ngx-dsxlibrary 2.21.63 → 2.21.65

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-dsxlibrary.mjs","sources":["../../../projects/ngx-dsx/src/lib/components/src/button/dsx-status-toggle/dsx-status-toggle.ts","../../../projects/ngx-dsx/src/lib/components/src/button/dsx-status-toggle/dsx-status-toggle.html","../../../projects/ngx-dsx/src/lib/components/src/checkBox/enable-disable/enable-disable.ts","../../../projects/ngx-dsx/src/lib/components/src/checkBox/enable-disable/enable-disable.html","../../../projects/ngx-dsx/src/lib/components/src/json/json-viewer/json-viewer.component.ts","../../../projects/ngx-dsx/src/lib/components/src/json/json-viewer/json-viewer.component.html","../../../projects/ngx-dsx/src/lib/components/src/status/date-indicator/date-indicator.ts","../../../projects/ngx-dsx/src/lib/components/src/status/date-indicator/date-indicator.html","../../../projects/ngx-dsx/src/lib/components/src/status/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/src/status/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/components/src/view/docx-preview/docx-preview.component.ts","../../../projects/ngx-dsx/src/lib/components/src/view/docx-preview/docx-preview.component.html","../../../projects/ngx-dsx/src/lib/components/src/view/pdf-preview/pdf-preview.component.ts","../../../projects/ngx-dsx/src/lib/components/src/view/pdf-preview/pdf-preview.component.html","../../../projects/ngx-dsx/src/lib/components/src/view/template-highlight/template-highlight.ts","../../../projects/ngx-dsx/src/lib/components/src/view/template-highlight/template-highlight.html","../../../projects/ngx-dsx/src/lib/services/src/icon-dsx.service.ts","../../../projects/ngx-dsx/src/lib/components/src/icon-dsx/icon-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/src/icon-dsx/icon-dsx.component.html","../../../projects/ngx-dsx/src/lib/components/src/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/src/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/models/src/similarity.util.ts","../../../projects/ngx-dsx/src/lib/components/src/app-message-help/app-message-help.component.ts","../../../projects/ngx-dsx/src/lib/components/src/app-message-help/app-message-help.component.html","../../../projects/ngx-dsx/src/lib/injections/environment.token.ts","../../../projects/ngx-dsx/src/lib/injections/parameterSecurity.ts","../../../projects/ngx-dsx/src/lib/services/src/security.service.ts","../../../projects/ngx-dsx/src/lib/services/src/alerta.service.ts","../../../projects/ngx-dsx/src/lib/services/src/utility-add.service.ts","../../../projects/ngx-dsx/src/lib/services/src/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/models/src/action-message.model.ts","../../../projects/ngx-dsx/src/lib/components/src/button/dsx-button/dsx-button.ts","../../../projects/ngx-dsx/src/lib/components/src/button/dsx-button/dsx-button.html","../../../projects/ngx-dsx/src/lib/components/src/inputs/file/file.component.ts","../../../projects/ngx-dsx/src/lib/components/src/inputs/file/file.component.html","../../../projects/ngx-dsx/src/lib/pipe/src/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/components/src/json/json-values-debuj/json-values-debuj.component.ts","../../../projects/ngx-dsx/src/lib/components/src/json/json-values-debuj/json-values-debuj.component.html","../../../projects/ngx-dsx/src/lib/components/src/label/ico-label/ico-label.ts","../../../projects/ngx-dsx/src/lib/components/src/label/ico-label/ico-label.html","../../../projects/ngx-dsx/src/lib/services/src/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/src/logo/logo-dsx/logo-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/src/logo/logo-dsx/logo-dsx.component.html","../../../projects/ngx-dsx/src/lib/components/src/loading-lottie/loading-lottie.component.ts","../../../projects/ngx-dsx/src/lib/components/src/loading-lottie/loading-lottie.component.html","../../../projects/ngx-dsx/src/lib/components/src/loading/css-v2/css-v2.component.ts","../../../projects/ngx-dsx/src/lib/components/src/loading/css-v2/css-v2.component.html","../../../projects/ngx-dsx/src/lib/components/src/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/src/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/models/src/environment-base.ts","../../../projects/ngx-dsx/src/lib/services/src/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/src/request-metrics.service.ts","../../../projects/ngx-dsx/src/lib/components/src/status/network-status/network-status.component.ts","../../../projects/ngx-dsx/src/lib/components/src/status/network-status/network-status.component.html","../../../projects/ngx-dsx/src/lib/components/src/navbar-dsx/navbar-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/src/navbar-dsx/navbar-dsx.component.html","../../../projects/ngx-dsx/src/lib/services/src/qr.service.ts","../../../projects/ngx-dsx/src/lib/components/src/qr/qr-generator/qr-generator.ts","../../../projects/ngx-dsx/src/lib/components/src/qr/qr-generator/qr-generator.html","../../../projects/ngx-dsx/src/lib/components/src/security/token-purpose-login/token-purpose-login.ts","../../../projects/ngx-dsx/src/lib/components/src/security/token-purpose-login/token-purpose-login.html","../../../projects/ngx-dsx/src/lib/components/src/view/screen-inspector/screen-inspector.ts","../../../projects/ngx-dsx/src/lib/components/src/view/screen-inspector/screen-inspector.html","../../../projects/ngx-dsx/src/lib/directives/src/arrow-navigation.directive.ts","../../../projects/ngx-dsx/src/lib/services/src/scroll-view/scroll-measurement.service.ts","../../../projects/ngx-dsx/src/lib/directives/src/auto-scroll-height.directive.ts","../../../projects/ngx-dsx/src/lib/directives/src/only-rango-pattern.directive.ts","../../../projects/ngx-dsx/src/lib/directives/src/select-all-on-focus.directive.ts","../../../projects/ngx-dsx/src/lib/guards/src/guard-token-purpose.guard.ts","../../../projects/ngx-dsx/src/lib/injections/cache.token.ts","../../../projects/ngx-dsx/src/lib/services/src/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/models/src/cache.types.ts","../../../projects/ngx-dsx/src/lib/primengdsx/src/fieldset/header/header-dsx/header-dsx.ts","../../../projects/ngx-dsx/src/lib/primengdsx/src/fieldset/header/header-dsx/header-dsx.html","../../../projects/ngx-dsx/src/lib/modules/src/dsx-add-tools.module.ts","../../../projects/ngx-dsx/src/lib/modules/src/prime-ng.module.ts","../../../projects/ngx-dsx/src/lib/pipe/src/join-by.pipe.ts","../../../projects/ngx-dsx/src/lib/pipe/src/truncate.pipe.ts","../../../projects/ngx-dsx/src/lib/services/src/endpoint.service.ts","../../../projects/ngx-dsx/src/lib/services/src/base-crud.service.ts","../../../projects/ngx-dsx/src/lib/services/src/cache.service.ts","../../../projects/ngx-dsx/src/lib/services/src/cache.provider.ts","../../../projects/ngx-dsx/src/lib/services/src/dte.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers/array-helpers.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers/result-file.service.ts","../../../projects/ngx-dsx/src/lib/services/src/messages/sweet-alert2-dialog.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers/next-toast-notify.service.ts","../../../projects/ngx-dsx/src/lib/services/src/response-html/result-response.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers.service.ts","../../../projects/ngx-dsx/src/lib/utils/src/form-data.util.ts","../../../projects/ngx-dsx/src/lib/services/src/http-helpers.service.ts","../../../projects/ngx-dsx/src/lib/services/src/master-detail-change.service.ts","../../../projects/ngx-dsx/src/lib/services/src/messages.service.ts","../../../projects/ngx-dsx/src/lib/services/src/response-html/form-preview.service.ts","../../../projects/ngx-dsx/src/lib/services/src/response-html/table-preview.service.ts","../../../projects/ngx-dsx/src/lib/utils/src/currency.util.ts","../../../projects/ngx-dsx/src/lib/utils/src/form-chain.helper.ts","../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/lib/validations/src/sorensen-dice.validators.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { Component, forwardRef, input } from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\n\r\n@Component({\r\n selector: 'dsx-status-toggle',\r\n imports: [FormsModule, ToggleButtonModule],\r\n templateUrl: './dsx-status-toggle.html',\r\n styleUrl: './dsx-status-toggle.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DsxStatusToggle),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DsxStatusToggle implements ControlValueAccessor {\r\n disabled = input<boolean>(false);\r\n formDisabled = false;\r\n isViewOnly = input<boolean>(false);\r\n offLabel = input<string>('Inactivo');\r\n onLabel = input<string>('Activo');\r\n value = false;\r\n\r\n onChange = (_: boolean) => {};\r\n onTouched = () => {};\r\n\r\n writeValue(value: boolean): void {\r\n this.value = !!value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled = disabled;\r\n }\r\n\r\n change(value: boolean) {\r\n this.value = value;\r\n this.onChange(value);\r\n this.onTouched();\r\n }\r\n}\r\n","@if(isViewOnly()){\r\n<p-toggleButton\r\n fluid\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"change($event)\"\r\n [onLabel]=\"onLabel()\"\r\n [offLabel]=\"offLabel()\"\r\n [disabled]=\"disabled() || formDisabled\"\r\n [onIcon]=\"'pi pi-check-circle'\"\r\n [offIcon]=\"'pi pi-times-circle'\"\r\n class=\"dsx-status-toggle\"\r\n/>\r\n}\r\n","import { Component, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'dsx-checkbox',\r\n imports: [],\r\n templateUrl: './enable-disable.html',\r\n styleUrl: './enable-disable.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DsxEnableDisable),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DsxEnableDisable implements ControlValueAccessor {\r\n checked = false;\r\n\r\n writeValue(value: boolean): void {\r\n this.checked = !!value;\r\n }\r\n\r\n // El componente es solo lectura; no necesita propagar cambios\r\n registerOnChange(_fn: unknown): void {}\r\n registerOnTouched(_fn: unknown): void {}\r\n}\r\n","<!-- From Uiverse.io by adamgiebl -->\r\n<div class=\"container\">\r\n <input type=\"checkbox\" [checked]=\"checked\" disabled />\r\n <div class=\"checkmark\"></div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n effect,\r\n EventEmitter,\r\n forwardRef,\r\n input,\r\n Output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { TreeNode } from 'primeng/api';\r\nimport { TreeModule } from 'primeng/tree';\r\n\r\ntype JsonPathSegment = string | number;\r\n\r\ntype JsonViewerMode = 'view' | 'edit' | boolean;\r\n\r\ntype JsonNodeMeta = {\r\n kind: 'compact-item' | 'group-active' | 'text-primitive' | 'active-primitive';\r\n indexLabel?: string;\r\n text?: string;\r\n activeVisual?: string;\r\n activeBoolean?: boolean | null;\r\n textPath?: JsonPathSegment[];\r\n activePath?: JsonPathSegment[];\r\n title?: string;\r\n key?: string;\r\n value?: string;\r\n path?: JsonPathSegment[];\r\n};\r\n\r\n@Component({\r\n selector: 'app-json-viewer',\r\n standalone: true,\r\n imports: [CommonModule, TreeModule],\r\n templateUrl: './json-viewer.component.html',\r\n styleUrl: './json-viewer.component.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => JsonViewerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class JsonViewerComponent implements ControlValueAccessor {\r\n data = input<unknown>(null);\r\n mode = input<JsonViewerMode>('view');\r\n textKey = input<string>('Texto');\r\n activeKey = input<string>('Activo');\r\n itemsKey = input<string>('Items');\r\n showStatusAsSymbol = input<boolean>(true);\r\n\r\n @Output() valueChange = new EventEmitter<unknown>();\r\n\r\n nodes: TreeNode[] = [];\r\n selectedNode: TreeNode | null = null;\r\n disabled = false;\r\n\r\n private controlValue: unknown = null;\r\n private normalizedValue: unknown = {};\r\n private readonly maxNormalizationDepth = 20;\r\n private onChange: (value: unknown) => void = () => undefined;\r\n private onTouched: () => void = () => undefined;\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.controlValue === null || this.controlValue === undefined) {\r\n this.updateNodes(this.data(), false);\r\n }\r\n });\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n this.controlValue = value;\r\n this.updateNodes(value, false);\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onNodeSelect(event: { node?: TreeNode }): void {\r\n const node = event?.node;\r\n\r\n if (!node?.children?.length) return;\r\n\r\n node.expanded = !node.expanded;\r\n this.selectedNode = null;\r\n this.nodes = [...this.nodes];\r\n }\r\n\r\n isEditMode(): boolean {\r\n const modeValue = this.mode();\r\n const editEnabled =\r\n typeof modeValue === 'boolean' ? modeValue : modeValue === 'edit';\r\n\r\n return editEnabled && !this.disabled;\r\n }\r\n\r\n getNodeMeta(node: TreeNode): JsonNodeMeta | null {\r\n const nodeData = node.data;\r\n\r\n if (!nodeData || typeof nodeData !== 'object') return null;\r\n\r\n const kind = (nodeData as { kind?: string }).kind;\r\n if (!kind) return null;\r\n\r\n return nodeData as JsonNodeMeta;\r\n }\r\n\r\n onTextEdit(\r\n path: JsonPathSegment[],\r\n value: string,\r\n nodeMeta: JsonNodeMeta,\r\n ): void {\r\n if (!this.isEditMode()) return;\r\n\r\n this.setValueAtPath(path, value);\r\n\r\n // Actualiza solo el meta del nodo para reflejar el cambio sin reconstruir el árbol.\r\n if (nodeMeta.kind === 'compact-item') {\r\n nodeMeta.text = value;\r\n } else if (nodeMeta.kind === 'text-primitive') {\r\n nodeMeta.value = value;\r\n }\r\n\r\n this.emitCurrentValue();\r\n }\r\n\r\n onTextBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n onActiveToggle(\r\n path: JsonPathSegment[],\r\n checked: boolean,\r\n nodeMeta: JsonNodeMeta,\r\n ): void {\r\n if (!this.isEditMode()) return;\r\n\r\n this.setValueAtPath(path, checked);\r\n\r\n // Actualiza el meta del nodo y recalcula el visual del símbolo.\r\n nodeMeta.activeBoolean = checked;\r\n nodeMeta.activeVisual = checked\r\n ? this.showStatusAsSymbol()\r\n ? '✓'\r\n : 'true'\r\n : this.showStatusAsSymbol()\r\n ? '✗'\r\n : 'false';\r\n\r\n // Fuerza detección de cambio en el array sin reconstruir el árbol.\r\n this.nodes = [...this.nodes];\r\n this.emitCurrentValue();\r\n this.onTouched();\r\n }\r\n\r\n private updateNodes(value: unknown, emit: boolean): void {\r\n this.normalizedValue = this.parseIfNeeded(value);\r\n this.nodes = this.buildTree(this.normalizedValue);\r\n\r\n if (emit) {\r\n this.emitCurrentValue();\r\n }\r\n }\r\n\r\n private parseIfNeeded(data: unknown): unknown {\r\n if (data === null || data === undefined || data === '') return {};\r\n\r\n return this.normalizeData(data, 0);\r\n }\r\n\r\n private normalizeData(data: unknown, depth: number): unknown {\r\n if (depth > this.maxNormalizationDepth) return data;\r\n\r\n if (typeof data === 'string') {\r\n const parsed = this.tryParseJsonString(data);\r\n\r\n if (parsed.parsed) {\r\n return this.normalizeData(parsed.value, depth + 1);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return data.map((item) => this.normalizeData(item, depth + 1));\r\n }\r\n\r\n if (typeof data === 'object' && data !== null) {\r\n return Object.entries(data as Record<string, unknown>).reduce(\r\n (acc, [key, value]) => {\r\n acc[key] = this.normalizeData(value, depth + 1);\r\n return acc;\r\n },\r\n {} as Record<string, unknown>,\r\n );\r\n }\r\n\r\n return data;\r\n }\r\n\r\n private tryParseJsonString(value: string): {\r\n parsed: boolean;\r\n value: unknown;\r\n } {\r\n const trimmed = value.trim();\r\n\r\n // Solo intentamos parsear si parece JSON para evitar costo innecesario\r\n // en strings de texto común.\r\n const looksLikeJson =\r\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\r\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\r\n\r\n if (!looksLikeJson) {\r\n return { parsed: false, value };\r\n }\r\n\r\n try {\r\n return { parsed: true, value: JSON.parse(trimmed) };\r\n } catch {\r\n return { parsed: false, value };\r\n }\r\n }\r\n\r\n private buildTree(\r\n data: unknown,\r\n parentKey: string = '0',\r\n path: JsonPathSegment[] = [],\r\n ): TreeNode[] {\r\n if (Array.isArray(data)) {\r\n return data.map((item, index) => {\r\n const key = `${parentKey}-${index}`;\r\n const itemPath = [...path, index];\r\n\r\n const compactItem = this.toCompactTextAndActive(\r\n item,\r\n itemPath,\r\n `[${String(index).padStart(2, '0')}]`,\r\n );\r\n if (compactItem) {\r\n return {\r\n key,\r\n label: `${compactItem.indexLabel} Texto: ${compactItem.text} | ${compactItem.activeVisual}`,\r\n icon: 'pi pi-file',\r\n data: compactItem,\r\n };\r\n }\r\n\r\n if (this.isComplex(item)) {\r\n return {\r\n key,\r\n label: `[${index}]`,\r\n icon: this.getIcon(item),\r\n children: this.buildTree(item, key, itemPath),\r\n };\r\n }\r\n\r\n return {\r\n key,\r\n label: `[${index}]: ${this.formatPrimitive(item)}`,\r\n icon: 'pi pi-file',\r\n };\r\n });\r\n }\r\n\r\n if (typeof data === 'object' && data !== null) {\r\n const objectData = data as Record<string, unknown>;\r\n\r\n return Object.keys(objectData).flatMap((key, index) => {\r\n const value = objectData[key];\r\n const nodeKey = `${parentKey}-${index}`;\r\n const childPath = [...path, key];\r\n const activeKeyName = this.activeKey();\r\n const itemsKeyName = this.itemsKey();\r\n const textKeyName = this.textKey();\r\n\r\n if (key === itemsKeyName && Array.isArray(value)) {\r\n return this.buildTree(value, nodeKey, childPath);\r\n }\r\n\r\n if (this.isItemsContainer(value)) {\r\n const container = value as Record<string, unknown>;\r\n const hasActive = Object.prototype.hasOwnProperty.call(\r\n container,\r\n activeKeyName,\r\n );\r\n const label = hasActive\r\n ? `${key} | ${this.formatActiveSymbol(container[activeKeyName])}`\r\n : key;\r\n\r\n const itemsChildren = this.buildTree(\r\n container[itemsKeyName],\r\n `${nodeKey}-0`,\r\n [...childPath, itemsKeyName],\r\n );\r\n const additionalChildren = Object.keys(container)\r\n .filter(\r\n (childKey) =>\r\n childKey !== itemsKeyName && childKey !== activeKeyName,\r\n )\r\n .flatMap((childKey, childIndex) => {\r\n return this.buildTree(\r\n { [childKey]: container[childKey] },\r\n `${nodeKey}-${childIndex + 1}`,\r\n childPath,\r\n );\r\n });\r\n\r\n const nodeMeta: JsonNodeMeta | undefined = hasActive\r\n ? {\r\n kind: 'group-active',\r\n title: key,\r\n activeVisual: this.formatActiveSymbol(container[activeKeyName]),\r\n activeBoolean: this.toBooleanLike(container[activeKeyName]),\r\n activePath: [...childPath, activeKeyName],\r\n }\r\n : undefined;\r\n\r\n return {\r\n key: nodeKey,\r\n label,\r\n icon: 'pi pi-folder',\r\n children: [...itemsChildren, ...additionalChildren],\r\n data: nodeMeta,\r\n };\r\n }\r\n\r\n const compactValue = this.toCompactTextAndActive(value, childPath, key);\r\n if (compactValue) {\r\n return {\r\n key: nodeKey,\r\n label: `${key}: Texto: ${compactValue.text} | ${compactValue.activeVisual}`,\r\n icon: 'pi pi-file',\r\n data: compactValue,\r\n };\r\n }\r\n\r\n const groupedValue = this.toGroupWithActive(value);\r\n if (groupedValue) {\r\n groupedValue.meta.title = key;\r\n groupedValue.meta.activePath = [...childPath, activeKeyName];\r\n\r\n return {\r\n key: nodeKey,\r\n label: `${key} | ${groupedValue.activeSymbol}`,\r\n icon: 'pi pi-folder',\r\n children: this.buildTree(groupedValue.children, nodeKey, childPath),\r\n data: groupedValue.meta,\r\n };\r\n }\r\n\r\n if (this.isComplex(value)) {\r\n return {\r\n key: nodeKey,\r\n label: key,\r\n icon: this.getIcon(value),\r\n children: this.buildTree(value, nodeKey, childPath),\r\n };\r\n }\r\n\r\n const primitiveMeta: JsonNodeMeta | undefined =\r\n key === textKeyName\r\n ? {\r\n kind: 'text-primitive',\r\n key,\r\n value: this.formatPrimitive(value),\r\n path: childPath,\r\n }\r\n : key === activeKeyName\r\n ? {\r\n kind: 'active-primitive',\r\n key,\r\n activeVisual: this.formatActiveSymbol(value),\r\n activeBoolean: this.toBooleanLike(value),\r\n path: childPath,\r\n }\r\n : undefined;\r\n\r\n return {\r\n key: nodeKey,\r\n label:\r\n key === activeKeyName\r\n ? `${key}: ${this.formatActiveSymbol(value)}`\r\n : `${key}: ${this.formatPrimitive(value)}`,\r\n icon: 'pi pi-file',\r\n data: primitiveMeta,\r\n };\r\n });\r\n }\r\n\r\n return [\r\n {\r\n key: parentKey,\r\n label: this.formatPrimitive(data),\r\n icon: 'pi pi-file',\r\n },\r\n ];\r\n }\r\n\r\n private isComplex(value: unknown): boolean {\r\n return (\r\n Array.isArray(value) || (typeof value === 'object' && value !== null)\r\n );\r\n }\r\n\r\n private formatPrimitive(value: unknown): string {\r\n if (value === null || value === undefined) return '-';\r\n\r\n if (typeof value === 'string') return value;\r\n\r\n return String(value);\r\n }\r\n\r\n private toCompactTextAndActive(\r\n value: unknown,\r\n basePath: JsonPathSegment[],\r\n indexLabel: string,\r\n ): JsonNodeMeta | null {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return null;\r\n }\r\n\r\n const record = value as Record<string, unknown>;\r\n const textKeyName = this.textKey();\r\n const activeKeyName = this.activeKey();\r\n const hasText = Object.prototype.hasOwnProperty.call(record, textKeyName);\r\n const hasActive = Object.prototype.hasOwnProperty.call(\r\n record,\r\n activeKeyName,\r\n );\r\n\r\n if (!hasText || !hasActive) return null;\r\n\r\n const activeValue = record[activeKeyName];\r\n\r\n return {\r\n kind: 'compact-item',\r\n indexLabel,\r\n text: this.formatPrimitive(record[textKeyName]),\r\n activeVisual: this.formatActiveSymbol(activeValue),\r\n activeBoolean: this.toBooleanLike(activeValue),\r\n textPath: [...basePath, textKeyName],\r\n activePath: [...basePath, activeKeyName],\r\n };\r\n }\r\n\r\n private isItemsContainer(value: unknown): boolean {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n return Array.isArray((value as Record<string, unknown>)[this.itemsKey()]);\r\n }\r\n\r\n private toGroupWithActive(value: unknown): {\r\n activeSymbol: string;\r\n children: Record<string, unknown>;\r\n meta: JsonNodeMeta;\r\n } | null {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return null;\r\n }\r\n\r\n const record = value as Record<string, unknown>;\r\n const activeKeyName = this.activeKey();\r\n const hasActive = Object.prototype.hasOwnProperty.call(\r\n record,\r\n activeKeyName,\r\n );\r\n\r\n if (!hasActive) return null;\r\n\r\n const childEntries = Object.entries(record).filter(\r\n ([childKey]) => childKey !== activeKeyName,\r\n );\r\n\r\n if (childEntries.length === 0) return null;\r\n\r\n const hasComplexChildren = childEntries.some(([, childValue]) =>\r\n this.isComplex(childValue),\r\n );\r\n\r\n if (!hasComplexChildren) return null;\r\n\r\n return {\r\n activeSymbol: this.formatActiveSymbol(record[activeKeyName]),\r\n children: Object.fromEntries(childEntries),\r\n meta: {\r\n kind: 'group-active',\r\n title: '',\r\n activeVisual: this.formatActiveSymbol(record[activeKeyName]),\r\n activeBoolean: this.toBooleanLike(record[activeKeyName]),\r\n },\r\n };\r\n }\r\n\r\n private formatActiveSymbol(value: unknown): string {\r\n const boolLike = this.toBooleanLike(value);\r\n\r\n if (boolLike === true) return this.showStatusAsSymbol() ? '✓' : 'true';\r\n if (boolLike === false) return this.showStatusAsSymbol() ? '✗' : 'false';\r\n\r\n return this.formatPrimitive(value);\r\n }\r\n\r\n private toBooleanLike(value: unknown): boolean | null {\r\n if (typeof value === 'boolean') return value;\r\n\r\n if (typeof value === 'number') {\r\n if (value === 1) return true;\r\n if (value === 0) return false;\r\n return null;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === 'true' || normalized === '1') return true;\r\n if (normalized === 'false' || normalized === '0') return false;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private getIcon(value: unknown): string {\r\n if (Array.isArray(value)) return 'pi pi-list';\r\n\r\n if (typeof value === 'object') return 'pi pi-folder';\r\n\r\n return 'pi pi-file';\r\n }\r\n\r\n private setValueAtPath(path: JsonPathSegment[], value: unknown): void {\r\n if (\r\n !path.length ||\r\n typeof this.normalizedValue !== 'object' ||\r\n this.normalizedValue === null\r\n ) {\r\n return;\r\n }\r\n\r\n let target: any = this.normalizedValue;\r\n\r\n for (let index = 0; index < path.length - 1; index += 1) {\r\n const segment = path[index];\r\n\r\n if (target === null || target === undefined) return;\r\n\r\n target = target[segment as any];\r\n }\r\n\r\n const lastSegment = path[path.length - 1];\r\n\r\n if (target !== null && target !== undefined) {\r\n target[lastSegment as any] = value;\r\n }\r\n }\r\n\r\n private emitUpdatedValue(): void {\r\n this.nodes = this.buildTree(this.normalizedValue);\r\n this.emitCurrentValue();\r\n this.onTouched();\r\n }\r\n\r\n private emitCurrentValue(): void {\r\n const payload = this.cloneValue(this.normalizedValue);\r\n this.controlValue = payload;\r\n this.onChange(payload);\r\n this.valueChange.emit(payload);\r\n }\r\n\r\n private cloneValue<T>(value: T): T {\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n } catch {\r\n return value;\r\n }\r\n }\r\n}\r\n","<p-tree\r\n [value]=\"nodes\"\r\n class=\"json-tree w-full\"\r\n selectionMode=\"single\"\r\n [(selection)]=\"selectedNode\"\r\n [highlightOnSelect]=\"false\"\r\n (onNodeSelect)=\"onNodeSelect($event)\"\r\n>\r\n <ng-template let-node pTemplate=\"default\">\r\n <div class=\"json-node\">\r\n <ng-container *ngIf=\"getNodeMeta(node) as meta; else defaultLabel\">\r\n <ng-container [ngSwitch]=\"meta.kind\">\r\n <ng-container *ngSwitchCase=\"'compact-item'\">\r\n <span class=\"json-prefix\">{{ meta.indexLabel || \"\" }}</span>\r\n <span class=\"json-key\"> Texto: </span>\r\n <ng-container *ngIf=\"isEditMode(); else compactTextView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [class.json-text-inactive]=\"meta.activeBoolean === false\"\r\n [value]=\"meta.text || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit(\r\n $any(meta.textPath),\r\n $any($event.target).value,\r\n meta\r\n )\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #compactTextView>\r\n <span [class.json-text-inactive]=\"meta.activeBoolean === false\">{{\r\n meta.text || \"\"\r\n }}</span>\r\n </ng-template>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'group-active'\">\r\n <span>{{ meta.title || \"\" }}</span>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode() && meta.activePath\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'text-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <ng-container *ngIf=\"isEditMode(); else textPrimitiveView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [value]=\"meta.value || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit($any(meta.path), $any($event.target).value, meta)\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #textPrimitiveView>\r\n <span>{{ meta.value || \"\" }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'active-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.path),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ node.label }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultLabel>\r\n {{ node.label }}\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n</p-tree>\r\n","import { Component, input, OnChanges } from '@angular/core';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'dsx-date-indicator',\r\n imports: [TagModule, TooltipModule],\r\n templateUrl: './date-indicator.html',\r\n styleUrl: './date-indicator.css',\r\n})\r\nexport class DateIndicator implements OnChanges {\r\n date = input<Date | string>('');\r\n minDays = input<number>(1);\r\n maxDays = input<number>(365);\r\n\r\n status = 'Correcto';\r\n\r\n severity: 'success' | 'warn' | 'info' | 'danger' = 'success';\r\n\r\n icon = 'pi pi-check-circle';\r\n\r\n tooltip = '';\r\n\r\n ngOnChanges(): void {\r\n this.calculate();\r\n }\r\n\r\n private calculate(): void {\r\n const rawDate = this.date();\r\n\r\n if (!rawDate) {\r\n this.setEmptyCriticalState();\r\n return;\r\n }\r\n\r\n const targetDate = new Date(rawDate);\r\n\r\n if (Number.isNaN(targetDate.getTime())) {\r\n this.setEmptyCriticalState();\r\n return;\r\n }\r\n\r\n const today = new Date();\r\n\r\n const diffMs = today.getTime() - targetDate.getTime();\r\n\r\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));\r\n\r\n const range = this.maxDays() - this.minDays();\r\n\r\n const step = range / 4;\r\n\r\n const level1 = this.minDays() + step;\r\n const level2 = this.minDays() + step * 2;\r\n const level3 = this.minDays() + step * 3;\r\n\r\n if (days <= level1) {\r\n this.status = 'Correcto';\r\n this.severity = 'success';\r\n this.icon = 'pi pi-check-circle';\r\n } else if (days <= level2) {\r\n this.status = 'Atención';\r\n this.severity = 'warn';\r\n this.icon = 'pi pi-exclamation-triangle';\r\n } else if (days <= level3) {\r\n this.status = 'Riesgo';\r\n this.severity = 'info';\r\n this.icon = 'pi pi-clock';\r\n } else {\r\n this.status = 'Crítico';\r\n this.severity = 'danger';\r\n this.icon = 'pi pi-times-circle';\r\n }\r\n\r\n this.tooltip = `Última actualización: ${targetDate.toLocaleDateString()} • ${days} días`;\r\n }\r\n\r\n private setEmptyCriticalState(): void {\r\n this.status = 'Crítico';\r\n this.severity = 'danger';\r\n this.icon = 'pi pi-times-circle';\r\n this.tooltip = 'Última actualización: Sin valor • 0 días';\r\n }\r\n}\r\n","<p-tag\r\n [severity]=\"severity\"\r\n [icon]=\"icon\"\r\n [value]=\"status\"\r\n [pTooltip]=\"tooltip\"\r\n>\r\n</p-tag>\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpDirective } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpDirective],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer' | 'percent'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<\r\n | 'light'\r\n | 'dark'\r\n | 'aqua'\r\n | 'sunset'\r\n | 'mint'\r\n | 'peach'\r\n | 'plasma'\r\n | 'nebula'\r\n >('light');\r\n\r\n options: Record<'currency' | 'integer' | 'percent', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n //prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n percent: {\r\n startVal: 0,\r\n duration: 0.5,\r\n suffix: '%',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div [class]=\"`kpi-card ${color()} ${theme()}-theme`\">\r\n <div class=\"kpi-container\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [countUpOptions]=\"getSelectedOption()\"\r\n [class]=\"`card-value-${theme()}`\"\r\n >0</span\r\n >\r\n <span [class]=\"`card-text-${theme()}`\">{{ label() }}</span>\r\n </div>\r\n <i [class]=\"`${iconType()} icon icon-${theme()}`\"></i>\r\n</div>\r\n","import {\r\n Component,\r\n effect,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n input,\r\n Output,\r\n signal,\r\n viewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\ntype DocxRenderOptions = {\r\n ignoreWidth?: boolean;\r\n renderHeaders?: boolean;\r\n renderFooters?: boolean;\r\n};\r\n\r\ntype DocxPreviewModule = {\r\n renderAsync: (\r\n document: Blob,\r\n bodyContainer: HTMLElement,\r\n styleContainer?: HTMLElement,\r\n options?: DocxRenderOptions,\r\n ) => Promise<void>;\r\n};\r\n\r\n@Component({\r\n selector: 'app-docx-preview',\r\n imports: [DialogModule, AvatarModule],\r\n templateUrl: './docx-preview.component.html',\r\n styleUrl: './docx-preview.component.css',\r\n})\r\nexport class DocxPreviewComponent {\r\n view = viewChild<ElementRef>('viewer');\r\n private visibleState: WritableSignal<boolean> = signal(false);\r\n loading = signal(false);\r\n rendered = signal(false);\r\n private renderToken = 0;\r\n\r\n @Input()\r\n set visible(value: boolean) {\r\n this.visibleState.set(!!value);\r\n }\r\n\r\n get visible(): boolean {\r\n return this.visibleState();\r\n }\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n blob = input<Blob | null>(null);\r\n\r\n constructor() {\r\n effect(() => {\r\n const container = this.view()?.nativeElement;\r\n const isVisible = this.visibleState();\r\n const fileBlob = this.blob();\r\n\r\n if (!container) {\r\n return;\r\n }\r\n\r\n if (!isVisible) {\r\n this.resetViewer(container);\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.rendered.set(false);\r\n\r\n if (!(fileBlob instanceof Blob)) {\r\n this.finishWithFallback(container);\r\n container.innerHTML =\r\n '<p>No hay un archivo .docx válido para previsualizar.</p>';\r\n return;\r\n }\r\n\r\n if (!fileBlob.size) {\r\n this.finishWithFallback(container);\r\n container.innerHTML = '<p>El archivo .docx está vacío.</p>';\r\n return;\r\n }\r\n\r\n const token = ++this.renderToken;\r\n container.innerHTML = '';\r\n const options: DocxRenderOptions = {\r\n ignoreWidth: true,\r\n renderHeaders: true,\r\n renderFooters: true,\r\n };\r\n\r\n void this.renderDocx(fileBlob, container, options, token);\r\n });\r\n }\r\n\r\n private resetViewer(container: HTMLElement): void {\r\n this.renderToken++;\r\n this.loading.set(false);\r\n this.rendered.set(false);\r\n container.innerHTML = '';\r\n }\r\n\r\n private finishWithFallback(container: HTMLElement): void {\r\n this.renderToken++;\r\n this.loading.set(false);\r\n this.rendered.set(true);\r\n container.innerHTML = '';\r\n }\r\n\r\n private async renderDocx(\r\n fileBlob: Blob,\r\n container: HTMLElement,\r\n options: DocxRenderOptions,\r\n token: number,\r\n ) {\r\n try {\r\n const viteDocxModulePath = '/@id/docx-preview';\r\n\r\n // Import dinámico en runtime para mantener docx-preview como peer opcional.\r\n const docxPreviewModule = (await import(\r\n /* @vite-ignore */ viteDocxModulePath\r\n )) as unknown as DocxPreviewModule;\r\n\r\n if (token !== this.renderToken || !this.visibleState()) {\r\n return;\r\n }\r\n\r\n await docxPreviewModule.renderAsync(\r\n fileBlob,\r\n container,\r\n undefined,\r\n options,\r\n );\r\n\r\n if (token === this.renderToken && this.visibleState()) {\r\n this.loading.set(false);\r\n this.rendered.set(true);\r\n }\r\n } catch (error) {\r\n if (token !== this.renderToken || !this.visibleState()) {\r\n return;\r\n }\r\n\r\n console.error(\r\n '[DocxPreview] Error al renderizar el archivo DOCX.',\r\n error,\r\n );\r\n\r\n container.innerHTML =\r\n '<p>No se pudo renderizar la vista previa DOCX. Verifica la consola para más detalles.</p>';\r\n this.loading.set(false);\r\n this.rendered.set(true);\r\n }\r\n }\r\n\r\n onHide() {\r\n const container = this.view()?.nativeElement;\r\n\r\n if (container) {\r\n this.renderToken++;\r\n container.innerHTML = '';\r\n }\r\n\r\n this.visibleChange.emit(false);\r\n }\r\n}\r\n","<p-dialog\r\n [visible]=\"visible\"\r\n (onHide)=\"onHide()\"\r\n [modal]=\"true\"\r\n [breakpoints]=\"{ '1199px': '75vw', '575px': '90vw' }\"\r\n [style]=\"{ width: '80vw' }\"\r\n [draggable]=\"false\"\r\n [resizable]=\"false\"\r\n [closable]=\"true\"\r\n [maximizable]=\"true\"\r\n>\r\n <ng-template #header>\r\n <div class=\"flex justify-content-center align-items-center gap-2 px-2\">\r\n <p-avatar image=\"icon2/word-2019.png\" />\r\n <span class=\"font-bold\">Vista preliminar del documento</span>\r\n </div>\r\n </ng-template>\r\n <div class=\"docx-preview-shell\">\r\n @if (loading()) {\r\n <div class=\"docx-preview-loading\">\r\n <span class=\"docx-preview-spinner\"></span>\r\n <span>Cargando vista previa del documento...</span>\r\n </div>\r\n }\r\n\r\n <div\r\n #viewer\r\n class=\"docx-preview-viewer\"\r\n [class.is-hidden]=\"loading() && !rendered()\"\r\n ></div>\r\n </div>\r\n</p-dialog>\r\n","import { Component, OnDestroy, effect, input, model } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\n@Component({\r\n selector: 'app-pdf-preview',\r\n imports: [DialogModule],\r\n templateUrl: './pdf-preview.component.html',\r\n styleUrl: './pdf-preview.component.css',\r\n})\r\nexport class PdfPreviewComponent implements OnDestroy {\r\n visible = model<boolean>(false);\r\n blob = input<Blob | null>(null);\r\n private objectUrl: string | null = null;\r\n pdfUrl: SafeResourceUrl | null = null;\r\n\r\n constructor(private sanitizer: DomSanitizer) {\r\n effect((onCleanup) => {\r\n const file = this.blob();\r\n const isVisible = this.visible();\r\n\r\n if (!isVisible || file === null) {\r\n this.limpiarUrlAnterior();\r\n return;\r\n }\r\n\r\n if (file.type !== 'application/pdf') {\r\n this.limpiarUrlAnterior();\r\n console.warn('El archivo recibido no es un PDF válido');\r\n return;\r\n }\r\n\r\n this.limpiarUrlAnterior();\r\n const currentObjectUrl = URL.createObjectURL(file);\r\n this.objectUrl = currentObjectUrl;\r\n this.pdfUrl =\r\n this.sanitizer.bypassSecurityTrustResourceUrl(currentObjectUrl);\r\n\r\n onCleanup(() => {\r\n URL.revokeObjectURL(currentObjectUrl);\r\n if (this.objectUrl === currentObjectUrl) {\r\n this.objectUrl = null;\r\n this.pdfUrl = null;\r\n }\r\n });\r\n });\r\n }\r\n\r\n private limpiarUrlAnterior(): void {\r\n if (this.objectUrl) {\r\n URL.revokeObjectURL(this.objectUrl);\r\n this.objectUrl = null;\r\n }\r\n this.pdfUrl = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.limpiarUrlAnterior();\r\n }\r\n}\r\n","<p-dialog\r\n header=\"Vista previa del documento de soporte\"\r\n [(visible)]=\"visible\"\r\n [style]=\"{ width: '80vw', height: '90vh' }\"\r\n [closable]=\"true\"\r\n [maximizable]=\"true\"\r\n>\r\n @if (pdfUrl) {\r\n <iframe\r\n [src]=\"pdfUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n style=\"border: none\"\r\n ></iframe>\r\n }\r\n</p-dialog>\r\n","import { Component, computed, inject, input } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { TabsModule } from 'primeng/tabs';\r\n\r\n@Component({\r\n selector: 'dsx-template-highlight',\r\n imports: [TabsModule],\r\n templateUrl: './template-highlight.html',\r\n styleUrl: './template-highlight.css',\r\n})\r\nexport class TemplateHighlight {\r\n text = input<string | null>(null);\r\n allowedKeys = input<readonly string[]>([]);\r\n\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n highlightedText = computed<SafeHtml>(() => {\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n this.processText(this.text(), this.allowedKeys()),\r\n );\r\n });\r\n\r\n private processText(\r\n raw: string | null,\r\n allowedKeys: readonly string[],\r\n ): string {\r\n if (!raw) return '';\r\n\r\n // Primero marcamos variables y etiquetas en el texto crudo usando placeholders.\r\n const spanMap = new Map<string, string>();\r\n let idx = 0;\r\n let result = raw;\r\n\r\n // Variables {{...}}\r\n result = result.replace(/{{(.*?)}}/g, (match, content) => {\r\n const trimmed = content.trim();\r\n let span: string;\r\n\r\n if (content !== trimmed) {\r\n span = `<span class=\"var-invalid\" title=\"Espacios inválidos\">${this.escapeHtml(match)}</span>`;\r\n } else if (!/^[A-Z0-9_]+$/.test(trimmed)) {\r\n span = `<span class=\"var-invalid\" title=\"Formato inválido\">${this.escapeHtml(match)}</span>`;\r\n } else if (!allowedKeys.includes(trimmed)) {\r\n span = `<span class=\"var-invalid\" title=\"Variable no definida\">${this.escapeHtml(match)}</span>`;\r\n } else {\r\n span = `<span class=\"var-valid\">${this.escapeHtml(match)}</span>`;\r\n }\r\n\r\n const placeholder = `__SPAN_${idx++}__`;\r\n spanMap.set(placeholder, span);\r\n return placeholder;\r\n });\r\n\r\n // Etiquetas estructurales: <negrita>, </negrita>, </salto>\r\n const tagRegex = /<[^>\\n]+>/g;\r\n const allowedTags = new Set(['<negrita>', '</negrita>', '</salto>']);\r\n const tagMatches = [...raw.matchAll(tagRegex)];\r\n const invalidTagReasonByIndex = new Map<number, string>();\r\n const negritaStack: number[] = [];\r\n\r\n for (let i = 0; i < tagMatches.length; i++) {\r\n const tag = tagMatches[i][0];\r\n\r\n if (!allowedTags.has(tag)) {\r\n invalidTagReasonByIndex.set(\r\n i,\r\n `Etiqueta inválida: \"${tag}\". Etiquetas permitidas: <negrita>, </negrita>, </salto>.`,\r\n );\r\n continue;\r\n }\r\n\r\n if (tag === '<negrita>') {\r\n negritaStack.push(i);\r\n continue;\r\n }\r\n\r\n if (tag === '</negrita>' && negritaStack.length === 0) {\r\n invalidTagReasonByIndex.set(\r\n i,\r\n 'Estructura incorrecta: Se encontró \"</negrita>\" sin una apertura \"<negrita>\" previa.',\r\n );\r\n continue;\r\n }\r\n\r\n if (tag === '</negrita>') {\r\n negritaStack.pop();\r\n }\r\n }\r\n\r\n for (const openTagIndex of negritaStack) {\r\n invalidTagReasonByIndex.set(\r\n openTagIndex,\r\n 'Estructura incorrecta: Falta cerrar una o más etiquetas \"</negrita>\".',\r\n );\r\n }\r\n\r\n let tagIndex = 0;\r\n result = result.replace(tagRegex, (tag) => {\r\n const reason = invalidTagReasonByIndex.get(tagIndex);\r\n const span = reason\r\n ? `<span class=\"tag-invalid\" title=\"${this.escapeAttr(reason)}\">${this.escapeHtml(tag)}</span>`\r\n : `<span class=\"tag-valid\">${this.escapeHtml(tag)}</span>`;\r\n\r\n const placeholder = `__SPAN_${idx++}__`;\r\n spanMap.set(placeholder, span);\r\n tagIndex += 1;\r\n return placeholder;\r\n });\r\n\r\n // Escapamos el resto del texto (fuera de placeholders).\r\n result = this.escapeHtml(result);\r\n\r\n // Ahora marcamos llaves sueltas: {{ o }} que no estén en pareja de variable.\r\n result = result.replace(/{{|}}/g, (m) => {\r\n return `<span class=\"var-brace-error\" title=\"Llave desbalanceada\">${m}</span>`;\r\n });\r\n\r\n // Restauramos los spans reales\r\n for (const [placeholder, span] of spanMap) {\r\n result = result.replace(placeholder, span);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private escapeHtml(text: string | null): string {\r\n if (!text) return '';\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n }\r\n\r\n private escapeAttr(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n }\r\n}\r\n","<p-tabs value=\"0\">\r\n <p-tablist>\r\n <p-tab value=\"0\">\r\n <i class=\"pi pi-file-edit tab-icon\" aria-hidden=\"true\"></i>\r\n <span>Preliminar</span>\r\n </p-tab>\r\n <p-tab value=\"1\">\r\n <i class=\"pi pi-list tab-icon\" aria-hidden=\"true\"></i>\r\n <span>Variables</span>\r\n </p-tab>\r\n </p-tablist>\r\n <p-tabpanels>\r\n <p-tabpanel value=\"0\">\r\n <div class=\"template-highlight\" [innerHTML]=\"highlightedText()\"></div>\r\n </p-tabpanel>\r\n <p-tabpanel value=\"1\">\r\n @if (allowedKeys().length) {\r\n <ul class=\"template-vars-list\">\r\n @for (key of allowedKeys(); track key) {\r\n <li>\r\n <strong>{{ key }}</strong>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </p-tabpanel>\r\n </p-tabpanels>\r\n</p-tabs>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { catchError, map, Observable, of, shareReplay } from 'rxjs';\r\n\r\n/** SVG del icono help como fallback de emergencia */\r\nconst HELP_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M440-200h80v-80h-80v80Zm40-400q-33 0-56.5 18.5T390-530l70 30q5-17 15-26.5t25-9.5q17 0 28.5 11.5T540-495q0 12-7.5 22T510-450q-35 24-52.5 44T440-340h80q0-22 12.5-39.5T570-412q30-21 40-41t10-42q0-51-35-88t-105-37q-60 0-94.5 29.5T340-510l70 30q8-25 23.5-37.5T480-530Zm0 500q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/></svg>`;\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio de carga de iconos SVG para `icon-dsx`.\r\n *\r\n * Flujo de resolución:\r\n * 1) Intenta cargar el recurso solicitado en `mdio/{name}.svg`.\r\n * 2) Si falla, registra un `console.warn` para depuración.\r\n * 3) Usa `mdio/help.svg` como fallback visual para mantener buena UX.\r\n * 4) Si también falla ese recurso, usa un SVG inline de `help` como último respaldo.\r\n *\r\n * Nota de mantenimiento:\r\n * Los recursos SVG deben mantenerse actualizados en la carpeta de assets (`mdio`),\r\n * de lo contrario se activará el fallback y el warning de ícono no encontrado.\r\n */\r\nexport class IconDsxService {\r\n private cache = new Map<string, Observable<SafeHtml>>();\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private sanitizer: DomSanitizer,\r\n ) {}\r\n\r\n /**\r\n * Carga un SVG por nombre desde `mdio/{name}.svg` y retorna contenido seguro para renderizar.\r\n */\r\n getIcon(\r\n name: string,\r\n style: 'outlined' | 'rounded' | 'sharp' = 'outlined',\r\n ): Observable<SafeHtml> {\r\n const cacheKey = `${style}:${name}`;\r\n if (this.cache.has(cacheKey)) {\r\n return this.cache.get(cacheKey)!;\r\n }\r\n\r\n let prefix = 'mdio';\r\n if (style === 'rounded') prefix = 'mdir';\r\n else if (style === 'sharp') prefix = 'mdis';\r\n\r\n const iconPath = `${prefix}/${name}.svg`;\r\n const helpIconPath = `${prefix}/help.svg`;\r\n\r\n //console.log(`[IconDsxService] Cargando icono: ${iconPath}`);\r\n\r\n const request$ = this.http.get(iconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n catchError((error) => {\r\n console.warn('[IconDsxService] Icono no encontrado, usando fallback', {\r\n name,\r\n path: iconPath,\r\n status: error?.status,\r\n message: error?.message,\r\n });\r\n\r\n return this.http.get(helpIconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n catchError(() => {\r\n return of(this.sanitizer.bypassSecurityTrustHtml(HELP_SVG));\r\n }),\r\n );\r\n }),\r\n shareReplay(1),\r\n );\r\n\r\n this.cache.set(cacheKey, request$);\r\n return request$;\r\n }\r\n}\r\n","import { Component, effect, input, isDevMode } from '@angular/core';\r\nimport { AsyncPipe } from '@angular/common';\r\nimport { SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconDsxService } from '../../../services/src/icon-dsx.service';\r\n\r\n@Component({\r\n selector: 'icon-dsx',\r\n imports: [AsyncPipe],\r\n templateUrl: './icon-dsx.component.html',\r\n styleUrl: './icon-dsx.component.css',\r\n})\r\nexport class IconDsxComponent {\r\n name = input<string>('');\r\n style = input<'outlined' | 'rounded' | 'sharp'>('rounded');\r\n\r\n debug = input<boolean>(false);\r\n\r\n svg$!: Observable<SafeHtml>;\r\n\r\n private readonly instanceId = Math.random().toString(36).substring(2, 8);\r\n\r\n private effectRuns = 0;\r\n\r\n constructor(private iconService: IconDsxService) {\r\n effect(() => {\r\n this.effectRuns++;\r\n\r\n if (this.debug() && isDevMode()) {\r\n console.log(`[icon-dsx:${this.instanceId}] effect`, {\r\n runs: this.effectRuns,\r\n name: this.name(),\r\n style: this.style(),\r\n });\r\n }\r\n\r\n this.svg$ = this.iconService.getIcon(this.name(), this.style());\r\n });\r\n }\r\n}\r\n","<span class=\"dsx-icon\" [innerHTML]=\"svg$ | async\"></span>\r\n","// app-message-error.component.ts\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n DoCheck,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n} from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { IconDsxComponent } from '../icon-dsx/icon-dsx.component';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n standalone: true,\r\n imports: [TagModule, IconDsxComponent],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.css',\r\n})\r\nexport class AppMessageErrorComponent\r\n implements AfterViewInit, DoCheck, OnDestroy\r\n{\r\n private readonly defaultFloatLabelErrorSpace = '1.3rem';\r\n private readonly templateFloatLabelErrorSpace = '1.3rem';\r\n private readonly templateFloatLabelLongErrorSpace = '2.4rem';\r\n private readonly templateLongErrorThreshold = 165;\r\n\r\n private floatLabelElement: HTMLElement | null = null;\r\n private previousInlineMarginBottom = '';\r\n private lastAppliedVisibleState = false;\r\n private lastAppliedErrorSpace = '';\r\n\r\n private lastControlStatus: string = '';\r\n private lastControlTouched: boolean = false;\r\n private lastControlDirty: boolean = false;\r\n private lastErrorsCount: number = 0;\r\n\r\n // Control nativo de visualización en el DOM\r\n private isElementAttachedAndVisible = false;\r\n private observer: IntersectionObserver | null = null;\r\n\r\n private _control: AbstractControl | null | undefined = null;\r\n\r\n @Input() set control(nuevoControl: AbstractControl | null | undefined) {\r\n this._control = nuevoControl;\r\n\r\n // Solo inicializa estados e imprime logs si el componente REALMENTE se está usando en pantalla\r\n if (nuevoControl && this.isElementAttachedAndVisible) {\r\n this.lastControlStatus = nuevoControl.status;\r\n this.lastControlTouched = nuevoControl.touched;\r\n this.lastControlDirty = nuevoControl.dirty;\r\n this.lastErrorsCount = nuevoControl.errors\r\n ? Object.keys(nuevoControl.errors).length\r\n : 0;\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n '🚨 [ERROR-COMPONENT DEBUG] Control reactivo activado y visible en pantalla:',\r\n {\r\n status: nuevoControl.status,\r\n keys: nuevoControl.errors ? Object.keys(nuevoControl.errors) : [],\r\n fullErrors: nuevoControl.errors,\r\n },\r\n );\r\n }\r\n\r\n this.syncFloatLabelSpacing();\r\n }\r\n }\r\n\r\n get control(): AbstractControl | null | undefined {\r\n return this._control;\r\n }\r\n\r\n @Input() form: FormGroup | null = null;\r\n\r\n // 🎯 NUEVO INPUT PARA EL CONTROL DE DEPURACIÓN EN CONSOLA\r\n @Input() debugMode: boolean = false;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef<HTMLElement>,\r\n private readonly renderer: Renderer2,\r\n ) {}\r\n\r\n ngAfterViewInit(): void {\r\n this.floatLabelElement = this.elementRef.nativeElement.closest(\r\n '.p-floatlabel',\r\n ) as HTMLElement | null;\r\n\r\n if (this.floatLabelElement) {\r\n this.previousInlineMarginBottom =\r\n this.floatLabelElement.style.marginBottom;\r\n }\r\n\r\n // Detecta de forma nativa si el modal se abrió o cerró visualmente\r\n if (typeof window !== 'undefined' && 'IntersectionObserver' in window) {\r\n this.observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n this.isElementAttachedAndVisible = entry.isIntersecting;\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `👁️ [ERROR-COMPONENT DEBUG] Visibilidad cambiada por IntersectionObserver. ¿Está visible?: ${this.isElementAttachedAndVisible}`,\r\n );\r\n }\r\n\r\n if (this.isElementAttachedAndVisible && this.control) {\r\n this.syncFloatLabelSpacing();\r\n }\r\n });\r\n },\r\n { threshold: 0.1 },\r\n );\r\n\r\n this.observer.observe(this.elementRef.nativeElement);\r\n } else {\r\n this.isElementAttachedAndVisible = true;\r\n }\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Si el componente está oculto en el fondo, ignora por completo el ciclo de detección de cambios\r\n if (!this.control || !this.isElementAttachedAndVisible) return;\r\n\r\n const currentErrorsCount = this.control.errors\r\n ? Object.keys(this.control.errors).length\r\n : 0;\r\n\r\n if (\r\n this.control.status !== this.lastControlStatus ||\r\n this.control.touched !== this.lastControlTouched ||\r\n this.control.dirty !== this.lastControlDirty ||\r\n currentErrorsCount !== this.lastErrorsCount\r\n ) {\r\n if (this.debugMode) {\r\n console.log(\r\n '🔄 [ERROR-COMPONENT DEBUG] Cambio de estado interno detectado por ngDoCheck:',\r\n {\r\n statusAntes: this.lastControlStatus,\r\n statusAhora: this.control.status,\r\n erroresContados: currentErrorsCount,\r\n },\r\n );\r\n }\r\n\r\n this.lastControlStatus = this.control.status;\r\n this.lastControlTouched = this.control.touched;\r\n this.lastControlDirty = this.control.dirty;\r\n this.lastErrorsCount = currentErrorsCount;\r\n\r\n this.syncFloatLabelSpacing();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\r\n\r\n if (!this.floatLabelElement) return;\r\n\r\n if (this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n return;\r\n }\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n\r\n private syncFloatLabelSpacing(): void {\r\n if (!this.floatLabelElement || !this.isElementAttachedAndVisible) return;\r\n\r\n const isVisible = this.isControlErrorVisible();\r\n const desiredSpace = this.getFloatLabelErrorSpace();\r\n\r\n if (\r\n isVisible === this.lastAppliedVisibleState &&\r\n (!isVisible || desiredSpace === this.lastAppliedErrorSpace)\r\n ) {\r\n return;\r\n }\r\n\r\n this.lastAppliedVisibleState = isVisible;\r\n if (isVisible) {\r\n this.lastAppliedErrorSpace = desiredSpace;\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n desiredSpace,\r\n );\r\n return;\r\n }\r\n\r\n this.lastAppliedErrorSpace = '';\r\n\r\n if (this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n return;\r\n }\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n\r\n isControlErrorVisible(): boolean {\r\n if (\r\n !this.control ||\r\n !this.control.invalid ||\r\n !this.isElementAttachedAndVisible\r\n ) {\r\n return false;\r\n }\r\n return !!(this.control.touched || this.control.dirty);\r\n }\r\n\r\n private getFloatLabelErrorSpace(): string {\r\n const templateError =\r\n this.control?.errors?.['invalidTemplateVariables'] ||\r\n this.control?.errors?.['invalidTemplateStructure'];\r\n\r\n if (templateError) {\r\n const errorData = templateError as {\r\n message?: string;\r\n details?: string[];\r\n };\r\n const firstDetail = Array.isArray(errorData.details)\r\n ? (errorData.details[0] ?? '')\r\n : '';\r\n const messageLength = `${errorData.message ?? ''} ${firstDetail}`.trim()\r\n .length;\r\n\r\n return messageLength > this.templateLongErrorThreshold\r\n ? this.templateFloatLabelLongErrorSpace\r\n : this.templateFloatLabelErrorSpace;\r\n }\r\n\r\n return this.defaultFloatLabelErrorSpace;\r\n }\r\n\r\n formatNumber(value: unknown): string {\r\n const num = Number(value);\r\n if (isNaN(num)) return String(value ?? '');\r\n return num % 1 === 0 ? String(num) : parseFloat(num.toFixed(2)).toString();\r\n }\r\n}\r\n","<!-- app-message-error.component.html -->\r\n<div class=\"dsx-error-slot\" [class.is-visible]=\"isControlErrorVisible()\">\r\n <div class=\"dsx-error-message\">\r\n <div class=\"dsx-error-message-content\">\r\n <!-- 🎯 INYECTA ESTA LÍNEA TEMPORAL DE DEPURACIÓN AQUÍ -->\r\n <!-- <span\r\n style=\"\r\n color: blue;\r\n font-size: 10px;\r\n display: block;\r\n word-break: break-all;\r\n \"\r\n >\r\n DEBUG ERRORES: {{ control?.errors | json }}\r\n </span> -->\r\n\r\n <icon-dsx name=\"warning\"></icon-dsx>\r\n\r\n @if (control?.errors?.[\"required\"]) {\r\n El campo <strong>es requerido.</strong>\r\n } @else if (control?.errors?.[\"invalidNIT\"]) {\r\n <strong>{{ control?.errors?.[\"invalidNIT\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidCUI\"]) {\r\n <strong>{{ control?.errors?.[\"invalidCUI\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidDateRange\"]) {\r\n <strong>{{ control?.errors?.[\"invalidDateRange\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"dateNotRange\"]) {\r\n <strong>{{ control?.errors?.[\"dateNotRange\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidDate\"]) {\r\n <strong>{{ control?.errors?.[\"invalidDate\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"minimumAge\"]) {\r\n <strong>{{ control?.errors?.[\"minimumAge\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"minlength\"]) {\r\n Debe tener al menos\r\n <strong>{{ control?.errors?.[\"minlength\"]?.requiredLength }}</strong>\r\n caracteres.\r\n } @else if (control?.errors?.[\"maxlength\"]) {\r\n Debe tener como máximo\r\n <strong>{{ control?.errors?.[\"maxlength\"]?.requiredLength }}</strong>\r\n caracteres.\r\n } @else if (control?.errors?.[\"min\"]) {\r\n El valor mínimo permitido es\r\n <strong>{{ formatNumber(control?.errors?.[\"min\"]?.min) }}</strong>\r\n } @else if (control?.errors?.[\"max\"]) {\r\n El valor máximo permitido es\r\n <strong>{{ formatNumber(control?.errors?.[\"max\"]?.max) }}</strong>\r\n } @else if (control?.errors?.[\"email\"]) {\r\n Debe ser una dirección de correo válida.\r\n } @else if (control?.errors?.[\"pattern\"]) {\r\n El campo no tiene el formato requerido.\r\n } @else if (control?.errors?.[\"alreadyValueExists\"]) {\r\n <strong>{{ control?.errors?.[\"alreadyValueExists\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidTemplateVariables\"]) {\r\n <div class=\"dsx-template-error\">\r\n <strong>\r\n {{ control?.errors?.[\"invalidTemplateVariables\"]?.message }}\r\n </strong>\r\n @if (control?.errors?.[\"invalidTemplateVariables\"]?.details?.length) {\r\n <span class=\"dsx-template-error-detail\">\r\n {{ control?.errors?.[\"invalidTemplateVariables\"]?.details?.[0] }}\r\n </span>\r\n }\r\n </div>\r\n } @else if (control?.errors?.[\"invalidTemplateStructure\"]) {\r\n <div class=\"dsx-template-error\">\r\n <strong>\r\n {{ control?.errors?.[\"invalidTemplateStructure\"]?.message }}\r\n </strong>\r\n @if (control?.errors?.[\"invalidTemplateStructure\"]?.details?.length) {\r\n <span class=\"dsx-template-error-detail\">\r\n {{ control?.errors?.[\"invalidTemplateStructure\"]?.details?.[0] }}\r\n </span>\r\n }\r\n </div>\r\n } @else if (control?.errors?.[\"similitudDetectada\"]) {\r\n <!-- 🎯 Estructuración del mensaje con el nombre aislado en negrita -->\r\n Ya existe un registro muy similar en el sistema:\r\n <strong\r\n >\"{{ control?.errors?.[\"similitudDetectada\"]?.sugerencia }}\"</strong\r\n >.\r\n } @else {\r\n Existe un error aún no identificado.\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Mensaje para formulario en general (Cambiado form.touched por form.dirty para evitar falsos positivos al clicar el fondo) -->\r\n@if (form?.invalid && form?.dirty) {\r\n <div class=\"mt-2 mb-2\">\r\n @if (this.form?.errors?.[\"atLeastOneRequired\"]) {\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}\r\n </p-tag>\r\n }\r\n </div>\r\n}\r\n","export function limpiarTexto(texto: string): string {\r\n return texto\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '') // Elimina tildes y diacríticos\r\n .replace(/[.\\s]+/g, ' ') // Convierte puntos y múltiples espacios en un solo espacio\r\n .trim();\r\n}\r\n\r\nexport function calcularSimilitud(str1: string, str2: string): number {\r\n const s1 = limpiarTexto(str1);\r\n const s2 = limpiarTexto(str2);\r\n\r\n if (s1 === s2) return 1.0;\r\n if (s1.length < 2 || s2.length < 2) return 0.0;\r\n\r\n const getBigrams = (str: string) => {\r\n const bigrams = new Set<string>();\r\n for (let i = 0; i < str.length - 1; i++) {\r\n bigrams.add(str.substring(i, i + 2));\r\n }\r\n return bigrams;\r\n };\r\n\r\n const b1 = getBigrams(s1);\r\n const b2 = getBigrams(s2);\r\n\r\n let intersection = 0;\r\n b1.forEach((bigram) => {\r\n if (b2.has(bigram)) intersection++;\r\n });\r\n\r\n return (2.0 * intersection) / (b1.size + b2.size);\r\n}\r\n","// app-message-help.component.ts\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n DoCheck,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n} from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { isObservable, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n shareReplay,\r\n switchMap,\r\n} from 'rxjs/operators';\r\nimport {\r\n calcularSimilitud,\r\n limpiarTexto,\r\n} from '../../../models/src/similarity.util';\r\nimport { IconDsxComponent } from '../icon-dsx/icon-dsx.component';\r\n\r\n@Component({\r\n selector: 'dsx-message-help',\r\n templateUrl: './app-message-help.component.html',\r\n imports: [IconDsxComponent],\r\n styleUrl: './app-message-help.component.css',\r\n})\r\nexport class AppMessageHelpComponent\r\n implements AfterViewInit, DoCheck, OnDestroy\r\n{\r\n private readonly defaultFloatLabelHelpSpace = '1.6rem';\r\n private floatLabelElement: HTMLElement | null = null;\r\n private previousInlineMarginBottom = '';\r\n private lastAppliedVisibleState = false;\r\n\r\n private controlSubscription = new Subscription();\r\n private procesadorSubscription = new Subscription();\r\n private currentIdSubscription = new Subscription();\r\n\r\n private inputSubject$ = new Subject<string>();\r\n private currentIdSubject$ = new Subject<string | number | null>();\r\n protected sugerenciasDetectadas: Array<{ texto: string; similitud: number }> =\r\n [];\r\n private currentIdValue: string | number | null = null;\r\n private initialValidationDone = false; // 🔴 Evitar validación múltiple\r\n\r\n private _control: AbstractControl | null | undefined = null;\r\n private _currentIdControl: AbstractControl | null | undefined = null;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef<HTMLElement>,\r\n private readonly renderer: Renderer2,\r\n ) {\r\n this.inicializarProcesadorSimilitud();\r\n }\r\n\r\n @Input() set control(nuevoControl: AbstractControl | null | undefined) {\r\n this._control = nuevoControl;\r\n\r\n this.controlSubscription.unsubscribe();\r\n this.controlSubscription = new Subscription();\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n '🔄 [DSX-HELP DEBUG] El control cambió o fue reasignado por el Modal.',\r\n { hasControl: !!nuevoControl },\r\n );\r\n }\r\n\r\n if (this.helperFunction === 'similarity' && nuevoControl) {\r\n const valorInicial = nuevoControl.value;\r\n const textoInicial =\r\n valorInicial !== null && valorInicial !== undefined\r\n ? String(valorInicial).trim()\r\n : '';\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n '🚀 [DSX-HELP DEBUG] Evaluando valor inicial del control:',\r\n `\"${textoInicial}\"`,\r\n );\r\n }\r\n this.inputSubject$.next(textoInicial);\r\n\r\n this.controlSubscription.add(\r\n nuevoControl.valueChanges\r\n .pipe(debounceTime(350), distinctUntilChanged())\r\n .subscribe((value) => {\r\n if (this.debugMode) {\r\n console.log(\r\n '⌨️ [DSX-HELP DEBUG] Usuario escribiendo en el control ACTIVO:',\r\n value,\r\n );\r\n }\r\n const textoLimpio =\r\n value !== null && value !== undefined ? String(value).trim() : '';\r\n this.inputSubject$.next(textoLimpio);\r\n // 🔴 Resetear flag cuando el usuario escribe\r\n this.initialValidationDone = false;\r\n }),\r\n );\r\n }\r\n }\r\n\r\n get control(): AbstractControl | null | undefined {\r\n return this._control;\r\n }\r\n\r\n @Input() set currentIdControl(control: AbstractControl | null | undefined) {\r\n this._currentIdControl = control;\r\n\r\n this.currentIdSubscription.unsubscribe();\r\n this.currentIdSubscription = new Subscription();\r\n\r\n if (this.debugMode) {\r\n console.log('🆔 [DSX-HELP DEBUG] Control de ID configurado:', !!control);\r\n }\r\n\r\n if (control && this.helperFunction === 'similarity') {\r\n const idInicial = control.value;\r\n this.currentIdSubject$.next(idInicial);\r\n this.currentIdValue = idInicial;\r\n\r\n this.currentIdSubscription.add(\r\n control.valueChanges\r\n .pipe(debounceTime(100), distinctUntilChanged())\r\n .subscribe((id) => {\r\n if (this.debugMode) {\r\n console.log('🆔 [DSX-HELP DEBUG] ID actualizado:', id);\r\n }\r\n this.currentIdValue = id;\r\n this.currentIdSubject$.next(id);\r\n if (this.control?.value) {\r\n const textoActual = String(this.control.value).trim();\r\n this.inputSubject$.next(textoActual);\r\n }\r\n }),\r\n );\r\n }\r\n }\r\n\r\n get currentIdControl(): AbstractControl | null | undefined {\r\n return this._currentIdControl;\r\n }\r\n\r\n @Input() helperFunction: 'dateLong' | 'similarity' | string = 'dateLong';\r\n @Input() dataSource: any | any[] | Observable<any[]> | null | undefined =\r\n null;\r\n @Input() key?: string;\r\n @Input() umbral: number = 0.5;\r\n @Input() debugMode: boolean = false;\r\n @Input() idFieldName: string = 'id';\r\n @Input() maxSugerencias: number = 5;\r\n\r\n // 🔴 Método público para validación manual (opcional)\r\n public triggerValidation(): void {\r\n if (this.helperFunction === 'similarity' && this.control?.value) {\r\n const textoActual = String(this.control.value).trim();\r\n if (textoActual) {\r\n if (this.debugMode) {\r\n console.log('🎯 [DSX-HELP DEBUG] Validación manual:', textoActual);\r\n }\r\n this.inputSubject$.next(textoActual);\r\n }\r\n }\r\n }\r\n\r\n // 🔴 Validación inicial automática\r\n private triggerInitialValidation(): void {\r\n if (this.initialValidationDone) return;\r\n\r\n if (this.helperFunction === 'similarity' && this.control?.value) {\r\n const textoActual = String(this.control.value).trim();\r\n if (textoActual && this.sugerenciasDetectadas.length === 0) {\r\n if (this.debugMode) {\r\n console.log(\r\n '🎯 [DSX-HELP DEBUG] Validación inicial automática:',\r\n textoActual,\r\n );\r\n }\r\n this.inputSubject$.next(textoActual);\r\n this.initialValidationDone = true;\r\n }\r\n }\r\n }\r\n\r\n private obtenerIdDelItem(item: any): any {\r\n if (!item || typeof item !== 'object') return null;\r\n\r\n if (this.idFieldName && item[this.idFieldName] !== undefined) {\r\n return item[this.idFieldName];\r\n }\r\n\r\n const camposComunes = [\r\n 'id',\r\n 'ID',\r\n 'Id',\r\n 'requisitoId',\r\n 'categoriaId',\r\n 'productoId',\r\n 'userId',\r\n 'empresaId',\r\n ];\r\n for (const campo of camposComunes) {\r\n if (item[campo] !== undefined && item[campo] !== null) {\r\n if (this.debugMode) {\r\n console.log(\r\n `🔍 [DSX-HELP DEBUG] ID encontrado en campo: ${campo} = ${item[campo]}`,\r\n );\r\n }\r\n return item[campo];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private inicializarProcesadorSimilitud(): void {\r\n this.procesadorSubscription.add(\r\n this.inputSubject$\r\n .pipe(\r\n switchMap((textoIngresado) => {\r\n if (this.debugMode) {\r\n console.log(\r\n '🧪 [DSX-HELP DEBUG] Procesador activado para analizar:',\r\n `\"${textoIngresado}\"`,\r\n `ID actual: ${this.currentIdValue}`,\r\n `Tipo ID actual: ${typeof this.currentIdValue}`,\r\n );\r\n }\r\n\r\n if (!textoIngresado || textoIngresado.trim() === '') {\r\n if (this.debugMode)\r\n console.log(\r\n '⚠️ [DSX-HELP DEBUG] Texto vacío, limpiando sugerencia.',\r\n );\r\n return of([]);\r\n }\r\n\r\n if (!this.dataSource) {\r\n if (this.debugMode)\r\n console.log(\r\n '❌ [DSX-HELP DEBUG] dataSource es nulo o inválido.',\r\n );\r\n return of([]);\r\n }\r\n\r\n let data$: Observable<any>;\r\n\r\n if (typeof this.dataSource === 'function') {\r\n data$ = of((this.dataSource as Function)());\r\n } else if (isObservable(this.dataSource)) {\r\n // 🔴 Aplicar shareReplay para evitar múltiples suscripciones\r\n data$ = this.dataSource.pipe(shareReplay(1));\r\n } else {\r\n data$ = of(this.dataSource);\r\n }\r\n\r\n return data$.pipe(\r\n map((items) => {\r\n const coleccion: any[] = Array.isArray(items)\r\n ? items\r\n : (items && (items as any).data) || [];\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `📊 [DSX-HELP DEBUG] Total items en colección: ${coleccion.length}`,\r\n );\r\n if (this.currentIdValue) {\r\n const itemActual = coleccion.find((item) => {\r\n const itemId = this.obtenerIdDelItem(item);\r\n return (\r\n itemId && String(itemId) === String(this.currentIdValue)\r\n );\r\n });\r\n if (itemActual) {\r\n console.log(\r\n `✅ [DSX-HELP DEBUG] Item actual encontrado en colección:`,\r\n {\r\n id: this.obtenerIdDelItem(itemActual),\r\n [this.key || 'nombre']:\r\n itemActual[this.key || 'nombre'],\r\n },\r\n );\r\n } else {\r\n console.log(\r\n `⚠️ [DSX-HELP DEBUG] No se encontró el item con ID ${this.currentIdValue} en la colección`,\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (coleccion.length === 0) {\r\n if (this.debugMode)\r\n console.log(\r\n '⚠️ [DSX-HELP DEBUG] Colección vacía, esperando datos...',\r\n );\r\n return [];\r\n }\r\n\r\n let itemsAComparar = coleccion;\r\n\r\n if (this.currentIdValue) {\r\n itemsAComparar = coleccion.filter((item) => {\r\n if (!item || typeof item !== 'object') return true;\r\n const itemId = this.obtenerIdDelItem(item);\r\n const excluir =\r\n itemId && String(itemId) === String(this.currentIdValue);\r\n\r\n if (excluir && this.debugMode) {\r\n console.log(\r\n `🚫 [DSX-HELP DEBUG] Excluyendo item con ID ${itemId} de la comparación`,\r\n );\r\n }\r\n\r\n return !excluir;\r\n });\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `📊 [DSX-HELP DEBUG] Items después de filtrar: ${itemsAComparar.length} (excluido ID: ${this.currentIdValue})`,\r\n );\r\n }\r\n }\r\n\r\n const coincidencias = itemsAComparar\r\n .map((item) => {\r\n const textoAComparar =\r\n this.key && item && typeof item === 'object'\r\n ? item[this.key]\r\n : item;\r\n if (typeof textoAComparar !== 'string') return null;\r\n\r\n const porcentaje = calcularSimilitud(\r\n textoIngresado,\r\n textoAComparar,\r\n );\r\n\r\n if (this.debugMode && porcentaje >= this.umbral) {\r\n console.log(\r\n `🎯 [DSX-HELP DEBUG] Coincidencia encontrada! Comparando: In(\"${limpiarTexto(textoIngresado)}\") vs BD(\"${limpiarTexto(textoAComparar)}\") | Similitud: ${(porcentaje * 100).toFixed(1)}%`,\r\n );\r\n } else if (this.debugMode && porcentaje > 0) {\r\n console.log(\r\n `⚖️ [DSX-HELP DEBUG] Comparando: In(\"${limpiarTexto(textoIngresado)}\") vs BD(\"${limpiarTexto(textoAComparar)}\") | Similitud: ${(porcentaje * 100).toFixed(1)}%`,\r\n );\r\n }\r\n\r\n if (porcentaje >= this.umbral) {\r\n return {\r\n texto: this.key ? item[this.key] : item,\r\n similitud: porcentaje,\r\n };\r\n }\r\n return null;\r\n })\r\n .filter(\r\n (item): item is { texto: string; similitud: number } =>\r\n item !== null,\r\n )\r\n .sort((a, b) => b.similitud - a.similitud)\r\n .slice(0, this.maxSugerencias);\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `✅ [DSX-HELP DEBUG] Total coincidencias encontradas: ${coincidencias.length}`,\r\n );\r\n if (coincidencias.length > 0) {\r\n console.log(\r\n `📋 [DSX-HELP DEBUG] Coincidencias:`,\r\n coincidencias.map((c) => ({\r\n texto: c.texto,\r\n similitud: c.similitud,\r\n })),\r\n );\r\n }\r\n }\r\n\r\n return coincidencias;\r\n }),\r\n );\r\n }),\r\n )\r\n .subscribe((sugerencias) => {\r\n this.sugerenciasDetectadas = sugerencias;\r\n if (this.debugMode) {\r\n console.log(\r\n '🔄 [DSX-HELP DEBUG] Resultado asignado a la vista. Coincidencias encontradas:',\r\n sugerencias.length,\r\n );\r\n }\r\n this.syncFloatLabelSpacing();\r\n }),\r\n );\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.floatLabelElement = this.elementRef.nativeElement.closest(\r\n '.p-floatlabel',\r\n ) as HTMLElement | null;\r\n if (this.floatLabelElement) {\r\n this.previousInlineMarginBottom =\r\n this.floatLabelElement.style.marginBottom;\r\n this.syncFloatLabelSpacing();\r\n }\r\n\r\n // 🔴 Ejecutar validación inicial después de que la vista esté lista\r\n setTimeout(() => {\r\n this.triggerInitialValidation();\r\n }, 300);\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.syncFloatLabelSpacing();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.controlSubscription.unsubscribe();\r\n this.currentIdSubscription.unsubscribe();\r\n this.procesadorSubscription.unsubscribe();\r\n\r\n if (this.floatLabelElement && this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n } else if (this.floatLabelElement) {\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n }\r\n\r\n getHelpMessage(): string | null {\r\n if (this.helperFunction === 'dateLong') {\r\n return this.buildDateLongMessage();\r\n }\r\n if (\r\n this.helperFunction === 'similarity' &&\r\n this.sugerenciasDetectadas.length > 0\r\n ) {\r\n if (this.sugerenciasDetectadas.length === 1) {\r\n return `Existe una coincidencia: \"${this.sugerenciasDetectadas[0].texto}\". ¿Deseas agregarla de todos modos?`;\r\n } else {\r\n const listaCoincidencias = this.sugerenciasDetectadas\r\n .map((sug) => `\"${sug.texto}\"`)\r\n .join(', ');\r\n return `Existen ${this.sugerenciasDetectadas.length} coincidencias: ${listaCoincidencias}. ¿Deseas agregarla de todos modos?`;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n isHelpVisible(): boolean {\r\n if (!this.control) return false;\r\n if (this.helperFunction === 'dateLong') {\r\n if (this.control.disabled) return !!this.getHelpMessage();\r\n if (!this.control.valid) return false;\r\n return !!this.getHelpMessage();\r\n }\r\n if (this.helperFunction === 'similarity') {\r\n return this.sugerenciasDetectadas.length > 0;\r\n }\r\n return false;\r\n }\r\n\r\n private syncFloatLabelSpacing(): void {\r\n if (!this.floatLabelElement) return;\r\n const isVisible = this.isHelpVisible();\r\n if (isVisible === this.lastAppliedVisibleState) return;\r\n this.lastAppliedVisibleState = isVisible;\r\n\r\n if (isVisible) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.defaultFloatLabelHelpSpace,\r\n );\r\n } else if (this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n } else {\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n }\r\n\r\n private buildDateLongMessage(): string | null {\r\n const rawValue = this.getControlValue();\r\n if (!rawValue) return null;\r\n const date = this.parseDateInput(rawValue);\r\n if (!date) return null;\r\n\r\n const formattedDate = new Intl.DateTimeFormat('es-GT', {\r\n weekday: 'long',\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n }).format(date);\r\n\r\n return formattedDate.charAt(0).toUpperCase() + formattedDate.slice(1);\r\n }\r\n\r\n private getControlValue(): unknown {\r\n if (!this.control) return null;\r\n if (this.control.disabled && 'getRawValue' in this.control) {\r\n return (this.control as any).getRawValue();\r\n }\r\n return this.control.value;\r\n }\r\n\r\n private parseDateInput(value: unknown): Date | null {\r\n if (value instanceof Date)\r\n return Number.isNaN(value.getTime()) ? null : value;\r\n if (typeof value === 'string') {\r\n const ddmmyyyyMatch = value.match(/^(\\d{2})-(\\d{2})-(\\d{4})$/);\r\n if (ddmmyyyyMatch)\r\n return new Date(\r\n Number(ddmmyyyyMatch[3]),\r\n Number(ddmmyyyyMatch[2]) - 1,\r\n Number(ddmmyyyyMatch[1]),\r\n );\r\n const shortDateMatch = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (shortDateMatch)\r\n return new Date(\r\n Number(shortDateMatch[1]),\r\n Number(shortDateMatch[2]) - 1,\r\n Number(shortDateMatch[3]),\r\n );\r\n const parsedDate = new Date(value);\r\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\r\n }\r\n return null;\r\n }\r\n}\r\n","<div class=\"dsx-help-slot\" [class.is-visible]=\"isHelpVisible()\">\r\n @if (isHelpVisible()) {\r\n <div\r\n class=\"dsx-help-message\"\r\n [class.is-warning]=\"helperFunction === 'similarity'\"\r\n >\r\n @if (helperFunction === \"similarity\") {\r\n <icon-dsx name=\"emergency_home\"></icon-dsx>\r\n } @else {\r\n <icon-dsx name=\"chat_info\"></icon-dsx>\r\n }\r\n <span>{{ getHelpMessage() }}</span>\r\n </div>\r\n }\r\n</div>\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\n/**\r\n * Valores válidos para el tema de SweetAlert2.\r\n * Esta constante permite autocompletado y validación en tiempo de compilación.\r\n *\r\n * @example\r\n * ```typescript\r\n * // En environment.ts\r\n * export const environment: EnvironmentConfig = {\r\n * // ...otros campos\r\n * sweetAlertTheme: 'dark', // ✅ Autocompletado disponible\r\n * };\r\n * ```\r\n */\r\nexport const SWEET_ALERT_THEMES = [\r\n 'auto',\r\n 'light',\r\n 'dark',\r\n 'minimal',\r\n 'borderless',\r\n 'bootstrap-4',\r\n 'bootstrap-4-light',\r\n 'bootstrap-4-dark',\r\n 'bootstrap-5',\r\n 'bootstrap-5-light',\r\n 'bootstrap-5-dark',\r\n 'material-ui',\r\n 'material-ui-light',\r\n 'material-ui-dark',\r\n 'embed-iframe',\r\n 'bulma',\r\n 'bulma-light',\r\n 'bulma-dark',\r\n 'default',\r\n 'wordpress-admin',\r\n] as const;\r\n\r\n/**\r\n * Tipo literal para los temas válidos de SweetAlert2.\r\n * Se genera automáticamente desde la constante SWEET_ALERT_THEMES.\r\n */\r\nexport type SweetAlertThemeType = (typeof SWEET_ALERT_THEMES)[number];\r\n\r\n/**\r\n * Esquema de configuración del entorno - Fuente única de verdad (Single Source of Truth)\r\n *\r\n * Este objeto define todos los campos requeridos y sus tipos esperados para la configuración del entorno.\r\n * Sirve como referencia automática para:\r\n * - Generar el tipo TypeScript `EnvironmentConfig`\r\n * - Validar la presencia de campos requeridos\r\n * - Validar los tipos de datos en runtime\r\n * - Detectar automáticamente campos que requieren validación especial (URLs)\r\n *\r\n * **Cómo agregar una nueva propiedad:**\r\n * 1. Agrégala a este objeto con su tipo: 'string', 'boolean' o 'number'\r\n * 2. Todo lo demás se actualiza automáticamente (tipo TypeScript, validaciones, etc.)\r\n *\r\n * @example\r\n * ```typescript\r\n * const ENVIRONMENT_SCHEMA = {\r\n * production: 'boolean' as const,\r\n * myAppUrl: 'string' as const,\r\n * apiTimeout: 'number' as const, // ← Agregar nueva propiedad\r\n * } as const;\r\n * ```\r\n *\r\n * @internal\r\n */\r\nconst ENVIRONMENT_SCHEMA = {\r\n production: 'boolean' as const,\r\n myAppUrl: 'string' as const,\r\n SeguridadITApiUrl: 'string' as const,\r\n tokenName: 'string' as const,\r\n tokenPurpose: 'string' as const,\r\n tokenNameRF: 'string' as const,\r\n sessionStatus: 'string' as const,\r\n refreshTokenExpiry: 'string' as const,\r\n rolIndex: 'number' as const,\r\n} as const;\r\n\r\n/**\r\n * Tipo que define la configuración del entorno de la aplicación.\r\n *\r\n * Este tipo se genera automáticamente a partir de `ENVIRONMENT_SCHEMA` usando\r\n * TypeScript mapped types. No es necesario mantenerlo manualmente.\r\n *\r\n * **Características:**\r\n * - Se sincroniza automáticamente con ENVIRONMENT_SCHEMA\r\n * - Proporciona autocompletado en IDEs\r\n * - Garantiza type-safety en tiempo de compilación\r\n * - Se valida en runtime usando `provideEnvironment()`\r\n *\r\n * **Campos requeridos:**\r\n * @property production - Indica si la aplicación está en modo producción\r\n * @property myAppUrl - URL base de la aplicación principal (debe incluir protocolo http:// o https://)\r\n * @property SeguridadITApiUrl - URL base de la API de seguridad (debe incluir protocolo http:// o https://)\r\n * @property tokenName - Nombre del token de acceso en el almacenamiento local/sesión\r\n * @property tokenPurpose - Nombre del token de propósito para recursos sensibles\r\n * @property tokenNameRF - Nombre del refresh token en el almacenamiento local/sesión\r\n * @property sessionStatus - Nombre de la clave para el estado de sesión\r\n * @property refreshTokenExpiry - Tiempo de expiración del refresh token (ej: \"7d\", \"24h\")\r\n * @property rolIndex - Índice lógico (1-based) del rol principal asociado al entorno\r\n *\r\n * **Campos opcionales:**\r\n * @property sweetAlertTheme - Tema visual global para SweetAlert2 ('auto' | 'light' | 'dark' | 'default' | 'bootstrap-4' | 'borderless' | 'bulma' | 'material-ui' | 'minimal' | 'wordpress-admin')\r\n *\r\n * @example\r\n * ```typescript\r\n * // En tu archivo environment.ts\r\n * import { EnvironmentConfig } from '@devsoftxela/ngx-dsx';\r\n *\r\n * export const environment: EnvironmentConfig = {\r\n * production: false,\r\n * myAppUrl: 'http://localhost:4200/',\r\n * SeguridadITApiUrl: 'http://localhost:5000/',\r\n * tokenName: 'access_token',\r\n * tokenPurpose: 'token-Purpose',\r\n * tokenNameRF: 'refresh_token',\r\n * sessionStatus: 'session_status',\r\n * refreshTokenExpiry: '7d',\r\n * sweetAlertTheme: 'dark' // ← Tema global para alertas (opcional)\r\n * };\r\n * ```\r\n */\r\nexport type EnvironmentConfig = {\r\n [K in keyof typeof ENVIRONMENT_SCHEMA]: (typeof ENVIRONMENT_SCHEMA)[K] extends 'string'\r\n ? string\r\n : (typeof ENVIRONMENT_SCHEMA)[K] extends 'boolean'\r\n ? boolean\r\n : (typeof ENVIRONMENT_SCHEMA)[K] extends 'number'\r\n ? number\r\n : never;\r\n} & {\r\n /**\r\n * Tema visual global para las alertas SweetAlert2.\r\n * Es opcional. Si no se define, se usará el tema por defecto de SweetAlert2.\r\n *\r\n * Valores válidos: 'auto' | 'light' | 'dark' | 'default' | 'bootstrap-4' |\r\n * 'borderless' | 'bulma' | 'material-ui' | 'minimal' | 'wordpress-admin'\r\n *\r\n * @example\r\n * ```typescript\r\n * sweetAlertTheme: 'dark' // Tema oscuro\r\n * sweetAlertTheme: 'minimal' // Tema minimalista\r\n * sweetAlertTheme: 'auto' // Detecta según preferencias del sistema\r\n * ```\r\n */\r\n /**\r\n * Tema visual global para las alertas SweetAlert2.\r\n *\r\n * Se define como `SweetAlertThemeType` para que TypeScript emita un error\r\n * en tiempo de compilación cuando se utilice un valor no válido.\r\n *\r\n * Si por alguna razón necesitas permitir cadenas arbitrarias (no\r\n * recomendadas), utiliza `EnvironmentConfigLenient` exportado más abajo.\r\n */\r\n sweetAlertTheme?: SweetAlertThemeType;\r\n sweetAlertFooter?: string;\r\n /**\r\n * Controla el comportamiento global al guardar un registro nuevo (id === 0)\r\n * en utilidades como `handleResponseService`.\r\n *\r\n * - true: al éxito, navega automáticamente al listado (`urlHome`).\r\n * - false: permanece en la vista actual y ejecuta `getForm()` + `form.reset()`.\r\n *\r\n * Puede sobrescribirse por llamada usando el parámetro opcional\r\n * `navigateOnCreateSuccess` en `handleResponseService`.\r\n */\r\n navigateToListOnCreateSuccess?: boolean;\r\n /**\r\n * Control global para mostrar el botón de tipo `validate` (Validar).\r\n *\r\n * - false: oculta el botón por defecto.\r\n * - true: muestra el botón en toda la aplicación.\r\n *\r\n * Puede sobrescribirse por instancia desde `dsx-button` con\r\n * `showValidateButtonOverride`.\r\n */\r\n showValidateButton?: boolean;\r\n /**\r\n * Control global para mostrar el botón de tipo `restore` (Restaurar).\r\n *\r\n * - false: oculta el botón por defecto.\r\n * - true: muestra el botón en toda la aplicación.\r\n *\r\n * Puede sobrescribirse por instancia desde `dsx-button` con\r\n * `showRestoreButtonOverride`.\r\n */\r\n showRestoreButton?: boolean;\r\n /**\r\n * Control global para mostrar el mensaje toast al invalidar cache.\r\n *\r\n * - false: no muestra toast al ejecutar `cacheService.invalidate(...)`.\r\n * - true: muestra toast por defecto al invalidar cache.\r\n *\r\n * Puede sobrescribirse por llamada con el parámetro opcional\r\n * `showUpdatedCacheMessage` de `cacheService.invalidate(...)`.\r\n */\r\n showUpdatedCacheMessage?: boolean;\r\n /**\r\n * Lista de roles que se utilizan para las guardas de rutas.\r\n * Debe ser un arreglo no vacío de strings.\r\n */\r\n rolesGuards: string[];\r\n /**\r\n * Dominio compartido para cookies entre subdominios en ambientes locales.\r\n * Es opcional y solo necesario en ambientes locales sin certificado.\r\n *\r\n * **Formato requerido:**\r\n * - Debe empezar con un punto (.)\r\n * - Debe tener al menos dos partes separadas por puntos\r\n * - Solo caracteres alfanuméricos, puntos y guiones\r\n *\r\n * **Ejemplos válidos:**\r\n * - `.inalsa.local` → cookies compartidas entre `rrhh.inalsa.local`, `venta.inalsa.local`, etc.\r\n * - `.express.local` → cookies compartidas entre `app2.express.local`, `app3.express.local`, etc.\r\n * - `.example.com` → cookies compartidas en ambiente local con dominio personalizado\r\n *\r\n * **Ejemplos inválidos:**\r\n * - `inalsa.local` ❌ (falta el punto inicial)\r\n * - `.inalsa` ❌ (necesita al menos dos partes)\r\n * - `. inalsa.local` ❌ (contiene espacios)\r\n *\r\n * **Comportamiento:**\r\n * - Se valida automáticamente al iniciar la aplicación con `provideEnvironment()`\r\n * - En ambiente HTTPS público sin `cookieDomain`, se usa automáticamente `.itgtxela.com`\r\n * - Si no está configurado en ambiente local, las cookies no se compartirán entre subdominios\r\n *\r\n * @example\r\n * ```typescript\r\n * // En environment.ts (ambiente local)\r\n * export const environment: EnvironmentConfig = {\r\n * production: true,\r\n * cookieDomain: '.inalsa.local', // ✅ Válido\r\n * // ... otros campos\r\n * };\r\n *\r\n * // En environment.prod.ts (HTTPS público)\r\n * export const environment: EnvironmentConfig = {\r\n * production: true,\r\n * // Sin cookieDomain → usa automáticamente .itgtxela.com\r\n * // ... otros campos\r\n * };\r\n * ```\r\n *\r\n * @throws Error si el formato es inválido durante la validación del environment\r\n */\r\n cookieDomain?: string;\r\n};\r\n\r\n/**\r\n * Variante leniente del tipo `EnvironmentConfig` que permite strings\r\n * arbitrarios en `sweetAlertTheme` (mantiene compatibilidad hacia atrás).\r\n *\r\n * Úsalo solo si realmente necesitas pasar valores no listados en\r\n * `SWEET_ALERT_THEMES` y entiendes que no habrá chequeo estático.\r\n */\r\nexport type EnvironmentConfigLenient = Omit<\r\n EnvironmentConfig,\r\n 'sweetAlertTheme'\r\n> & {\r\n sweetAlertTheme?: SweetAlertThemeType | (string & {});\r\n};\r\n\r\n/**\r\n * Token de inyección de dependencias para la configuración del entorno.\r\n *\r\n * Este token se utiliza para inyectar la configuración del entorno en servicios y componentes.\r\n * **IMPORTANTE:** No uses este token directamente en providers. En su lugar, usa la función\r\n * `provideEnvironment()` que incluye validación automática.\r\n *\r\n * @example\r\n * ```typescript\r\n * // ✅ Forma correcta - En tu configuración de app\r\n * import { provideEnvironment } from '@devsoftxela/ngx-dsx';\r\n * import { environment } from './environments/environment';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideEnvironment(environment), // ← Con validación automática\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // ✅ Forma correcta - Inyectar en servicios\r\n * import { inject } from '@angular/core';\r\n * import { ENVIRONMENT, EnvironmentConfig } from '@devsoftxela/ngx-dsx';\r\n *\r\n * export class MiServicio {\r\n * private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // ❌ Forma incorrecta - Sin validación\r\n * providers: [\r\n * { provide: ENVIRONMENT, useValue: environment } // ← Sin validación\r\n * ]\r\n * ```\r\n *\r\n * @see {@link provideEnvironment} para configurar con validación\r\n * @see {@link EnvironmentConfig} para la estructura de datos\r\n */\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig',\r\n);\r\n\r\n/**\r\n * Valida que la configuración del entorno esté completa y correctamente configurada.\r\n *\r\n * Esta función verifica que:\r\n * - La configuración del entorno no sea null o undefined\r\n * - Todas las propiedades requeridas estén presentes y no estén vacías\r\n * - Las URLs tengan un formato válido\r\n *\r\n * @param environment - Configuración del entorno a validar\r\n * @throws Error si alguna validación falla, con un mensaje descriptivo del problema\r\n *\r\n * @example\r\n * ```typescript\r\n * const config: EnvironmentConfig = { ... };\r\n * validateEnvironmentConfig(config);\r\n * ```\r\n */\r\nexport function validateEnvironmentConfig(\r\n environment: EnvironmentConfig,\r\n): void {\r\n if (!environment) {\r\n throw new Error(\r\n '[ENVIRONMENT] La configuración del entorno no está definida. ' +\r\n 'Asegúrate de proporcionar una configuración válida usando provideEnvironment().',\r\n );\r\n }\r\n\r\n // Obtener automáticamente todos los campos requeridos del schema\r\n // Usamos keyof typeof ENVIRONMENT_SCHEMA para solo validar campos del schema base\r\n const requiredFields = Object.keys(\r\n ENVIRONMENT_SCHEMA,\r\n ) as (keyof typeof ENVIRONMENT_SCHEMA)[];\r\n\r\n const missingFields: string[] = [];\r\n const emptyFields: string[] = [];\r\n const wrongTypeFields: string[] = [];\r\n\r\n // Validar que todos los campos requeridos existan, no estén vacíos y tengan el tipo correcto\r\n requiredFields.forEach((field) => {\r\n const expectedType = ENVIRONMENT_SCHEMA[field];\r\n\r\n if (!(field in environment)) {\r\n missingFields.push(field);\r\n } else if (\r\n environment[field] === null ||\r\n environment[field] === undefined\r\n ) {\r\n emptyFields.push(field);\r\n } else {\r\n // Validar tipo de dato\r\n const actualType = typeof environment[field];\r\n if (actualType !== expectedType) {\r\n wrongTypeFields.push(\r\n `${field} (esperado: ${expectedType}, recibido: ${actualType})`,\r\n );\r\n }\r\n\r\n // Validar que strings no estén vacíos\r\n if (\r\n expectedType === 'string' &&\r\n typeof environment[field] === 'string' &&\r\n (environment[field] as string).trim() === ''\r\n ) {\r\n emptyFields.push(field);\r\n }\r\n }\r\n });\r\n\r\n // Reportar campos faltantes\r\n if (missingFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Faltan los siguientes campos en la configuración del entorno: ${missingFields.join(\r\n ', ',\r\n )}. ` + 'Por favor, verifica tu configuración de environment.',\r\n );\r\n }\r\n\r\n // Reportar campos vacíos\r\n if (emptyFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Los siguientes campos están vacíos en la configuración del entorno: ${emptyFields.join(\r\n ', ',\r\n )}. ` + 'Por favor, proporciona valores válidos para estos campos.',\r\n );\r\n }\r\n\r\n // Reportar campos con tipo incorrecto\r\n if (wrongTypeFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Los siguientes campos tienen un tipo de dato incorrecto: ${wrongTypeFields.join(\r\n ', ',\r\n )}. ` + 'Por favor, corrige los tipos de datos.',\r\n );\r\n }\r\n\r\n // Validar formato de URLs (solo para campos que contengan 'url' en su nombre)\r\n requiredFields.forEach((field) => {\r\n if (\r\n field.toLowerCase().includes('url') &&\r\n typeof environment[field] === 'string'\r\n ) {\r\n validateUrl(field as string, environment[field] as string);\r\n }\r\n });\r\n\r\n // Validar rolesGuards\r\n if (\r\n !Array.isArray(environment.rolesGuards) ||\r\n environment.rolesGuards.length === 0 ||\r\n !environment.rolesGuards.every(\r\n (r) => typeof r === 'string' && r.trim().length > 0,\r\n )\r\n ) {\r\n throw new Error(\r\n \"[ENVIRONMENT] El campo 'rolesGuards' debe ser un arreglo no vacío de cadenas de texto válidas.\",\r\n );\r\n }\r\n\r\n // Validar sweetAlertTheme si está definido: emitir warning y usar tema por defecto si es inválido\r\n if (\r\n environment.sweetAlertTheme !== undefined &&\r\n typeof environment.sweetAlertTheme === 'string'\r\n ) {\r\n const allowedThemes = SWEET_ALERT_THEMES as readonly string[];\r\n if (!allowedThemes.includes(environment.sweetAlertTheme)) {\r\n console.warn(\r\n `[ENVIRONMENT] Valor no reconocido para 'sweetAlertTheme': '${environment.sweetAlertTheme}'. Temas válidos: ${allowedThemes.join(\r\n ', ',\r\n )}. Se usará el tema por defecto de SweetAlert2.`,\r\n );\r\n }\r\n }\r\n\r\n // Validar cookieDomain si está definido\r\n if (environment.cookieDomain !== undefined) {\r\n validateCookieDomain(environment.cookieDomain);\r\n }\r\n\r\n // Validar showUpdatedCacheMessage si está definido\r\n if (\r\n environment.showUpdatedCacheMessage !== undefined &&\r\n typeof environment.showUpdatedCacheMessage !== 'boolean'\r\n ) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'showUpdatedCacheMessage' debe ser boolean. ` +\r\n `Tipo recibido: ${typeof environment.showUpdatedCacheMessage}.`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Valida que cookieDomain tenga un formato correcto para cookies.\r\n *\r\n * Reglas de validación:\r\n * - Debe ser un string no vacío\r\n * - Debe empezar con un punto (.)\r\n * - No puede contener espacios en blanco\r\n * - Solo puede contener caracteres alfanuméricos, puntos y guiones\r\n * - Debe tener al menos dos partes separadas por puntos (ej: .inalsa.local)\r\n *\r\n * Ejemplos válidos:\r\n * - `.inalsa.local`\r\n * - `.express.local`\r\n * - `.example.com`\r\n * - `.site.co.uk`\r\n *\r\n * Ejemplos inválidos:\r\n * - `inalsa.local` (falta el punto inicial)\r\n * - `.inalsa` (necesita al menos dos partes)\r\n * - `. inalsa.local` (contiene espacios)\r\n * - `.inalsa..local` (puntos consecutivos)\r\n *\r\n * @param cookieDomain - Dominio a validar\r\n * @throws Error si el dominio tiene un formato inválido\r\n */\r\nfunction validateCookieDomain(cookieDomain: unknown): void {\r\n // Validar tipo de dato\r\n if (typeof cookieDomain !== 'string') {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' debe ser una cadena de texto. ` +\r\n `Tipo recibido: ${typeof cookieDomain}. Valor: ${cookieDomain}`,\r\n );\r\n }\r\n\r\n const domain = cookieDomain.trim();\r\n\r\n // Validar que no esté vacío\r\n if (domain.length === 0) {\r\n throw new Error(\r\n \"[ENVIRONMENT] El campo 'cookieDomain' no puede estar vacío. \" +\r\n 'Si no necesitas un dominio compartido, omite este campo.',\r\n );\r\n }\r\n\r\n // Validar que empiece con un punto\r\n if (!domain.startsWith('.')) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' debe empezar con un punto (.). ` +\r\n `Valor inválido: '${domain}'. ` +\r\n \"Ejemplo correcto: '.inalsa.local'\",\r\n );\r\n }\r\n\r\n // Validar que no contenga espacios\r\n if (/\\s/.test(domain)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' no puede contener espacios en blanco. ` +\r\n `Valor inválido: '${domain}'`,\r\n );\r\n }\r\n\r\n // Validar caracteres permitidos: alfanuméricos, puntos y guiones\r\n if (!/^(\\.[a-zA-Z0-9-]+)+$/.test(domain)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' contiene caracteres no permitidos. ` +\r\n `Valor inválido: '${domain}'. ` +\r\n 'Solo se permiten caracteres alfanuméricos, puntos (.) y guiones (-). ' +\r\n \"Ejemplo correcto: '.inalsa.local'\",\r\n );\r\n }\r\n\r\n // Validar que tenga al menos dos partes (ej: .inalsa.local)\r\n const parts = domain.split('.').filter((part) => part.length > 0);\r\n if (parts.length < 2) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' debe tener al menos dos partes separadas por puntos. ` +\r\n `Valor inválido: '${domain}'. ` +\r\n \"Ejemplos correctos: '.inalsa.local', '.express.local'\",\r\n );\r\n }\r\n\r\n // Validar que no haya puntos consecutivos\r\n if (domain.includes('..')) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' no puede tener puntos consecutivos. ` +\r\n `Valor inválido: '${domain}'. ` +\r\n \"Ejemplo correcto: '.inalsa.local'\",\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Valida que una URL tenga un formato válido.\r\n * Permite tanto URLs absolutas (http://..., https://...) como rutas relativas (/, /api, etc.).\r\n *\r\n * @param fieldName - Nombre del campo para mensajes de error\r\n * @param url - URL a validar\r\n * @throws Error si la URL no tiene un formato válido\r\n */\r\nfunction validateUrl(fieldName: string, url: string): void {\r\n // Patrón para rutas relativas (comienzan con /)\r\n const relativePathPattern = /^\\/[^/]*/;\r\n\r\n // Si es una ruta relativa, solo validar que sea válida\r\n if (relativePathPattern.test(url)) {\r\n // Validar que la URL termine con '/' para evitar problemas de concatenación\r\n if (!url.endsWith('/')) {\r\n console.warn(\r\n `[ENVIRONMENT] Advertencia: El campo '${fieldName}' no termina con '/'. ` +\r\n `Valor actual: '${url}'. Se recomienda que las URLs base terminen con '/' para evitar problemas de concatenación.`,\r\n );\r\n }\r\n return; // La ruta relativa es válida\r\n }\r\n\r\n // Si no es una ruta relativa, debe ser una URL absoluta\r\n try {\r\n // Intentar crear un objeto URL para validar el formato\r\n new URL(url);\r\n } catch {\r\n // Si falla, verificar si al menos tiene un formato básico válido\r\n const urlPattern = /^https?:\\/\\/.+/;\r\n if (!urlPattern.test(url)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo '${fieldName}' no tiene un formato de URL válido. ` +\r\n `Valor actual: '${url}'. Debe ser una URL absoluta (http://... o https://...) o una ruta relativa que comience con /`,\r\n );\r\n }\r\n }\r\n\r\n // Validar que la URL termine con '/' para evitar problemas de concatenación\r\n if (!url.endsWith('/')) {\r\n console.warn(\r\n `[ENVIRONMENT] Advertencia: El campo '${fieldName}' no termina con '/'. ` +\r\n `Valor actual: '${url}'. Se recomienda que las URLs base terminen con '/' para evitar problemas de concatenación.`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Proporciona una configuración de entorno validada para la inyección de dependencias.\r\n *\r\n * Esta función crea un provider que valida automáticamente la configuración del entorno\r\n * cuando la aplicación se inicializa. Si la configuración es inválida, lanza un error\r\n * descriptivo que indica qué está mal configurado.\r\n *\r\n * @param environment - Configuración del entorno a proporcionar\r\n * @returns Provider de Angular configurado con la validación integrada\r\n *\r\n * @example\r\n * ```typescript\r\n * // En app.config.ts o main.ts\r\n * import { provideEnvironment } from './path/to/environment.token';\r\n * import { environment } from './environments/environment';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideEnvironment(environment),\r\n * // ... otros providers\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Para módulos (NgModule)\r\n * import { provideEnvironment } from './path/to/environment.token';\r\n * import { environment } from './environments/environment';\r\n *\r\n * @NgModule({\r\n * providers: [\r\n * provideEnvironment(environment),\r\n * // ... otros providers\r\n * ]\r\n * })\r\n * export class AppModule { }\r\n * ```\r\n */\r\nexport function provideEnvironment(environment: EnvironmentConfig): Provider {\r\n return {\r\n provide: ENVIRONMENT,\r\n useFactory: () => {\r\n // Validar la configuración al momento de la inyección\r\n validateEnvironmentConfig(environment);\r\n return environment;\r\n },\r\n };\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/parameterSecurity.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\r\n);\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { ServiceResult } from '../../models';\r\nimport { SeguridadITParameter } from '../../models/src/parameterSecurity.model';\r\nimport { DataLoginModel, DataToken } from '../../models/src/token.model';\r\n\r\n/**\r\n * Servicio de seguridad que gestiona la autenticación y autorización mediante tokens JWT.\r\n *\r\n * Este servicio proporciona métodos para:\r\n * - Refrescar tokens de acceso\r\n * - Revocar tokens de refresco\r\n * - Obtener parámetros de seguridad\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private securityService: SecurityService) {}\r\n *\r\n * refreshToken() {\r\n * this.securityService.tokenRefresh(this.refreshToken)\r\n * .subscribe(data => console.log(data));\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n /** Servicio HttpClient para realizar peticiones HTTP */\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Configuración del entorno inyectada mediante el token ENVIRONMENT.\r\n * La validación se realiza automáticamente al usar provideEnvironment().\r\n */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /** URL base de la API JWT construida desde la configuración del entorno */\r\n private urlApi: string = `${this.environment.myAppUrl}api/parameter`;\r\n private SeguridadITApiJwt: string = `${this.environment.SeguridadITApiUrl}api/jwt`;\r\n private SeguridadITApiJwtSensitiveData: string = `${this.environment.SeguridadITApiUrl}api/jwtSensitiveData`;\r\n\r\n /**\r\n * Obtiene un nuevo token de acceso utilizando un refresh token válido.\r\n *\r\n * Este método envía una solicitud POST al endpoint de refresco de token\r\n * y devuelve un nuevo par de tokens (access token y refresh token).\r\n *\r\n * @param refreshToken - El refresh token válido para obtener un nuevo token de acceso\r\n * @returns Observable que emite un objeto DataToken con el nuevo par de tokens\r\n *\r\n * @example\r\n * ```typescript\r\n * this.securityService.tokenRefresh('your-refresh-token')\r\n * .subscribe({\r\n * next: (data) => console.log('Nuevo token:', data.accessToken),\r\n * error: (err) => console.error('Error al refrescar token:', err)\r\n * });\r\n * ```\r\n */\r\n tokenRefresh(refreshToken: string): Observable<ServiceResult<DataToken>> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.post<ServiceResult<DataToken>>(\r\n `${this.SeguridadITApiJwt}/refresh-token/`,\r\n body,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Revoca un refresh token para invalidarlo y prevenir su uso futuro.\r\n *\r\n * Este método envía una solicitud POST al endpoint de revocación de token\r\n * para invalidar permanentemente el refresh token proporcionado.\r\n *\r\n * @param refreshToken - El refresh token que se desea revocar\r\n * @returns Observable que emite true si la revocación fue exitosa, false en caso contrario\r\n *\r\n * @example\r\n * ```typescript\r\n * this.securityService.tokenRevok('your-refresh-token')\r\n * .subscribe({\r\n * next: (success) => {\r\n * if (success) console.log('Token revocado exitosamente');\r\n * },\r\n * error: (err) => console.error('Error al revocar token:', err)\r\n * });\r\n * ```\r\n */\r\n tokenRevok(refreshToken: string): Observable<boolean> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n // Realiza una solicitud POST al endpoint de revocación de token\r\n return this.http.post<boolean>(\r\n `${this.SeguridadITApiJwt}/revoke-token/`,\r\n body,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n },\r\n );\r\n }\r\n\r\n /**\r\n *\r\n * @param credencial\r\n * @returns\r\n */\r\n tokenPurposeGenerate(\r\n credencial: DataLoginModel,\r\n ): Observable<ServiceResult<DataToken>> {\r\n return this.http.post<ServiceResult<DataToken>>(\r\n `${this.SeguridadITApiJwtSensitiveData}/token-purpose/`,\r\n credencial,\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene los parámetros de seguridad de la aplicación desde el servidor.\r\n *\r\n * Este método recupera la configuración de seguridad que incluye políticas de contraseñas,\r\n * tiempos de expiración de sesión, y otras configuraciones relacionadas con la seguridad.\r\n *\r\n * @param invalidCacheParam - Indica si se debe invalidar la caché del servidor.\r\n * Si es true, fuerza al servidor a devolver los datos más recientes\r\n * sin usar la caché. Por defecto es false.\r\n * @returns Observable que emite un objeto SeguridadITParameter con la configuración de seguridad\r\n *\r\n * @example\r\n * ```typescript\r\n * // Obtener parámetros usando caché\r\n * this.securityService.getParameterSecurity()\r\n * .subscribe(params => console.log('Parámetros:', params));\r\n *\r\n * // Obtener parámetros sin usar caché\r\n * this.securityService.getParameterSecurity(true)\r\n * .subscribe(params => console.log('Parámetros actualizados:', params));\r\n * ```\r\n */\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false,\r\n ): Observable<ServiceResult<SeguridadITParameter>> {\r\n // Crea los parámetros de la solicitud, incluyendo el parámetro invalidCacheParam,\r\n // parametro diseñado para invalidar la caché a traves del filtro\r\n const params = new HttpParams().set(\r\n 'invalidCacheParam',\r\n invalidCacheParam.toString(),\r\n );\r\n\r\n // Realiza una solicitud GET al endpoint de parámetros de seguridad\r\n return this.http.get<ServiceResult<SeguridadITParameter>>(\r\n `${this.urlApi}/security-parameter/`,\r\n { params },\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertResult,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport {\r\n ENVIRONMENT,\r\n SWEET_ALERT_THEMES,\r\n} from '../../injections/environment.token';\r\nimport { ResponseHttpModel } from '../../models/src/response-http.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n icono?: string;\r\n icon?: SweetAlertIcon;\r\n showConfirmButton?: boolean;\r\n confirmButtonText?: string;\r\n timer?: number;\r\n imageWidth?: number;\r\n imageHeight?: number;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private toastrService = inject(ToastrService);\r\n\r\n /**\r\n * Configuración del entorno inyectada (opcional).\r\n * Se usa para obtener el tema global de SweetAlert2 desde el environment.\r\n */\r\n private environment = inject(ENVIRONMENT, { optional: true });\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Se inicializa desde el environment si está configurado, o puede establecerse\r\n * manualmente llamando a setDefaultTheme().\r\n *\r\n * **Prioridad de temas:**\r\n * 1. Tema específico pasado en options de cada alerta\r\n * 2. Tema establecido con setDefaultTheme()\r\n * 3. Tema configurado en environment.sweetAlertTheme\r\n * 4. Tema por defecto de SweetAlert2\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n constructor() {\r\n // Inicializar el tema desde el environment si está disponible\r\n if (this.environment?.sweetAlertTheme) {\r\n const allowed = SWEET_ALERT_THEMES as readonly string[];\r\n const themeValue = this.environment.sweetAlertTheme;\r\n if (typeof themeValue === 'string' && !allowed.includes(themeValue)) {\r\n console.warn(\r\n `[AlertaService] Tema de SweetAlert2 inválido: '${themeValue}'. Se utilizará el tema por defecto.`,\r\n );\r\n } else {\r\n this.defaultTheme = themeValue as SweetAlertTheme;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Permite establecer el theme global para todas las alertas SweetAlert2.\r\n * Este tema sobrescribe el configurado en el environment.\r\n *\r\n * @param theme - Valor de theme válido para SweetAlert2 (por ejemplo: 'dark', 'minimal', etc).\r\n *\r\n * @example\r\n * ```typescript\r\n * // Cambiar el tema en tiempo de ejecución\r\n * alertaService.setDefaultTheme('dark');\r\n * ```\r\n */\r\n setDefaultTheme(theme: SweetAlertTheme) {\r\n this.defaultTheme = theme;\r\n }\r\n\r\n /**\r\n * Obtiene el tema actual configurado para SweetAlert2.\r\n * @returns El tema actual o undefined si no hay tema configurado.\r\n */\r\n getDefaultTheme(): SweetAlertTheme | undefined {\r\n return this.defaultTheme;\r\n }\r\n\r\n /**\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 4. bottom-center 5. bottom-right\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000,\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign,\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n /**\r\n * Muestra un diálogo de confirmación con SweetAlert2, espera la respuesta del usuario\r\n * y retorna `true` si confirmó o `false` si canceló/cerró.\r\n *\r\n * La imagen se precarga antes de mostrar el diálogo para evitar un parpadeo visual.\r\n *\r\n * @param title - Título principal del diálogo.\r\n * @param text - Cuerpo del mensaje; admite HTML (se inyecta como `html`).\r\n * @param icono - Ruta relativa de la imagen dentro de `assets/dsxResource/`.\r\n * Por defecto: `'icon2/garbage_make_empty_001.png'`.\r\n * @returns `Promise<boolean>` que resuelve en `true` si el usuario pulsó **Aceptar**,\r\n * o en `false` si pulsó **Cancelar** o cerró el diálogo.\r\n *\r\n * @example\r\n * // Uso con icono por defecto (papelera)\r\n * const confirmado = await this.alertaService.alertConfirm(\r\n * 'Eliminar',\r\n * 'Desea <strong>eliminar</strong> este registro?',\r\n * );\r\n *\r\n * @example\r\n * // Sobreescribir el icono pasando la ruta como tercer argumento\r\n * // La ruta es relativa a assets/dsxResource/\r\n * const confirmado = await this.alertaService.alertConfirm(\r\n * 'Archivar',\r\n * 'Desea <strong>archivar</strong> este registro?',\r\n * 'icon2/archive_001.png', // ← icono personalizado\r\n * );\r\n * @deprecated Este servicio sera sustuido\r\n */\r\n alertConfirm(\r\n title: string,\r\n text: string,\r\n icono: string = 'icon2/garbage_make_empty_001.png',\r\n ): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: `<strong>DEVSoftXela</strong> ${new Date().getFullYear()}`,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed),\r\n );\r\n }\r\n\r\n /**\r\n * Muestra una alerta de confirmación estándar para guardar o actualizar un registro.\r\n *\r\n * @param isNew - Indica si se trata de un nuevo registro (true = \"Salvar\", false = \"Actualizar\").\r\n * @returns Promise<boolean> que indica si el usuario confirmó la acción.\r\n */\r\n alertConfirmSaveOrUpdate(isNew: boolean): Promise<boolean> {\r\n const title = isNew ? 'Salvar' : 'Actualizar';\r\n const text = 'Desea <strong>guardar</strong> el registro?';\r\n const icono = 'icon2/save_2029637.png';\r\n return this.alertConfirm(title, text, icono);\r\n }\r\n\r\n /**\r\n * Variante de alerta de confirmación que recibe el id numérico del registro.\r\n *\r\n * Internamente evalúa si el registro es nuevo (`id === 0`) y delega en\r\n * alertConfirmSaveOrUpdate(isNew: boolean) para mostrar el mensaje.\r\n *\r\n * @param id - Identificador del registro. Se considera nuevo cuando `id === 0`.\r\n * @returns Promise<boolean> que indica si el usuario confirmó la acción.\r\n */\r\n alertConfirmSaveOrUpdateById(id: number): Promise<boolean> {\r\n const isNew = id === 0;\r\n return this.alertConfirmSaveOrUpdate(isNew);\r\n }\r\n\r\n /**\r\n * Muestra una alerta de confirmación estándar para eliminar, borrar (soft delete) o restaurar un registro.\r\n *\r\n * - Si se pasa un objeto con la propiedad `activo === false`, el mensaje se personaliza para \"Restaurar\".\r\n * - Si `activo` es true o no se envía, el comportamiento es el mismo de antes (Eliminar/Borrar según `softDelete`).\r\n *\r\n * @param softDelete - Si es true se muestra mensaje de borrado lógico, si es false eliminación definitiva.\r\n * @param data - Objeto opcional que puede incluir la propiedad `activo`. Si `activo === false` se mostrará un mensaje de restaurar.\r\n * @returns Promise<boolean> que indica si el usuario confirmó la acción.\r\n */\r\n alertConfirmDelete(\r\n softDelete: boolean,\r\n data?: { activo?: boolean },\r\n ): Promise<boolean> {\r\n const isActive = data?.activo; // true | false | undefined\r\n const isRestore = isActive === false; // solo si viene explícitamente en false\r\n\r\n const title = isRestore ? 'Restaurar' : 'Eliminar';\r\n\r\n const text = isRestore\r\n ? 'Desea <strong>restaurar</strong> el registro?'\r\n : softDelete\r\n ? 'Desea <strong>borrar</strong> el registro?'\r\n : 'Desea <strong>eliminar definitivmente</strong> el registro?';\r\n\r\n const icono = isRestore\r\n ? 'icon2/garbage_make_empty.png' // puedes usar otro icono de restaurar\r\n : softDelete\r\n ? 'icon2/recycle-bin_16854652.png'\r\n : 'icon2/delete2.png';\r\n\r\n return this.alertConfirm(title, text, icono);\r\n }\r\n\r\n alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'icon/notFound01.png',\r\n timer: number = 3500,\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i>${message}</i> <span> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n * Muestra una alerta visual personalizada usando SweetAlert2.\r\n *\r\n * Permite configurar el mensaje, el título, el icono, la imagen, el botón de confirmación,\r\n * el temporizador y el tema visual, entre otras opciones.\r\n *\r\n * @param titleAlert - Título principal de la alerta (obligatorio).\r\n * @param messageHtml - Mensaje en formato HTML (obligatorio).\r\n * @param options - Opciones configurables de la alerta (opcional). Permite personalizar icono, imagen, botón, temporizador, etc.\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta o cuando se cierra automáticamente.\r\n *\r\n * @example\r\n * // Alerta básica con icono de éxito y cierre automático\r\n * alertaHtmlSuccess('Operación exitosa', 'Los datos se guardaron correctamente');\r\n *\r\n * @example\r\n * // Alerta de error con imagen personalizada y temporizador\r\n * alertaHtmlSuccess('Error crítico', 'No se pudo conectar al servidor', {\r\n * icono: 'error-icon.png',\r\n * icon: 'error',\r\n * timer: 5000\r\n * });\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón personalizado y sin imagen\r\n * alertaHtmlSuccess('Confirmar acción', '¿Está seguro de eliminar este registro?', {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Sí, eliminar',\r\n * icon: 'warning',\r\n * showImage: false\r\n * }).then((result) => {\r\n * if (result.isConfirmed) {\r\n * // Lógica cuando el usuario confirma\r\n * }\r\n * });\r\n */\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n messageHtml: string,\r\n options: AlertOptions = {},\r\n ): Promise<SweetAlertResult> {\r\n const {\r\n icono = 'icon/check02.png',\r\n icon,\r\n showConfirmButton = false,\r\n confirmButtonText = 'Ok',\r\n timer = 2000,\r\n imageWidth = 125,\r\n imageHeight = 125,\r\n showImage = true,\r\n theme, // Puede venir por options o usar el global\r\n } = options;\r\n\r\n /**\r\n * Nota importante:\r\n * Para que el parámetro `theme` funcione correctamente, el proyecto que\r\n * consume esta librería debe importar el CSS del tema de SweetAlert2 en\r\n * sus estilos (por ejemplo en `styles.scss` o en `angular.json` -> \"styles\").\r\n * Si no se importa el CSS correspondiente al tema seleccionado, las\r\n * alertas no aplicarán el estilo del tema y se verán con el estilo por\r\n * defecto de SweetAlert2.\r\n */\r\n\r\n // Usa el theme global si no se especifica uno en options\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n html: messageHtml,\r\n draggable: true,\r\n showConfirmButton,\r\n confirmButtonText,\r\n timer: showConfirmButton ? undefined : timer, // Timer solo si no hay botón\r\n timerProgressBar: !showConfirmButton && timer > 0,\r\n imageUrl: showImage && icono ? `/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\r\n // Aplica el theme global o el específico (cast a SweetAlertTheme para compatibilidad)\r\n ...(alertTheme !== undefined && { theme: alertTheme as SweetAlertTheme }),\r\n };\r\n // Solo agrega el icono si está definido\r\n if (icon !== undefined) {\r\n alertConfig.icon = icon;\r\n }\r\n\r\n // Precargar imagen solo si es necesario\r\n if (showImage && icono) {\r\n return this.preloadImage(icono).then(() => Swal.fire(alertConfig));\r\n }\r\n\r\n return Swal.fire(alertConfig);\r\n }\r\n\r\n // private configureTimer(\r\n // config: SweetAlertOptions,\r\n // showConfirmButton: boolean,\r\n // timer: number\r\n // ) {\r\n // if (!showConfirmButton && timer > 0) {\r\n // config.timer = timer;\r\n // config.timerProgressBar = true;\r\n // }\r\n // }\r\n\r\n // No se puede utilizar por conflicto con primeng\r\n // notyfAlert(message: string) {\r\n // this.notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top',\r\n // },\r\n // });\r\n // }\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Muestra un mensaje tipo toast usando PrimeNG MessageService.\r\n *\r\n * @param severity - Tipo de severidad del mensaje. Valores posibles:\r\n * 'success' | 'info' | 'warn' | 'error' | 'contrast' | 'secondary'.\r\n * Por defecto: 'success'.\r\n * @param title - Título del mensaje (aparece como summary).\r\n * @param message - Detalle del mensaje (aparece como detail).\r\n * @param time - Duración en milisegundos que el mensaje estará visible. Por defecto: 1500 ms.\r\n *\r\n * @example\r\n * // Mensaje de éxito\r\n * alertaService.showPrimeMessage('success', 'Operación exitosa', 'El registro fue guardado correctamente');\r\n *\r\n * @example\r\n * // Mensaje de advertencia personalizado\r\n * alertaService.showPrimeMessage('warn', 'Advertencia', 'Faltan campos obligatorios', 3000);\r\n */\r\n // showPrimeMessage(\r\n // title: string,\r\n // message: string,\r\n // severity:\r\n // | 'success'\r\n // | 'info'\r\n // | 'warn'\r\n // | 'error'\r\n // | 'contrast'\r\n // | 'secondary' = 'success',\r\n // time: number = 1500\r\n // ) {\r\n // this.primeMessageService.add({\r\n // severity: severity,\r\n // summary: title,\r\n // detail: message,\r\n // life: time,\r\n // });\r\n // }\r\n}\r\n","import { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport moment from 'moment-timezone';\r\nimport {\r\n auditTime,\r\n debounceTime,\r\n distinctUntilChanged,\r\n merge,\r\n Observable,\r\n Subject,\r\n takeUntil,\r\n} from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { ResponseHttpModel, ServiceResult } from '../../models';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n} from '../../models/src/extensions.model';\r\nimport {\r\n FieldConfig,\r\n FormRule,\r\n ReactiveForm,\r\n TypedForm,\r\n} from '../../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\n\r\ninterface CreateTypedFormOptions {\r\n /**\r\n * Si es true, deshabilita por defecto los controles que no tengan\r\n * la propiedad \"disabled\" explícitamente definida en su configuración.\r\n */\r\n disableUnassignedControls?: boolean;\r\n}\r\n\r\ninterface SanitizarFormOptions {\r\n /**\r\n * Campos que se serializarán con JSON.stringify antes de retornar.\r\n * Ejemplo: ['funciones']\r\n */\r\n jsonFields?: string[];\r\n\r\n /**\r\n * Si es true, cuando falle la serialización de un campo listado en `jsonFields`,\r\n * ese campo se establece en null y el método continúa.\r\n */\r\n returnNullOnError?: boolean;\r\n\r\n /**\r\n * Si es true, ante cualquier error global retorna null en lugar de lanzar excepción.\r\n * Útil cuando se desea cortar el flujo por completo al fallar la sanitización.\r\n */\r\n returnFormNullOnError?: boolean;\r\n}\r\n\r\ntype DateInput = string | Date | null | undefined;\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UtilityAddService {\r\n private _serviceAlerta = inject(AlertaService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private _router = inject(Router);\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto formateada según la zona horaria especificada.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en la zona horaria especificada o null si la fecha es null.\r\n */\r\n convertirFechaSegunZonaHoraria(fecha: DateInput): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Cambia esto a la zona horaria que desees\r\n const zonaHoraria = 'America/Guatemala';\r\n return moment(fecha).tz(zonaHoraria).format();\r\n }\r\n\r\n /**\r\n * Convierte una fecha base y le inyecta la hora, minutos y segundos exactos del momento actual del sistema.\r\n *\r\n * @param {DateInput} fecha - La fecha base elegida (usualmente desde un Datepicker).\r\n * @returns {Date | null} - Objeto Date con la fecha modificada a la hora actual o null si la entrada es inválida.\r\n */\r\n convertDateTimeLive(fecha: DateInput): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n\r\n const fechaMoment = moment(fecha);\r\n const ahora = moment(); // Captura el instante exacto actual (horas, minutos, segundos)\r\n\r\n // Seteamos la hora, minutos, segundos y milisegundos del momento actual en la fecha base\r\n fechaMoment.set({\r\n hour: ahora.hour(),\r\n minute: ahora.minute(),\r\n second: ahora.second(),\r\n millisecond: ahora.millisecond(),\r\n });\r\n\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a un objeto Date en formato ISO, opcionalmente ajustando la hora al inicio del día.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {Date | null} - La fecha convertida en formato Date o null si la fecha es null.\r\n */\r\n convertirFechaISOString(\r\n fecha: DateInput,\r\n initHour: boolean = false,\r\n ): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena en formato ISO 8601.\r\n *\r\n * @param {string | Date} fecha - La fecha a convertir. Puede ser un string o un objeto Date.\r\n * @param {boolean} initHour - Si es true, ajusta la hora al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha en formato ISO 8601 (ejemplo: '2025-09-05T00:00:00.000Z') o null si la fecha es inválida.\r\n *\r\n * @example\r\n * // Fecha como string\r\n * service.convertirFechaISO8601('2025-09-05'); // '2025-09-05T00:00:00.000Z'\r\n * // Fecha como Date y ajustando al inicio del día\r\n * service.convertirFechaISO8601(new Date(), true); // '2025-09-05T00:00:00.000Z'\r\n */\r\n convertirFechaISO8601(\r\n fecha: DateInput,\r\n initHour: boolean = false,\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toISOString();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato corto (YYYY-MM-DD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha formateada en formato corto (YYYY-MM-DD) o null si la fecha es null.\r\n */\r\n convertirFechaShort(\r\n fecha: DateInput,\r\n initHour: boolean = false,\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n const fechaMoment = moment(fecha).format('YYYY-MM-DD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto que representa solo la hora (HH:mm).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La hora formateada (HH:mm) o null si la fecha es null.\r\n */\r\n convertirFechaTime(fecha: DateInput): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('HH:mm');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato timestamp (YYYYMMDD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en formato timestamp (YYYYMMDD) o null si la fecha es null.\r\n */\r\n convertirTimeStampString(fecha: DateInput): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('YYYYMMDD');\r\n return fechaMoment;\r\n }\r\n\r\n /* OPCIONES PARA FOMULARIOS REACTIVOS */\r\n /**\r\n * Crea un FormGroup tipado a partir de una configuración de campos.\r\n *\r\n * Soporta validadores síncronos (`validators`) y, de forma opcional,\r\n * validadores asíncronos (`asyncValidators`) por cada control.\r\n *\r\n * @param {FormBuilder} fb - Instancia de FormBuilder para crear el FormGroup.\r\n * @param {FieldConfig<T>} config - Configuración de los campos del formulario.\r\n * @param {ValidatorFn[]} groupValidators - Validadores adicionales a nivel de grupo.\r\n * @param {CreateTypedFormOptions} options - Opciones de creación del formulario.\r\n * - disableUnassignedControls: Si es true, deshabilita solo los campos que no\r\n * tienen \"disabled\" definido, respetando los valores explícitos del usuario.\r\n * @returns {FormGroup} - El FormGroup creado.\r\n *\r\n * @example\r\n * const form = this.utilityAddService.createTypedForm(\r\n * this.fb,\r\n * {\r\n * codigo: { value: 'A1' }, // Se deshabilita por opción global\r\n * nombre: { value: 'Demo', disabled: false }, // Se respeta explícitamente\r\n * email: {\r\n * value: '',\r\n * validators: [Validators.email],\r\n * asyncValidators: [\r\n * asyncExistsValidator(\r\n * (value, id) => this.userService.emailExists(value, id),\r\n * { currentId: this.id, fieldName: 'email' },\r\n * ),\r\n * ],\r\n * },\r\n * },\r\n * { disableUnassignedControls: true },\r\n * );\r\n */\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n options?: CreateTypedFormOptions,\r\n ): FormGroup;\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[],\r\n options?: CreateTypedFormOptions,\r\n ): FormGroup;\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidatorsOrOptions?: ValidatorFn[] | CreateTypedFormOptions,\r\n options: CreateTypedFormOptions = { disableUnassignedControls: false },\r\n ): FormGroup {\r\n const groupValidators = Array.isArray(groupValidatorsOrOptions)\r\n ? groupValidatorsOrOptions\r\n : undefined;\r\n const resolvedOptions = Array.isArray(groupValidatorsOrOptions)\r\n ? options\r\n : (groupValidatorsOrOptions ?? options);\r\n\r\n const formGroup: { [key in keyof T]?: FormControl } = {};\r\n\r\n // Crear controles de formulario individuales\r\n for (const key in config) {\r\n if (Object.prototype.hasOwnProperty.call(config, key)) {\r\n const fieldConfig = config[key];\r\n const {\r\n value,\r\n validators = [],\r\n asyncValidators = [],\r\n }: {\r\n value: T[keyof T] | null;\r\n validators?: ValidatorFn | ValidatorFn[] | null;\r\n asyncValidators?: AsyncValidatorFn | AsyncValidatorFn[] | null;\r\n } = fieldConfig;\r\n const hasAssignedDisabled = Object.prototype.hasOwnProperty.call(\r\n fieldConfig,\r\n 'disabled',\r\n );\r\n const disabled = hasAssignedDisabled\r\n ? Boolean(fieldConfig.disabled)\r\n : Boolean(resolvedOptions.disableUnassignedControls);\r\n\r\n formGroup[key] = new FormControl(\r\n { value, disabled },\r\n validators,\r\n asyncValidators,\r\n );\r\n }\r\n }\r\n\r\n // Crear el FormGroup con validadores adicionales a nivel de grupo si existen\r\n const group = fb.group(\r\n formGroup,\r\n groupValidators ? { validators: groupValidators } : {},\r\n );\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Crea un ReactiveForm tipado con capacidad de suscripción y limpieza.\r\n *\r\n * Extiende createTypedForm() agregando un Subject (destroy$) para manejar\r\n * la suscripción y limpieza automática de observables cuando el componente\r\n * se destruye.\r\n *\r\n * @template T - El tipo genérico del modelo para el formulario.\r\n * @param fb - Instancia de FormBuilder.\r\n * @param config - Configuración de los campos del formulario (FieldConfig<T>).\r\n * @param groupValidators - Validadores adicionales a nivel de grupo.\r\n * @param options - Opciones de creación del formulario.\r\n * - disableUnassignedControls: Si es true, deshabilita solo los campos que no\r\n * tienen \"disabled\" definido, respetando los valores explícitos del usuario.\r\n * @returns ReactiveForm<T> - FormGroup tipado con Subject destroy$ para limpieza.\r\n *\r\n * @example\r\n * ```typescript\r\n * interface LoginForm {\r\n * username: string;\r\n * password: string;\r\n * }\r\n *\r\n * const config: FieldConfig<LoginForm> = {\r\n * username: { value: '', validators: [Validators.required] },\r\n * password: { value: '', validators: [Validators.required] }\r\n * };\r\n *\r\n * const form = this.utilityAddService.createReactiveForm(\r\n * this.fb,\r\n * config,\r\n * [this.matchPasswordsValidator],\r\n * { disableUnassignedControls: true },\r\n * );\r\n *\r\n * // Al destruir el componente, limpiar todas las suscripciones\r\n * ngOnDestroy() {\r\n * form.destroy$.next();\r\n * form.destroy$.complete();\r\n * }\r\n * ```\r\n */\r\n createReactiveForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n options?: CreateTypedFormOptions,\r\n ): ReactiveForm<T>;\r\n createReactiveForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[],\r\n options?: CreateTypedFormOptions,\r\n ): ReactiveForm<T>;\r\n createReactiveForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidatorsOrOptions?: ValidatorFn[] | CreateTypedFormOptions,\r\n options: CreateTypedFormOptions = { disableUnassignedControls: false },\r\n ): ReactiveForm<T> {\r\n const groupValidators = Array.isArray(groupValidatorsOrOptions)\r\n ? groupValidatorsOrOptions\r\n : undefined;\r\n const resolvedOptions = Array.isArray(groupValidatorsOrOptions)\r\n ? options\r\n : (groupValidatorsOrOptions ?? options);\r\n\r\n const form = this.createTypedForm(\r\n fb,\r\n config,\r\n groupValidators,\r\n resolvedOptions,\r\n ) as TypedForm<T> & {\r\n destroy$: Subject<void>;\r\n };\r\n\r\n form.destroy$ = new Subject<void>();\r\n\r\n return form;\r\n }\r\n\r\n /**\r\n * Suscribe a los cambios de un control específico del formulario.\r\n *\r\n * Monitorea el control especificado y ejecuta un callback cada vez que su valor\r\n * cambia. Soporta debouncing y deduplicación automática de valores idénticos.\r\n *\r\n * @template T - El tipo del formulario.\r\n * @template K - La clave del control a monitorear.\r\n * @param form - El ReactiveForm a monitorear.\r\n * @param controlName - Nombre del control a observar.\r\n * @param callback - Función a ejecutar cuando cambia el valor. Recibe el nuevo valor y el formulario.\r\n * @param options - Opciones de configuración:\r\n * - debounce?: Milisegundos de espera antes de ejecutar el callback (default: sin debounce).\r\n * - distinct?: Si es true (default), solo ejecuta si el valor cambió (comparación por referencia).\r\n *\r\n * @example\r\n * ```typescript\r\n * this.utilityAddService.onControlChange(\r\n * form,\r\n * 'email',\r\n * (value, form) => {\r\n * console.log('Email cambió a:', value);\r\n * },\r\n * { debounce: 500, distinct: true }\r\n * );\r\n * ```\r\n */\r\n onControlChange<T, K extends keyof T>(\r\n form: ReactiveForm<T>,\r\n controlName: K,\r\n callback: (value: T[K] | null, form: ReactiveForm<T>) => void,\r\n options?: {\r\n debounce?: number;\r\n distinct?: boolean;\r\n },\r\n ) {\r\n let stream = form.get(controlName as string)!.valueChanges;\r\n\r\n if (options?.distinct !== false) {\r\n stream = stream.pipe(distinctUntilChanged());\r\n }\r\n\r\n if (options?.debounce) {\r\n stream = stream.pipe(debounceTime(options.debounce));\r\n }\r\n\r\n stream\r\n .pipe(takeUntil(form.destroy$))\r\n .subscribe((value) => callback(value as T[K], form));\r\n }\r\n\r\n /**\r\n * Suscribe a los cambios de múltiples controles del formulario.\r\n *\r\n * Monitorea una lista de controles y ejecuta un callback cuando cualquiera\r\n * de ellos cambia. Útil para reacciones complejas que dependen de varios campos.\r\n * Soporta operaciones asincrónicas en el callback.\r\n *\r\n * @template T - El tipo del formulario.\r\n * @param form - El ReactiveForm a monitorear.\r\n * @param controls - Array de nombres de controles a observar.\r\n * @param callback - Función a ejecutar cuando cambia cualquier control. Puede ser asincrónica.\r\n * @param options - Opciones de configuración:\r\n * - debounce?: Milisegundos de espera antes de ejecutar el callback.\r\n *\r\n * @example\r\n * ```typescript\r\n * this.utilityAddService.onControlsChange(\r\n * form,\r\n * ['startDate', 'endDate'],\r\n * async (form) => {\r\n * const startDate = form.get('startDate')?.value;\r\n * const endDate = form.get('endDate')?.value;\r\n * // Validar rango de fechas\r\n * await this.validateDateRange(startDate, endDate);\r\n * },\r\n * { debounce: 300 }\r\n * );\r\n * ```\r\n */\r\n onControlsChange<T>(\r\n form: ReactiveForm<T>,\r\n controls: (keyof T)[],\r\n callback: (form: ReactiveForm<T>) => void | Promise<void>,\r\n options?: { debounce?: number },\r\n ) {\r\n const observables = controls.map(\r\n (control) => form.get(control as string)!.valueChanges,\r\n );\r\n\r\n let stream = merge(...observables);\r\n\r\n if (options?.debounce) {\r\n stream = stream.pipe(debounceTime(options.debounce));\r\n }\r\n\r\n stream = stream.pipe(auditTime(0));\r\n\r\n stream.pipe(takeUntil(form.destroy$)).subscribe(() => callback(form));\r\n }\r\n\r\n /**\r\n * Registra reglas de validación personalizadas que se evalúan dinámicamente.\r\n *\r\n * Permite definir reglas complejas que se ejecutan cuando sus dependencias cambian.\r\n * Cada regla puede depender de múltiples campos y ejecutar lógica asincrónica\r\n * para actualizar otros campos del formulario.\r\n *\r\n * @template T - El tipo del formulario.\r\n * @param form - El ReactiveForm donde se aplicarán las reglas.\r\n * @param rules - Array de FormRule<T> que especifican:\r\n * - dependsOn: Campos que disparan la regla cuando cambian.\r\n * - compute: Función que actualiza el formulario en base a los cambios.\r\n * - debounce?: Milisegundos de espera opcional.\r\n *\r\n * @example\r\n * ```typescript\r\n * const rules: FormRule<MyForm>[] = [\r\n * {\r\n * dependsOn: ['country'],\r\n * debounce: 300,\r\n * compute: async (form) => {\r\n * const country = form.get('country')?.value;\r\n * const states = await this.getStatesByCountry(country);\r\n * form.get('state')?.setValue(states[0]);\r\n * }\r\n * }\r\n * ];\r\n *\r\n * this.utilityAddService.registerRules(form, rules);\r\n * ```\r\n */\r\n registerRules<T>(form: ReactiveForm<T>, rules: FormRule<T>[]) {\r\n const runningRules = new Set<FormRule<T>>();\r\n\r\n rules.forEach((rule) => {\r\n this.onControlsChange(\r\n form,\r\n rule.dependsOn,\r\n async (form) => {\r\n if (runningRules.has(rule)) return;\r\n\r\n try {\r\n runningRules.add(rule);\r\n await rule.compute(form);\r\n } finally {\r\n runningRules.delete(rule);\r\n }\r\n },\r\n { debounce: rule.debounce },\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Sanitiza un formulario obteniendo valores de un formulario, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del modelo a procesar.\r\n * @param form - El formulario reactivo de Angular del que se obtendrán los valores.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar. Cada objeto debe contener:\r\n * - `nombre`: El nombre del campo de fecha en el modelo.\r\n * - `tipo`: El tipo de conversión que se debe aplicar (por ejemplo, `'short'`, `'zh'`, `'iso').\r\n * @returns Un objeto del tipo `T` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo de fecha especificado no existe en los datos del formulario.\r\n *\r\n * @example\r\n * // Procesar varios campos de fecha\r\n * const precioValues = service.sanitizarModelo<ItemPrecioModel>(\r\n * form,\r\n * { nombre: 'fechaInicio', tipo: 'short' },\r\n * { nombre: 'fechaFin', tipo: 'zh' }\r\n * );\r\n */\r\n sanitizarForm<T>(\r\n form: any,\r\n options: SanitizarFormOptions & { returnFormNullOnError: true },\r\n ...campos: FechasConversion[]\r\n ): T | null;\r\n sanitizarForm<T>(\r\n form: any,\r\n options: SanitizarFormOptions,\r\n ...campos: FechasConversion[]\r\n ): T;\r\n sanitizarForm<T>(form: any, ...campos: FechasConversion[]): T;\r\n sanitizarForm<T>(\r\n form: any,\r\n ...args: Array<FechasConversion | SanitizarFormOptions>\r\n ): T | null {\r\n const hasOptions = this.isSanitizarFormOptions(args[0]);\r\n const options = hasOptions ? (args[0] as SanitizarFormOptions) : {};\r\n const campos = (hasOptions ? args.slice(1) : args) as FechasConversion[];\r\n\r\n try {\r\n // Obtén todos los valores del formulario\r\n const rawData = form?.getRawValue?.();\r\n\r\n if (!rawData) {\r\n throw new Error('El formulario no tiene valores.');\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue: Record<string, any> = { ...rawData };\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo)\r\n : null;\r\n });\r\n\r\n // Serializa campos JSON (ej: funciones) cuando se solicita.\r\n (options.jsonFields ?? []).forEach((fieldName) => {\r\n if (!(fieldName in updatedValue)) {\r\n if (options.returnNullOnError) {\r\n updatedValue[fieldName] = null;\r\n return;\r\n }\r\n\r\n throw new Error(`El campo \"${fieldName}\" no existe en el valor.`);\r\n }\r\n\r\n const fieldValue = updatedValue[fieldName];\r\n\r\n if (\r\n fieldValue === null ||\r\n fieldValue === undefined ||\r\n fieldValue === ''\r\n ) {\r\n updatedValue[fieldName] = null;\r\n return;\r\n }\r\n\r\n // Si ya es string, evitamos doble serialización.\r\n if (typeof fieldValue === 'string') {\r\n updatedValue[fieldName] = fieldValue;\r\n return;\r\n }\r\n\r\n try {\r\n const serialized = JSON.stringify(fieldValue);\r\n if (serialized === undefined) {\r\n throw new Error(\r\n `No fue posible serializar el campo \"${fieldName}\".`,\r\n );\r\n }\r\n\r\n updatedValue[fieldName] = serialized;\r\n } catch (error) {\r\n if (options.returnNullOnError) {\r\n this.logIfNotProduction(\r\n `sanitizarForm: campo \"${fieldName}\" establecido en null por error de serialización`,\r\n error,\r\n );\r\n updatedValue[fieldName] = null;\r\n return;\r\n }\r\n\r\n throw error;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n } catch (error) {\r\n if (options.returnFormNullOnError) {\r\n this.logIfNotProduction('sanitizarForm: retorno null por error', error);\r\n return null;\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n private isSanitizarFormOptions(\r\n value: FechasConversion | SanitizarFormOptions | undefined,\r\n ): value is SanitizarFormOptions {\r\n if (!value || typeof value !== 'object') return false;\r\n\r\n const candidate = value as Record<string, unknown>;\r\n\r\n // Si tiene llaves propias de conversión de fecha, no es options.\r\n if ('nombre' in candidate || 'tipo' in candidate) return false;\r\n\r\n return (\r\n 'jsonFields' in candidate ||\r\n 'returnNullOnError' in candidate ||\r\n 'returnFormNullOnError' in candidate\r\n );\r\n }\r\n\r\n /**\r\n * Sanitiza un objeto plano, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del objeto a procesar.\r\n * @param values - El objeto con los datos.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar.\r\n * @returns Un objeto del tipo T con las conversiones de fecha aplicadas.\r\n */\r\n sanitizarModel<T extends Record<string, any>>(\r\n values: T,\r\n ...campos: FechasConversion[]\r\n ): T {\r\n // Crear una copia del objeto para no modificar el original\r\n const updatedValue: Record<string, any> = { ...values };\r\n\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el objeto.`);\r\n }\r\n\r\n const valorActual = updatedValue[nombre];\r\n\r\n if (\r\n valorActual !== null &&\r\n valorActual !== undefined &&\r\n valorActual !== ''\r\n ) {\r\n updatedValue[nombre] = this.convertirFecha(valorActual, tipo);\r\n } else {\r\n updatedValue[nombre] = null;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Convierte una fecha al formato especificado.\r\n *\r\n * @param fecha - La fecha en formato string que se desea convertir.\r\n * Debe estar en un formato reconocible por `Date` o en ISO 8601.\r\n * @param tipo - El tipo de conversión a realizar. Soporta:\r\n * - `'short'`: Devuelve la fecha en formato corto (YYYY-MM-DD).\r\n * - `'zh'`: Devuelve la fecha ajustada a la zona horaria configurada.\r\n * - `'iso'`: Devuelve la fecha como objeto Date en formato ISO.\r\n * - `'iso8601'`: Devuelve la fecha como string en formato ISO 8601.\r\n * @returns La fecha convertida como string o Date según el tipo especificado, o null si la fecha es inválida.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n *\r\n * @example\r\n * // Formato corto\r\n * service.convertirFecha('2025-08-21', 'short'); // '2025-08-21'\r\n * // Zona horaria\r\n * service.convertirFecha('2025-08-21', 'zh'); // '2025-08-21T00:00:00-06:00' (ejemplo)\r\n * // Formato ISO (Date)\r\n * service.convertirFecha('2025-08-21', 'iso'); // Date { ... }\r\n * // Formato ISO 8601 (string)\r\n * service.convertirFecha('2025-08-21', 'iso8601'); // '2025-08-21T00:00:00.000Z'\r\n * // Formato live (fecha con hora actual)\r\n * service.convertirFecha('2025-08-21', 'live'); // Date { ... }\r\n */\r\n private convertirFecha(\r\n fecha: DateInput,\r\n tipo: TipoFechaConversion,\r\n ): Date | string | null {\r\n switch (tipo) {\r\n case 'short':\r\n // Implementación para el formato corto\r\n return this.convertirFechaShort(fecha);\r\n case 'zh':\r\n // Implementación para zonas horarias\r\n return this.convertirFechaSegunZonaHoraria(fecha);\r\n case 'iso': {\r\n return this.convertirFechaISOString(fecha);\r\n }\r\n case 'iso8601': {\r\n return this.convertirFechaISO8601(fecha);\r\n }\r\n case 'live': {\r\n return this.convertDateTimeLive(fecha);\r\n }\r\n default:\r\n throw new Error(`Tipo de conversión desconocido: ${tipo}`);\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable\r\n * @param fileObservable Observable que emite el Blob del archivo\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fileName Nombre del archivo sin extensión\r\n */\r\n handleFileResponse(\r\n fileObservable: Observable<Blob>,\r\n actionId: number = 0,\r\n fileName: string,\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (fileBlob: Blob) => {\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(fileUrl, actionId, fileName, fileExtension);\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable cuando se necesita\r\n * obtener el nombre de archivo desde los headers HTTP (Content-Disposition).\r\n *\r\n * @deprecated Usar ServiceResultService.getDownloadableFile() +\r\n * ServiceResultService.processFileResult() para un flujo unificado.\r\n * Mantener temporalmente para compatibilidad legacy.\r\n *\r\n * @param fileObservable Observable que emite HttpResponse<Blob>\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fallbackFileName Nombre de archivo por defecto si no viene en el header\r\n */\r\n handleFileResponseFromResponse(\r\n fileObservable: Observable<HttpResponse<Blob>>,\r\n actionId: number = 0,\r\n fallbackFileName: string = 'archivo sin nombre',\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (response) => {\r\n const fileBlob = response.body as Blob;\r\n\r\n if (!fileBlob) {\r\n console.error('La respuesta no contiene cuerpo (Blob)');\r\n return;\r\n }\r\n\r\n const headerFileName = this.getFileNameFromContentDisposition(\r\n response.headers,\r\n );\r\n const baseFileName = headerFileName || fallbackFileName;\r\n\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n this.logIfNotProduction(\r\n 'Manejando archivo con tipo:',\r\n fileBlob,\r\n fileBlob.type,\r\n 'nombre:',\r\n baseFileName,\r\n );\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, baseFileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(\r\n fileUrl,\r\n actionId,\r\n baseFileName,\r\n fileExtension,\r\n );\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n /**\r\n * Extrae el blob y el nombre del archivo desde una respuesta HTTP sin realizar la descarga.\r\n * Es útil cuando necesitas reutilizar el blob para múltiples operaciones.\r\n *\r\n * @deprecated Usar ServiceResultService.getDownloadableFile() que ya retorna\r\n * ServiceResult<FileData> con blob y fileName listos para consumo.\r\n * Mantener temporalmente para compatibilidad con proyectos consumidores legacy.\r\n *\r\n * @param fileObservable Observable que emite HttpResponse<Blob>\r\n * @param fallbackFileName Nombre de archivo por defecto si no viene en el header\r\n * @returns Observable que emite un objeto con { blob, fileName }\r\n *\r\n * @example\r\n * this.utilityAddService.extractFileDataFromResponse(this.fileService.getFile())\r\n * .subscribe(({ blob, fileName }) => {\r\n * // Usar blob y fileName para múltiples operaciones\r\n * this.utilityAddService.descargarManual(blob, fileName);\r\n * });\r\n */\r\n extractFileDataFromResponse(\r\n fileObservable: Observable<HttpResponse<Blob>>,\r\n fallbackFileName: string = 'archivo sin nombre',\r\n ): Observable<{ blob: Blob; fileName: string }> {\r\n return new Observable((observer) => {\r\n fileObservable.subscribe({\r\n next: (response) => {\r\n const fileBlob = response.body as Blob;\r\n\r\n if (!fileBlob) {\r\n observer.error('La respuesta no contiene cuerpo (Blob)');\r\n return;\r\n }\r\n\r\n const headerFileName = this.getFileNameFromContentDisposition(\r\n response.headers,\r\n );\r\n const baseFileName = headerFileName || fallbackFileName;\r\n const fullFileName = this.ensureFileNameWithExtension(\r\n baseFileName,\r\n fileBlob.type,\r\n );\r\n\r\n this.logIfNotProduction(\r\n 'Extrayendo archivo con tipo:',\r\n fileBlob.type,\r\n 'nombre:',\r\n fullFileName,\r\n );\r\n\r\n observer.next({\r\n blob: fileBlob,\r\n fileName: fullFileName,\r\n });\r\n observer.complete();\r\n },\r\n error: (err) => observer.error(err),\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Descarga un archivo manualmente usando el blob y nombre del archivo proporcionados.\r\n * Es útil como complemento a extractFileDataFromResponse para reutilizar blobs.\r\n *\r\n * @deprecated Usar ServiceResultService.descargarBlob() en flujos nuevos.\r\n * Mantener temporalmente para no romper consumidores actuales.\r\n *\r\n * @param blob Objeto Blob del archivo a descargar\r\n * @param fileName Nombre completo del archivo incluyendo extensión\r\n * @param expectedExtension Extensión esperada (opcional). Si se envía y no coincide\r\n * con la extensión final del archivo, se abrirá en una nueva pestaña en lugar de descargar.\r\n *\r\n * @example\r\n * // Opción 1: Usar directamente con un blob\r\n * this.utilityAddService.descargarBlob(blob, 'Reporte.xlsx');\r\n *\r\n * // Opción 2: Combinar con extractFileDataFromResponse\r\n * this.utilityAddService.extractFileDataFromResponse(httpResponse$)\r\n * .subscribe(({ blob, fileName }) => {\r\n * this.utilityAddService.descargarBlob(blob, fileName);\r\n * });\r\n */\r\n descargarBlob(\r\n blob: Blob | null | undefined,\r\n fileName: string | null | undefined,\r\n expectedExtension?: string | null,\r\n ): void {\r\n if (!blob) {\r\n console.warn('No se proporcionó un blob válido para descargar.');\r\n return;\r\n }\r\n\r\n const fileUrl = URL.createObjectURL(blob);\r\n const baseFileName = fileName?.trim() || 'archivo_descargado';\r\n const fullFileName = this.ensureFileNameWithExtension(\r\n baseFileName,\r\n blob.type,\r\n );\r\n\r\n const normalizedExpectedExtension = (expectedExtension || '')\r\n .trim()\r\n .toLowerCase();\r\n\r\n if (normalizedExpectedExtension) {\r\n const expectedWithDot = normalizedExpectedExtension.startsWith('.')\r\n ? normalizedExpectedExtension\r\n : `.${normalizedExpectedExtension}`;\r\n\r\n const currentExtensionMatch = /\\.[^./\\\\]+$/.exec(fullFileName);\r\n const currentExtension = currentExtensionMatch\r\n ? currentExtensionMatch[0].toLowerCase()\r\n : '';\r\n\r\n if (currentExtension !== expectedWithDot) {\r\n window.open(fileUrl, '_blank');\r\n this.revokeObjectUrl(fileUrl);\r\n return;\r\n }\r\n }\r\n\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n this.revokeObjectUrl(fileUrl);\r\n }\r\n\r\n /**\r\n * Verifica si un archivo es de tipo Excel.\r\n *\r\n * @param fileType - Tipo MIME del archivo a verificar.\r\n * @returns true si es un archivo Excel (.xlsx), false en caso contrario.\r\n * @private\r\n */\r\n private isExcelFile(fileType: string): boolean {\r\n return fileType.includes(\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n );\r\n }\r\n\r\n /**\r\n * Extrae el nombre del archivo desde el header Content-Disposition de una respuesta HTTP.\r\n *\r\n * Parsea el header Content-Disposition siguiendo el estándar RFC 5987 para\r\n * extraer el nombre del archivo, incluyendo manejo de caracteres especiales\r\n * y codificaciones UTF-8.\r\n *\r\n * @param headers - Headers HTTP de la respuesta.\r\n * @returns El nombre del archivo o null si no se encuentra.\r\n * @private\r\n *\r\n * @example\r\n * // Header: Content-Disposition: attachment; filename*=UTF-8''Reporte%202025.pdf\r\n * // Retorna: 'Reporte 2025.pdf'\r\n */\r\n private getFileNameFromContentDisposition(\r\n headers: HttpHeaders,\r\n ): string | null {\r\n const contentDisposition = headers.get('content-disposition');\r\n\r\n if (!contentDisposition) return null;\r\n\r\n const matches = /filename\\*?[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i.exec(\r\n contentDisposition,\r\n );\r\n if (!matches || !matches[1]) return null;\r\n\r\n let fileName = matches[1].replace(/['\"]/g, '').trim();\r\n\r\n // Manejar posibles codificaciones tipo RFC5987: filename*=UTF-8''Nombre.pdf\r\n if (fileName.toLowerCase().includes(\"utf-8''\")) {\r\n fileName = decodeURIComponent(fileName.split(\"''\")[1] || '');\r\n }\r\n\r\n return fileName;\r\n }\r\n\r\n /**\r\n * Determina la extensión de archivo basada en su tipo MIME.\r\n *\r\n * @param fileType - Tipo MIME del archivo.\r\n * @returns La extensión correspondiente:\r\n * - '.pdf' para archivos PDF.\r\n * - '.xlsx' para archivos Excel.\r\n * - Otras extensiones conocidas según el MIME.\r\n * - Cadena vacía si no se puede inferir.\r\n * @private\r\n */\r\n private getFileExtension(fileType: string): string {\r\n const normalizedType = fileType.toLowerCase();\r\n\r\n if (normalizedType.includes('pdf')) return '.pdf';\r\n if (normalizedType.includes('spreadsheetml')) return '.xlsx';\r\n if (normalizedType.includes('ms-excel')) return '.xls';\r\n if (normalizedType.includes('csv')) return '.csv';\r\n if (normalizedType.includes('zip')) return '.zip';\r\n if (normalizedType.includes('json')) return '.json';\r\n if (normalizedType.includes('xml')) return '.xml';\r\n if (normalizedType.includes('text/plain')) return '.txt';\r\n if (normalizedType.includes('png')) return '.png';\r\n if (normalizedType.includes('jpeg') || normalizedType.includes('jpg')) {\r\n return '.jpg';\r\n }\r\n\r\n return '';\r\n }\r\n\r\n /**\r\n * Asegura que el nombre del archivo tenga extensión.\r\n * Si ya trae extensión, lo respeta sin modificarlo.\r\n * Si no trae extensión, intenta inferirla desde el tipo MIME.\r\n *\r\n * @param fileName - Nombre del archivo, con o sin extensión.\r\n * @param fileType - Tipo MIME del archivo.\r\n * @returns Nombre de archivo con extensión cuando es posible.\r\n * @private\r\n */\r\n private ensureFileNameWithExtension(\r\n fileName: string,\r\n fileType: string,\r\n ): string {\r\n const hasExtension = /\\.[^./\\\\]+$/.test(fileName);\r\n if (hasExtension) return fileName;\r\n\r\n const fileExtension = this.getFileExtension(fileType);\r\n return fileExtension ? `${fileName}${fileExtension}` : fileName;\r\n }\r\n\r\n /**\r\n * Maneja archivos no Excel (como PDFs) realizando acciones de visualización o descarga.\r\n *\r\n * @param fileUrl - URL temporal del objeto Blob del archivo.\r\n * @param actionId - ID de acción:\r\n * - 0: Abre el archivo en una nueva pestaña.\r\n * - 1: Inicia la descarga del archivo.\r\n * @param fileName - Nombre base del archivo sin extensión.\r\n * @param fileExtension - Extensión del archivo incluyendo el punto (ej: '.pdf').\r\n * @private\r\n */\r\n private handleNonExcelFiles(\r\n fileUrl: string,\r\n actionId: number,\r\n fileName: string,\r\n fileExtension: string,\r\n ): void {\r\n switch (actionId) {\r\n case 0: // Abrir en nueva ventana\r\n window.open(fileUrl, '_blank');\r\n break;\r\n case 1: // Descargar archivo\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Abre un archivo PDF en una nueva pestaña del navegador.\r\n *\r\n * @deprecated Usar ServiceResultService.PdfView() en flujos nuevos.\r\n * Mantener temporalmente para compatibilidad con código existente.\r\n *\r\n * @param blob - Objeto Blob que contiene los datos del archivo PDF.\r\n *\r\n * @example\r\n * // Uso típico con respuesta de servicio HTTP\r\n * this.pdfService.getPdf(id).subscribe(blob => {\r\n * this.utilityAddService.PdfView(blob);\r\n * });\r\n *\r\n * @description\r\n * Este método crea un URL temporal para el Blob del PDF y lo abre en una nueva\r\n * pestaña del navegador. El URL se revoca automáticamente después de 100ms para\r\n * liberar memoria.\r\n */\r\n PdfView(blob: Blob): any {\r\n // Crear un URL temporal para el Blob\r\n const pdfUrl = URL.createObjectURL(blob);\r\n // Abrir el PDF en una nueva pestaña\r\n window.open(pdfUrl, '_blank');\r\n\r\n // Liberar el URL del Blob una vez que la pestaña ha sido abierta\r\n // Esperar un poco para asegurarse de que el archivo se ha abierto\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(pdfUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Descarga un archivo PDF con un nombre personalizado que incluye el prefijo \"DTE_\".\r\n *\r\n * @param blob - Objeto Blob que contiene los datos del archivo PDF a descargar.\r\n * @param filename - Nombre base del archivo sin extensión (se agregará automáticamente \".pdf\" y el prefijo \"DTE_\").\r\n *\r\n * @example\r\n * // Uso típico con respuesta de servicio HTTP\r\n * this.dteService.getDTE(operacionId).subscribe(blob => {\r\n * this.utilityAddService.downloadPdfFile(blob, '12345');\r\n * // Descarga el archivo como: DTE_12345.pdf\r\n * });\r\n *\r\n * @description\r\n * Este método crea un URL temporal para el Blob y simula un clic en un enlace de\r\n * descarga para iniciar la descarga automática del archivo. El nombre del archivo\r\n * sigue el formato: DTE_{filename}.pdf. El URL se revoca después de 100ms para\r\n * liberar memoria.\r\n */\r\n downloadPdfFile(blob: Blob, filename: string) {\r\n // Crear un URL temporal para el Blob\r\n const pdfUrl = URL.createObjectURL(blob);\r\n\r\n // Crear un enlace de descarga\r\n const link = document.createElement('a');\r\n link.href = pdfUrl;\r\n\r\n // Establecer el nombre del archivo utilizando el operacionId\r\n link.download = `DTE_${filename}.pdf`;\r\n\r\n // Simular un clic en el enlace para iniciar la descarga\r\n link.click();\r\n\r\n // Liberar el URL del Blob después de un pequeño retraso\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(pdfUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Inicia la descarga programada de un archivo.\r\n *\r\n * Crea un elemento <a> temporal, lo configura con el archivo y tipo MIME,\r\n * y simula un clic para iniciar la descarga del navegador.\r\n *\r\n * @param fileUrl - URL temporal (object URL) del archivo a descargar.\r\n * @param fullFileName - Nombre completo del archivo incluyendo extensión.\r\n * @private\r\n */\r\n private forceDownload(fileUrl: string, fullFileName: string): void {\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n }\r\n\r\n /**\r\n * Libera la memoria de un URL de objeto temporal.\r\n *\r\n * Revoca un object URL creado con URL.createObjectURL() después de un pequeño\r\n * retraso (100ms) para asegurar que el navegador ha terminado de usar el archivo.\r\n *\r\n * @param fileUrl - URL del objeto a revocar.\r\n * @private\r\n */\r\n private revokeObjectUrl(fileUrl: string): void {\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Muestra información en consola solo en desarrollo, permitiendo múltiples argumentos como console.log nativo.\r\n *\r\n * @param args - Argumentos a mostrar en consola (texto, objetos, etc).\r\n * @example\r\n * logIfNotProduction('Datos:', response);\r\n * logIfNotProduction('Error:', error, { extra: true });\r\n */\r\n logIfNotProduction(...args: any[]): void {\r\n if (!this.environment.production) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Valida todos los campos de un formulario y muestra una alerta.\r\n *\r\n * Marca todos los controles como tocados (triggereando la validación visual)\r\n * y muestra una notificación toastr indicando que hay validaciones pendientes.\r\n * Útil para formularios donde deseas mostrar todos los errores de validación\r\n * de una vez.\r\n *\r\n * @param form - El FormGroup a validar.\r\n *\r\n * @example\r\n * ```typescript\r\n * if (this.form.invalid) {\r\n * this.utilityAddService.checkFormValid(this.form);\r\n * return;\r\n * }\r\n * ```\r\n */\r\n checkFormValid(control: AbstractControl | null | undefined): boolean {\r\n // 👈 Cambiado a boolean\r\n if (!control) return false;\r\n\r\n // Marca todos los controles para activar los estilos de error en la UI\r\n control.markAllAsTouched();\r\n\r\n // Si el formulario es inválido, ejecutamos las alertas y logs\r\n if (control.invalid) {\r\n // Reporta en consola los campos inválidos solo en desarrollo.\r\n if (!this.environment.production) {\r\n const invalidControls = this.getInvalidControls(control);\r\n if (invalidControls.length > 0) {\r\n console.warn(\r\n 'UtilityAddService.checkFormValid: campos inválidos detectados:',\r\n );\r\n invalidControls.forEach(({ path, errors }) => {\r\n console.warn(`- ${path}`, errors);\r\n });\r\n }\r\n }\r\n\r\n // Muestra el toastr de advertencia\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Formulario',\r\n 'Revise los campos con validaciones pendientes',\r\n 2,\r\n );\r\n\r\n return false; // 👈 Retorna false si hay errores pendientes\r\n }\r\n\r\n return true; // 👈 Retorna true si el formulario es 100% válido\r\n }\r\n\r\n private getInvalidControls(\r\n control: AbstractControl,\r\n parentPath: string = '',\r\n ): Array<{ path: string; errors: Record<string, unknown> | null }> {\r\n const controls = (control as { controls?: unknown }).controls;\r\n\r\n if (!controls) {\r\n return control.invalid\r\n ? [\r\n {\r\n path: parentPath || '(raiz)',\r\n errors: control.errors as Record<string, unknown> | null,\r\n },\r\n ]\r\n : [];\r\n }\r\n\r\n const invalidControls: Array<{\r\n path: string;\r\n errors: Record<string, unknown> | null;\r\n }> = [];\r\n\r\n if (Array.isArray(controls)) {\r\n controls.forEach((childControl, index) => {\r\n const childPath = parentPath ? `${parentPath}[${index}]` : `[${index}]`;\r\n invalidControls.push(\r\n ...this.getInvalidControls(\r\n childControl as AbstractControl,\r\n childPath,\r\n ),\r\n );\r\n });\r\n\r\n return invalidControls;\r\n }\r\n\r\n Object.entries(controls as Record<string, AbstractControl>).forEach(\r\n ([controlName, childControl]) => {\r\n const childPath = parentPath\r\n ? `${parentPath}.${controlName}`\r\n : controlName;\r\n\r\n invalidControls.push(\r\n ...this.getInvalidControls(childControl, childPath),\r\n );\r\n },\r\n );\r\n\r\n return invalidControls;\r\n }\r\n\r\n /**\r\n * Extrae valores únicos de un campo específico de un array de objetos.\r\n *\r\n * Obtiene todos los valores distintos de una propiedad en un array de objetos,\r\n * retornando un array de objetos FilterOption tipado y ordenado alfabéticamente.\r\n * Incluye validaciones para detectar campos inexistentes con mensajes de alerta.\r\n *\r\n * @template T - Tipo de los objetos en el array.\r\n * @param data - Array de objetos del cual extraer valores únicos.\r\n * @param field - Nombre del campo del cual extraer valores únicos.\r\n * @returns Array de FilterOption ordenado alfabéticamente, o array vacío si hay errores.\r\n *\r\n * @example\r\n * ```typescript\r\n * interface Usuario {\r\n * id: number;\r\n * nombre: string;\r\n * departamento: string;\r\n * }\r\n *\r\n * const usuarios: Usuario[] = [\r\n * { id: 1, nombre: 'Juan', departamento: 'TI' },\r\n * { id: 2, nombre: 'María', departamento: 'RRHH' },\r\n * { id: 3, nombre: 'Pedro', departamento: 'TI' }\r\n * ];\r\n *\r\n * const deptosUnicos = this.utilityAddService.getUniqueValues(usuarios, 'departamento');\r\n * // Retorna: [\r\n * // { value: 'RRHH', field: 'departamento' },\r\n * // { value: 'TI', field: 'departamento' }\r\n * // ]\r\n * ```\r\n */\r\n getUniqueValues<T>(data: T[], field: keyof T): FilterOption[] {\r\n if (!data || data.length === 0) {\r\n console.warn(\r\n 'UtilityAddService.getUniqueValues: El array de datos está vacío. No se puede obtener valores únicos.',\r\n );\r\n return [];\r\n }\r\n\r\n const hasField = data.some((item) =>\r\n Object.prototype.hasOwnProperty.call(item as object, field as string),\r\n );\r\n\r\n if (!hasField) {\r\n const availableFields = Array.from(\r\n new Set(data.flatMap((item) => Object.keys(item as object))),\r\n ).sort();\r\n\r\n console.warn(\r\n `UtilityAddService.getUniqueValues: El campo \"${String(\r\n field,\r\n )}\" no existe en los objetos proporcionados. Campos disponibles: ${availableFields.join(\r\n ', ',\r\n )}`,\r\n );\r\n\r\n return [];\r\n }\r\n\r\n const uniqueValues = data.reduce((acc: FilterOption[], current) => {\r\n const fieldValue = current[field];\r\n\r\n if (\r\n typeof fieldValue === 'string' &&\r\n !acc.some((item) => item.value === fieldValue)\r\n ) {\r\n acc.push({\r\n value: fieldValue,\r\n field: field.toString(),\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return uniqueValues.sort((a, b) => a.value.localeCompare(b.value));\r\n }\r\n\r\n /**\r\n * Helper function para parsear fechas para filtro de primeNg en table\r\n * @param date - Fecha en formato string, Date o null/undefined\r\n * @returns Date | null - Objeto Date válido o null\r\n */\r\n parseDate(date: string | Date | null): Date | null {\r\n if (!date) return null;\r\n return typeof date === 'string' ? new Date(date) : date;\r\n }\r\n\r\n /**\r\n * Función pura que procesa una cadena de texto conteniendo números individuales y/o rangos numéricos,\r\n * devolviendo un array con todos los números expandidos.\r\n *\r\n * @param input - Cadena de texto con el formato: número[.número][.inicio-fin][...]\r\n * @returns Array de números con todos los valores individuales y rangos expandidos\r\n *\r\n * @example\r\n * // Uso básico\r\n * const result = parseNumericRanges('1.5.7.10-12');\r\n * // Retorna: [1, 5, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Con espacios y caracteres especiales\r\n * const result = parseNumericRanges(' 3. 5-7 .10-12abc');\r\n * // Retorna: [3, 5, 6, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Rangos invertidos (serán ignorados)\r\n * const result = parseNumericRanges('10-8');\r\n * // Retorna: [] (array vacío)\r\n *\r\n * @note\r\n * Características especiales:\r\n * - Elimina automáticamente espacios y caracteres no numéricos\r\n * - Los números deben estar separados por puntos (.)\r\n * - Los rangos deben usar guión (-) sin espacios entre números\r\n * - Es tolerante a formatos inconsistentes\r\n * - Omite elementos inválidos sin generar errores\r\n */\r\n parseNumericRanges(input: string): number[] {\r\n const cleanString = input.replace(/[^\\d.\\- ]/g, '').replace(/\\s+/g, '');\r\n\r\n const parts = cleanString.split('.');\r\n const result: number[] = [];\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.includes('-')) {\r\n const [startStr, endStr] = part.split('-');\r\n const start = parseInt(startStr, 10);\r\n const end = parseInt(endStr, 10);\r\n\r\n if (!isNaN(start) && !isNaN(end) && start <= end) {\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n }\r\n } else {\r\n const number = parseInt(part, 10);\r\n if (!isNaN(number)) {\r\n result.push(number);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adaptador para procesar eventos de input y extraer rangos numéricos.\r\n *\r\n * @param event - Objeto Event del DOM, preferiblemente de un elemento input\r\n * @returns\r\n * - Array de números generado a partir del valor del input, cuando hay\r\n * números/rangos.\r\n * - El carácter comodín \"*\" cuando el valor del input es exactamente \"*\".\r\n *\r\n * @example\r\n * // Uso en template Angular\r\n * <input (input)=\"processNumericRangesFromEvent($event)\">\r\n *\r\n * @example\r\n * // Uso directo\r\n * const result = processNumericRangesFromEvent(inputEvent);\r\n *\r\n * @note\r\n * Esta función es un wrapper que:\r\n * - Extrae el valor del input del evento\r\n * - Delega el procesamiento a parseNumericRanges()\r\n * - Mantiene compatibilidad con eventos de diferentes frameworks\r\n *\r\n * @dependencies\r\n * Requiere que el evento tenga la propiedad target.value (standard DOM)\r\n * Para otros tipos de eventos (ej. Angular Material) puede necesitar ajustes\r\n */\r\n processNumericRangesFromEvent(event: Event): number[] | '*' {\r\n const rawValue = (event.target as HTMLInputElement).value ?? '';\r\n const inputValue = rawValue.trim();\r\n\r\n // Si el valor es exactamente el comodín \"*\", lo devolvemos tal cual\r\n // para que el consumidor pueda interpretarlo como \"todos\".\r\n if (inputValue === '*') {\r\n return '*';\r\n }\r\n\r\n // Para mezclas de números y asteriscos, parseNumericRanges elimina\r\n // cualquier carácter no numérico/rango (como \"*\"), dando prioridad\r\n // a los números y omitiendo el comodín.\r\n return this.parseNumericRanges(inputValue);\r\n }\r\n\r\n private buildAssociatedGuideHtml(data: unknown): string {\r\n if (!Array.isArray(data) || data.length === 0) {\r\n return '';\r\n }\r\n\r\n const itemsHtml = data\r\n .map((item: any) => {\r\n const cantidadRegistros = String(item?.cantidadRegistros ?? '0');\r\n const vista = String(item?.vista ?? 'No disponible');\r\n\r\n return (\r\n `<li style=\"display: list-item; margin: 0.35rem 0;\">` +\r\n `<div><strong>Ingrese a:</strong> ${vista}</div>` +\r\n `<div><strong>Registros asociados:</strong> ${cantidadRegistros}</div>` +\r\n `</li>`\r\n );\r\n })\r\n .join('');\r\n\r\n return (\r\n `<div style=\"margin-top: 0.65rem;\">` +\r\n `<div style=\"margin-bottom: 0.55rem;\">Sugerencia(s):</div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${itemsHtml}</ol>` +\r\n `</div>`\r\n );\r\n }\r\n\r\n private formatPrimaryAlertMessage(message: string): string {\r\n return `<div style=\"font-family: 'Oswald', sans-serif; font-weight: normal; font-style: italic; margin-bottom: 0.3rem;\">${message}</div>`;\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP, mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @param response - Respuesta de la operación (debe tener isSuccess, title, statusMessage).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n * @param navigateOnCreateSuccess - Override opcional para decidir si un registro nuevo (id === 0)\r\n * navega al listado tras éxito. Tiene prioridad sobre environment.navigateToListOnCreateSuccess.\r\n *\r\n * @example\r\n * // Uso típico en un componente\r\n * this.utilityAddService.handleResponse(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponse(\r\n response: ResponseHttpModel,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number,\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.statusMessage,\r\n 2,\r\n );\r\n if (id > 0) {\r\n this._router.navigate([urlHome]);\r\n return;\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n const guideHtml = this.buildAssociatedGuideHtml(\r\n (response as any)?.data,\r\n );\r\n const mainMessage = this.formatPrimaryAlertMessage(\r\n response.statusMessage,\r\n );\r\n\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n `${mainMessage}${guideHtml}`,\r\n {\r\n icono: 'icon2/hard_drive_error.png',\r\n showConfirmButton: true,\r\n },\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponse:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP que devuelve un ServiceResult<T>,\r\n * mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @typeParam T - Tipo de dato contenido en la propiedad data de ServiceResult.\r\n * @param response - Respuesta del servicio (debe tener isSuccess, title, message, etc.).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n *\r\n * @example\r\n * // Uso típico en un componente con ServiceResult\r\n * this.utilityAddService.handleResponseService<MiModelo>(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponseService<T>(\r\n response: ServiceResult<T>,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number,\r\n navigateOnCreateSuccess?: boolean,\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n const shouldNavigateOnCreate =\r\n navigateOnCreateSuccess ??\r\n this.environment.navigateToListOnCreateSuccess ??\r\n true;\r\n\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.message,\r\n 2,\r\n );\r\n if (id > 0 || (id === 0 && shouldNavigateOnCreate)) {\r\n this._router.navigate([urlHome]);\r\n return;\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n const guideHtml = this.buildAssociatedGuideHtml(\r\n (response as any)?.data,\r\n );\r\n const mainMessage = this.formatPrimaryAlertMessage(response.message);\r\n\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n `${mainMessage}${guideHtml}`,\r\n {\r\n icono: 'icon/request.png',\r\n showConfirmButton: true,\r\n },\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponseService:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2,\r\n );\r\n }\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n delay,\r\n map,\r\n Observable,\r\n of,\r\n retry,\r\n throwError,\r\n} from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterSecurity,\r\n} from '../../models/src/parameterSecurity.model';\r\nimport { SecurityService } from './security.service';\r\nimport { UtilityAddService } from './utility-add.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio para gestionar los parámetros de seguridad de la aplicación.\r\n * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.\r\n * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.\r\n *\r\n * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)\r\n */\r\nexport class ParameterValuesService<T extends string = string> {\r\n /**\r\n * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.\r\n * Se usan para validar y mapear los parámetros recibidos de la API.\r\n */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /**\r\n * Cache interno para optimizar la comparación de valores de parámetros.\r\n * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.\r\n */\r\n private parameterCache = new Map<string, any>();\r\n\r\n private alertedParams = new Set<string>();\r\n private alertedParamsIsParameterValue = new Set<string>();\r\n\r\n /**\r\n * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.\r\n */\r\n private apiService = inject(SecurityService);\r\n\r\n private readonly _utilityServie = inject(UtilityAddService);\r\n\r\n /**\r\n * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.\r\n */\r\n private _dataParameter = signal<MyParameterValues<T>[]>(\r\n this.initializeData(),\r\n );\r\n\r\n /**\r\n * Flag que indica si ya se cargaron los parámetros desde la API.\r\n */\r\n private _loaded = signal(false);\r\n get loaded() {\r\n return this._loaded();\r\n }\r\n\r\n /**\r\n * Inicializa los datos de parámetros usando los valores inyectados.\r\n * @returns Array de parámetros iniciales tipados\r\n */\r\n private initializeData(): MyParameterValues<T>[] {\r\n return this.initialParameters.map((param) =>\r\n this.createMyParameterValue(param.parameterName as T, param.values),\r\n );\r\n }\r\n\r\n /**\r\n * Crea una instancia de MyParameterValues tipada y segura.\r\n * @param parameterName Nombre del parámetro\r\n * @param values Valores asociados al parámetro\r\n * @returns Objeto MyParameterValues\r\n */\r\n private createMyParameterValue(\r\n parameterName: T,\r\n values: any[],\r\n ): MyParameterValues<T> {\r\n return {\r\n parameterName,\r\n values: [...values],\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve los parámetros actuales como un array de solo lectura.\r\n */\r\n get dataParameter(): Readonly<MyParameterValues<T>[]> {\r\n return this._dataParameter();\r\n }\r\n\r\n /**\r\n * Setter privado para actualizar los parámetros.\r\n * Solo puede ser usado dentro del servicio para mantener la integridad de los datos.\r\n * @param values Array de parámetros a almacenar\r\n */\r\n private setDataParameter(values: MyParameterValues<T>[]): void {\r\n if (!Array.isArray(values)) {\r\n console.error('Error: valores inválidos para dataParameter');\r\n return;\r\n }\r\n this._dataParameter.set(values);\r\n }\r\n\r\n /**\r\n * Carga los parámetros desde la API.\r\n * Si ya se cargaron y force=false, devuelve la copia en memoria.\r\n * @param force Indica si se debe forzar la recarga desde la API (default: false)\r\n * @returns Observable que emite los parámetros cargados como MyParameterValues[]\r\n */\r\n loadParameters(force = false): Observable<MyParameterValues<T>[]> {\r\n if (this._loaded() && !force) {\r\n return of([...this.dataParameter]); // copia mutable\r\n }\r\n\r\n return this.apiService.getParameterSecurity(force).pipe(\r\n map((response) => {\r\n this._utilityServie.logIfNotProduction(\r\n 'Sistema API parámetros:',\r\n response.data?.sistema,\r\n );\r\n const apiParameters = response.data?.parameterSecurity ?? [];\r\n this.validateParameters(apiParameters);\r\n const values = this.mapToMyParameterValues(apiParameters);\r\n this.setDataParameter(values);\r\n this._loaded.set(true);\r\n return values;\r\n }),\r\n // 👇 fallback si falla la llamada pero ya teníamos data\r\n catchError((error) => {\r\n if (this._loaded() && this.dataParameter.length > 0) {\r\n return of([...this.dataParameter]);\r\n }\r\n this._loaded.set(false);\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Fuerza la recarga de los parámetros desde la API.\r\n * @returns Observable que emite los parámetros actualizados\r\n */\r\n refreshParameters(): Observable<MyParameterValues<T>[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /**\r\n * Crea una copia segura y mutable de los parámetros actuales.\r\n * @returns Array de parámetros\r\n */\r\n private createSafeCopy(): MyParameterValues<T>[] {\r\n return this.dataParameter.map((item) =>\r\n this.createMyParameterValue(item.parameterName, [...item.values]),\r\n );\r\n }\r\n\r\n /**\r\n * Mapea los parámetros recibidos de la API a objetos tipados y seguros.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n * @returns Array de MyParameterValues\r\n */\r\n private mapToMyParameterValues(\r\n apiParameters: ParameterSecurity[],\r\n ): MyParameterValues<T>[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => {\r\n // Función de conversión type-safe\r\n return this.convertToTypedParameter(param);\r\n })\r\n .filter((param): param is MyParameterValues<T> => param !== null);\r\n }\r\n\r\n /**\r\n * Convierte un parámetro de la API a un objeto tipado, validando el nombre.\r\n * @param param Parámetro recibido de la API\r\n * @returns Objeto MyParameterValues o null si no es válido\r\n */\r\n private convertToTypedParameter(\r\n param: ParameterSecurity,\r\n ): MyParameterValues<T> | null {\r\n const initialParam = this.initialParameters.find(\r\n (p) => p.parameterName === param.parameterName,\r\n );\r\n\r\n if (!initialParam) {\r\n return null;\r\n }\r\n\r\n // Conversión segura con verificación\r\n if (this.isValidParameterName(param.parameterName)) {\r\n return this.createMyParameterValue(\r\n param.parameterName as T,\r\n param.parameterValues?.map((v) => v.value) ?? [],\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Verifica si un nombre de parámetro es válido según los parámetros iniciales.\r\n * @param name Nombre a validar\r\n * @returns true si es válido\r\n */\r\n private isValidParameterName(name: string): name is T {\r\n // Verifica que el nombre esté en los parámetros iniciales\r\n return this.initialParameters.some((param) => param.parameterName === name);\r\n }\r\n\r\n /**\r\n * Valida que los parámetros devueltos por la API coincidan con los iniciales.\r\n * Muestra errores o advertencias en consola si existen diferencias.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n */\r\n private validateParameters(apiParameters: ParameterSecurity[]): void {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n const apiNames = apiParameters.map((p) => p.parameterName);\r\n\r\n const missing = initialNames.filter((name) => !apiNames.includes(name));\r\n const extra = apiNames.filter((name) => !initialNames.includes(name));\r\n\r\n if (missing.length) {\r\n console.warn(`Faltan en API: ${missing.join(', ')}`);\r\n const ok = confirm(`Faltan en API: ${missing.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (extra.length) {\r\n console.warn(`Extra en API: ${extra.join(', ')}`);\r\n const ok = confirm(`Extra en API: ${extra.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (initialNames.length !== apiNames.length) {\r\n console.warn(\r\n `Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Si `index` es null (valor por defecto), devuelve todo el arreglo de valores.\r\n * Devuelve `defaultValue` si no existe el parámetro o el índice es inválido.\r\n * Valida que el parámetro exista antes de acceder a su valor.\r\n * @param parameterName Nombre del parámetro\r\n * @param index Índice del valor dentro del array. Si es null (default), devuelve todos los valores.\r\n * @param defaultValue Valor por defecto si no existe (default: null)\r\n * @returns Valor del parámetro, todos los valores si index es null, o defaultValue si no existe o el índice es inválido\r\n */\r\n getValue<U = any>(parameterName: T): U[];\r\n getValue<U = any>(\r\n parameterName: T,\r\n index: number,\r\n defaultValue?: U | null,\r\n ): U;\r\n getValue<U = any>(\r\n parameterName: T,\r\n index: null,\r\n defaultValue?: U[] | null,\r\n ): U[];\r\n getValue<U = any>(\r\n parameterName: T,\r\n index: number | null = null,\r\n defaultValue: U | U[] | null = null,\r\n ): U | U[] {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName,\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParams.has(parameterName)) {\r\n alert(`Advertencia: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParams.add(parameterName);\r\n }\r\n return defaultValue as U | U[];\r\n }\r\n\r\n if (index === null) {\r\n return param.values as U[];\r\n }\r\n\r\n if (index < 0 || index >= param.values.length) {\r\n alert(\r\n `Advertencia: Índice ${index} fuera de rango para el parámetro '${parameterName}'.`,\r\n );\r\n return defaultValue as U;\r\n }\r\n\r\n return param.values[index] as U;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.\r\n * @param parameterName Nombre del parámetro\r\n * @param expectedValue Valor esperado\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @returns true si coincide, false en caso contrario\r\n */\r\n isParameterValue<U = any>(\r\n parameterName: T,\r\n expectedValue: U,\r\n index = 0,\r\n ): boolean {\r\n const cacheKey = `${String(parameterName)}_${index}`;\r\n\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName,\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParamsIsParameterValue.has(parameterName)) {\r\n alert(`Error: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParamsIsParameterValue.add(parameterName);\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.parameterCache.has(cacheKey)) {\r\n const value = this.getValue<U>(parameterName, index);\r\n this.parameterCache.set(cacheKey, value);\r\n }\r\n\r\n return this.parameterCache.get(cacheKey) === expectedValue;\r\n }\r\n\r\n /**\r\n * Limpia el cache interno de comparaciones de parámetros.\r\n */\r\n clearParameterCache(): void {\r\n this.parameterCache.clear();\r\n }\r\n\r\n /**\r\n * Verifica si un parámetro tiene al menos un valor.\r\n * @param parameterName Nombre del parámetro\r\n * @returns true si tiene al menos un valor, false si no tiene\r\n */\r\n hasAnyValue(parameterName: T): boolean {\r\n return this.getAllValues(parameterName).length > 0;\r\n }\r\n\r\n /**\r\n * Devuelve todos los valores de un parámetro.\r\n * @param parameterName Nombre del parámetro\r\n * @returns Array de valores\r\n */\r\n getAllValues<U = any>(parameterName: T): U[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as U[];\r\n }\r\n}\r\n","/**\r\n * action-message.model.ts\r\n *\r\n * Centraliza los tipos de acción y la configuración de mensajes para acciones de botones y operaciones comunes en la UI.\r\n *\r\n * - Define los tipos de acción estándar usados en dsx-button y otros componentes.\r\n * - Permite mantener uniformidad y evitar errores por typos en los tipos de acción.\r\n * - Provee la función getActionMessageConfig para obtener los textos, títulos e íconos de confirmación según la acción y el estado.\r\n * - Si se usa una acción válida pero sin mensaje configurado, en modo desarrollo muestra un warning para facilitar el mantenimiento.\r\n *\r\n * Uso recomendado:\r\n * - Importa ACTION_TYPES y ActionType donde se requiera validar o tipar acciones de botones.\r\n * - Usa getActionMessageConfig para obtener la configuración de confirmación antes de ejecutar acciones destructivas o de restauración.\r\n *\r\n * Ejemplo:\r\n * import { ACTION_TYPES, ActionType, getActionMessageConfig } from '.../action-message.model';\r\n * const config = getActionMessageConfig('softDelete', true);\r\n * // config: { title, message, icon }\r\n *\r\n * Si agregas un nuevo tipo de acción, recuerda añadir su mensaje en getActionMessageConfig.\r\n */\r\n\r\nimport { SweetAlertIcon } from 'sweetalert2';\r\n\r\n/**\r\n * Tipos de acción disponibles para el componente `dsx-button`.\r\n *\r\n * Usa `ACTION_TYPES` en el consumidor para evitar typos.\r\n *\r\n * **Persistencia de datos (formulario)**\r\n * - `create` → Navega a la ruta de nuevo registro (azul)\r\n * - `saveOrUpdate` → Muestra \"Guardar\" si `id` es 0, \"Actualizar\" si `id` > 0 (amarillo)\r\n *\r\n * **Eliminar**\r\n * - `delete` → Eliminar registro permanentemente (rojo)\r\n * - `softDelete` → Borrar registro con borrado lógico (amarillo)\r\n *\r\n * **Formulario**\r\n * - `validate` → Validar formulario sin guardar (gris)\r\n * - `restore` → Restaurar datos originales (gris)\r\n *\r\n * **Navegación / Utilidades**\r\n * - `home` → Ir al inicio (gris)\r\n * - `refresh` → Recargar datos desde el servidor (morado)\r\n *\r\n * **Consulta / Descarga**\r\n * - `details` → Ver el detalle de un registro (azul índigo)\r\n * - `view` → Previsualizar o abrir detalle (azul cielo)\r\n * - `export` → Exportar información a Excel (verde Excel)\r\n * - `download` → Descargar archivo o recurso (ámbar cálido)\r\n * - `import` → Importar datos desde archivo (azul acero)\r\n */\r\nexport const ACTION_TYPES = {\r\n hardDelete: 'hardDelete',\r\n softDelete: 'softDelete',\r\n return: 'return',\r\n home: 'home',\r\n validate: 'validate',\r\n restore: 'restore',\r\n edit: 'edit',\r\n create: 'create',\r\n save: 'save',\r\n update: 'update',\r\n refresh: 'refresh',\r\n details: 'details',\r\n view: 'view',\r\n export: 'export',\r\n download: 'download',\r\n import: 'import',\r\n} as const;\r\n\r\nexport type ActionType = (typeof ACTION_TYPES)[keyof typeof ACTION_TYPES];\r\n\r\nexport interface ActionMessageConfig {\r\n title: string;\r\n message: string;\r\n icon?: SweetAlertIcon | null | undefined;\r\n icono?: string | null | undefined;\r\n confirmButtonText?: string | undefined;\r\n cancelButtonText?: string | undefined;\r\n showConfirmButton?: boolean | undefined;\r\n showCancelButton?: boolean | undefined;\r\n}\r\n\r\nexport function getActionMessageConfig(\r\n action: Exclude<ActionType, 'softDelete' | 'hardDelete'>,\r\n dataPreview?: string,\r\n): ActionMessageConfig;\r\nexport function getActionMessageConfig(\r\n action: Extract<ActionType, 'softDelete' | 'hardDelete'>,\r\n isActive: boolean,\r\n dataPreview?: string,\r\n): ActionMessageConfig;\r\nexport function getActionMessageConfig(\r\n action: ActionType,\r\n secondArg?: boolean | string,\r\n thirdArg?: string,\r\n): ActionMessageConfig {\r\n const isActive =\r\n action === 'softDelete' || action === 'hardDelete'\r\n ? typeof secondArg === 'boolean'\r\n ? secondArg\r\n : true\r\n : true;\r\n const dataPreview =\r\n action === 'softDelete' || action === 'hardDelete'\r\n ? thirdArg\r\n : typeof secondArg === 'string'\r\n ? secondArg\r\n : undefined;\r\n\r\n // Valores por defecto para todas las propiedades\r\n const defaults: ActionMessageConfig = {\r\n title: '',\r\n message: '',\r\n icon: undefined,\r\n confirmButtonText: undefined,\r\n cancelButtonText: undefined,\r\n showConfirmButton: undefined,\r\n showCancelButton: undefined,\r\n };\r\n\r\n if (action === 'softDelete') {\r\n if (isActive) {\r\n return {\r\n ...defaults,\r\n title: '¿Archivar registro?',\r\n message:\r\n 'El registro dejará de estar visible en las listas principales, pero podrás recuperarlo más tarde.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon/folder01.png',\r\n confirmButtonText: 'Archivar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n } else {\r\n return {\r\n ...defaults,\r\n title: '¿Restaurar registro?',\r\n message:\r\n 'El registro volverá a estar <strong>activo</strong> y visible en todas las listas principales del sistema.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon/documentation.png',\r\n confirmButtonText: 'Sí, restaurar',\r\n cancelButtonText: 'Dejar archivado',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n }\r\n if (action === 'hardDelete') {\r\n return {\r\n ...defaults,\r\n title: '¿Eliminar permanentemente?',\r\n message:\r\n 'Esta acción <strong>no se puede deshacer</strong>. Se perderán todos los datos asociados a este registro de forma inmediata.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon/delete.png',\r\n confirmButtonText: 'Eliminar permanentemente',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (action === 'save') {\r\n return {\r\n ...defaults,\r\n title: '¿Guardar registro?',\r\n message:\r\n 'El nuevo registro se guardará en el sistema.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon2/save_2029637.png',\r\n confirmButtonText: 'Guardar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (action === 'update') {\r\n return {\r\n ...defaults,\r\n title: '¿Actualizar registro?',\r\n message:\r\n 'Los cambios realizados se actualizarán en el sistema.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon2/save_2029637.png',\r\n confirmButtonText: 'Actualizar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (action === 'restore') {\r\n return {\r\n ...defaults,\r\n title: '¿Revertir cambios?',\r\n message:\r\n 'Se perderán todos los cambios que hayas realizado en el formulario y se volverán a cargar los datos originales.',\r\n icono: 'icon/data-recovery.png',\r\n confirmButtonText: 'Restaurar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\r\n console.warn(\r\n `[getActionMessageConfig] Acción \"${action}\" existe pero no tiene mensaje configurado. ` +\r\n 'Agrega la configuración correspondiente para evitar este warning.',\r\n );\r\n }\r\n // Retorna los valores por defecto si la acción no es válida\r\n return { ...defaults };\r\n}\r\n","import {\r\n Component,\r\n HostBinding,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n output,\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Button } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../../../injections/environment.token';\r\nimport { ParameterValuesService } from '../../../../services/src/parameter-values.service';\r\nimport {\r\n ACTION_TYPES,\r\n ActionType,\r\n} from '../../../../models/src/action-message.model';\r\n\r\n/**\r\n * Paleta corporativa de colores para `dsx-button`.\r\n *\r\n * Cada token tiene un significado semántico fijo. Úsala como referencia\r\n * para asignar `colorToken` al añadir nuevos tipos de botón.\r\n *\r\n * | Token | Color | Uso semántico |\r\n * |-----------|----------------|---------------------------------------------------|\r\n * | danger | Coral rojo | Acción destructiva e irreversible (eliminar) |\r\n * | warning | Naranja cálido | Acción con riesgo moderado / borrado lógico |\r\n * | caution | Ámbar dorado | Requiere verificación del usuario (actualizar) |\r\n * | success | Verde menta | Guardar nuevo registro / agregar |\r\n * | primary | Azul claro | Editar / navegar con contexto de registro |\r\n * | info | Cian suave | Recargar datos / refrescar vista |\r\n * | neutral | Gris azulado | Acción secundaria / navegación sin contexto |\r\n * | restore | Violeta suave | Deshacer / restaurar estado anterior |\r\n * | view | Teal profundo | Ver / previsualizar detalle |\r\n * | excel | Verde Excel | Exportar información a hoja de cálculo |\r\n * | download | Naranja quemado| Descargar archivo o recurso |\r\n * | import | Azul acero | Importar información desde archivo |\r\n * | details | Azul índigo | Abrir detalle de registro |\r\n */\r\nexport const DSX_PALETTE = {\r\n danger: '#EF5350',\r\n warning: '#FF7043',\r\n caution: '#FFB300',\r\n success: '#0ba055', // Verde para Guardar\r\n primary: '#0066cc', // Azul para Actualizar\r\n info: '#26C6DA',\r\n neutral: '#90A4AE',\r\n restore: '#B0BEC5', // Gris suave, menos resaltado\r\n return: '#11438d', // Azul violeta para \"Regresar registro archivado\"\r\n view: '#00838F',\r\n excel: '#217346',\r\n download: '#E65100',\r\n import: '#546E7A',\r\n details: '#3949AB',\r\n magenta: '#D81B60', // Magenta vibrante\r\n cyan: '#00BCD4', // Cian brillante\r\n olive: '#808000', // Verde oliva\r\n brown: '#8D6E63', // Marrón suave\r\n slate: '#607D8B', // Azul pizarra\r\n} as const;\r\n\r\nexport type DsxColorToken = keyof typeof DSX_PALETTE;\r\n\r\ntype DsxButtonConfig = {\r\n label: string;\r\n /** Nombre de icono para Material Symbols (fallback cuando no se define primeIcon). */\r\n icon: string;\r\n tooltip: string;\r\n /** Token de la paleta corporativa que determina el color del botón. */\r\n colorToken: DsxColorToken;\r\n /** Clase de PrimeIcons para renderizado por `p-button` ([icon]). */\r\n primeIcon?: string;\r\n /** Si es `true`, el botón se renderiza con contorno en lugar de relleno sólido. */\r\n outlined?: boolean;\r\n};\r\n\r\n/** Tipos que necesitan un `[id]` mayor a 0 para poder mostrarse. */\r\nconst TYPES_REQUIRING_ID: ActionType[] = [\r\n 'hardDelete',\r\n 'softDelete',\r\n 'restore',\r\n];\r\n\r\n@Component({\r\n selector: 'dsx-button',\r\n imports: [Button, TooltipModule],\r\n templateUrl: './dsx-button.html',\r\n styleUrl: './dsx-button.css',\r\n})\r\nexport class DsxButtonComponent {\r\n debug = input<boolean>(false);\r\n private renderCount = 0;\r\n private readonly _paramService = inject(ParameterValuesService<string>);\r\n private readonly _router = inject(Router);\r\n private readonly _environment = inject(ENVIRONMENT, {\r\n optional: true,\r\n }) as EnvironmentConfig | undefined;\r\n\r\n constructor() {\r\n if (isDevMode()) {\r\n effect(() => {\r\n if (!this.debug()) return;\r\n\r\n this.renderCount++;\r\n\r\n console.log(`[dsx-button:${this.type()}] render #${this.renderCount}`, {\r\n id: this.id(),\r\n type: this.type(),\r\n disabled: this.disabled(),\r\n routerLink: this.routerLink(),\r\n });\r\n });\r\n }\r\n }\r\n\r\n @HostBinding('class.dsx-button-compact-host')\r\n get compactHostClass(): boolean {\r\n return this.isCompactIconButton;\r\n }\r\n\r\n type = input<ActionType>(ACTION_TYPES.hardDelete);\r\n disabled = input<boolean>(false);\r\n routerLink = input<string | any[] | undefined>(undefined);\r\n /**\r\n * Ruta de navegación simplificada. La `/` inicial se agrega automáticamente.\r\n * Cada segmento solo admite: letras, números, `-`, `_`, `.` y `:` (params de ruta).\r\n * Ejemplos válidos: `'home'`, `'container/nuevo'`, `'item/123'`\r\n * Ejemplos inválidos: `'item/*'`, `'item?foo=bar'`, `'item/../other'`\r\n * Para rutas dinámicas complejas usa `[routerLink]` directamente.\r\n */\r\n routerPath = input<string | undefined>(undefined);\r\n /** Ancho del botón. Usa `rem` para que escale con la preferencia de fuente del usuario.\r\n * Ejemplo: `'8rem'`, `'12rem'`. Valor por defecto: `'9rem'`.\r\n */\r\n width = input<string>('9rem');\r\n iconOnly = input<boolean>(false);\r\n iconOnlyWidth = input<string>('2.5rem');\r\n raised = input<boolean>(true);\r\n rounded = input<boolean>(true);\r\n\r\n parameterName = input<string | undefined>(undefined);\r\n parameterExpectedValue = input<any>(1);\r\n parameterIndex = input<number>(0);\r\n\r\n id = input<number | string | null | undefined>(undefined);\r\n requireIdInput = input<boolean>(false);\r\n requiresIdGreaterThanZero = input<boolean>(false);\r\n\r\n labelOverride = input<string | undefined>(undefined);\r\n tooltipOverride = input<string | undefined>(undefined);\r\n iconOverride = input<string | undefined>(undefined);\r\n primeIconOverride = input<string | undefined>(undefined);\r\n /** Permite personalizar el color usando únicamente tokens de la paleta DSX. */\r\n colorOverride = input<DsxColorToken | undefined>(undefined);\r\n /** Permite forzar estilo outlined o sólido por instancia. */\r\n outlinedOverride = input<boolean | undefined>(undefined);\r\n /**\r\n * Override por instancia para el botón `validate`.\r\n * Tiene prioridad sobre `environment.showValidateButton`.\r\n */\r\n showValidateButtonOverride = input<boolean | undefined>(undefined);\r\n /**\r\n * Override por instancia para el botón `restore`.\r\n * Tiene prioridad sobre `environment.showRestoreButton`.\r\n */\r\n showRestoreButtonOverride = input<boolean | undefined>(undefined);\r\n\r\n action = output<void>();\r\n\r\n /** Valida y normaliza `routerPath`: agrega `/` inicial y rechaza caracteres inválidos. */\r\n readonly resolvedRouterLink = computed<string | undefined>(() => {\r\n this.log('computed resolvedRouterLink');\r\n const raw = this.routerPath();\r\n if (!raw) return undefined;\r\n\r\n const VALID_SEGMENT = /^[a-zA-Z0-9\\-_.:]+$/;\r\n const normalizedRaw = raw.replace(/^\\/+/, '');\r\n const rawSegments = normalizedRaw.split('/');\r\n const hasEmptySegments =\r\n normalizedRaw.length > 0 && rawSegments.some((s) => s.length === 0);\r\n if (hasEmptySegments) {\r\n console.warn(\r\n `[dsx-button] routerPath contiene segmentos vacíos (\"//\" o \"/\" al final). ` +\r\n `Ruta recibida: \"${raw}\"`,\r\n );\r\n return undefined;\r\n }\r\n\r\n const segments = rawSegments.filter(Boolean);\r\n const invalid = segments.filter((s) => !VALID_SEGMENT.test(s));\r\n\r\n if (invalid.length > 0) {\r\n console.warn(\r\n `[dsx-button] routerPath contiene segmentos inválidos: \"${invalid.join('\", \"')}\". ` +\r\n `Solo se permiten letras, números, guion (-), guion bajo (_), punto (.) y dos puntos (:). ` +\r\n `Ruta recibida: \"${raw}\"`,\r\n );\r\n return undefined;\r\n }\r\n\r\n return `/${segments.join('/')}`;\r\n });\r\n\r\n /** Prioriza routerPath (validado) sobre routerLink (libre). */\r\n readonly effectiveRouterLink = computed<string | any[] | undefined>(() => {\r\n this.log('computed effectiveRouterLink');\r\n const resolvedPath = this.resolvedRouterLink();\r\n if (resolvedPath) {\r\n return resolvedPath;\r\n }\r\n\r\n const link = this.routerLink();\r\n if (typeof link !== 'string') {\r\n return link;\r\n }\r\n\r\n const trimmed = link.trim();\r\n if (!trimmed) {\r\n return link;\r\n }\r\n\r\n // URLs externas no se normalizan ni validan como rutas internas.\r\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(trimmed)) {\r\n return link;\r\n }\r\n\r\n const VALID_SEGMENT = /^[a-zA-Z0-9\\-_.:]+$/;\r\n const pathForValidation = trimmed.replace(/^\\/+/, '');\r\n const rawSegments = pathForValidation.split('/');\r\n const hasEmptySegments =\r\n pathForValidation.length > 0 &&\r\n rawSegments.some((segment) => segment.length === 0);\r\n\r\n if (hasEmptySegments) {\r\n console.warn(\r\n `[dsx-button] routerLink contiene segmentos vacíos (\"//\" o \"/\" al final). ` +\r\n `Ruta recibida: \"${link}\"`,\r\n );\r\n return link;\r\n }\r\n\r\n const invalid = rawSegments\r\n .filter(Boolean)\r\n .filter((segment) => !VALID_SEGMENT.test(segment));\r\n\r\n if (invalid.length > 0) {\r\n console.warn(\r\n `[dsx-button] routerLink contiene segmentos inválidos: \"${invalid.join('\", \"')}\". ` +\r\n `Solo se permiten letras, números, guion (-), guion bajo (_), punto (.) y dos puntos (:). ` +\r\n `Ruta recibida: \"${link}\"`,\r\n );\r\n return link;\r\n }\r\n\r\n // Si llega una ruta simple sin prefijo, se normaliza a absoluta para evitar navegación relativa inesperada.\r\n if (\r\n link.startsWith('/') ||\r\n link.startsWith('./') ||\r\n link.startsWith('../')\r\n ) {\r\n return link;\r\n }\r\n\r\n if (trimmed.includes('?') || trimmed.includes('#')) {\r\n return link;\r\n }\r\n\r\n return `/${trimmed.split('/').filter(Boolean).join('/')}`;\r\n });\r\n\r\n // get buttonStyle(): Record<string, string> {\r\n // this.log('getter buttonStyle');\r\n // const color = DSX_PALETTE[this.config.colorToken];\r\n // const width = this.iconOnly() ? this.iconOnlyWidth() : this.width();\r\n\r\n // if (this.isCompactIconButton) {\r\n // return {\r\n // width,\r\n // background: 'transparent',\r\n // borderColor: 'transparent',\r\n // color,\r\n // };\r\n // }\r\n\r\n // if (this.config.outlined) {\r\n // return { width, background: 'transparent', borderColor: color, color };\r\n // }\r\n\r\n // return { width, background: color, borderColor: color, color: '#ffffff' };\r\n // }\r\n\r\n readonly buttonStyleComputed = computed(() => {\r\n const color = DSX_PALETTE[this.config.colorToken];\r\n const width = this.iconOnly() ? this.iconOnlyWidth() : this.width();\r\n\r\n if (this.isCompactIconButton) {\r\n return {\r\n width,\r\n background: 'transparent',\r\n borderColor: 'transparent',\r\n color,\r\n };\r\n }\r\n\r\n if (this.config.outlined) {\r\n return {\r\n width,\r\n background: 'transparent',\r\n borderColor: color,\r\n color,\r\n };\r\n }\r\n\r\n return {\r\n width,\r\n background: color,\r\n borderColor: color,\r\n color: '#ffffff',\r\n };\r\n });\r\n\r\n get buttonLabel(): string | undefined {\r\n return this.iconOnly() ? undefined : this.label;\r\n }\r\n\r\n get buttonSize(): 'small' | undefined {\r\n return this.isCompactIconButton ? 'small' : undefined;\r\n }\r\n\r\n get buttonStyleClass(): string | undefined {\r\n return this.isCompactIconButton ? 'dsx-button-compact' : undefined;\r\n }\r\n\r\n get isCompactIconButton(): boolean {\r\n return this.rounded() && this.iconOnly();\r\n }\r\n\r\n get config(): DsxButtonConfig {\r\n const cfg = ACTION_CONFIG[this.type() as ActionType];\r\n const colorOverride = this.colorOverride();\r\n const outlinedOverride = this.outlinedOverride();\r\n\r\n // Ya no se gestiona softDelete/return como modo, cada acción es independiente\r\n\r\n return {\r\n ...cfg,\r\n colorToken: colorOverride ?? cfg.colorToken,\r\n outlined: outlinedOverride ?? cfg.outlined,\r\n };\r\n }\r\n\r\n get label(): string {\r\n return this.labelOverride() ?? this.config.label;\r\n }\r\n\r\n // get tooltip(): string {\r\n // this.log('getter tooltip');\r\n // return this.tooltipOverride() ?? this.config.tooltip;\r\n // }\r\n\r\n readonly tooltip = computed(() => {\r\n return this.tooltipOverride() ?? this.config.tooltip;\r\n });\r\n\r\n get icon(): string {\r\n return this.iconOverride() ?? this.config.icon;\r\n }\r\n\r\n get materialIcon(): string {\r\n return this.icon || 'file_export';\r\n }\r\n\r\n get primeIcon(): string | undefined {\r\n if (this.primeIconOverride()) {\r\n return this.primeIconOverride();\r\n }\r\n\r\n return 'primeIcon' in this.config ? this.config.primeIcon : undefined;\r\n }\r\n\r\n // showButton(): boolean {\r\n // this.time('showButton');\r\n\r\n // const result =\r\n // this.passesGlobalVisibilityPolicy() &&\r\n // this.passesParameterValidation() &&\r\n // this.passesIdValidation();\r\n\r\n // this.log('showButton()', {\r\n // result,\r\n // });\r\n\r\n // this.timeEnd('showButton');\r\n\r\n // return result;\r\n // }\r\n\r\n readonly visible = computed(() => {\r\n return (\r\n this.passesGlobalVisibilityPolicy() &&\r\n this.passesParameterValidation() &&\r\n this.passesIdValidation()\r\n );\r\n });\r\n\r\n private passesGlobalVisibilityPolicy(): boolean {\r\n const type = this.type();\r\n\r\n if (type === 'validate') {\r\n const override = this.showValidateButtonOverride();\r\n if (override !== undefined) {\r\n return override;\r\n }\r\n\r\n return this._environment?.showValidateButton ?? false;\r\n }\r\n\r\n if (type === 'restore') {\r\n const override = this.showRestoreButtonOverride();\r\n if (override !== undefined) {\r\n return override;\r\n }\r\n\r\n return this._environment?.showRestoreButton ?? false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async onButtonClick(): Promise<void> {\r\n this.log('click', {\r\n id: this.id(),\r\n target: this.effectiveRouterLink(),\r\n });\r\n\r\n this.action.emit();\r\n\r\n const target = this.effectiveRouterLink();\r\n if (target == null) {\r\n if (this.type() === 'home') {\r\n console.warn(\r\n '[dsx-button] El botón tipo \"home\" no tiene routerLink ni routerPath configurado.',\r\n );\r\n }\r\n return;\r\n }\r\n\r\n try {\r\n const start = performance.now();\r\n const navigated = await this.navigateToTarget(target);\r\n this.log('navigation', {\r\n target,\r\n navigated,\r\n durationMs: Math.round(performance.now() - start),\r\n });\r\n if (!navigated) {\r\n // El router rechazó la navegación, lo más común durante hot-reload\r\n // es que un guard de autenticación aún no tiene el estado listo.\r\n // Se reintenta una vez tras un tick para darle tiempo al guard.\r\n const retried = await new Promise<boolean>((resolve) =>\r\n setTimeout(\r\n async () => resolve(await this.navigateToTarget(target)),\r\n 0,\r\n ),\r\n );\r\n if (!retried) {\r\n console.warn(\r\n '[dsx-button] Navegación rechazada (posiblemente por un route guard). ' +\r\n 'Si ocurre solo tras hot-reload, es normal que el guard rechace ' +\r\n 'la primera navegación mientras los servicios de autenticación ' +\r\n 'no han terminado de restaurar su estado.',\r\n target,\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n console.warn(\r\n '[dsx-button] Error al navegar desde el botón.',\r\n target,\r\n error,\r\n );\r\n }\r\n }\r\n\r\n private passesIdValidation(): boolean {\r\n this.log('passesIdValidation');\r\n const explicitId = this.getNormalizedId();\r\n const routeId = this.getIdFromNavigationTarget(this.effectiveRouterLink());\r\n const id = explicitId ?? routeId;\r\n const requiresExistingRecord =\r\n this.requiresIdGreaterThanZero() ||\r\n this.type() === 'hardDelete' ||\r\n this.type() === 'softDelete' ||\r\n this.type() === 'restore' ||\r\n this.type() === 'return';\r\n\r\n // Permite exigir que venga [id] cuando el caso de uso lo requiera.\r\n if (this.requireIdInput() && typeof id !== 'number') {\r\n return false;\r\n }\r\n\r\n if (!requiresExistingRecord) {\r\n return true;\r\n }\r\n\r\n return typeof id === 'number' && id > 0;\r\n }\r\n\r\n private getIdFromNavigationTarget(\r\n target: string | any[] | undefined,\r\n ): number | undefined {\r\n if (Array.isArray(target)) {\r\n for (let index = target.length - 1; index >= 0; index--) {\r\n const parsed = this.parseFiniteNumber(target[index]);\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n if (typeof target === 'string') {\r\n const cleanPath = target.split('?')[0].split('#')[0];\r\n const segments = cleanPath.split('/').filter(Boolean);\r\n\r\n for (let index = segments.length - 1; index >= 0; index--) {\r\n const parsed = this.parseFiniteNumber(segments[index]);\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private parseFiniteNumber(value: unknown): number | undefined {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return undefined;\r\n }\r\n\r\n const parsed = Number(trimmed);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private getNormalizedId(): number | undefined {\r\n const value = this.id();\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return undefined;\r\n }\r\n\r\n const parsed = Number(trimmed);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private hasExplicitIdInput(): boolean {\r\n const value = this.id();\r\n\r\n if (value === null || value === undefined) {\r\n return false;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value.trim() !== '';\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private navigateToTarget(target: string | any[]): Promise<boolean> {\r\n if (Array.isArray(target)) {\r\n return this._router.navigate(target);\r\n }\r\n\r\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(target)) {\r\n window.location.assign(target);\r\n return Promise.resolve(true);\r\n }\r\n\r\n return this._router.navigateByUrl(target);\r\n }\r\n\r\n private passesParameterValidation(): boolean {\r\n this.log('passesParameterValidation');\r\n const parameterName = this.parameterName();\r\n\r\n // Si no se define un parámetro de seguridad, el botón se muestra sin restricción.\r\n if (!parameterName) {\r\n return true;\r\n }\r\n\r\n // Mantiene una UX estable durante refresh de parámetros: evita parpadeo\r\n // y no evalúa permisos hasta que ParameterValuesService termine de cargar.\r\n if (!this._paramService.loaded) {\r\n return false;\r\n }\r\n\r\n // Conserva el comportamiento original del servicio:\r\n // - retorna false si no cumple el valor esperado\r\n // - alerta si el parámetro no existe (ayuda a detectar typos)\r\n return this._paramService.isParameterValue(\r\n parameterName,\r\n this.parameterExpectedValue(),\r\n this.parameterIndex(),\r\n );\r\n }\r\n\r\n private log(message: string, data?: unknown): void {\r\n if (!this.debug()) return;\r\n\r\n console.log(\r\n `%c[dsx-button:${this.type()}] ${message}`,\r\n 'color:#1976d2;font-weight:bold',\r\n data ?? '',\r\n );\r\n }\r\n\r\n private warn(message: string, data?: unknown): void {\r\n if (!this.debug()) return;\r\n\r\n console.warn(`[dsx-button:${this.type()}] ${message}`, data ?? '');\r\n }\r\n\r\n private time(label: string): void {\r\n if (!this.debug()) return;\r\n\r\n console.time(`[dsx-button:${this.type()}] ${label}`);\r\n }\r\n\r\n private timeEnd(label: string): void {\r\n if (!this.debug()) return;\r\n\r\n console.timeEnd(`[dsx-button:${this.type()}] ${label}`);\r\n }\r\n}\r\n\r\nconst ACTION_CONFIG: Record<ActionType, DsxButtonConfig> = {\r\n hardDelete: {\r\n label: 'Eliminar',\r\n icon: 'delete_forever',\r\n primeIcon: 'pi pi-trash',\r\n colorToken: 'danger',\r\n tooltip: 'Eliminar registro',\r\n },\r\n softDelete: {\r\n label: 'Archivar',\r\n icon: 'archive',\r\n primeIcon: 'pi pi-thumbs-down',\r\n colorToken: 'warning',\r\n tooltip: 'Archivar registro',\r\n },\r\n return: {\r\n label: 'Restaurar',\r\n icon: 'history',\r\n primeIcon: 'pi pi-history',\r\n colorToken: 'return',\r\n tooltip: 'Restaurar registro archivado',\r\n outlined: true,\r\n },\r\n home: {\r\n label: 'Inicio',\r\n icon: 'home_app_logo',\r\n primeIcon: 'pi pi-home',\r\n colorToken: 'neutral',\r\n tooltip: 'Ir al inicio',\r\n outlined: true,\r\n },\r\n validate: {\r\n label: 'Validar',\r\n icon: 'help',\r\n primeIcon: 'pi pi-check-circle',\r\n colorToken: 'neutral',\r\n tooltip: 'Validar formulario',\r\n outlined: true,\r\n },\r\n restore: {\r\n label: 'Deshacer',\r\n icon: 'history',\r\n primeIcon: 'pi pi-history',\r\n colorToken: 'restore',\r\n tooltip: 'Restaurar los datos',\r\n outlined: true,\r\n },\r\n edit: {\r\n label: 'Editar',\r\n icon: 'edit',\r\n primeIcon: 'pi pi-file-edit',\r\n colorToken: 'primary',\r\n tooltip: 'Editar registro',\r\n },\r\n save: {\r\n label: 'Guardar',\r\n icon: 'save',\r\n primeIcon: 'pi pi-save',\r\n colorToken: 'success',\r\n tooltip: 'Guardar nuevo registro',\r\n },\r\n update: {\r\n label: 'Actualizar',\r\n icon: 'edit_note',\r\n primeIcon: 'pi pi-save',\r\n colorToken: 'primary',\r\n tooltip: 'Actualizar registro existente',\r\n },\r\n refresh: {\r\n label: 'Refrescar',\r\n icon: 'cloud_sync',\r\n primeIcon: 'pi pi-refresh',\r\n colorToken: 'info',\r\n tooltip: 'Sincronizar datos',\r\n outlined: true,\r\n },\r\n details: {\r\n label: 'Detalles',\r\n icon: 'list',\r\n primeIcon: 'pi pi-list',\r\n colorToken: 'details',\r\n tooltip: 'Detalle de registro',\r\n },\r\n create: {\r\n label: 'Agregar',\r\n icon: 'add_box',\r\n primeIcon: 'pi pi-plus',\r\n colorToken: 'success',\r\n tooltip: 'Nuevo registro',\r\n },\r\n view: {\r\n label: 'Visualizar',\r\n icon: 'visibility',\r\n primeIcon: 'pi pi-eye',\r\n colorToken: 'view',\r\n tooltip: 'Vista previa',\r\n },\r\n export: {\r\n label: 'Exportar',\r\n icon: 'file_export',\r\n primeIcon: 'pi pi-file-excel',\r\n colorToken: 'excel',\r\n tooltip: 'Exportar a Excel',\r\n },\r\n download: {\r\n label: 'Descargar',\r\n icon: 'download',\r\n primeIcon: 'pi pi-download',\r\n colorToken: 'download',\r\n tooltip: 'Descargar archivo',\r\n },\r\n import: {\r\n label: 'Importar',\r\n icon: 'database_upload',\r\n primeIcon: 'pi pi-upload',\r\n colorToken: 'import',\r\n tooltip: 'Importar desde archivo',\r\n },\r\n} as const;\r\n","<!--Botón con las configuraciones dinámicas para CRUD -->\r\n@if (visible()) {\r\n<p-button\r\n [label]=\"buttonLabel\"\r\n [style]=\"buttonStyleComputed()\"\r\n [styleClass]=\"buttonStyleClass\"\r\n [pTooltip]=\"tooltip()\"\r\n [tooltipDisabled]=\"disabled()\"\r\n tooltipPosition=\"top\"\r\n [rounded]=\"rounded()\"\r\n [text]=\"isCompactIconButton\"\r\n [size]=\"buttonSize\"\r\n severity=\"secondary\"\r\n [disabled]=\"disabled()\"\r\n [icon]=\"iconOnly() ? primeIcon : undefined\"\r\n (click)=\"onButtonClick()\"\r\n>\r\n @if (!iconOnly()) {\r\n <span class=\"material-symbols-outlined dsx-button-icon-small\"\r\n >{{ materialIcon }}</span\r\n >\r\n }\r\n</p-button>\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator,\r\n} from '@angular/forms';\r\nimport { Button } from 'primeng/button';\r\nimport { FileUpload } from 'primeng/fileupload';\r\nimport { Tooltip } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'dsx-file-upload',\r\n imports: [FileUpload, Tooltip, Button],\r\n templateUrl: './file.component.html',\r\n styleUrl: './file.component.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FileComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => FileComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FileComponent\r\n implements ControlValueAccessor, Validator, AfterViewInit, OnDestroy\r\n{\r\n // Inputs\r\n existingFileName = input<string | null>(null);\r\n debug = input<boolean>(false);\r\n required = input<boolean>(true);\r\n accept = input<string>('.xls,.xlsx');\r\n pTooltipOverride = input<string>('Seleccione un archivo');\r\n tooltipPositionOverride = input<string | undefined>('top');\r\n maxFileSize = input<number>(5);\r\n invalidSummary = input<string>('El formato es inválido.');\r\n invalidDetail = input<string>('Archivo debe tener un formato válido. ({0}).');\r\n invalidSizeSummary = input<string>('Tamaño de archivo inválido.');\r\n invalidSizeDetail = input<string>('El tamaño máximo permitido es {0}');\r\n\r\n // Signals de estado\r\n isReplacing = signal(false);\r\n disabled = signal<boolean>(false);\r\n private isViewActive = signal(false);\r\n private value: File | null = null;\r\n private touched = false;\r\n private control: AbstractControl | null = null;\r\n\r\n // Dependencias\r\n private cdr = inject(ChangeDetectorRef);\r\n fileUpload = viewChild<FileUpload>('fileUpload');\r\n\r\n // Computed properties (solo se \"activan\" si la vista está activa)\r\n hasExistingFile = computed(() => {\r\n if (!this.isViewActive()) return false;\r\n const hasFile = !!this.existingFileName() && !this.isReplacing();\r\n if (this.debug() && this.isViewActive())\r\n this.log('hasExistingFile', { hasFile });\r\n return hasFile;\r\n });\r\n\r\n showExistingFile = computed(() => {\r\n if (!this.isViewActive()) return false;\r\n const show = this.hasExistingFile() && !this.isReplacing();\r\n if (this.debug() && this.isViewActive())\r\n this.log('showExistingFile', { show });\r\n return show;\r\n });\r\n\r\n isFileUploadEnabled = computed(() => {\r\n if (!this.isViewActive()) return false;\r\n if (this.disabled()) return false;\r\n const enabled = !this.hasExistingFile() || this.isReplacing();\r\n if (this.debug() && this.isViewActive())\r\n this.log('isFileUploadEnabled', { enabled });\r\n return enabled;\r\n });\r\n\r\n isReplaceButtonDisabled = computed(() => {\r\n if (!this.isViewActive()) return true;\r\n if (this.disabled()) return true;\r\n if (this.isReplacing()) return true;\r\n return false;\r\n });\r\n\r\n // --- Constructor: Aquí se crean los effects (contexto de inyección válido) ---\r\n constructor() {\r\n // Efecto 1: Re-evaluar validación cuando cambie el estado relevante\r\n effect(() => {\r\n // Solo ejecutar si la vista está activa\r\n if (!this.isViewActive()) return;\r\n\r\n // \"Tocar\" estas signals para que el efecto dependa de ellas\r\n const hasFile = this.hasExistingFile();\r\n const replacing = this.isReplacing();\r\n const fileName = this.existingFileName();\r\n\r\n if (this.debug())\r\n this.log('Effect: validation trigger', {\r\n hasFile,\r\n replacing,\r\n fileName,\r\n });\r\n\r\n if (this.control) {\r\n // Usar untracked para no crear bucles infinitos\r\n untracked(() => {\r\n this.control?.updateValueAndValidity({ emitEvent: false });\r\n });\r\n }\r\n this.cdr.detectChanges();\r\n });\r\n\r\n // Efecto 2: Cancelar reemplazo si el componente se deshabilita\r\n effect(() => {\r\n if (!this.isViewActive()) return;\r\n\r\n const isDisabled = this.disabled();\r\n const isReplacingNow = this.isReplacing();\r\n\r\n if (this.debug())\r\n this.log('Effect: disabled changed', { isDisabled, isReplacingNow });\r\n\r\n if (isDisabled && isReplacingNow) {\r\n this.cancelReplace();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Activar el componente después de que la vista esté lista\r\n setTimeout(() => {\r\n this.isViewActive.set(true);\r\n if (this.debug()) console.log('[FileComponent] View activated');\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.isViewActive.set(false);\r\n if (this.debug()) console.log('[FileComponent] Component destroyed');\r\n }\r\n\r\n // --- Métodos públicos y ControlValueAccessor ---\r\n onSelect(event: any): void {\r\n if (!this.isViewActive()) return;\r\n if (!this.isFileUploadEnabled()) {\r\n console.warn('File upload is disabled');\r\n this.fileUpload()?.clear();\r\n return;\r\n }\r\n\r\n const file = event.files?.[0] ?? null;\r\n if (this.debug()) this.log('File selected', { name: file?.name });\r\n\r\n this.value = file;\r\n this.onChange(file);\r\n this.markAsTouched();\r\n\r\n if (this.isReplacing() && file) {\r\n this.isReplacing.set(false);\r\n }\r\n\r\n if (this.control) {\r\n this.control.updateValueAndValidity();\r\n }\r\n }\r\n\r\n clear(): void {\r\n if (!this.isViewActive()) return;\r\n this.fileUpload()?.clear();\r\n this.value = null;\r\n this.onChange(null);\r\n this.markAsTouched();\r\n if (this.control) this.control.updateValueAndValidity();\r\n }\r\n\r\n writeValue(value: File | null): void {\r\n if (!this.isViewActive()) return;\r\n if (this.debug()) this.log('writeValue', { value: value?.name || null });\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n if (!this.isViewActive()) return;\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n startReplace(): void {\r\n if (!this.isViewActive()) return;\r\n if (this.disabled()) return;\r\n this.fileUpload()?.clear();\r\n this.value = null;\r\n this.onChange(null);\r\n this.isReplacing.set(true);\r\n if (this.debug()) this.log('startReplace');\r\n }\r\n\r\n cancelReplace(): void {\r\n if (!this.isViewActive()) return;\r\n this.isReplacing.set(false);\r\n this.fileUpload()?.clear();\r\n this.value = null;\r\n this.onChange(null);\r\n this.markAsTouched();\r\n if (this.debug()) this.log('cancelReplace');\r\n }\r\n\r\n // --- Validación ---\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = control;\r\n if (!this.isViewActive()) return null;\r\n\r\n if (!this.required()) return null;\r\n if (this.hasExistingFile()) return null;\r\n if (this.isReplacing() && !this.value) return { required: true };\r\n if (!this.hasExistingFile() && !this.value) return { required: true };\r\n\r\n return null;\r\n }\r\n\r\n // --- Privados ---\r\n private onChange = (_: File | null) => {};\r\n private onTouched = () => {};\r\n\r\n private markAsTouched(): void {\r\n if (!this.touched) {\r\n this.touched = true;\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private log(method: string, data?: any): void {\r\n console.log(`[FileComponent] ${method}`, data || '');\r\n }\r\n}\r\n","@if (showExistingFile()) {\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"text-sm\"> 📄 {{ existingFileName() }} </span>\r\n\r\n <p-button\r\n icon=\"pi pi-cloud-upload\"\r\n [rounded]=\"true\"\r\n severity=\"info\"\r\n (click)=\"startReplace()\"\r\n [disabled]=\"isReplaceButtonDisabled()\"\r\n pTooltip=\"Reemplazar archivo\"\r\n tooltipPosition=\"top\"\r\n />\r\n </div>\r\n} @else {\r\n <div class=\"flex items-center gap-2\">\r\n <p-fileUpload\r\n #fileUpload\r\n mode=\"basic\"\r\n [accept]=\"accept()\"\r\n [maxFileSize]=\"maxFileSize() * 1024 * 1024\"\r\n [invalidFileTypeMessageSummary]=\"invalidSummary()\"\r\n [invalidFileTypeMessageDetail]=\"invalidDetail()\"\r\n [invalidFileSizeMessageSummary]=\"invalidSizeSummary()\"\r\n [invalidFileSizeMessageDetail]=\"invalidSizeDetail()\"\r\n (onSelect)=\"onSelect($event)\"\r\n [disabled]=\"!isFileUploadEnabled()\"\r\n [pTooltip]=\"pTooltipOverride()\"\r\n [tooltipPosition]=\"tooltipPositionOverride()\"\r\n />\r\n\r\n @if (isReplacing()) {\r\n <p-button\r\n icon=\"pi pi-times\"\r\n [rounded]=\"true\"\r\n severity=\"secondary\"\r\n (click)=\"cancelReplace()\"\r\n [disabled]=\"disabled()\"\r\n pTooltip=\"Cancelar reemplazo\"\r\n tooltipPosition=\"top\"\r\n />\r\n }\r\n </div>\r\n}\r\n","import { isDevMode, Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n /**\r\n * Stringifica el JSON manteniendo arrays en una línea para una vista más compacta\r\n */\r\n private compactStringify(obj: any, indent: number = 0): string {\r\n const spaces = ' '.repeat(indent);\r\n\r\n if (obj === null) {\r\n return 'null';\r\n }\r\n\r\n if (typeof obj !== 'object') {\r\n if (typeof obj === 'string') {\r\n return JSON.stringify(obj);\r\n }\r\n return String(obj);\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return JSON.stringify(obj.toISOString());\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n // Mantener arrays en una línea\r\n const items = obj.map((item) => {\r\n if (item instanceof Date) {\r\n return JSON.stringify(item.toISOString());\r\n }\r\n if (typeof item === 'object' && item !== null) {\r\n return this.compactStringify(item, indent);\r\n }\r\n return typeof item === 'string'\r\n ? JSON.stringify(item)\r\n : item === null\r\n ? 'null'\r\n : String(item);\r\n });\r\n return `[${items.join(', ')}]`;\r\n }\r\n\r\n // Para objetos, mantener la indentación\r\n const keys = Object.keys(obj);\r\n if (keys.length === 0) {\r\n return '{}';\r\n }\r\n\r\n const innerIndent = indent + 2;\r\n const innerSpaces = ' '.repeat(innerIndent);\r\n const lines = keys.map((key) => {\r\n const value = obj[key];\r\n const stringified =\r\n value instanceof Date\r\n ? JSON.stringify(value.toISOString())\r\n : typeof value === 'object' && value !== null\r\n ? this.compactStringify(value, innerIndent)\r\n : typeof value === 'string'\r\n ? JSON.stringify(value)\r\n : value === null\r\n ? 'null'\r\n : String(value);\r\n return `${innerSpaces}\"${key}\": ${stringified}`;\r\n });\r\n\r\n return `{\\n${lines.join(',\\n')}\\n${spaces}}`;\r\n }\r\n\r\n private readonly instanceId = Math.random().toString(36).slice(2, 8);\r\n private executions = 0;\r\n\r\n transform(value: any): string {\r\n if (isDevMode()) {\r\n this.executions++;\r\n\r\n if (this.executions % 10 === 0) {\r\n console.log(`[jsonHighlight:${this.instanceId}] ${this.executions}`);\r\n }\r\n }\r\n\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = this.compactStringify(value);\r\n // Detecta fechas ISO: \"YYYY-MM-DDTHH:MM:SS.mmmZ\"\r\n const ISO_DATE_RE = /^\"(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\"$/;\r\n\r\n // Aplica estilo y colores para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Detectar fechas ISO (YYYY-MM-DDTHH:MM:SS.mmmZ)\r\n const isoMatch = match.match(ISO_DATE_RE);\r\n if (isoMatch) {\r\n return `<span class=\"json-string json-date\">\"<span class=\"json-date-part\">${isoMatch[1]}</span><span class=\"json-date-sep\">T</span><span class=\"json-date-time\">${isoMatch[2]}</span>\"</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, (match) => {\r\n if (match === 'null') {\r\n return '<span class=\"json-null\">null</span>';\r\n }\r\n return `<span class=\"json-boolean\">${match}</span>`;\r\n })\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n isDevMode,\r\n} from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { JsonHighlightPipe } from '../../../../pipe/src/json-highlight.pipe';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n standalone: true,\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class JsonValuesDebujComponent implements OnInit, OnDestroy {\r\n @Input() form!: FormGroup;\r\n\r\n /**\r\n * Activa logs de diagnóstico.\r\n */\r\n @Input() debug = false;\r\n\r\n debugValue: unknown;\r\n\r\n private subscription?: Subscription;\r\n private changesCount = 0;\r\n\r\n ngOnInit(): void {\r\n this.debugValue = this.form.getRawValue();\r\n\r\n if (this.debug && isDevMode()) {\r\n console.log('[json-debug] componente creado');\r\n }\r\n\r\n this.subscription = this.form.valueChanges.subscribe(() => {\r\n this.changesCount++;\r\n this.debugValue = this.form.getRawValue();\r\n\r\n if (this.debug && isDevMode()) {\r\n console.log('[json-debug] formulario actualizado', {\r\n cambios: this.changesCount,\r\n valid: this.form.valid,\r\n dirty: this.form.dirty,\r\n touched: this.form.touched,\r\n });\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.debug && isDevMode()) {\r\n console.log('[json-debug] componente destruido', {\r\n cambiosTotales: this.changesCount,\r\n });\r\n }\r\n\r\n this.subscription?.unsubscribe();\r\n }\r\n}\r\n","@if (form) {\r\n <div class=\"custom-container\">\r\n <pre class=\"custom-pre\" [innerHTML]=\"debugValue | jsonHighlight\"></pre>\r\n </div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { IconDsxComponent } from '../../icon-dsx/icon-dsx.component';\r\n\r\n@Component({\r\n selector: 'dsx-ico-label',\r\n imports: [IconDsxComponent],\r\n templateUrl: './ico-label.html',\r\n styleUrl: './ico-label.css',\r\n})\r\nexport class IcoLabel {\r\n ico = input.required<string>();\r\n label = input.required<string>();\r\n}\r\n","<div class=\"flex\">\r\n <icon-dsx class=\"myIco\" [name]=\"ico()\" [debug]=\"true\"></icon-dsx>\r\n <span class=\"myLabel\">{{ label() }}</span>\r\n</div>\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio centralizado para controlar el estado de carga global.\r\n *\r\n * Expone una señal (`spinnerVisible`) que puede consumirse en componentes\r\n * para mostrar u ocultar un spinner.\r\n *\r\n * Uso recomendado:\r\n * - `show()` / `hide()` para flujos con múltiples operaciones concurrentes.\r\n * - `showImmediate()` para feedback visual inmediato (sin afectar contador).\r\n * - `reset()` para recuperar estado en errores inesperados.\r\n */\r\nexport class SpinnerLoadingService {\r\n /**\r\n * Señal reactiva que indica si el spinner debe mostrarse.\r\n *\r\n * Ejemplo:\r\n * ```ts\r\n * readonly isLoading = this.spinnerLoadingService.spinnerVisible;\r\n * ```\r\n */\r\n spinnerVisible = signal(false);\r\n\r\n /**\r\n * Contador interno de operaciones activas.\r\n * Permite que el spinner permanezca visible mientras haya procesos en curso.\r\n */\r\n private counter = 0;\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Incrementa el contador de cargas activas.\r\n *\r\n * Muestra el spinner solo en la transición de `0 -> 1` para evitar\r\n * renderizados redundantes cuando hay varias operaciones simultáneas.\r\n *\r\n * Cuándo usarlo:\r\n * - Antes de iniciar una petición HTTP manual.\r\n * - Antes de ejecutar una acción asíncrona larga.\r\n */\r\n show(): void {\r\n this.counter++;\r\n if (this.counter === 1) {\r\n this.spinnerVisible.set(true);\r\n }\r\n }\r\n\r\n /**\r\n * Muestra el spinner de forma inmediata sin modificar el contador.\r\n *\r\n * Cuándo usarlo:\r\n * - Para feedback instantáneo en la UI (por ejemplo, al hacer clic en un botón).\r\n * - Cuando otro mecanismo (ejemplo: interceptor HTTP) controlará `show()`/`hide()`.\r\n */\r\n showImmediate(): void {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n /**\r\n * Decrementa el contador de cargas activas.\r\n *\r\n * Oculta el spinner únicamente cuando el contador llega a `0`.\r\n * Si se llama más veces de las debidas, el contador no baja de `0`.\r\n *\r\n * Cuándo usarlo:\r\n * - Al finalizar una operación iniciada con `show()`.\r\n */\r\n hide(): void {\r\n if (this.counter > 0) {\r\n this.counter--;\r\n }\r\n\r\n if (this.counter === 0) {\r\n this.spinnerVisible.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Restablece el estado del servicio a su valor inicial.\r\n *\r\n * Fuerza `counter = 0` y oculta el spinner.\r\n * Útil en escenarios de recuperación por error o al reinicializar contexto.\r\n */\r\n reset(): void {\r\n this.counter = 0;\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, viewChild } from '@angular/core';\r\nimport { createTimeline } from 'animejs';\r\n\r\n@Component({\r\n selector: 'app-logo-dsx',\r\n imports: [],\r\n templateUrl: './logo-dsx.component.html',\r\n styleUrl: './logo-dsx.component.css',\r\n})\r\nexport class LogoDsxComponent implements AfterViewInit {\r\n logo = viewChild.required<ElementRef>('logo');\r\n hexagon = viewChild.required<ElementRef>('logoHexagon');\r\n circle = viewChild.required<ElementRef>('logoCircle');\r\n mask = viewChild.required<ElementRef>('logoMask');\r\n text = viewChild.required<ElementRef>('logoText');\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n createTimeline({\r\n autoplay: true,\r\n delay: 90,\r\n })\r\n .add(this.logo().nativeElement, {\r\n translateY: [-100, 0],\r\n opacity: [0, 1],\r\n duration: 420,\r\n easing: 'outCubic',\r\n })\r\n .add(\r\n this.hexagon().nativeElement,\r\n {\r\n rotate: [-54, 0],\r\n duration: 220,\r\n easing: 'outBack',\r\n },\r\n 60,\r\n )\r\n .add(\r\n this.circle().nativeElement,\r\n {\r\n scale: [0, 1],\r\n duration: 320,\r\n easing: 'outElastic(amplitude = 1, period = .2)',\r\n },\r\n 150,\r\n )\r\n .add(\r\n this.mask().nativeElement,\r\n {\r\n scale: [0, 1],\r\n duration: 300,\r\n easing: 'outElastic(amplitude = 1, period = .2)',\r\n },\r\n 170,\r\n )\r\n .add(\r\n this.text().nativeElement,\r\n {\r\n translateX: ['-60%', 0],\r\n opacity: [0, 1],\r\n duration: 380,\r\n easing: 'outExpo',\r\n },\r\n 650,\r\n )\r\n .add(\r\n this.logo().nativeElement,\r\n {\r\n translateY: -8,\r\n duration: 70,\r\n easing: 'outQuad',\r\n },\r\n 420,\r\n )\r\n .add(\r\n this.logo().nativeElement,\r\n {\r\n translateY: 0,\r\n duration: 150,\r\n easing: 'outBounce',\r\n },\r\n 490,\r\n );\r\n }\r\n}\r\n","<div class=\"site-logo\">\r\n <figure #logo>\r\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 148 128\">\r\n <defs>\r\n <linearGradient id=\"logo-gradient\" x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\">\r\n <stop offset=\"0%\" stop-color=\"#00ffff\" />\r\n <stop offset=\"100%\" stop-color=\"#ff00ff\" />\r\n </linearGradient>\r\n <linearGradient\r\n id=\"circle-gradient\"\r\n x1=\"0%\"\r\n y1=\"100%\"\r\n x2=\"100%\"\r\n y2=\"0%\"\r\n >\r\n <stop offset=\"0%\" stop-color=\"#ff00ff\" />\r\n <stop offset=\"100%\" stop-color=\"#00ffff\" />\r\n </linearGradient>\r\n <mask id=\"circle-mask\">\r\n <rect fill=\"white\" width=\"100%\" height=\"100%\"></rect>\r\n <circle\r\n #logoMask\r\n id=\"logo-mask\"\r\n fill=\"black\"\r\n cx=\"120\"\r\n cy=\"96\"\r\n r=\"28\"\r\n ></circle>\r\n </mask>\r\n </defs>\r\n <polygon\r\n #logoHexagon\r\n id=\"logo-hexagon\"\r\n fill=\"#475569\"\r\n stroke=\"#9ca3af\"\r\n stroke-width=\"2\"\r\n stroke-linejoin=\"round\"\r\n points=\"64 128 8.574 96 8.574 32 64 0 119.426 32 119.426 96\"\r\n mask=\"url(#circle-mask)\"\r\n ></polygon>\r\n <circle #logoCircle fill=\"#16a34a\" cx=\"120\" cy=\"96\" r=\"20\"></circle>\r\n </svg>\r\n </figure>\r\n <div class=\"site-title\">\r\n <div #logoText class=\"site-title-text\">\r\n DEV<span\r\n >SOFTXela<span style=\"font-size: small; vertical-align: super\"\r\n >&copy;</span\r\n >\r\n {{ currentYear }}</span\r\n >\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, effect, inject, input } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../../services/src/spinner-loading.service';\r\nimport { AnimationOptions, LottieComponent } from 'ngx-lottie';\r\nimport { LogoDsxComponent } from '../logo/logo-dsx/logo-dsx.component';\r\n\r\n@Component({\r\n selector: 'app-loading-lottie',\r\n imports: [LottieComponent, LogoDsxComponent],\r\n templateUrl: './loading-lottie.component.html',\r\n styleUrl: './loading-lottie.component.css',\r\n})\r\nexport class LoadingLottieComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n jsonUrl = input<string>('Loader_Liquid4');\r\n size = input<string>('250px');\r\n options: AnimationOptions = { path: '' };\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n effect(() => {\r\n this.options = {\r\n path: `jsonlottie/${this.jsonUrl() + '.json'}`,\r\n };\r\n });\r\n }\r\n}\r\n","@if (_spinnerService.spinnerVisible()) {\r\n <div class=\"loader-container\">\r\n <ng-lottie\r\n [options]=\"options\"\r\n [width]=\"size()\"\r\n [height]=\"size()\"\r\n ></ng-lottie>\r\n <!-- <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p> -->\r\n <app-logo-dsx></app-logo-dsx>\r\n </div>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../../../services/src/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading-v2',\r\n imports: [],\r\n templateUrl: './css-v2.component.html',\r\n styleUrl: './css-v2.component.css',\r\n})\r\nexport class CssV2Component {\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"spinner-container\">\r\n <div class=\"center_div\">\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n </div>\r\n <p class=\"loading-text\">Cargando...</p>\r\n </div>\r\n</div>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../../services/src/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.css',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { EnvironmentConfig } from '../../injections/environment.token';\r\n\r\n/**\r\n * Configuración base de entorno para la aplicación.\r\n *\r\n * Este tipo es un alias de {@link EnvironmentConfig} para usarlo en el\r\n * contexto de modelos de la librería (por ejemplo, para defaults de dev/prod).\r\n *\r\n * De esta forma, cualquier cambio en ENVIRONMENT_SCHEMA / EnvironmentConfig\r\n * se propaga automáticamente aquí y se evita la desincronización entre\r\n * definiciones.\r\n */\r\nexport interface AppEnvironment extends EnvironmentConfig {}\r\n\r\n/**\r\n * Configuración base que provee la librería para entornos de desarrollo.\r\n *\r\n * Se omiten `myAppUrl` y `rolIndex` porque normalmente dependen de cada\r\n * aplicación cliente. Esos campos se vuelven obligatorios al combinar este\r\n * tipo con {@link DevEnvironmentComplete} en el proyecto que consume.\r\n */\r\nexport type DevEnvironmentDefaults = Omit<\r\n AppEnvironment,\r\n 'myAppUrl' | 'rolIndex'\r\n>;\r\n\r\n/**\r\n * Configuración base que provee la librería para entornos de producción.\r\n *\r\n * Se omite únicamente `rolIndex`, que debe ser definido por cada\r\n * aplicación cliente. En el proyecto consumidor se recomienda usar\r\n * {@link ProdEnvironmentComplete} para forzar ese campo como requerido.\r\n */\r\nexport type ProdEnvironmentDefaults = Omit<AppEnvironment, 'rolIndex'>;\r\n\r\n/**\r\n * Tipo recomendado para el `environment` de desarrollo en las aplicaciones\r\n * que consumen la librería.\r\n *\r\n * Combina los valores por defecto de la librería con los campos que cada\r\n * app debe completar: `myAppUrl` y `rolIndex`.\r\n */\r\nexport type DevEnvironmentComplete = DevEnvironmentDefaults &\r\n Pick<AppEnvironment, 'myAppUrl' | 'rolIndex'>;\r\n\r\n/**\r\n * Tipo recomendado para el `environment` de producción en las aplicaciones\r\n * que consumen la librería.\r\n *\r\n * Combina los valores por defecto de la librería con el campo obligatorio\r\n * `rolIndex` que aporta cada aplicación cliente.\r\n */\r\nexport type ProdEnvironmentComplete = ProdEnvironmentDefaults &\r\n Pick<AppEnvironment, 'rolIndex'>;\r\n\r\n/**\r\n * Entorno de desarrollo.\r\n *\r\n * No define `myAppUrl` porque normalmente se toma de la configuración\r\n * de la aplicación Angular (por ejemplo, `environment.ts` del proyecto).\r\n */\r\nexport const developmentEnvironment: DevEnvironmentDefaults = {\r\n production: false,\r\n SeguridadITApiUrl: 'https://localhost:7197/',\r\n tokenName: 'securityIT-Authorize',\r\n tokenPurpose: 'token-Purpose',\r\n tokenNameRF: 'refresh-Authorize',\r\n sessionStatus: 'lastActivity',\r\n refreshTokenExpiry: 'refreshToken-Expiry',\r\n showUpdatedCacheMessage: false,\r\n rolesGuards: ['Administrador SIIT'],\r\n};\r\n\r\n/**\r\n * Entorno de producción.\r\n *\r\n * Define todas las propiedades de `AppEnvironment`, incluida `myAppUrl`.\r\n */\r\nexport const productionEnvironment: ProdEnvironmentDefaults = {\r\n production: true,\r\n myAppUrl: '/',\r\n SeguridadITApiUrl: 'https://securityapi.itgtxela.com/',\r\n tokenName: 'securityIT-Authorize',\r\n tokenPurpose: 'token-Purpose',\r\n tokenNameRF: 'refresh-Authorize',\r\n sessionStatus: 'lastActivity',\r\n refreshTokenExpiry: 'refreshToken-Expiry',\r\n showUpdatedCacheMessage: false,\r\n rolesGuards: ['Administrador SIIT'],\r\n};\r\n\r\n/**\r\n * Devuelve el índice 0-based del rol principal a partir del `rolIndex` 1-based\r\n * definido en el entorno.\r\n *\r\n * Úsalo cuando necesites indexar arreglos (por ejemplo, listas de roles) para\r\n * evitar repetir la resta de 1 en múltiples lugares del código.\r\n *\r\n * @example\r\n * ```ts\r\n * import { getZeroBasedRolIndex } from '@devsoftxela/ngx-dsx';\r\n *\r\n * const idx = getZeroBasedRolIndex(environment);\r\n * const rol = roles[idx];\r\n * ```\r\n */\r\nexport function getZeroBasedRolIndex(\r\n env: Pick<AppEnvironment, 'rolIndex'>,\r\n): number {\r\n return Math.max(0, env.rolIndex - 1);\r\n}\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { getZeroBasedRolIndex } from '../../models/src/environment-base';\r\nimport { DataToken, jwtSecurityModel } from '../../models/src/token.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n _cookieService = inject(CookieService);\r\n _router = inject(Router);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n private _productionWithoutHttpsWarningShown = false;\r\n private _securityService = inject(SecurityService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /**\r\n * Detecta si el host actual es local o de red privada.\r\n *\r\n * Se usa para evitar fallback de cookies en escenarios de desarrollo,\r\n * incluso cuando por configuración externa `environment.production`\r\n * viene en `true`.\r\n */\r\n private isLocalOrPrivateHost(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const host = window.location?.hostname ?? '';\r\n if (!host) {\r\n return false;\r\n }\r\n\r\n const normalizedHost = host.toLowerCase();\r\n if (\r\n normalizedHost === 'localhost' ||\r\n normalizedHost === '127.0.0.1' ||\r\n normalizedHost === '::1' ||\r\n normalizedHost.endsWith('.local')\r\n ) {\r\n return true;\r\n }\r\n\r\n const privateIpv4Pattern = /^(10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[0-1])\\.)/;\r\n return privateIpv4Pattern.test(normalizedHost);\r\n }\r\n\r\n /**\r\n * Resuelve el dominio a usar para cookies según entorno/host actual.\r\n *\r\n * Orden de prioridad:\r\n * 1. Si `environment.cookieDomain` está configurado, lo usa (para ambientes locales).\r\n * 2. Si HTTPS público, usa `.itgtxela.com`.\r\n * 3. Si no coincide nada, devuelve undefined (sin dominio compartido).\r\n */\r\n private resolveCookieDomain(\r\n isProduction: boolean,\r\n isHttps: boolean,\r\n ): string | undefined {\r\n if (!isProduction || typeof window === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n // 1️⃣ Si está configurado en environment, usarlo (para ambientes locales).\r\n if (this.environment.cookieDomain) {\r\n return this.environment.cookieDomain;\r\n }\r\n\r\n // 2️⃣ Producción pública con HTTPS: mantener dominio corporativo.\r\n if (isHttps) {\r\n return '.itgtxela.com';\r\n }\r\n\r\n // 3️⃣ Sin coincidencia: sin dominio compartido.\r\n return undefined;\r\n }\r\n\r\n private warnProductionWithoutHttpsOnce(): void {\r\n if (this._productionWithoutHttpsWarningShown) {\r\n return;\r\n }\r\n\r\n this._productionWithoutHttpsWarningShown = true;\r\n console.warn(\r\n '[AuthorizeService] Entorno en producción pero sin HTTPS. Ajustando opciones de cookie para evitar rechazo por Secure/SameSite.',\r\n );\r\n }\r\n\r\n // Función para obtener opciones de cookies estándar\r\n /**\r\n * Construye las opciones usadas por `CookieService` al crear cookies.\r\n *\r\n * Motivo del cambio:\r\n * - Los navegadores rechazan cookies con `SameSite=None` si no se envían sobre\r\n * `Secure` (HTTPS). En entornos locales HTTP esto causa que las cookies no\r\n * sean guardadas aunque el servicio intente crearlas.\r\n *\r\n * Comportamiento:\r\n * - En producción y cuando la página usa `https:` se aplica `secure: true`,\r\n * `sameSite: 'None'` y se establece `domain` (como antes).\r\n * - Si no hay HTTPS (p. ej. red local con HTTP) se fuerza `sameSite: 'Lax'`\r\n * y `secure` queda en `false` para evitar que el navegador rechace la cookie.\r\n * - Esto preserva el comportamiento original en entornos con HTTPS.\r\n */\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const isHttps =\r\n typeof window !== 'undefined' && window.location?.protocol === 'https:';\r\n const cookieDomain = this.resolveCookieDomain(isProduction, isHttps);\r\n\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isHttps,\r\n sameSite: isHttps ? 'None' : 'Lax',\r\n };\r\n\r\n // Asignar dominio cuando aplique (público HTTPS o red local .local en producción).\r\n if (cookieDomain) {\r\n cookieOptions.domain = cookieDomain;\r\n }\r\n\r\n if (isProduction && !isHttps) {\r\n this.warnProductionWithoutHttpsOnce();\r\n }\r\n\r\n return cookieOptions;\r\n }\r\n\r\n // Función para establecer una cookie\r\n /**\r\n * Crea una cookie de autenticación y controla un fallback seguro.\r\n *\r\n * Reglas de fallback (`document.cookie`):\r\n * - Solo aplica en ejecución real de producción.\r\n * - Solo aplica cuando la página NO está en HTTPS.\r\n * - Nunca aplica en `isDevMode()`.\r\n * - Nunca aplica en hosts locales/privados.\r\n *\r\n * Objetivo:\r\n * - Mantener política estricta en producción real.\r\n * - Evitar falsos positivos de fallback durante desarrollo local.\r\n */\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n const isHttps =\r\n typeof window !== 'undefined' && window.location?.protocol === 'https:';\r\n const isLocalOrPrivateHost = this.isLocalOrPrivateHost();\r\n const allowFallback =\r\n !isDevMode() &&\r\n this.environment.production &&\r\n !isHttps &&\r\n !isLocalOrPrivateHost;\r\n\r\n // Intentamos usar CookieService (respeta domain/secure/samesite cuando corresponde).\r\n // El fallback con document.cookie se limita a producción sin HTTPS.\r\n try {\r\n this._cookieService.set(\r\n name,\r\n value,\r\n options.expires,\r\n options.path,\r\n options.domain,\r\n options.secure,\r\n options.sameSite,\r\n );\r\n\r\n // Verificar si la cookie quedó creada; si no, intentar fallback con document.cookie\r\n const created = this._cookieService.get(name);\r\n if (!created && allowFallback) {\r\n try {\r\n const expires =\r\n options.expires instanceof Date\r\n ? options.expires.toUTCString()\r\n : '';\r\n // Fallback mínimo: no usar Secure ni domain para entornos HTTP locales.\r\n document.cookie = `${name}=${value}; path=/; ${expires ? 'expires=' + expires + '; ' : ''}SameSite=Lax`;\r\n console.warn(\r\n `[AuthorizeService] Cookie '${name}' creada via fallback document.cookie`,\r\n );\r\n } catch (err) {\r\n console.warn(\r\n `[AuthorizeService] No se pudo crear cookie fallback para '${name}':`,\r\n err,\r\n );\r\n }\r\n } else if (!created && this.environment.production) {\r\n console.warn(\r\n `[AuthorizeService] Cookie '${name}' no pudo verificarse con CookieService en entorno no elegible para fallback.`,\r\n );\r\n }\r\n } catch (err) {\r\n console.error(\r\n '[AuthorizeService] Error al crear cookie con CookieService:',\r\n err,\r\n );\r\n if (allowFallback) {\r\n try {\r\n const expires = expiryDate.toUTCString();\r\n document.cookie = `${name}=${value}; path=/; expires=${expires}; SameSite=Lax`;\r\n console.warn(\r\n `[AuthorizeService] Cookie '${name}' creada via fallback document.cookie tras error.`,\r\n );\r\n } catch (err2) {\r\n console.error(\r\n '[AuthorizeService] Fallback document.cookie falló:',\r\n err2,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n }\r\n\r\n getTokenPurpose(): string | null {\r\n return this._cookieService.get(this.environment.tokenPurpose);\r\n }\r\n\r\n setTokenPurpose(token: DataToken): void {\r\n this.setCookie(\r\n this.environment.tokenPurpose,\r\n token.token,\r\n new Date(token.refreshTokenExpiry),\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene el Refresh Token almacenado en cookies.\r\n *\r\n * - En modo desarrollo (isDevMode):\r\n * Si no existe un refresh token en cookies, genera uno temporal\r\n * para evitar errores durante pruebas locales.\r\n *\r\n * - En modo producción:\r\n * Simplemente devuelve el refresh token real almacenado por el backend.\r\n *\r\n * @returns string | null - El refresh token o null si no existe.\r\n */\r\n getTokenRefresh(): string | null {\r\n // 🔹 MODO DESARROLLO: asegura que siempre haya un token de prueba\r\n if (isDevMode()) {\r\n const tokenRefresh = this._cookieService.get(\r\n this.environment.tokenNameRF,\r\n );\r\n\r\n // Si no existe un refresh token, generamos uno de desarrollo\r\n if (!tokenRefresh) {\r\n const devTokens: DataToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c', // Token dummy para testing\r\n refreshTokenExpiry: new Date(),\r\n };\r\n\r\n // Carga y guarda las cookies necesarias\r\n this.tokenReload(devTokens);\r\n }\r\n }\r\n\r\n // 🔹 DEVUELVE el refresh token real o de desarrollo\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate,\r\n );\r\n }\r\n\r\n getLastActivity(): number | null {\r\n // Obtiene el valor de la cookie\r\n const lastActivity = this._cookieService.get(\r\n this.environment.sessionStatus,\r\n );\r\n\r\n if (lastActivity) {\r\n // Intenta convertir el valor en un número\r\n const timestamp = parseInt(lastActivity, 10);\r\n\r\n // Verifica que sea un número válido\r\n if (!isNaN(timestamp)) {\r\n return timestamp;\r\n }\r\n }\r\n\r\n // Si no hay cookie o el valor no es válido, devuelve null\r\n return null;\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: DataToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n // Usar la fecha de expiración que viene del servidor para el refresh token\r\n const refreshTokenExpiryDate = new Date(tokens.refreshTokenExpiry);\r\n\r\n // Guardar el access token y refresh token con sus fechas de expiración\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate,\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n\r\n getTokenPurposeValid(): boolean {\r\n const token = this.getTokenPurpose();\r\n\r\n if (!token) {\r\n return false;\r\n }\r\n\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n\r\n /**\r\n * Obtiene los valores principales del JWT almacenado (usuario, roles y estado).\r\n *\r\n * Este getter:\r\n * - Lee el access token desde cookies.\r\n * - Devuelve un objeto tipado (jwtSecurityModel).\r\n * - Decodifica el token para obtener `unique_name` y `role`.\r\n * - Determina si el token está expirado usando JwtHelperService.\r\n *\r\n * Si no existe token:\r\n * - Devuelve un objeto vacío con valores en null y `isTokenExpired = true`.\r\n *\r\n * Uso:\r\n * const info = this.authorize.getTokenValues;\r\n */\r\n get getTokenValues(): jwtSecurityModel {\r\n // Obtener el token almacenado\r\n const token = this.getToken();\r\n\r\n // Si no existe token → devolver estructura vacía\r\n if (!token) {\r\n return {\r\n userName: null,\r\n role: null,\r\n isTokenExpired: true,\r\n };\r\n }\r\n\r\n // Decodificar JWT\r\n const decoded = this.helperJwt.decodeToken(token) || {};\r\n\r\n return {\r\n userName: decoded.unique_name ?? null,\r\n\r\n // JWT puede traer role como string o como array → convertir a array\r\n role: decoded.role\r\n ? Array.isArray(decoded.role)\r\n ? decoded.role\r\n : [decoded.role]\r\n : null,\r\n\r\n // Validación de expiración del JWT\r\n isTokenExpired: this.helperJwt.isTokenExpired(token),\r\n };\r\n }\r\n\r\n /**\r\n * Rol principal calculado a partir del JWT y del rolIndex configurado\r\n * en el environment.\r\n *\r\n * - Usa getTokenValues para obtener el array de roles del token.\r\n * - Usa getZeroBasedRolIndex(environment) para convertir el rolIndex 1-based\r\n * del entorno a un índice 0-based.\r\n * - Si el rol viene con formato \"ROL~descripcion\", devuelve solo la parte\r\n * anterior al separador `~`.\r\n */\r\n get primaryRole(): string | null {\r\n const idx = getZeroBasedRolIndex(this.environment);\r\n const tokenValues = this.getTokenValues;\r\n const roles = tokenValues.role ?? [];\r\n const raw = roles[idx] ?? null;\r\n return typeof raw === 'string' ? raw.split('~')[0] : null;\r\n }\r\n\r\n /**\r\n * Verifica si el usuario está autenticado.\r\n *\r\n * La validación se basa en la existencia del refresh token en cookies.\r\n * El navegador gestiona automáticamente la expiración de las cookies.\r\n *\r\n * @returns `true` si el usuario está autenticado, `false` en caso contrario\r\n */\r\n isAuthenticated(): boolean {\r\n const refreshToken = this.getTokenRefresh();\r\n return !!(refreshToken && refreshToken.trim() !== '');\r\n }\r\n\r\n /**\r\n * Cierra la sesión del usuario de forma segura y controlada.\r\n *\r\n * Este método implementa un proceso de logout robusto que:\r\n * 1. Verifica el estado actual de la sesión y la ubicación del usuario\r\n * 2. Intenta revocar el refresh token en el servidor (si existe)\r\n * 3. Limpia todos los datos de sesión local\r\n * 4. Redirige al usuario a la página de login\r\n *\r\n * **Casos manejados:**\r\n * - Usuario ya en página de login: Solo limpia datos locales\r\n * - Sin refresh token: Limpia datos locales y redirige\r\n * - Con refresh token: Intenta revocarlo, luego limpia y redirige\r\n * - Error al revocar: Limpia datos locales de todas formas (seguridad)\r\n * - Modo desarrollo: Maneja tokens de prueba correctamente\r\n *\r\n * **Importante:** Este método es **asíncrono** en su ejecución interna pero no retorna una promesa.\r\n * La redirección al login ocurre después de limpiar la sesión, independientemente del resultado de la revocación.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Uso básico desde un componente\r\n * this.authorizeService.logout();\r\n *\r\n * // Uso con navegación posterior controlada\r\n * this.authorizeService.logout();\r\n * // La redirección al login es automática\r\n * ```\r\n *\r\n * @see {@link clearSessionData} para el proceso de limpieza de datos\r\n * @see {@link SecurityService.tokenRevok} para la revocación en el servidor\r\n */\r\n logout(): void {\r\n try {\r\n // 1️⃣ Prevenir acciones innecesarias si ya está en el login\r\n if (this._router.url === '/login') {\r\n console.info(\r\n '[AuthorizeService] Usuario ya en página de login, limpiando sesión local...',\r\n );\r\n this.clearSessionData();\r\n return;\r\n }\r\n\r\n // 2️⃣ Obtener el refresh token de forma segura\r\n const refreshToken = this.getTokenRefresh();\r\n\r\n // 3️⃣ Si no hay refresh token, proceder con limpieza directa\r\n if (!refreshToken || refreshToken.trim() === '') {\r\n console.warn(\r\n '[AuthorizeService] No se encontró refresh token, limpiando sesión local...',\r\n );\r\n this.clearSessionData();\r\n return;\r\n }\r\n\r\n // 4️⃣ Limpiar sesión local e ir a login INMEDIATAMENTE\r\n // La revocación en el servidor se hace en segundo plano para no bloquear la navegación.\r\n this.clearSessionData();\r\n\r\n // 5️⃣ Intentar revocar el token en el servidor (fire-and-forget)\r\n // console.info(\r\n // '[AuthorizeService] Revocando refresh token en el servidor (en segundo plano)...',\r\n // );\r\n\r\n this._securityService.tokenRevok(refreshToken).subscribe({\r\n next: (success) => {\r\n if (success) {\r\n // console.info(\r\n // '[AuthorizeService] Refresh token revocado exitosamente en el servidor',\r\n // );\r\n } else {\r\n console.warn(\r\n '[AuthorizeService] El servidor no pudo revocar el token.',\r\n );\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n '[AuthorizeService] Error al revocar el refresh token en segundo plano:',\r\n {\r\n message: error?.message || 'Error desconocido',\r\n status: error?.status,\r\n statusText: error?.statusText,\r\n url: error?.url,\r\n },\r\n );\r\n },\r\n complete: () => {\r\n //console.info('[AuthorizeService] Proceso de logout completado');\r\n },\r\n });\r\n } catch (error) {\r\n // 6️⃣ Capturar cualquier error inesperado en el proceso de logout\r\n console.error(\r\n '[AuthorizeService] Error crítico durante el proceso de logout:',\r\n error,\r\n );\r\n\r\n // Garantizar que la sesión se limpie incluso si ocurre un error inesperado\r\n try {\r\n this.clearSessionData();\r\n } catch (cleanupError) {\r\n console.error(\r\n '[AuthorizeService] Error crítico al limpiar sesión:',\r\n cleanupError,\r\n );\r\n // Último recurso: redirigir al login sin importar qué\r\n this._router.navigate(['/login']).catch((navError) => {\r\n console.error(\r\n '[AuthorizeService] Error al navegar a login:',\r\n navError,\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Limpia todos los datos de sesión del usuario de forma segura.\r\n *\r\n * Este método privado se encarga de:\r\n * - Eliminar todas las cookies relacionadas con autenticación\r\n * - Limpiar el localStorage completamente\r\n * - Redirigir al usuario a la página de login\r\n *\r\n * **Cookies eliminadas:**\r\n * - Token de acceso (access token)\r\n * - Token de refresco (refresh token)\r\n * - Estado de sesión (session status)\r\n *\r\n * **Consideraciones:**\r\n * - Se eliminan las cookies con path '/' para asegurar su borrado\r\n * - En producción, también se considera el dominio configurado\r\n * - El localStorage se limpia completamente por seguridad\r\n * - La redirección es forzada incluso si hay errores previos\r\n *\r\n * @private\r\n */\r\n private clearSessionData(): void {\r\n try {\r\n // console.info(\r\n // '[AuthorizeService] Iniciando limpieza de datos de sesión...',\r\n // );\r\n\r\n // 1️⃣ Eliminar cookies con path explícito\r\n const cookiesToDelete = [\r\n this.environment.tokenName,\r\n this.environment.tokenNameRF,\r\n this.environment.tokenPurpose,\r\n this.environment.sessionStatus,\r\n ];\r\n\r\n cookiesToDelete.forEach((cookieName) => {\r\n try {\r\n // Eliminar con path '/'\r\n this._cookieService.delete(cookieName, '/');\r\n\r\n // En producción, también intentar eliminar con dominio específico\r\n if (this.environment.production) {\r\n const isHttps =\r\n typeof window !== 'undefined' &&\r\n window.location?.protocol === 'https:';\r\n const dynamicDomain = this.resolveCookieDomain(\r\n this.environment.production,\r\n isHttps,\r\n );\r\n const domainsToDelete = Array.from(\r\n new Set(['.itgtxela.com', dynamicDomain].filter(Boolean)),\r\n ) as string[];\r\n\r\n domainsToDelete.forEach((domain) => {\r\n this._cookieService.delete(cookieName, '/', domain);\r\n });\r\n }\r\n\r\n //console.debug(`[AuthorizeService] Cookie eliminada: ${cookieName}`);\r\n } catch (error) {\r\n console.error(\r\n `[AuthorizeService] Error al eliminar cookie ${cookieName}:`,\r\n error,\r\n );\r\n }\r\n });\r\n\r\n // 2️⃣ Limpiar localStorage\r\n try {\r\n localStorage.clear();\r\n //console.debug('[AuthorizeService] localStorage limpiado');\r\n } catch (error) {\r\n console.error(\r\n '[AuthorizeService] Error al limpiar localStorage:',\r\n error,\r\n );\r\n }\r\n\r\n // 3️⃣ Redirigir al login\r\n //console.info('[AuthorizeService] Redirigiendo a página de login...');\r\n this._router.navigate(['/login']).then(\r\n () => console.info('[AuthorizeService] Redirección exitosa a /login'),\r\n (error) =>\r\n console.error('[AuthorizeService] Error en la redirección:', error),\r\n );\r\n } catch (error) {\r\n console.error(\r\n '[AuthorizeService] Error crítico en clearSessionData:',\r\n error,\r\n );\r\n\r\n // Último recurso: intentar redirigir sin importar qué\r\n this._router.navigate(['/login']).catch((navError) => {\r\n console.error(\r\n '[AuthorizeService] Error final al intentar redirigir:',\r\n navError,\r\n );\r\n });\r\n }\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport type NetworkScore = 100 | 75 | 50 | 25;\r\n\r\nexport interface RequestMetricsState {\r\n lastDurationMs: number;\r\n averageDurationMs: number;\r\n requestsCount: number;\r\n score: NetworkScore;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RequestMetricsService {\r\n private historySize = 20;\r\n private durations: number[] = [];\r\n\r\n readonly state = signal<RequestMetricsState>({\r\n lastDurationMs: 0,\r\n averageDurationMs: 0,\r\n requestsCount: 0,\r\n score: 100,\r\n });\r\n\r\n registerRequest(durationMs: number) {\r\n this.durations.push(durationMs);\r\n if (this.durations.length > this.historySize) {\r\n this.durations.shift();\r\n }\r\n\r\n const avg =\r\n this.durations.reduce((acc, d) => acc + d, 0) / this.durations.length;\r\n\r\n const score = this.mapDurationToScore(avg);\r\n\r\n this.state.set({\r\n lastDurationMs: durationMs,\r\n averageDurationMs: avg,\r\n requestsCount: this.durations.length,\r\n score,\r\n });\r\n }\r\n\r\n private mapDurationToScore(avgMs: number): NetworkScore {\r\n // Ajusta umbrales a tu realidad\r\n if (avgMs <= 325) return 100;\r\n if (avgMs <= 800) return 75;\r\n if (avgMs <= 1500) return 50;\r\n return 25;\r\n }\r\n}\r\n","import { DecimalPipe } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { RequestMetricsService } from '../../../../services/src/request-metrics.service';\r\n\r\n@Component({\r\n selector: 'app-network-status',\r\n imports: [Avatar, DecimalPipe, TooltipModule],\r\n templateUrl: './network-status.component.html',\r\n styleUrl: './network-status.component.css',\r\n})\r\nexport class NetworkStatusComponent {\r\n private readonly metrics = inject(RequestMetricsService);\r\n state = this.metrics.state; // signal\r\n\r\n get tooltipText(): string {\r\n const { score, averageDurationMs, requestsCount } = this.state();\r\n const avg = Math.round(averageDurationMs);\r\n return `Estado de la red: ${score}% (promedio ${avg} ms, últimas ${requestsCount} peticiones)`;\r\n }\r\n\r\n getStatusImage(): string {\r\n const score = this.state().score;\r\n\r\n // 100 hasta 76 -> imagen \"muy buena\"\r\n if (score >= 76) {\r\n return 'image/Status_Green.png';\r\n }\r\n\r\n // 75 hasta 50 -> imagen \"media\"\r\n if (score >= 50) {\r\n return 'image/Status_Yellow.png';\r\n }\r\n\r\n // 50 o menos -> última imagen (mala)\r\n return 'image/Status_Red.png';\r\n }\r\n}\r\n","<div class=\"network-status-container\">\r\n <p-avatar\r\n [image]=\"getStatusImage()\"\r\n [pTooltip]=\"tooltipText\"\r\n tooltipPosition=\"bottom\"\r\n />\r\n <span> {{ state().score }}% </span>\r\n <span> {{ state().averageDurationMs | number: \"1.0-0\" }}ms </span>\r\n</div>\r\n","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../../injections/environment.token';\r\nimport { AlertaService } from '../../../services/src/alerta.service';\r\nimport { AuthorizeService } from '../../../services/src/authorize.service';\r\nimport { ParameterValuesService } from '../../../services/src/parameter-values.service';\r\nimport { IconDsxComponent } from '../icon-dsx/icon-dsx.component';\r\nimport { NetworkStatusComponent } from '../status/network-status/network-status.component';\r\n\r\n@Component({\r\n selector: 'app-navbar-dsx',\r\n imports: [\r\n ButtonModule,\r\n FormsModule,\r\n IconDsxComponent,\r\n ImageModule,\r\n MenubarModule,\r\n NetworkStatusComponent,\r\n ],\r\n templateUrl: './navbar-dsx.component.html',\r\n styleUrl: './navbar-dsx.component.css',\r\n})\r\nexport class NavbarDsxComponent implements OnInit {\r\n _authorizeService = inject(AuthorizeService);\r\n appVersion = input<string>('V1.0.0');\r\n checked: boolean = false; // Estado del interruptor (tema claro/oscuro)\r\n logoWidth = input<string>('300');\r\n private readonly _alertaService = inject(AlertaService);\r\n private readonly _parameterSecurityService = inject(ParameterValuesService);\r\n urlLogo = input<string>('assets/image/logoApp.png');\r\n private readonly environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n ngOnInit(): void {\r\n // Inicializa el tema al cargar el componente\r\n this.initializeTheme();\r\n }\r\n\r\n // Rol actual calculado en base al token y al rolIndex del environment.\r\n // Se evalúa en cada ciclo de detección de cambios, por lo que refleja\r\n // automáticamente los cambios cuando se refresca el token.\r\n get currentRole(): string | null {\r\n return this._authorizeService.primaryRole;\r\n }\r\n\r\n // Inicializa el tema y el estado del interruptor\r\n initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') || 'light'; // Obtén el tema guardado o usa 'light' por defecto\r\n this.checked = savedTheme === 'dark'; // Actualiza el estado del interruptor\r\n this.applyTheme(savedTheme); // Aplica el tema\r\n }\r\n\r\n // Cambia el tema y actualiza el estado del interruptor\r\n onThemeChange(isDarkMode: boolean): void {\r\n // Determina el tema basado en el estado del interruptor\r\n const theme = isDarkMode ? 'dark' : 'light';\r\n // Aplica el tema\r\n this.applyTheme(theme);\r\n }\r\n\r\n // Aplica el tema y guarda la preferencia en localStorage\r\n applyTheme(theme: string): void {\r\n const html = document.documentElement;\r\n\r\n // Elimina las clases previas y agrega la nueva clase\r\n html.classList.remove('my-app-dark', 'my-app-light');\r\n html.classList.add(theme === 'dark' ? 'my-app-dark' : 'my-app-light');\r\n\r\n // Guarda el tema en localStorage\r\n localStorage.setItem('theme', theme);\r\n }\r\n\r\n actualizarSeguridadIT() {\r\n this._parameterSecurityService.refreshParameters().subscribe({\r\n next: (values) => {\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2,\r\n );\r\n //console.log('Parámetros cargados:', values);\r\n },\r\n error: (err) => {\r\n console.error('Error al actualizar parámetros de SeguridadIT', err);\r\n this._alertaService.toastrAlerts(\r\n 3,\r\n 'SeguridadIT',\r\n 'Error al actualizar parámetros!',\r\n 2,\r\n );\r\n },\r\n complete: () => this._parameterSecurityService.clearParameterCache(),\r\n });\r\n }\r\n}\r\n","<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n [src]=\"urlLogo()\"\r\n alt=\"Image\"\r\n [width]=\"logoWidth()\"\r\n />\r\n <span class=\"version-text\">{{ appVersion() }}</span>\r\n </ng-template>\r\n <ng-template #end>\r\n <div>\r\n <!-- Datos del usuario -->\r\n <div class=\"navbar-user-info\">\r\n <icon-dsx name=\"verified_user\" class=\"navbar-user-icon\"></icon-dsx>\r\n <div class=\"navbar-user-text\">\r\n <span class=\"navbar-user-name\">\r\n {{ _authorizeService.getTokenValues.userName }}\r\n </span>\r\n <span class=\"navbar-user-role\">\r\n {{ currentRole }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Componente de estado de red -->\r\n <app-network-status></app-network-status>\r\n\r\n <!-- Actualización de permisos -->\r\n <p-button\r\n size=\"small\"\r\n class=\"ml-2 mr-2\"\r\n label=\"Permisos\"\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n (click)=\"actualizarSeguridadIT()\"\r\n >\r\n <span class=\"material-symbols-outlined mr-1\">local_police</span>\r\n </p-button>\r\n\r\n <label class=\"ui-switch\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"checked\"\r\n (click)=\"onThemeChange(!checked ? true : false)\"\r\n />\r\n <div class=\"slider\">\r\n <div class=\"circle\"></div>\r\n </div>\r\n </label>\r\n <!-- <p-inputSwitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-inputSwitch> -->\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n","import { Injectable } from '@angular/core';\r\n\r\ntype QrCodeModule = {\r\n toDataURL: (\r\n text: string,\r\n options?: {\r\n errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';\r\n type?: string;\r\n width?: number;\r\n margin?: number;\r\n color?: { dark?: string; light?: string };\r\n },\r\n ) => Promise<string>;\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class QrService {\r\n private async loadQrCodeModule(): Promise<QrCodeModule> {\r\n try {\r\n const viteQrModulePath = '/@id/qrcode';\r\n const qrModule = (await import(\r\n /* @vite-ignore */ viteQrModulePath\r\n )) as unknown as {\r\n default?: QrCodeModule;\r\n } & QrCodeModule;\r\n\r\n return qrModule.default ?? qrModule;\r\n } catch (error) {\r\n throw new Error(\r\n \"No se encontro el paquete opcional 'qrcode'. Instala 'qrcode' para usar QrGenerator.\",\r\n { cause: error },\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Genera un código QR como Blob usando qrcode\r\n * Sin necesidad de llamadas HTTP externas, evita problemas de CORS\r\n */\r\n async getQrBlob(textToEncode: string): Promise<Blob> {\r\n try {\r\n const qrCode = await this.loadQrCodeModule();\r\n\r\n // Genera el QR como Data URL\r\n const dataUrl = await qrCode.toDataURL(textToEncode, {\r\n errorCorrectionLevel: 'H',\r\n type: 'image/png',\r\n width: 300,\r\n margin: 1,\r\n color: {\r\n dark: '#000000',\r\n light: '#FFFFFF',\r\n },\r\n });\r\n\r\n // Convierte Data URL a Blob\r\n const response = await fetch(dataUrl);\r\n return response.blob();\r\n } catch (err) {\r\n console.error('Error generando QR:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","import { Component, inject, signal, input, effect } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { QrService } from './../../../../services/src/qr.service';\r\n\r\n@Component({\r\n selector: 'dsx-qr-generator',\r\n imports: [FormsModule],\r\n templateUrl: './qr-generator.html',\r\n styleUrl: './qr-generator.css',\r\n})\r\nexport class QrGenerator {\r\n private qrService = inject(QrService);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n // Inputs del padre\r\n codigoQr = input<string | null>(null); // Contenido a codificar en el QR\r\n labelQr = input<string>('SCAN ME'); // Texto del banner inferior\r\n\r\n // Señales internas (copias escribibles de los inputs)\r\n qrImageUrl = signal<SafeUrl | null>(null);\r\n loading = signal(false);\r\n labelText = signal<string>('SCAN ME');\r\n textToEncode = signal<string>('');\r\n private previewObjectUrl: string | null = null;\r\n private lastGeneratedCode: string | null = null;\r\n private generationRequestId = 0;\r\n\r\n constructor() {\r\n effect(() => {\r\n // Sincronizar labelQr → labelText\r\n this.labelText.set(this.labelQr());\r\n\r\n // Sincronizar codigoQr → textToEncode y generar el QR\r\n const codigo = this.codigoQr()?.trim() ?? '';\r\n\r\n if (codigo) {\r\n if (codigo === this.lastGeneratedCode && this.currentRawBlob) {\r\n return;\r\n }\r\n\r\n this.lastGeneratedCode = codigo;\r\n this.textToEncode.set(codigo);\r\n this.loading.set(true);\r\n this.generateQrCode(codigo);\r\n } else {\r\n this.lastGeneratedCode = null;\r\n this.currentRawBlob = null;\r\n this.revokePreviewUrl();\r\n this.qrImageUrl.set(null);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private currentRawBlob: Blob | null = null;\r\n\r\n generateQrCode(codeToEncode: string): void {\r\n if (!codeToEncode) return;\r\n\r\n const requestId = ++this.generationRequestId;\r\n\r\n this.qrService\r\n .getQrBlob(codeToEncode)\r\n .then((blob: Blob) => {\r\n // Ignora respuestas de solicitudes viejas para evitar parpadeos.\r\n if (requestId !== this.generationRequestId) return;\r\n\r\n this.currentRawBlob = blob;\r\n this.generateDesignImage(requestId);\r\n })\r\n .catch((err) => {\r\n if (requestId !== this.generationRequestId) return;\r\n this.loading.set(false);\r\n console.error('Error generando QR:', err);\r\n });\r\n }\r\n\r\n onLabelChange(value: string): void {\r\n this.labelText.set(value);\r\n // Regenera la imagen de preview con la nueva etiqueta\r\n this.generateDesignImage();\r\n }\r\n\r\n private generateDesignImage(requestId?: number): void {\r\n if (!this.currentRawBlob) return;\r\n\r\n const qrImage = new Image();\r\n const qrUrl = URL.createObjectURL(this.currentRawBlob);\r\n qrImage.src = qrUrl;\r\n\r\n qrImage.onload = () => {\r\n if (requestId && requestId !== this.generationRequestId) {\r\n URL.revokeObjectURL(qrUrl);\r\n return;\r\n }\r\n\r\n const qrSize = qrImage.width || 300;\r\n const padding = 20;\r\n const labelAreaHeight = 70;\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = qrSize + padding * 2;\r\n canvas.height = qrSize + labelAreaHeight + padding;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n // Fondo blanco\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // DIBUJAR LAS ESQUINAS DE ENFOQUE\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = 5;\r\n const lineLength = 25;\r\n\r\n const xMin = padding - 10;\r\n const yMin = padding - 10;\r\n const xMax = padding + qrSize + 10;\r\n const yMax = padding + qrSize + 10;\r\n\r\n // Esquinas\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMin);\r\n ctx.lineTo(xMin, yMin);\r\n ctx.lineTo(xMin, yMin + lineLength);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMin);\r\n ctx.lineTo(xMax, yMin);\r\n ctx.lineTo(xMax, yMin + lineLength);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMax);\r\n ctx.lineTo(xMin, yMax);\r\n ctx.lineTo(xMin, yMax - lineLength);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMax);\r\n ctx.lineTo(xMax, yMax);\r\n ctx.lineTo(xMax, yMax - lineLength);\r\n ctx.stroke();\r\n\r\n // Dibujar el código QR\r\n ctx.drawImage(qrImage, padding, padding, qrSize, qrSize);\r\n\r\n // Configuración del banner\r\n const rectWidth = qrSize * 0.8;\r\n const rectHeight = 45;\r\n const rectX = padding + (qrSize - rectWidth) / 2;\r\n const rectY = yMax + 20;\r\n\r\n // Caja negra\r\n ctx.fillStyle = '#000000';\r\n ctx.fillRect(rectX, rectY, rectWidth, rectHeight);\r\n\r\n // Triángulo indicador\r\n ctx.beginPath();\r\n ctx.moveTo(canvas.width / 2, rectY - 8);\r\n ctx.lineTo(canvas.width / 2 - 10, rectY);\r\n ctx.lineTo(canvas.width / 2 + 10, rectY);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n // Texto\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.font = 'bold 18px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(\r\n this.labelText().toUpperCase(),\r\n canvas.width / 2,\r\n rectY + rectHeight / 2,\r\n );\r\n\r\n // Convertir a URL para mostrar en preview\r\n canvas.toBlob((blob) => {\r\n URL.revokeObjectURL(qrUrl);\r\n\r\n if (requestId && requestId !== this.generationRequestId) return;\r\n\r\n if (blob) {\r\n this.revokePreviewUrl();\r\n const previewUrl = URL.createObjectURL(blob);\r\n this.previewObjectUrl = previewUrl;\r\n this.qrImageUrl.set(\r\n this.sanitizer.bypassSecurityTrustUrl(previewUrl),\r\n );\r\n this.loading.set(false);\r\n } else {\r\n this.loading.set(false);\r\n }\r\n }, 'image/png');\r\n };\r\n\r\n qrImage.onerror = () => {\r\n URL.revokeObjectURL(qrUrl);\r\n if (requestId && requestId !== this.generationRequestId) return;\r\n this.loading.set(false);\r\n };\r\n }\r\n\r\n private revokePreviewUrl(): void {\r\n if (this.previewObjectUrl) {\r\n URL.revokeObjectURL(this.previewObjectUrl);\r\n this.previewObjectUrl = null;\r\n }\r\n }\r\n\r\n downloadWithLabel(): void {\r\n if (!this.currentRawBlob) return;\r\n\r\n const qrImage = new Image();\r\n const qrUrl = URL.createObjectURL(this.currentRawBlob);\r\n qrImage.src = qrUrl;\r\n\r\n qrImage.onload = () => {\r\n const qrSize = qrImage.width || 300;\r\n const padding = 20; // Margen compacto para reducir el espacio superior\r\n const labelAreaHeight = 70;\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = qrSize + padding * 2;\r\n canvas.height = qrSize + labelAreaHeight + padding;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n // Fondo blanco\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // DIBUJAR LAS ESQUINAS DE ENFOQUE (Estilo de tu imagen de referencia)\r\n ctx.strokeStyle = '#000000'; // Color negro para las líneas de enfoque\r\n ctx.lineWidth = 5; // Grosor de las esquinas\r\n const lineLength = 25; // Largo de cada segmento de la esquina\r\n\r\n // Área delimitadora donde se posicionará el QR\r\n const xMin = padding - 10;\r\n const yMin = padding - 10;\r\n const xMax = padding + qrSize + 10;\r\n const yMax = padding + qrSize + 10;\r\n\r\n // Esquina Superior Izquierda\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMin);\r\n ctx.lineTo(xMin, yMin);\r\n ctx.lineTo(xMin, yMin + lineLength);\r\n ctx.stroke();\r\n // Esquina Superior Derecha\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMin);\r\n ctx.lineTo(xMax, yMin);\r\n ctx.lineTo(xMax, yMin + lineLength);\r\n ctx.stroke();\r\n // Esquina Inferior Izquierda\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMax);\r\n ctx.lineTo(xMin, yMax);\r\n ctx.lineTo(xMin, yMax + lineLength);\r\n ctx.stroke();\r\n // Esquina Inferior Derecha\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMax);\r\n ctx.lineTo(xMax, yMax);\r\n ctx.lineTo(xMax, yMax + lineLength);\r\n ctx.stroke();\r\n\r\n // Dibujar el código QR original obtenido desde qrcoder.co.uk\r\n ctx.drawImage(qrImage, padding, padding, qrSize, qrSize);\r\n\r\n // Configuración geométrica de la etiqueta negra inferior\r\n const rectWidth = qrSize * 0.8;\r\n const rectHeight = 45;\r\n const rectX = padding + (qrSize - rectWidth) / 2;\r\n const rectY = yMax + 20; // Separado adecuadamente de la línea de enfoque inferior\r\n\r\n // Dibujar caja contenedora de texto\r\n ctx.fillStyle = '#000000';\r\n ctx.fillRect(rectX, rectY, rectWidth, rectHeight);\r\n\r\n // Pequeño triángulo indicador (Flecha superior de la caja)\r\n ctx.beginPath();\r\n ctx.moveTo(canvas.width / 2, rectY - 8);\r\n ctx.lineTo(canvas.width / 2 - 10, rectY);\r\n ctx.lineTo(canvas.width / 2 + 10, rectY);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n // Renderizar Texto de Referencia\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.font = 'bold 18px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(\r\n this.labelText().toUpperCase(),\r\n canvas.width / 2,\r\n rectY + rectHeight / 2,\r\n );\r\n\r\n // Conversión final y descarga en JPEG\r\n canvas.toBlob(\r\n (finalBlob) => {\r\n if (finalBlob) {\r\n const downloadUrl = URL.createObjectURL(finalBlob);\r\n const link = document.createElement('a');\r\n link.href = downloadUrl;\r\n\r\n const now = new Date();\r\n const timestamp =\r\n now.getFullYear().toString() +\r\n (now.getMonth() + 1).toString().padStart(2, '0') +\r\n now.getDate().toString().padStart(2, '0') +\r\n now.getHours().toString().padStart(2, '0') +\r\n now.getMinutes().toString().padStart(2, '0') +\r\n now.getSeconds().toString().padStart(2, '0');\r\n link.download = `qr-${timestamp}.jpg`;\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n\r\n URL.revokeObjectURL(downloadUrl);\r\n URL.revokeObjectURL(qrUrl);\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95,\r\n );\r\n };\r\n }\r\n}\r\n","<div class=\"w-full max-w-xs mx-auto text-center\">\r\n <!-- Encabezado -->\r\n <h2 class=\"font-semibold text-gray-500\">Generador QR</h2>\r\n\r\n <!-- Valor recibido como validación (solo lectura) -->\r\n <!-- <p class=\"text-xs text-gray-400 mb-3 truncate\">\r\n <span class=\"font-medium text-gray-500\">Contenido: </span>{{ textToEncode()\r\n }}\r\n </p> -->\r\n\r\n <div class=\"qr-preview-shell\">\r\n @if (loading()) {\r\n <div class=\"qr-loading-state\">\r\n <span class=\"qr-spinner\"></span>\r\n <span>Generando código QR...</span>\r\n </div>\r\n } @if (qrImageUrl()) {\r\n <div class=\"flex flex-col items-center gap-3 qr-content\">\r\n <!-- Imagen generada con esquinas y banner -->\r\n <div\r\n class=\"rounded-xl border border-gray-200 bg-white p-1 shadow-md inline-block\"\r\n >\r\n <img\r\n [src]=\"qrImageUrl()\"\r\n alt=\"Código QR\"\r\n class=\"w-44 h-auto block rounded\"\r\n />\r\n </div>\r\n\r\n <!-- Botón descarga -->\r\n <button\r\n style=\"\r\n background: #059669;\r\n color: #fff;\r\n font-size: 0.8rem;\r\n padding: 0.4rem 1rem;\r\n border-radius: 0.5rem;\r\n cursor: pointer;\r\n \"\r\n class=\"font-semibold hover:opacity-90 transition-opacity flex items-center justify-center gap-1\"\r\n (click)=\"downloadWithLabel()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 1rem; height: 1rem; flex-shrink: 0\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2M7 10l5 5 5-5M12 15V3\"\r\n />\r\n </svg>\r\n Descargar JPEG\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, inject } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { AuthorizeService } from './../../../../services/src/authorize.service';\r\nimport { SecurityService } from './../../../../services/src/security.service';\r\nimport { DataLoginModel } from './../../../../models/src/token.model';\r\nimport { AlertaService } from './../../../../services/src/alerta.service';\r\n\r\n@Component({\r\n selector: 'app-token-purpose-login',\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n DialogModule,\r\n AvatarModule,\r\n ButtonModule,\r\n TooltipModule,\r\n FloatLabelModule,\r\n PasswordModule,\r\n ],\r\n templateUrl: './token-purpose-login.html',\r\n styleUrl: './token-purpose-login.css',\r\n})\r\nexport class TokenPurposeLogin {\r\n private readonly fb = inject(FormBuilder);\r\n private readonly _authorizeService = inject(AuthorizeService);\r\n private readonly _securityService = inject(SecurityService);\r\n private readonly _alertService = inject(AlertaService);\r\n form!: FormGroup;\r\n visible: boolean = false;\r\n\r\n constructor() {\r\n this.getForm();\r\n }\r\n\r\n getForm() {\r\n this.form = this.fb.group({\r\n userName: [{ value: null, disabled: true }, [Validators.required]],\r\n password: [null, [Validators.required]],\r\n });\r\n }\r\n\r\n showDialog() {\r\n this.visible = true;\r\n }\r\n\r\n generarTokenPurpose() {\r\n //Validar el password\r\n if (this.form.valid) {\r\n this._securityService\r\n .tokenPurposeGenerate(this.form.getRawValue() as DataLoginModel)\r\n .subscribe({\r\n next: (result) => {\r\n if (result.isSuccess) {\r\n this._authorizeService.setTokenPurpose(result.data!);\r\n this._alertService.toastrAlerts(\r\n 1,\r\n result.title,\r\n result.message,\r\n 2,\r\n );\r\n this.visible = false;\r\n this.form.reset();\r\n } else {\r\n this._alertService.toastrAlerts(\r\n 4,\r\n result.title,\r\n result.message,\r\n 2,\r\n );\r\n }\r\n },\r\n error: (err) => console.error('Error al generar token purpose:', err),\r\n complete: () => '',\r\n });\r\n }\r\n }\r\n}\r\n","<div class=\"flex\">\r\n <p-button\r\n (click)=\"showDialog()\"\r\n label=\"Generar Token\"\r\n pTooltip=\"Ingrese sus credenciales para generar un token de acceso.\"\r\n tooltipPosition=\"top\"\r\n severity=\"secondary\"\r\n icon=\"pi pi-lock\"\r\n [rounded]=\"true\"\r\n [raised]=\"true\"\r\n />\r\n</div>\r\n<form [formGroup]=\"form\">\r\n <p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '30rem' }\">\r\n <ng-template #header>\r\n <div class=\"flex items-center gap-2 px-2\">\r\n <p-avatar image=\"icon/folder.png\" size=\"large\" />\r\n <h5>Token de Seguridad</h5>\r\n </div>\r\n </ng-template>\r\n <span class=\"text-surface-500 dark:text-surface-400 block\"\r\n >Ingrese sus credenciales para generar un token de acceso.</span\r\n >\r\n <div class=\"mt-3\">\r\n <p-floatLabel variant=\"in\">\r\n <p-password\r\n formControlName=\"password\"\r\n [invalid]=\"form.get('password')?.invalid && (form.get('password')?.dirty || form.get('password')?.touched)\"\r\n [feedback]=\"false\"\r\n [toggleMask]=\"true\"\r\n fluid\r\n />\r\n <label>Contraseña</label>\r\n </p-floatLabel>\r\n @if (form.get('password')?.invalid && (form.get('password')?.dirty ||\r\n form.get('password')?.touched)) {\r\n <small class=\"text-red-500\">La contraseña es obligatoria.</small>\r\n }\r\n </div>\r\n <ng-template #footer>\r\n <p-button\r\n label=\"Cancelar\"\r\n variant=\"outlined\"\r\n [rounded]=\"true\"\r\n icon=\"pi pi-times\"\r\n severity=\"danger\"\r\n (click)=\"visible = false\"\r\n />\r\n <p-button\r\n label=\"Generar\"\r\n variant=\"outlined\"\r\n [rounded]=\"true\"\r\n icon=\"pi pi-unlock\"\r\n severity=\"success\"\r\n [disabled]=\"!form.valid\"\r\n (click)=\"generarTokenPurpose()\"\r\n />\r\n </ng-template>\r\n </p-dialog>\r\n</form>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, HostListener, isDevMode } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'dsx-screen-inspector',\r\n imports: [CommonModule],\r\n templateUrl: './screen-inspector.html',\r\n styleUrl: './screen-inspector.css',\r\n})\r\nexport class ScreenInspector {\r\n private static readonly GRID_STORAGE_KEY = 'dsx-screen-inspector-show-grid';\r\n\r\n width: number = 0;\r\n height: number = 0;\r\n breakpoint: string = '';\r\n isDevelopment: boolean = false;\r\n\r\n // Estado para controlar la visibilidad de las líneas guía\r\n showGrid: boolean = true;\r\n\r\n ngOnInit() {\r\n this.isDevelopment = isDevMode();\r\n\r\n if (this.isDevelopment) {\r\n this.showGrid = this.readGridStateFromStorage();\r\n }\r\n\r\n this.updateDimensions();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n if (this.isDevelopment) {\r\n this.updateDimensions();\r\n }\r\n }\r\n\r\n // Captura el atajo Alt + Shift + I de forma global\r\n @HostListener('window:keydown', ['$event'])\r\n handleKeyboardEvent(event: KeyboardEvent) {\r\n if (\r\n this.isDevelopment &&\r\n event.altKey &&\r\n event.shiftKey &&\r\n (event.key === 'I' || event.key === 'i')\r\n ) {\r\n event.preventDefault(); // Evita cualquier comportamiento secundario\r\n this.showGrid = !this.showGrid; // Alterna encendido / apagado\r\n this.persistGridState();\r\n }\r\n }\r\n\r\n private readGridStateFromStorage(): boolean {\r\n if (typeof window === 'undefined') return true;\r\n\r\n try {\r\n const savedValue = window.localStorage.getItem(\r\n ScreenInspector.GRID_STORAGE_KEY,\r\n );\r\n if (savedValue === null) return true;\r\n return savedValue === 'true';\r\n } catch {\r\n return true;\r\n }\r\n }\r\n\r\n private persistGridState(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n window.localStorage.setItem(\r\n ScreenInspector.GRID_STORAGE_KEY,\r\n String(this.showGrid),\r\n );\r\n } catch {\r\n // Ignora errores de almacenamiento (modo privado, cuota, etc.)\r\n }\r\n }\r\n\r\n private updateDimensions() {\r\n this.width = window.innerWidth;\r\n this.height = window.innerHeight;\r\n this.breakpoint = this.getTailwindBreakpoint(this.width);\r\n }\r\n\r\n private getTailwindBreakpoint(width: number): string {\r\n if (width < 640) return 'XS';\r\n if (width < 768) return 'SM';\r\n if (width < 1024) return 'MD';\r\n if (width < 1280) return 'LG';\r\n if (width < 1536) return 'XL';\r\n return '2XL';\r\n }\r\n}\r\n","<!-- CONTROL DE ENTORNO: Solo se dibuja si estamos en modo desarrollo -->\r\n@if(isDevelopment){\r\n<ng-container>\r\n <!-- CONTENEDOR GENERAL TOTALMENTE TRANSPARENTE -->\r\n <div\r\n style=\"\r\n position: fixed !important;\r\n top: 0 !important;\r\n left: 0 !important;\r\n width: 100vw !important;\r\n height: 100vh !important;\r\n z-index: 999999 !important;\r\n background-color: transparent !important;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n \"\r\n >\r\n <!-- REGLA MILIMÉTRICA CONDICIONAL -->\r\n @if(showGrid) {\r\n <div class=\"inspector-ruler\"></div>\r\n }\r\n\r\n <!-- CONTENEDOR DE CONTENIDO CENTRAL -->\r\n <div\r\n style=\"\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n pointer-events: none;\r\n width: 100%;\r\n \"\r\n >\r\n <!-- LETRAS GIGANTES EN NEGRO CON OPACIDAD -->\r\n <h1\r\n style=\"\r\n font-size: 35vw !important;\r\n font-weight: 900 !important;\r\n font-family:\r\n system-ui,\r\n -apple-system,\r\n sans-serif !important;\r\n color: rgba(0, 0, 0, 0.05) !important;\r\n margin: 0;\r\n padding: 0;\r\n line-height: 0.8;\r\n letter-spacing: -0.05em;\r\n text-transform: uppercase;\r\n \"\r\n >\r\n {{ breakpoint }}\r\n </h1>\r\n\r\n <!-- CUADRO DE DIÁLOGO DE LAS MEDIDAS EXACTAS -->\r\n <div\r\n style=\"\r\n margin-top: 20px;\r\n background-color: #111827;\r\n border: 2px solid rgba(0, 0, 0, 0.15);\r\n border-radius: 12px;\r\n padding: 12px 32px;\r\n font-family: monospace;\r\n font-size: 22px;\r\n font-weight: bold;\r\n color: #34d399;\r\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);\r\n backdrop-filter: blur(8px);\r\n pointer-events: auto;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 4px;\r\n \"\r\n >\r\n <div>\r\n {{ width }}<span\r\n style=\"\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 16px;\r\n font-weight: normal;\r\n margin-left: 4px;\r\n \"\r\n >px ancho</span\r\n >\r\n <span style=\"color: rgba(255, 255, 255, 0.3); margin: 0 16px\">|</span>\r\n {{ height }}<span\r\n style=\"\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 16px;\r\n font-weight: normal;\r\n margin-left: 4px;\r\n \"\r\n >px alto</span\r\n >\r\n </div>\r\n\r\n <!-- Recordatorio del atajo de teclado con tipografía pequeña -->\r\n <span\r\n style=\"\r\n color: rgba(255, 255, 255, 0.35);\r\n font-size: 11px;\r\n font-weight: normal;\r\n letter-spacing: 0.5px;\r\n \"\r\n >\r\n Presiona\r\n <b style=\"color: #f3f4f6; font-weight: bold\">Alt + Shift + I</b> para\r\n ocultar/mostrar cuadrícula\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n}\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva de navegación por teclado entre elementos de una tabla.\r\n *\r\n * Uso: colocar el atributo [appKeyboardNav] en cada control navegable dentro\r\n * de un contenedor <table>. La directiva busca el <table> más cercano con\r\n * `closest('table')` y recorre todos los elementos marcados con ese atributo.\r\n *\r\n * Teclas soportadas:\r\n * - Enter / ArrowDown / ArrowRight → siguiente elemento\r\n * - Shift+Enter / ArrowUp / ArrowLeft → elemento anterior\r\n * La navegación es cíclica (del último vuelve al primero y viceversa).\r\n *\r\n * NOTA DE COMPATIBILIDAD — componentes PrimeNG:\r\n * Actualmente validado con <p-inputnumber>. Los componentes de PrimeNG (y otros\r\n * wrappers) no exponen un <input> nativo directamente en el host; en su lugar\r\n * renderizan el <input> como hijo en el shadow/light DOM interno.\r\n * Por eso esta directiva no hace `.focus()` sobre el host del componente, sino\r\n * que resuelve primero el control nativo enfocable interno mediante\r\n * `resolveFocusableTarget()`. Si en el futuro se integran otros componentes\r\n * (p-dropdown, p-select, etc.) puede ser necesario ampliar ese selector o agregar\r\n * lógica específica por tipo de componente, ya que cada uno renderiza su control\r\n * interno de forma diferente.\r\n */\r\n@Directive({\r\n selector: '[appKeyboardNav]',\r\n})\r\nexport class ArrowNavigationDirective {\r\n /**\r\n * Activa los logs de depuración en consola.\r\n * Cambiar a `true` para trazar el flujo de navegación durante el desarrollo.\r\n */\r\n private readonly debug = false;\r\n\r\n constructor(private el: ElementRef<HTMLElement>) {}\r\n\r\n @HostListener('keydown', ['$event'])\r\n handleKey(event: KeyboardEvent) {\r\n this.log('keydown recibido', {\r\n key: event.key,\r\n shiftKey: event.shiftKey,\r\n element: this.el.nativeElement,\r\n });\r\n\r\n const keys = ['Enter', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];\r\n if (!keys.includes(event.key)) {\r\n this.log('tecla ignorada', { key: event.key });\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n // Obtiene todos los elementos navegables no deshabilitados dentro del <table>\r\n const elements = this.getElements();\r\n const index = elements.indexOf(this.el.nativeElement);\r\n\r\n this.log('elementos navegables detectados', {\r\n total: elements.length,\r\n currentIndex: index,\r\n });\r\n\r\n // Si el elemento actual no está en la lista (p.ej. no tiene [appKeyboardNav]) se aborta\r\n if (index === -1) {\r\n this.log('elemento actual no encontrado en la lista navegable');\r\n return;\r\n }\r\n\r\n let nextIndex = index;\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n nextIndex = event.shiftKey ? index - 1 : index + 1;\r\n break;\r\n\r\n case 'ArrowDown':\r\n nextIndex = index + 1;\r\n break;\r\n\r\n case 'ArrowUp':\r\n nextIndex = index - 1;\r\n break;\r\n\r\n case 'ArrowRight':\r\n nextIndex = index + 1;\r\n break;\r\n\r\n case 'ArrowLeft':\r\n nextIndex = index - 1;\r\n break;\r\n }\r\n\r\n // Navegación cíclica: al pasar del último vuelve al primero y viceversa\r\n if (nextIndex >= elements.length) nextIndex = 0;\r\n if (nextIndex < 0) nextIndex = elements.length - 1;\r\n\r\n const nextElement = elements[nextIndex];\r\n this.log('moviendo foco', {\r\n from: index,\r\n to: nextIndex,\r\n nextElement,\r\n });\r\n\r\n this.focusElement(nextElement);\r\n }\r\n\r\n /**\r\n * Recoge todos los elementos con [appKeyboardNav] dentro del <table> contenedor\r\n * y filtra los que estén deshabilitados.\r\n */\r\n private getElements(): HTMLElement[] {\r\n const container = this.el.nativeElement.closest('table');\r\n\r\n if (!container) {\r\n this.log('no se encontró contenedor table con closest()');\r\n return [];\r\n }\r\n\r\n return Array.from(\r\n container.querySelectorAll<HTMLElement>('[appKeyboardNav]'),\r\n ).filter((el) => !el.hasAttribute('disabled'));\r\n }\r\n\r\n /**\r\n * Aplica el foco al control enfocable real dentro del elemento destino.\r\n * Necesario para componentes wrapper como <p-inputnumber>, donde el foco\r\n * debe recaer en el <input> interno y no en el host del componente.\r\n */\r\n private focusElement(element: HTMLElement) {\r\n const target = this.resolveFocusableTarget(element);\r\n\r\n this.log('target de foco resuelto', {\r\n source: element,\r\n target,\r\n });\r\n\r\n if (!target) {\r\n this.log('no se encontró target enfocable');\r\n return;\r\n }\r\n\r\n target.focus();\r\n\r\n // Selecciona el contenido del input para facilitar la edición inmediata\r\n if (\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLTextAreaElement\r\n ) {\r\n this.log('aplicando select() al target enfocable');\r\n target.select();\r\n }\r\n }\r\n\r\n /**\r\n * Resuelve el control interno enfocable de un elemento.\r\n *\r\n * Si el elemento es directamente enfocable (input, button, etc.) lo retorna tal cual.\r\n * De lo contrario busca el primer descendiente que sea un control nativo activo.\r\n *\r\n * NOTA: cada componente de PrimeNG u otras librerías puede renderizar su control\r\n * interno con una estructura diferente. Si un componente no recibe el foco\r\n * correctamente, revisar primero el HTML renderizado en DevTools y ajustar el\r\n * selector de `querySelector` según sea necesario.\r\n */\r\n private resolveFocusableTarget(element: HTMLElement): HTMLElement | null {\r\n if (this.isDirectlyFocusable(element)) return element;\r\n\r\n const nestedFocusable = element.querySelector<HTMLElement>(\r\n 'input:not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n\r\n return nestedFocusable ?? null;\r\n }\r\n\r\n /** Determina si un elemento puede recibir el foco directamente. */\r\n private isDirectlyFocusable(element: HTMLElement): boolean {\r\n if (element.hasAttribute('disabled')) return false;\r\n\r\n const tag = element.tagName.toLowerCase();\r\n if (['input', 'textarea', 'select', 'button'].includes(tag)) return true;\r\n\r\n return element.tabIndex >= 0;\r\n }\r\n\r\n /**\r\n * Traza un mensaje en consola cuando el modo debug está activo.\r\n * Para activar: cambiar `debug = false` a `debug = true`.\r\n */\r\n private log(message: string, data?: unknown) {\r\n if (!this.debug) return;\r\n // console.log('[ArrowNavigationDirective]', message, data ?? '');\r\n }\r\n}\r\n","// services/scroll-measurement.service.ts\r\nimport { Injectable, computed, signal } from '@angular/core';\r\n\r\nexport interface ScrollMeasurements {\r\n height: string;\r\n heightPx: number;\r\n rows: number;\r\n tableScrollHeight: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ScrollMeasurementService {\r\n private measurements = signal<ScrollMeasurements | null>(null);\r\n private instancesCount = 0;\r\n private lastUpdateHeight = '';\r\n\r\n readonly globalHeight = computed(\r\n () => this.measurements()?.height ?? '315px',\r\n );\r\n readonly globalHeightPx = computed(\r\n () => this.measurements()?.heightPx ?? 315,\r\n );\r\n readonly globalRows = computed(() => this.measurements()?.rows ?? 6);\r\n readonly globalTableScrollHeight = computed(\r\n () => this.measurements()?.tableScrollHeight ?? '280px',\r\n );\r\n\r\n readonly hasMeasurements = computed(() => this.measurements() !== null);\r\n\r\n getLatestMeasurements(): ScrollMeasurements | null {\r\n return this.measurements();\r\n }\r\n\r\n updateMeasurements(measurements: ScrollMeasurements) {\r\n // Evitar actualizaciones duplicadas\r\n if (this.lastUpdateHeight === measurements.height) {\r\n return;\r\n }\r\n\r\n this.lastUpdateHeight = measurements.height;\r\n this.measurements.set(measurements);\r\n }\r\n\r\n registerInstance(instanceId: string) {\r\n this.instancesCount++;\r\n }\r\n\r\n unregisterInstance(instanceId: string) {\r\n this.instancesCount = Math.max(0, this.instancesCount - 1);\r\n if (this.instancesCount === 0) {\r\n setTimeout(() => {\r\n if (this.instancesCount === 0) {\r\n this.measurements.set(null);\r\n this.lastUpdateHeight = '';\r\n }\r\n }, 5000);\r\n }\r\n }\r\n\r\n reset() {\r\n this.measurements.set(null);\r\n this.lastUpdateHeight = '';\r\n }\r\n}\r\n","// auto-scroll-height.directive.ts (versión estable sin IntersectionObserver)\r\nimport {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n NgZone,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { ScrollMeasurementService } from '../../services/src/scroll-view/scroll-measurement.service';\r\n\r\n@Directive({\r\n selector: '[appAutoScrollHeight]',\r\n})\r\nexport class AutoScrollHeightDirective implements AfterViewInit, OnDestroy {\r\n // Inputs públicos\r\n marginBottom = input<number>(75);\r\n minHeight = input<number>(315);\r\n rowHeight = input<number>(40);\r\n tableChromeReserve = input<number>(210);\r\n minRows = input<number>(6);\r\n maxRows = input<number>(25);\r\n tableScrollMinHeight = input<number>(140);\r\n\r\n shareMeasurements = input<boolean>(true);\r\n measurementGroup = input<string>('default');\r\n debugMode = input<boolean>(false);\r\n\r\n // Outputs\r\n heightCalculated = output<string>();\r\n rowsCalculated = output<number>();\r\n tableScrollHeightCalculated = output<string>();\r\n\r\n private readonly ngZone = inject(NgZone);\r\n private readonly el: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly measurementService = inject(ScrollMeasurementService);\r\n\r\n private resizeObserver?: ResizeObserver;\r\n private rafId: number | null = null;\r\n private debounceTimer: number | null = null;\r\n private initTimer: number | null = null;\r\n\r\n private lastEmitted = {\r\n height: '',\r\n heightPx: 0,\r\n rows: 0,\r\n tableScrollHeight: '',\r\n };\r\n\r\n private cachedViewportHeight = 0;\r\n private isInitialized = false;\r\n private instanceId = Math.random().toString(36).substring(4, 9);\r\n private hasPendingUpdate = false;\r\n\r\n private log(message: string, data?: any) {\r\n if (!this.debugMode()) return;\r\n const prefix = `🔍 [${this.instanceId}]`;\r\n if (data) {\r\n console.log(prefix, message, data);\r\n } else {\r\n console.log(prefix, message);\r\n }\r\n }\r\n\r\n constructor() {\r\n effect(() => {\r\n if (\r\n this.shareMeasurements() &&\r\n this.measurementService.hasMeasurements()\r\n ) {\r\n const globalHeight = this.measurementService.globalHeight();\r\n const globalRows = this.measurementService.globalRows();\r\n const globalScrollHeight =\r\n this.measurementService.globalTableScrollHeight();\r\n\r\n if (\r\n this.lastEmitted.height !== globalHeight &&\r\n !this.hasPendingUpdate\r\n ) {\r\n this.log(`📡 Recibiendo medidas: ${globalHeight}`);\r\n\r\n this.emitInZone(() => {\r\n this.heightCalculated.emit(globalHeight);\r\n this.rowsCalculated.emit(globalRows);\r\n this.tableScrollHeightCalculated.emit(globalScrollHeight);\r\n });\r\n\r\n this.lastEmitted = {\r\n height: globalHeight,\r\n heightPx: this.measurementService.globalHeightPx(),\r\n rows: globalRows,\r\n tableScrollHeight: globalScrollHeight,\r\n };\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.measurementService.registerInstance(this.instanceId);\r\n this.setupResizeObserver();\r\n this.scheduleInitialCalculation();\r\n this.log(`🚀 Inicializado`);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resizeObserver?.disconnect();\r\n this.measurementService.unregisterInstance(this.instanceId);\r\n this.cleanup();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n if (typeof window !== 'undefined') {\r\n this.cachedViewportHeight = window.innerHeight;\r\n }\r\n\r\n // Verificar si esta tab está visible\r\n if (this.isTabVisible() && this.isInitialized) {\r\n this.log(`🪟 Resize - visible, recalculando`);\r\n this.scheduleDebouncedRecalculation();\r\n }\r\n }\r\n\r\n private isTabVisible(): boolean {\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n const style = window.getComputedStyle(this.el.nativeElement);\r\n return (\r\n rect.width > 0 &&\r\n rect.height > 0 &&\r\n style.display !== 'none' &&\r\n style.visibility !== 'hidden'\r\n );\r\n }\r\n\r\n private setupResizeObserver() {\r\n if (typeof window === 'undefined') return;\r\n\r\n this.cachedViewportHeight = window.innerHeight;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n if (this.isTabVisible() && this.isInitialized) {\r\n this.scheduleDebouncedRecalculation();\r\n }\r\n });\r\n\r\n this.resizeObserver.observe(this.el.nativeElement);\r\n }\r\n\r\n private scheduleInitialCalculation() {\r\n const existing = this.measurementService.getLatestMeasurements();\r\n\r\n if (existing && this.measurementService.hasMeasurements()) {\r\n // Usar medidas existentes\r\n setTimeout(() => {\r\n this.log(`📦 Usando medidas existentes: ${existing.height}`);\r\n this.emitInZone(() => {\r\n this.heightCalculated.emit(existing.height);\r\n this.rowsCalculated.emit(existing.rows);\r\n this.tableScrollHeightCalculated.emit(existing.tableScrollHeight);\r\n });\r\n this.lastEmitted = {\r\n height: existing.height,\r\n heightPx: existing.heightPx,\r\n rows: existing.rows,\r\n tableScrollHeight: existing.tableScrollHeight,\r\n };\r\n this.isInitialized = true;\r\n this.log(`✅ Listo`);\r\n }, 50);\r\n } else {\r\n // Primera carga, calcular\r\n this.scheduleRafRecalculation();\r\n\r\n this.initTimer = window.setTimeout(() => {\r\n this.initTimer = null;\r\n this.scheduleRafRecalculation();\r\n setTimeout(() => {\r\n this.isInitialized = true;\r\n this.log(`✅ Listo (primer cálculo)`);\r\n }, 50);\r\n }, 100);\r\n }\r\n }\r\n\r\n private scheduleDebouncedRecalculation() {\r\n if (!this.isInitialized) return;\r\n\r\n if (this.debounceTimer) {\r\n clearTimeout(this.debounceTimer);\r\n }\r\n\r\n this.debounceTimer = window.setTimeout(() => {\r\n this.debounceTimer = null;\r\n this.scheduleRafRecalculation();\r\n }, 150);\r\n }\r\n\r\n private scheduleRafRecalculation() {\r\n if (this.rafId !== null) {\r\n cancelAnimationFrame(this.rafId);\r\n }\r\n\r\n this.rafId = requestAnimationFrame(() => {\r\n this.rafId = null;\r\n this.recalculate();\r\n });\r\n }\r\n\r\n private recalculate() {\r\n if (!this.isTabVisible()) {\r\n this.log(`👻 Tab no visible, omitiendo recálculo`);\r\n return;\r\n }\r\n\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n const elementTop = rect.top;\r\n\r\n let availableHeight =\r\n this.cachedViewportHeight - elementTop - this.marginBottom();\r\n availableHeight = Math.max(availableHeight, this.minHeight());\r\n const alturaPx = Math.floor(availableHeight);\r\n const alturaCalculada = `${alturaPx}px`;\r\n\r\n const heightDiff = Math.abs(alturaPx - this.lastEmitted.heightPx);\r\n const isSignificantChange = heightDiff >= 5;\r\n\r\n if (!isSignificantChange && this.lastEmitted.heightPx > 0) {\r\n return;\r\n }\r\n\r\n const suggestedRows = this.calculateSuggestedRows(alturaPx);\r\n const suggestedTableScrollHeight =\r\n this.calculateTableScrollHeight(suggestedRows);\r\n\r\n this.log(`📐 Recalculando: ${this.lastEmitted.heightPx}px → ${alturaPx}px`);\r\n\r\n // Actualizar medidas globales (cualquier tab visible puede hacerlo)\r\n this.hasPendingUpdate = true;\r\n this.measurementService.updateMeasurements({\r\n height: alturaCalculada,\r\n heightPx: alturaPx,\r\n rows: suggestedRows,\r\n tableScrollHeight: suggestedTableScrollHeight,\r\n });\r\n\r\n // Pequeño delay para evitar loops\r\n setTimeout(() => {\r\n this.hasPendingUpdate = false;\r\n }, 100);\r\n\r\n this.emitInZone(() => {\r\n if (this.lastEmitted.height !== alturaCalculada) {\r\n this.heightCalculated.emit(alturaCalculada);\r\n }\r\n\r\n if (this.lastEmitted.rows !== suggestedRows) {\r\n this.rowsCalculated.emit(suggestedRows);\r\n }\r\n\r\n if (this.lastEmitted.tableScrollHeight !== suggestedTableScrollHeight) {\r\n this.tableScrollHeightCalculated.emit(suggestedTableScrollHeight);\r\n }\r\n });\r\n\r\n this.lastEmitted = {\r\n height: alturaCalculada,\r\n heightPx: alturaPx,\r\n rows: suggestedRows,\r\n tableScrollHeight: suggestedTableScrollHeight,\r\n };\r\n }\r\n\r\n private calculateSuggestedRows(availablePx: number): number {\r\n const rowPx = Math.max(20, Math.floor(this.rowHeight()));\r\n const reservePx = this.getEffectiveTableChromeReserve();\r\n const minRows = Math.max(1, Math.floor(this.minRows()));\r\n const maxRows = Math.max(minRows, this.getEffectiveMaxRows(minRows));\r\n\r\n const usablePx = Math.max(0, availablePx - reservePx);\r\n const calculated = Math.max(minRows, Math.floor(usablePx / rowPx));\r\n\r\n return Math.min(calculated, maxRows);\r\n }\r\n\r\n private getEffectiveMaxRows(minRows: number): number {\r\n const baseMaxRows = Math.max(minRows, Math.floor(this.maxRows()));\r\n const vh = this.cachedViewportHeight;\r\n\r\n if (vh <= 640) return Math.min(baseMaxRows, 8);\r\n if (vh <= 700) return Math.min(baseMaxRows, 10);\r\n if (vh <= 760) return Math.min(baseMaxRows, 12);\r\n return baseMaxRows;\r\n }\r\n\r\n private getEffectiveTableChromeReserve(): number {\r\n const baseReserve = Math.max(0, Math.floor(this.tableChromeReserve()));\r\n const vh = this.cachedViewportHeight;\r\n\r\n if (vh <= 640) return 200;\r\n if (vh <= 700) return baseReserve + 56;\r\n if (vh <= 760) return baseReserve + 32;\r\n if (vh > 820) return Math.max(120, baseReserve - 80);\r\n if (vh > 700) return Math.max(140, baseReserve - 40);\r\n return baseReserve;\r\n }\r\n\r\n private calculateTableScrollHeight(suggestedRows: number): string {\r\n const rowPx = Math.max(20, Math.floor(this.rowHeight()));\r\n const minHeightPx = Math.max(120, Math.floor(this.tableScrollMinHeight()));\r\n\r\n const adjustment =\r\n this.cachedViewportHeight > 0 && this.cachedViewportHeight <= 640\r\n ? 40\r\n : 24;\r\n const calculatedPx = Math.max(\r\n minHeightPx,\r\n suggestedRows * rowPx - adjustment,\r\n );\r\n\r\n return `${calculatedPx}px`;\r\n }\r\n\r\n private emitInZone(fn: () => void) {\r\n if (NgZone.isInAngularZone()) {\r\n fn();\r\n } else {\r\n this.ngZone.run(fn);\r\n }\r\n }\r\n\r\n private cleanup() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n if (this.rafId !== null) {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n\r\n if (this.debounceTimer !== null) {\r\n clearTimeout(this.debounceTimer);\r\n this.debounceTimer = null;\r\n }\r\n\r\n if (this.initTimer !== null) {\r\n clearTimeout(this.initTimer);\r\n this.initTimer = null;\r\n }\r\n }\r\n}\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva que permite solo la entrada de:\r\n * - Dígitos (0-9)\r\n * - Separadores punto (.)\r\n * - Rango con guión (-)\r\n * - O bien un comodín completo \"*\" que representa \"todos\"\r\n *\r\n * Ejemplos válidos:\r\n * - 1.2.3\r\n * - 4-6\r\n * - 1.3.5-9\r\n * - * (comodín: todos)\r\n *\r\n * Restringe:\r\n * - Letras\r\n * - Espacios\r\n * - Caracteres especiales (salvo \"*\")\r\n * - Doble punto (..), doble guión (--), o combinaciones como (.-)\r\n * - Mezclas de comodín con números (por ejemplo: *1, 1.*)\r\n */\r\n@Directive({\r\n selector: '[appOnlyRangoPattern]',\r\n})\r\nexport class OnlyRangoPatternDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n /**\r\n * Expresión regular para permitir caracteres válidos individualmente (tecla por tecla).\r\n */\r\n private keyRegex: RegExp = /^[0-9.\\-]$/;\r\n\r\n /**\r\n * Escucha el evento de teclado y permite únicamente teclas válidas.\r\n * También evita combinaciones inválidas como `..`, `--`, `.1`, etc.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const input = this.el.nativeElement;\r\n const currentValue = input.value;\r\n const cursorPos = input.selectionStart ?? 0;\r\n const selectionStart = input.selectionStart ?? 0;\r\n const selectionEnd = input.selectionEnd ?? 0;\r\n const hasFullSelection =\r\n selectionStart === 0 && selectionEnd === currentValue.length;\r\n const nextValue =\r\n currentValue.slice(0, cursorPos) +\r\n event.key +\r\n currentValue.slice(cursorPos);\r\n\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Tab',\r\n 'Home',\r\n 'End',\r\n ];\r\n\r\n if (allowedKeys.includes(event.key)) return;\r\n\r\n // Si ya hay comodín \"*\" sin selección completa, no se permiten más caracteres\r\n // (solo borrar/navegar). Si todo el texto está seleccionado, se permite\r\n // sobrescribirlo.\r\n if (currentValue === '*' && !hasFullSelection) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // Permitir comodín \"*\" si el campo está vacío o si todo el contenido\r\n // está seleccionado (para poder reemplazar rápidamente los números).\r\n if (event.key === '*') {\r\n if (!currentValue || hasFullSelection) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (!this.keyRegex.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir más de un punto o guión seguido, o combinaciones como \".-\", \"-.\", etc.\r\n if (/(\\.\\.|--|-\\.)|(\\.-)/.test(nextValue)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir iniciar con punto o guión\r\n if (cursorPos === 0 && (event.key === '.' || event.key === '-')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Previene el pegado de cadenas que no cumplan con la estructura válida.\r\n * Solo permite: número o número separados por punto o guión correctamente.\r\n */\r\n @HostListener('paste', ['$event'])\r\n onPaste(event: ClipboardEvent): void {\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const sanitized = pasted.trim();\r\n\r\n // Permitir comodín completo \"*\" pegado\r\n if (sanitized === '*') {\r\n return;\r\n }\r\n\r\n // Patrón completo de cadena válida: ej. 1.2.3.4-6\r\n const pattern = /^(\\d+(-\\d+)?)(\\.\\d+(-\\d+)?)*$/;\r\n\r\n if (!pattern.test(sanitized)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appSelectAllOnFocus]',\r\n})\r\nexport class SelectAllOnFocusDirective {\r\n @HostListener('onFocus', ['$event'])\r\n @HostListener('focus', ['$event'])\r\n selectAll(event: Event): void {\r\n const htmlInput = event.target as HTMLInputElement;\r\n if (htmlInput) {\r\n htmlInput.select();\r\n }\r\n }\r\n}\r\n","import { Location } from '@angular/common';\r\nimport { CanActivateFn } from '@angular/router';\r\nimport { AuthorizeService } from './../../services/src/authorize.service';\r\nimport { inject } from '@angular/core';\r\n\r\nexport const guardTokenPurposeGuard: CanActivateFn = (route, state) => {\r\n const authService = inject(AuthorizeService);\r\n const location = inject(Location);\r\n\r\n //console.log('[guardTokenPurposeGuard] ruta capturada:', state.url);\r\n\r\n if (authService.getTokenPurposeValid()) {\r\n // Permite pasar a la edición\r\n return true;\r\n }\r\n\r\n // Si no es válido:\r\n console.warn('Permiso denegado: Token Purpose no válido');\r\n\r\n // Regresa a la pantalla anterior del navegador.\r\n location.back();\r\n return false;\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const CACHE_KEYS = new InjectionToken<Record<string, string>>(\r\n 'CACHE_KEYS'\r\n);\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { EMPTY, throwError } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n // Activar en true cuando se necesite depurar en desarrollo.\r\n private readonly enableDevConsoleLogs = false && isDevMode();\r\n\r\n private isPurposeTokenError(error: HttpErrorResponse): boolean {\r\n const payload = error.error as any;\r\n return payload?.error === 'token_purpose_error';\r\n }\r\n\r\n private getPurposeTokenDescription(error: HttpErrorResponse): string {\r\n const payload = error.error as any;\r\n return (\r\n payload?.error_description ||\r\n 'Se requiere un token especial para acceder a este recurso.'\r\n );\r\n }\r\n\r\n handleErrorResponse(error: HttpErrorResponse | Error) {\r\n // Si el error ya no es un HttpErrorResponse (por ejemplo, un Error relanzado\r\n // desde otro catch), sólo lo propagamos sin volver a mostrar mensajes.\r\n if (!(error instanceof HttpErrorResponse)) {\r\n if (this.enableDevConsoleLogs) {\r\n // console.error(\r\n // 'Error no HTTP capturado por ErrorHandlerService:',\r\n // error,\r\n // );\r\n }\r\n\r\n return throwError(() => error);\r\n }\r\n\r\n let alertTitle = 'Servicio de Errores';\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n let isUnhandledSystemError = false;\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage = `<div style=\"font-family: 'Oswald', sans-serif; font-weight: normal; font-style: italic; margin-bottom: 0.3rem;\">Verifica los datos ingresados o validaciones existentes</div>`;\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = this.isPurposeTokenError(error)\r\n ? '<b>Acceso a recurso sensible no autorizado</b> (401).'\r\n : '<b>Acceso no autorizado</b> (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage =\r\n 'Se ha generado un error no controlado por el sistema en el último proceso realizado, comuníquese con el administrador.';\r\n isUnhandledSystemError = true;\r\n break;\r\n }\r\n\r\n // Preparar detalle del error para mostrar, priorizando solo la parte \"errors\" del objeto\r\n let errorDetail = '';\r\n let errorDetailHtml = '';\r\n\r\n if (!isUnhandledSystemError && this.isPurposeTokenError(error)) {\r\n errorDetail = this.getPurposeTokenDescription(error);\r\n } else if (\r\n !isUnhandledSystemError &&\r\n error &&\r\n typeof error.error === 'object' &&\r\n error.error !== null\r\n ) {\r\n const anyError: any = error.error as any;\r\n\r\n const getAssociatedPayload = (source: any) => {\r\n const resolveItemsArray = (value: any): any[] => {\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const nested =\r\n value.data ??\r\n value.Data ??\r\n value.details ??\r\n value.Details ??\r\n value.items ??\r\n value.Items;\r\n\r\n if (Array.isArray(nested)) {\r\n return nested;\r\n }\r\n }\r\n\r\n return [];\r\n };\r\n\r\n const candidates = [\r\n source,\r\n source?.error,\r\n source?.Error,\r\n source?.detail,\r\n source?.details,\r\n source?.payload,\r\n source?.response,\r\n source?.response?.data,\r\n source?.result,\r\n ].filter((item) => item && typeof item === 'object');\r\n\r\n for (const candidate of candidates) {\r\n const title = candidate.title ?? candidate.Title;\r\n const message = candidate.message ?? candidate.Message;\r\n const rawItems =\r\n candidate.data ??\r\n candidate.Data ??\r\n candidate.details ??\r\n candidate.Details ??\r\n candidate.items ??\r\n candidate.Items;\r\n\r\n const items = resolveItemsArray(rawItems);\r\n\r\n if (typeof title === 'string' && typeof message === 'string') {\r\n return {\r\n title,\r\n message,\r\n items,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const associatedPayload = getAssociatedPayload(anyError);\r\n\r\n if (this.enableDevConsoleLogs) {\r\n // console.log('[ErrorHandler] anyError payload:', anyError);\r\n // console.log(\r\n // '[ErrorHandler] associatedPayload detectado:',\r\n // associatedPayload,\r\n // );\r\n }\r\n\r\n if (associatedPayload) {\r\n alertTitle = associatedPayload.title || alertTitle;\r\n userMessage = associatedPayload.message || userMessage;\r\n\r\n const associatedItems =\r\n associatedPayload.items.length > 0\r\n ? associatedPayload.items\r\n : Array.isArray(anyError?.data)\r\n ? anyError.data\r\n : [];\r\n\r\n if (this.enableDevConsoleLogs) {\r\n // console.log(\r\n // '[ErrorHandler] associatedItems procesados:',\r\n // associatedItems,\r\n // );\r\n }\r\n\r\n if (associatedItems.length > 0) {\r\n const guideItems = associatedItems\r\n .map((item: any) => {\r\n const seccionOTabla = String(\r\n item?.seccionOTabla ?? 'No disponible',\r\n );\r\n const cantidadRegistros = String(item?.cantidadRegistros ?? '0');\r\n const vista = String(item?.vista ?? 'No disponible');\r\n const ruta = String(item?.ruta ?? 'No disponible');\r\n\r\n return (\r\n `<li style=\"display: list-item; margin: 0.35rem 0;\">` +\r\n `<div><strong>Vista:</strong> ${vista}</div>` +\r\n `<div><strong>Sección o tabla:</strong> ${seccionOTabla}</div>` +\r\n `<div><strong>Registros asociados:</strong> ${cantidadRegistros}</div>` +\r\n `<div><strong>Ruta:</strong> ${ruta}</div>` +\r\n `</li>`\r\n );\r\n })\r\n .join('');\r\n\r\n errorDetailHtml =\r\n `<div style=\"margin-top: 0.6rem;\">` +\r\n `<div style=\"font-family: 'Roboto', sans-serif; font-size: small; margin-bottom: 0.7rem;\">Sugerencia(s):<br/></div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${guideItems}</ol>` +\r\n `</div>`;\r\n }\r\n } else {\r\n // Si existe la propiedad \"errors\" (típica de ASP.NET Core ProblemDetails), usar solo esa\r\n const validationErrors = anyError.errors ?? anyError.Errors;\r\n\r\n if (validationErrors && typeof validationErrors === 'object') {\r\n // Mostrar solo los mensajes, sin prefijo de nombre de campo\r\n const parts: string[] = [];\r\n for (const key of Object.keys(validationErrors)) {\r\n const value = validationErrors[key];\r\n if (Array.isArray(value)) {\r\n parts.push(...value.map((msg) => String(msg)));\r\n } else {\r\n parts.push(String(value));\r\n }\r\n }\r\n\r\n if (parts.length > 0) {\r\n const listItems = parts\r\n .map(\r\n (msg) =>\r\n `<li style=\"display: list-item; margin: 0.15rem 0;\">${msg}</li>`,\r\n )\r\n .join('');\r\n errorDetailHtml =\r\n `<div style=\"margin-top: 0.15rem;\">` +\r\n `<div style=\"font-family: 'Roboto', sans-serif; font-size: small; margin-bottom: 0.7rem;\">Corrige lo(s) siguiente(s):<br/></div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1.05rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${listItems}</ol>` +\r\n `</div>`;\r\n }\r\n } else {\r\n // Si no hay \"errors\", usar el objeto completo serializado\r\n errorDetail = JSON.stringify(anyError);\r\n }\r\n }\r\n } else if (!isUnhandledSystemError) {\r\n errorDetail = (error?.error ?? '') as string;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n const alertBody =\r\n `<div class=\"alertMessageDsx\"><strong>${userMessage}</strong></div>` +\r\n (errorDetailHtml ? `<div>${errorDetailHtml}</div>` : '') +\r\n (errorDetail\r\n ? `<div class=\"alertMessageDsx\" style=\"font-size: 1.02rem; margin-top: 0.35rem;\">${errorDetail}</div>`\r\n : '');\r\n\r\n this._serviceAlerta.alertaHtmlSuccess(alertTitle, alertBody, {\r\n icon: 'error',\r\n icono: '',\r\n showConfirmButton: true,\r\n });\r\n\r\n // Imprimir el mensaje técnico\r\n if (this.enableDevConsoleLogs) {\r\n //console.error('error-handler:', err);\r\n }\r\n\r\n // El error HTTP ya fue tratado y notificado al usuario.\r\n // Se completa el flujo para evitar relanzarlo al consumidor cuando no es necesario.\r\n return EMPTY;\r\n }\r\n}\r\n","// Interceptor HTTP para manejar autorización y refresco de tokens en peticiones HTTP.\r\n// Permite agregar el token de autorización, manejar errores 401 y refrescar el token automáticamente.\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n EMPTY,\r\n filter,\r\n finalize,\r\n switchMap,\r\n take,\r\n} from 'rxjs';\r\nimport { ServiceResult } from '../models/src/response-http.model';\r\nimport { DataToken } from '../models/src/token.model';\r\nimport { AuthorizeService } from '../services/src/authorize.service';\r\nimport { ErrorHandlerService } from '../services/src/error-handler.service';\r\nimport { SecurityService } from '../services/src/security.service';\r\nimport { SpinnerLoadingService } from '../services/src/spinner-loading.service';\r\nimport { RequestMetricsService } from '../services/src/request-metrics.service';\r\n// Indica si se está realizando un refresh de token\r\nlet isRefreshing = false;\r\n// Subject para emitir el nuevo token tras el refresh\r\nlet refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n/**\r\n * Interceptor principal para autorización HTTP.\r\n * - Agrega el token de autorización a cada petición.\r\n * - Muestra/oculta el spinner de carga según el número de peticiones activas.\r\n * - Maneja errores 401 (Unauthorized) refrescando el token si es posible.\r\n * - Repite la petición original tras refrescar el token.\r\n */\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n const _metricsService = inject(RequestMetricsService);\r\n const _token = _authorizeService.getToken();\r\n const _tokenPurpose = _authorizeService.getTokenPurpose();\r\n let authReq = req;\r\n\r\n // Si la URL de la petición es inválida, retorna un observable vacío\r\n // Surgio a partir de angular V21\r\n if (!req.url || req.url.trim() === '' || req.url === '/') {\r\n return EMPTY;\r\n }\r\n\r\n // Justo después del console.log(...)\r\n const url = req.url || '';\r\n\r\n const isAssetRequest = url.includes('/assets/') || url.startsWith('mdio/'); // ajusta según tu caso\r\n\r\n if (isAssetRequest) {\r\n // No agregar token ni mostrar spinner para estos recursos\r\n return next(req);\r\n }\r\n\r\n if (_token) {\r\n authReq = req.clone({\r\n setHeaders: { Authorization: `Bearer ${_token}` },\r\n });\r\n }\r\n\r\n // Validar si el token de propósito es válido y agregarlo a la petición si es necesario\r\n if (_tokenPurpose && _authorizeService.getTokenPurposeValid()) {\r\n authReq = authReq.clone({\r\n setHeaders: { 'X-Special-Token': _tokenPurpose },\r\n });\r\n // Debería incluir X-Special-Token\r\n // console.log('Cabeceras enviadas:', authReq.headers.keys());\r\n }\r\n\r\n //console.log('Interceptor - Petición HTTP iniciada:', req.url);\r\n\r\n // Para depuración: muestra el token agregado\r\n //console.log('Interceptor - Token agregado a la petición:', authReq);\r\n\r\n // Notifica que inicia una petición (el servicio lleva el conteo interno)\r\n _spinnerService.show();\r\n\r\n const start = performance.now();\r\n\r\n // Ejecuta la petición HTTP\r\n return next(authReq).pipe(\r\n // Manejo de errores en la respuesta\r\n catchError((error: HttpErrorResponse) => {\r\n // Si el error es 401 (no autorizado), intenta refrescar el token\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n const refreshToken = _authorizeService.getTokenRefresh();\r\n // Si no hay refresh token, delega el manejo del error\r\n if (!refreshToken) {\r\n return _handleErrorService.handleErrorResponse(error);\r\n }\r\n\r\n // Si no se está refrescando el token, inicia el proceso de refresh\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n // Reiniciar el subject en cada ciclo de refresh para evitar estados cerrados por error\r\n refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n // Solicita el refresh del token\r\n return _securityService.tokenRefresh(refreshToken).pipe(\r\n switchMap((response: ServiceResult<DataToken>) => {\r\n // Si el servicio de refresh indica fallo o no retorna datos, mostrar error y cortar flujo\r\n if (!response.isSuccess || !response.data) {\r\n //console.log('Refresh token fallido:', response);\r\n isRefreshing = false;\r\n const refreshError = new HttpErrorResponse({\r\n status: HttpStatusCode.Unauthorized,\r\n statusText: 'Token de refresco inválido',\r\n error: response.message,\r\n url: req.url,\r\n });\r\n\r\n // Notificar a las peticiones en espera que el refresh falló\r\n refreshTokenSubject.error(refreshError);\r\n\r\n // Enviamos el error al manejador centralizado para mostrar el mensaje al usuario\r\n return _handleErrorService.handleErrorResponse(refreshError);\r\n }\r\n\r\n // Refresh exitoso: actualizar tokens y repetir la petición original\r\n isRefreshing = false;\r\n _authorizeService.tokenReload(response.data); // Actualiza el token en el servicio\r\n refreshTokenSubject.next(response.data.token); // Emite el nuevo token\r\n\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.data.token}`,\r\n },\r\n }),\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n refreshTokenSubject.error(err); // Emite el error en el subject\r\n return _handleErrorService.handleErrorResponse(err);\r\n }),\r\n );\r\n } else {\r\n // Si ya se está refrescando, espera a que el subject emita el nuevo token\r\n return refreshTokenSubject.pipe(\r\n filter((token) => token != null), // Espera a que el token sea válido\r\n take(1), // Toma solo la primera emisión válida\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n }),\r\n ),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n // Para otros errores, delega al servicio de manejo de errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n // Al finalizar la petición (éxito o error), actualiza el conteo y oculta el spinner si corresponde\r\n // comentarizar el hide para verificar el spinner en la aplicacion final\r\n finalize(() => {\r\n const duration = performance.now() - start;\r\n _metricsService.registerRequest(duration);\r\n _spinnerService.hide();\r\n }),\r\n );\r\n};\r\n","export type InferCacheKeyType<T extends Record<string, string>> = keyof T;\r\n\r\n/**\r\n * Transforma un tipo de mapa `T` cuyas claves son simbólicas\r\n * y cuyos valores son nombres de propiedades reales de caché,\r\n * a un objeto donde esas propiedades reales son claves booleanas.\r\n *\r\n * @example\r\n * ```ts\r\n * type T = { cliente: 'invalidateCacheCliente' };\r\n * InferCacheOptions<T> // { invalidateCacheCliente: boolean }\r\n * ```\r\n */\r\nexport type InferCacheOptions<T extends Record<string, string>> = {\r\n [K in keyof T as T[K]]: boolean;\r\n};\r\n\r\nexport function createInitialCache<T extends Record<string, string>>(\r\n cacheKeys: T\r\n): {\r\n -readonly [K in keyof T as T[K]]: boolean;\r\n} {\r\n return Object.fromEntries(\r\n Object.values(cacheKeys).map((key) => [key, false])\r\n ) as any;\r\n}\r\n","import { Component, input, OnInit } from '@angular/core';\r\nimport { AvatarModule } from 'primeng/avatar';\r\n\r\n@Component({\r\n selector: 'header-dsx',\r\n imports: [AvatarModule],\r\n templateUrl: './header-dsx.html',\r\n styleUrl: './header-dsx.css',\r\n})\r\nexport class HeaderDsx implements OnInit {\r\n id = input<number | null>(null);\r\n etiqueta = input.required<string>();\r\n defaultPNG = input<string>('icon/folder_001.png');\r\n defaultGIF = input<string>('gif/file.gif');\r\n icoPNG = input<string | null>(null);\r\n icoGIF = input<string | null>(null);\r\n icono: string | null = null;\r\n textoEncabezado: string | null = null;\r\n subTitulo = input<string | null>(null);\r\n\r\n ngOnInit(): void {\r\n this.definirTexto();\r\n //throw new Error('Method not implemented.');\r\n }\r\n\r\n private definirTexto(): void {\r\n // Validaciones para el texto del encabezado según el valor de ID\r\n // Caso 1: No se proporcionó ID (indefinido o nulo) -> Plural\r\n if (this.id() === null) {\r\n this.textoEncabezado = this.etiqueta();\r\n }\r\n // Caso 2: El ID existe y vale exactamente 0 -> Registrar\r\n else if (this.id() === 0) {\r\n this.textoEncabezado = `Registrar ${this.etiqueta()}`;\r\n }\r\n // Caso 3: El ID es mayor que 0 -> Editar\r\n else if (this.id()! > 0) {\r\n this.textoEncabezado = `Editar ${this.etiqueta()}`;\r\n }\r\n\r\n // Validaciones para el icono según el valor de ID\r\n // Caso 1: No se proporcionó ningún icono -> Usar el icono por defecto\r\n if (this.icoPNG() === null && this.icoGIF() === null) {\r\n this.icono = this.defaultPNG();\r\n }\r\n // Caso 2: Se proporcionó un icono PNG -> Usar el icono PNG\r\n else if (this.icoPNG() !== null) {\r\n this.icono = this.icoPNG();\r\n }\r\n // Caso 3: Se proporcionó un icono GIF -> Usar el icono GIF\r\n else if (this.icoGIF() !== null) {\r\n this.icono = this.icoGIF();\r\n }\r\n }\r\n}\r\n","<div class=\"area-fieldset-header flex items-center gap-2 px-2\">\r\n <p-avatar [image]=\"icono!\"></p-avatar>\r\n <div class=\"flex flex-col\">\r\n <h3>{{ textoEncabezado }}</h3>\r\n @if(subTitulo() !== null ){\r\n <ng-container>\r\n <span class=\"text-xs text-gray-600\">{{ subTitulo() }}</span>\r\n </ng-container>\r\n }\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterLink } from '@angular/router';\r\nimport { DsxButtonComponent } from '../../components/src/button/dsx-button/dsx-button';\r\nimport { DsxStatusToggle } from '../../components/src/button/dsx-status-toggle/dsx-status-toggle';\r\nimport { DsxEnableDisable } from '../../components/src/checkBox/enable-disable/enable-disable';\r\nimport { IconDsxComponent } from '../../components/src/icon-dsx/icon-dsx.component';\r\nimport { JsonValuesDebujComponent } from '../../components/src/json/json-values-debuj/json-values-debuj.component';\r\nimport { HeaderDsx } from '../../primengdsx/src/fieldset/header/header-dsx/header-dsx';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n DsxButtonComponent,\r\n DsxEnableDisable,\r\n DsxStatusToggle,\r\n HeaderDsx,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n RouterLink,\r\n ],\r\n exports: [\r\n CommonModule,\r\n DsxButtonComponent,\r\n DsxEnableDisable,\r\n DsxStatusToggle,\r\n FormsModule,\r\n HeaderDsx,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n RouterLink,\r\n ],\r\n providers: [],\r\n})\r\nexport class DsxAddToolsModule {}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//PrimeNG\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { AutoFocusModule } from 'primeng/autofocus';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { AvatarGroupModule } from 'primeng/avatargroup';\r\nimport { BadgeModule } from 'primeng/badge';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CardModule } from 'primeng/card';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ContextMenuModule } from 'primeng/contextmenu';\r\nimport { DataViewModule } from 'primeng/dataview';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { FieldsetModule } from 'primeng/fieldset';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { InputMaskModule } from 'primeng/inputmask';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { KeyFilterModule } from 'primeng/keyfilter';\r\nimport { KnobModule } from 'primeng/knob';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { OrganizationChartModule } from 'primeng/organizationchart';\r\nimport { OverlayBadgeModule } from 'primeng/overlaybadge';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { PickListModule } from 'primeng/picklist';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { RatingModule } from 'primeng/rating';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { ScrollerModule } from 'primeng/scroller';\r\nimport { ScrollPanelModule } from 'primeng/scrollpanel';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { SelectButtonModule } from 'primeng/selectbutton';\r\nimport { SliderModule } from 'primeng/slider';\r\nimport { SpeedDialModule } from 'primeng/speeddial';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { StepperModule } from 'primeng/stepper';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TextareaModule } from 'primeng/textarea';\r\nimport { TimelineModule } from 'primeng/timeline';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { TreeModule } from 'primeng/tree';\r\nimport { TreeTableModule } from 'primeng/treetable';\r\n\r\nconst PRIME_NG_MODULES = [\r\n AccordionModule,\r\n AutoCompleteModule,\r\n AutoFocusModule,\r\n AvatarGroupModule,\r\n AvatarModule,\r\n BadgeModule,\r\n ButtonModule,\r\n CardModule,\r\n CheckboxModule,\r\n ContextMenuModule,\r\n DataViewModule,\r\n DatePickerModule,\r\n DialogModule,\r\n DividerModule,\r\n DrawerModule,\r\n FieldsetModule,\r\n FileUploadModule,\r\n FloatLabelModule,\r\n IconFieldModule,\r\n ImageModule,\r\n InputIconModule,\r\n InputMaskModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n KeyFilterModule,\r\n KnobModule,\r\n MenubarModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n OrganizationChartModule,\r\n OverlayBadgeModule,\r\n PanelMenuModule,\r\n PasswordModule,\r\n PickListModule,\r\n PopoverModule,\r\n RadioButtonModule,\r\n RatingModule,\r\n RippleModule,\r\n ScrollerModule,\r\n ScrollPanelModule,\r\n SelectButtonModule,\r\n SelectModule,\r\n SliderModule,\r\n SpeedDialModule,\r\n SplitButtonModule,\r\n StepperModule,\r\n TableModule,\r\n TabsModule,\r\n TagModule,\r\n TextareaModule,\r\n TimelineModule,\r\n ToastModule,\r\n ToggleButtonModule,\r\n TooltipModule,\r\n TreeModule,\r\n TreeTableModule,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [...PRIME_NG_MODULES],\r\n providers: [],\r\n})\r\nexport class PrimeNgModule {}\r\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Pipe `joinByPipe`\n *\n * Une los valores de una propiedad de un arreglo de objetos en una sola cadena\n * separado por el `separator` proporcionado.\n *\n * Uso (template):\n * - `items | joinByPipe:'name'` => une la propiedad `name` con `, ` como separador\n * - `items | joinByPipe:'name':'; '` => usa `; ` como separador\n *\n * Ejemplo:\n * const items = [{ name: 'Ana' }, { name: 'Luis' }, { other: 'x' }];\n * // Resultado: 'Ana, Luis'\n *\n * Comportamiento:\n * - Si el arreglo es nulo, indefinido o vacío devuelve `''`.\n * - Si la propiedad no existe en el primer elemento devuelve `''` y registra\n * una advertencia en la consola.\n * - Convierte cada valor a `string`, filtra valores vacíos y los concatena.\n */\n@Pipe({\n name: 'joinBy',\n standalone: true,\n})\nexport class JoinByPipe implements PipeTransform {\n /**\n * Transforma un arreglo de objetos en una cadena unida por `separator` usando\n * la propiedad indicada.\n *\n * @param array - Arreglo de objetos o `null`/`undefined`.\n * @param property - Clave del objeto cuyos valores se van a unir.\n * @param separator - Cadena que separará los valores (por defecto `', '`).\n * @returns Una cadena con los valores unidos o `''` si no hay datos válidos.\n */\n transform<T extends Record<string, any>>(\n array: T[] | null | undefined,\n property: keyof T,\n separator: string = ', ',\n ): string {\n // Si el arreglo está vacío o es nulo/indefinido retornamos cadena vacía\n if (!array?.length) return '';\n\n // Validar que la propiedad exista al menos en el primer elemento\n if (!(property in array[0])) {\n console.warn(\n `JoinByPipe: La propiedad \"${String(property)}\" no existe en el objeto.`,\n );\n return '';\n }\n\n // Convertir valores a string, eliminar vacíos y unir con el separador\n return array\n .map((item) => String(item[property] ?? ''))\n .filter((value) => value.length > 0)\n .join(separator);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate',\r\n standalone: true,\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n /**\r\n * Transforma una cadena de texto truncándola según los parámetros proporcionados.\r\n *\r\n * @param value - La cadena de texto que se desea truncar.\r\n * @param limit - El número máximo de caracteres permitidos. Por defecto es 100. Si no se encuentra un espacio dentro del límite, usa el límite original (15).\r\n * @param completeWords - Si es true, evita cortar palabras a la mitad. Por defecto es false.\r\n * @param ellipsis - La cadena que se añadirá al final del texto truncado. Por defecto es '...'.\r\n * @returns La cadena truncada con el ellipsis añadido, si es necesario.\r\n */\r\n transform(\r\n value: string,\r\n limit: number = 20,\r\n completeWords: boolean = false,\r\n ellipsis: string = '...'\r\n ): string {\r\n // Si el valor es nulo o indefinido, devuelve una cadena vacía para evitar errores.\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n // Si completeWords es true, ajusta el límite para no cortar palabras.\r\n if (completeWords) {\r\n // Encuentra el último espacio dentro del límite para evitar cortar palabras.\r\n limit = value.slice(0, limit).lastIndexOf(' ');\r\n\r\n // Si no se encuentra un espacio dentro del límite, usa el límite original.\r\n if (limit < 0) {\r\n limit = 15; // Valor por defecto si no hay espacios.\r\n }\r\n }\r\n\r\n // Trunca el texto y añade el ellipsis si la longitud del texto supera el límite.\r\n return value.length > limit ? value.slice(0, limit) + ellipsis : value;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport {\r\n ServiceResult,\r\n ServiceResultVoid,\r\n} from '../../models/src/response-http.model';\r\n\r\n/**\r\n * Servicio genérico para consumir endpoints REST de la API.\r\n *\r\n * @typeParam T Tipo base de la entidad. Puede sobrescribirse por método.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EndpointService<T> {\r\n /** Cliente HTTP de Angular utilizado para realizar las peticiones. */\r\n private http = inject(HttpClient);\r\n\r\n /** Configuración de entorno que contiene la URL base de la API. */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /**\r\n * Construye la URL completa del endpoint a partir de la configuración de entorno.\r\n *\r\n * @param endpoint Segmento del endpoint (por ejemplo: 'usuarios', 'facturas').\r\n * @returns URL absoluta del endpoint.\r\n */\r\n private getUrl(endpoint: string): string {\r\n return `${this.environment.myAppUrl}api/${endpoint}`;\r\n }\r\n\r\n /**\r\n * Obtiene un listado de recursos del endpoint especificado.\r\n *\r\n * @typeParam TList Tipo de cada elemento del listado (por defecto `T`).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param invalidateCache Indica si se invalida la caché del lado del servidor.\r\n * @returns Observable con un arreglo de elementos del tipo `TList`.\r\n */\r\n list<TList = T>(\r\n endpoint: string,\r\n invalidateCache: boolean = false,\r\n ): Observable<TList[]> {\r\n return this.http.get<TList[]>(\r\n `${this.getUrl(endpoint)}/listar/${invalidateCache}`,\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene un recurso por su identificador.\r\n *\r\n * @typeParam TEdit Tipo del recurso retornado (por defecto `T`).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param id Identificador del recurso a recuperar.\r\n * @returns Observable con el elemento del tipo `TEdit`.\r\n */\r\n edit<TEdit = T>(endpoint: string, id: number): Observable<TEdit> {\r\n return this.http.get<TEdit>(`${this.getUrl(endpoint)}/get-id/${id}`);\r\n }\r\n\r\n /**\r\n * Crea o actualiza un recurso en el endpoint especificado.\r\n *\r\n * @typeParam TSave Tipo del payload enviado al backend (por defecto `T`).\r\n * @typeParam TResponse Tipo de la entidad en la respuesta (por defecto `T`).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param values Objeto con los datos del recurso a guardar.\r\n * @returns Observable con el resultado del servicio que envuelve `TResponse`.\r\n */\r\n save<TSave = T, TResponse = T>(\r\n endpoint: string,\r\n values: TSave,\r\n ): Observable<ServiceResult<TResponse>> {\r\n return this.http.put<ServiceResult<TResponse>>(\r\n `${this.getUrl(endpoint)}/save`,\r\n values,\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene el listado agrupado de recursos del endpoint especificado.\r\n *\r\n * @typeParam TGroup Tipo del resultado agrupado (flexible por petición).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param invalidateCache Indica si se invalida la caché del lado del servidor.\r\n * @returns Observable con el resultado tipado como `TGroup`.\r\n */\r\n listGroup<TGroup = T>(\r\n endpoint: string,\r\n invalidateCache: boolean = false,\r\n ): Observable<TGroup> {\r\n return this.http.get<TGroup>(\r\n `${this.getUrl(endpoint)}/listar-grupo/${invalidateCache}`,\r\n );\r\n }\r\n\r\n /**\r\n * Elimina un recurso del endpoint especificado.\r\n *\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param id Identificador del recurso a eliminar (numérico o textual).\r\n * @param softDelete Indica si la eliminación es lógica (por defecto) o física.\r\n * @returns Observable con el modelo de respuesta HTTP genérico.\r\n */\r\n delete(\r\n endpoint: string,\r\n id: number | string,\r\n softDelete: boolean = true,\r\n ): Observable<ServiceResultVoid> {\r\n return this.http.delete<ServiceResultVoid>(\r\n `${this.getUrl(endpoint)}/delete/${id}/${softDelete}`,\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { EndpointService } from './endpoint.service';\r\n\r\n/**\r\n * Clase base para servicios CRUD tipados.\r\n *\r\n * @typeParam TBase Modelo base que representa la entidad principal.\r\n * @typeParam TGroup Tipo del resultado de `listGroup`. Debe pasarse explícitamente;\r\n * si no se usa `listGroup`, omitir o dejar `never`.\r\n * @typeParam TEdit Modelo de respuesta para la operación de edición/consulta por id.\r\n * @typeParam TSave Modelo de entrada para guardar (create/update).\r\n * @typeParam TList Modelo de cada elemento del listado.\r\n * @typeParam TDelete Tipo del identificador usado para eliminar (number o string).\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport abstract class BaseCRUDService<\r\n TBase,\r\n TGroup = never,\r\n TEdit = TBase,\r\n TSave = TBase,\r\n TList = TBase,\r\n TDelete extends string | number = number,\r\n> {\r\n /** Segmento del endpoint (sin prefijo api/). */\r\n protected abstract endpoint: string;\r\n\r\n /** Servicio HTTP base para operaciones REST. */\r\n protected readonly _endpointService = inject(EndpointService);\r\n\r\n /**\r\n * Obtiene el listado de registros.\r\n * @param invalidateCache Si es true, solicita invalidar caché en backend.\r\n */\r\n list(invalidateCache: boolean = false) {\r\n return this._endpointService.list<TList>(this.endpoint, invalidateCache);\r\n }\r\n\r\n /**\r\n * Obtiene un registro por id para edición.\r\n * @param id Identificador numérico del registro.\r\n */\r\n edit(id: number) {\r\n return this._endpointService.edit<TEdit>(this.endpoint, id);\r\n }\r\n\r\n /**\r\n * Guarda un registro (creación o actualización).\r\n * @param values Payload tipado para persistir.\r\n */\r\n save(values: TSave) {\r\n return this._endpointService.save<TSave, TBase>(this.endpoint, values);\r\n }\r\n\r\n /**\r\n * Elimina un registro por identificador.\r\n * @param value Identificador del registro a eliminar.\r\n * @param softDelete Si es true, realiza eliminación lógica.\r\n */\r\n delete(value: TDelete, softDelete: boolean = true) {\r\n return this._endpointService.delete(this.endpoint, value, softDelete);\r\n }\r\n\r\n /**\r\n * Obtiene el listado agrupado. El tipo de retorno se define en el genérico\r\n * `TGroup` de la clase al extender `BaseCRUDService`.\r\n * @param invalidateCache Si es true, solicita invalidar caché en backend.\r\n */\r\n listGroup(invalidateCache: boolean = false) {\r\n return this._endpointService.listGroup<TGroup>(\r\n this.endpoint,\r\n invalidateCache,\r\n );\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CACHE_KEYS } from '../../injections/cache.token';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { InferCacheOptions } from '../../models/src/cache.types';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\n/**\r\n * Servicio genérico para el manejo de caché reactivo basado en claves definidas por el consumidor.\r\n *\r\n * Este servicio utiliza señales (`signal`) para almacenar el estado de invalidación de caché\r\n * y permite marcar ciertas entradas como inválidas mediante una llamada a `invalidate`.\r\n *\r\n * ---\r\n * ## Uso básico\r\n * Si no se especifica el tipo genérico `T`, el servicio funcionará con un mapa genérico\r\n * `Record<string, string>` sin autocompletado.\r\n *\r\n * ```ts\r\n * const cacheService = inject(CacheService);\r\n * cacheService.invalidate(['cualquierClave']);\r\n * ```\r\n *\r\n * ---\r\n * ## Uso tipado (recomendado)\r\n * 1. Definir las claves de caché en el proyecto consumidor:\r\n * ```ts\r\n * export const INITIAL_CACHE_KEYS = {\r\n * cliente: 'invalidateCacheCliente',\r\n * empresa: 'invalidateCacheEmpresa'\r\n * } as const;\r\n *\r\n * export type ValueCacheKeys = typeof INITIAL_CACHE_KEYS;\r\n * ```\r\n *\r\n * 2. Proveer estas claves en `AppModule` o un módulo raíz:\r\n * ```ts\r\n * providers: [\r\n * { provide: CACHE_KEYS, useValue: INITIAL_CACHE_KEYS }\r\n * ]\r\n * ```\r\n *\r\n * 3. Inyectar el servicio especificando el tipo:\r\n * ```ts\r\n * const cacheService = inject<CacheService<ValueCacheKeys>>(CacheService);\r\n *\r\n * cacheService.options.invalidateCacheCliente; // ✅ boolean con autocompletado\r\n * cacheService.invalidate(['cliente']); // marca como invalidado\r\n * ```\r\n *\r\n * @typeParam T - Objeto con claves simbólicas (`keyof T`) como `cliente`, `empresa`,\r\n * y valores string literales usados como claves reales de caché.\r\n * Por defecto: `Record<string, string>`.\r\n */\r\nexport class CacheService<\r\n T extends Record<string, string> = Record<string, string>,\r\n> {\r\n /**\r\n * Mapa de claves simbólicas a claves reales de caché.\r\n * Se inyecta desde el proyecto consumidor mediante `CACHE_KEYS`.\r\n */\r\n private keys = inject(CACHE_KEYS) as T;\r\n\r\n /**\r\n * Servicio de alerta utilizado para mostrar notificaciones al usuario.\r\n */\r\n private alert = inject(AlertaService);\r\n\r\n /**\r\n * Configuración global de entorno para controlar comportamiento de mensajes.\r\n */\r\n private readonly environment = inject(ENVIRONMENT, {\r\n optional: true,\r\n }) as EnvironmentConfig | null;\r\n\r\n /**\r\n * Estado reactivo que contiene un objeto donde cada propiedad (clave real de caché)\r\n * tiene un valor booleano que indica si el caché ha sido invalidado (`true`)\r\n * o sigue siendo válido (`false`).\r\n *\r\n * Este estado es tipado automáticamente en función de los valores de `T`.\r\n */\r\n private _options = signal<InferCacheOptions<T>>(\r\n Object.fromEntries(\r\n Object.values(this.keys).map((k) => [k, false]),\r\n ) as InferCacheOptions<T>,\r\n );\r\n\r\n /**\r\n * Obtiene el estado actual del caché.\r\n * Cada propiedad representa una clave real de caché con su valor booleano.\r\n */\r\n get options(): InferCacheOptions<T> {\r\n return this._options();\r\n }\r\n\r\n /**\r\n * Invalida una o más claves simbólicas, marcando su correspondiente\r\n * propiedad de caché como `true` (invalidada).\r\n *\r\n * @param keysToInvalidate - Lista de claves simbólicas (`keyof T`) a invalidar.\r\n * @param showUpdatedCacheMessage - Sobrescribe el comportamiento global de\r\n * visualización del toast para esta llamada puntual. Tiene prioridad sobre\r\n * `environment.showUpdatedCacheMessage`.\r\n *\r\n * @example\r\n * ```ts\r\n * cacheService.invalidate(['cliente', 'empresa']);\r\n * cacheService.invalidate(['cliente'], true); // fuerza mostrar mensaje\r\n * ```\r\n */\r\n invalidate(\r\n keysToInvalidate: (keyof T)[] | null = null,\r\n showUpdatedCacheMessage?: boolean,\r\n ): void {\r\n if (!keysToInvalidate?.length) return;\r\n\r\n const current: InferCacheOptions<T> = { ...this._options() };\r\n\r\n keysToInvalidate.forEach((key) => {\r\n const prop = this.keys[key] as keyof InferCacheOptions<T>;\r\n current[prop] = true as InferCacheOptions<T>[typeof prop];\r\n });\r\n\r\n this._options.set(current);\r\n\r\n const shouldShowMessage =\r\n showUpdatedCacheMessage ??\r\n this.environment?.showUpdatedCacheMessage ??\r\n false;\r\n\r\n if (shouldShowMessage) {\r\n this.alert.toastrAlerts(\r\n 2,\r\n 'Estado',\r\n 'Datos actualizados (cache).',\r\n 2,\r\n 1000,\r\n );\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { CacheService } from './cache.service';\r\n\r\nexport function createTypedCacheProvider<T extends Record<string, string>>(\r\n tokenName: string\r\n): { token: InjectionToken<CacheService<T>>; provider: Provider } {\r\n const token = new InjectionToken<CacheService<T>>(tokenName);\r\n\r\n const provider: Provider = {\r\n provide: token,\r\n useFactory: () => new CacheService<T>(),\r\n deps: [],\r\n };\r\n\r\n return { token, provider };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DteService {\r\n /** Servicio HttpClient para realizar peticiones HTTP */\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Configuración del entorno inyectada mediante el token ENVIRONMENT.\r\n * La validación se realiza automáticamente al usar provideEnvironment().\r\n */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /** URL base de la API JWT construida desde la configuración del entorno */\r\n private SeguridadITApi: string = `${this.environment.SeguridadITApiUrl}api/dte`;\r\n\r\n pdfDTE(UUID: string): Observable<Blob> {\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.get<Blob>(`${this.SeguridadITApi}/pdf-dte/${UUID}`, {\r\n responseType: 'blob' as 'json',\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ArrayHelpersService {\r\n // ==========================================\r\n // 1. SECCIÓN: VALIDACIONES (GUARDS / CHECKS)\r\n // ==========================================\r\n\r\n isArrayOf<T>(data: any, keyOfT: keyof T): data is T[] {\r\n if (!Array.isArray(data)) return false;\r\n if (data.length === 0) return true;\r\n\r\n // Accedemos explícitamente al primer elemento para validar la propiedad\r\n const existePropiedad = keyOfT in data[0];\r\n\r\n if (!existePropiedad) {\r\n // Genera una ventana emergente bloqueante en el navegador\r\n alert(\r\n `[TypeGuard Error]: La propiedad '${String(keyOfT)}' no existe en la clase/objeto recibido.`,\r\n );\r\n\r\n // Opcional: También lanzamos un error en consola para ver el objeto dañado\r\n console.error('Objeto recibido con estructura incorrecta:', data[0]);\r\n }\r\n\r\n return existePropiedad;\r\n }\r\n}\r\n","import {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n HttpResponse,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n BlobRequestOptions,\r\n FileData,\r\n HttpParamValue,\r\n} from '../../../models/src/file-data.model';\r\nimport { catchError, from, Observable, of, switchMap } from 'rxjs';\r\nimport { ServiceResult } from '../../../models';\r\nimport { AlertaService } from '../alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ResultFileService {\r\n private readonly http = inject(HttpClient);\r\n private readonly _alertaService = inject(AlertaService);\r\n\r\n /**\r\n * Contrato esperado del backend para endpoints de descarga:\r\n * 1) Respuesta binaria directa (Content-Type del archivo), opcionalmente con\r\n * Content-Disposition para el nombre y headers x-title/x-message.\r\n * 2) Respuesta JSON serializada dentro de Blob (type application/json)\r\n * con estructura ServiceResult<FileContentResult>, donde data puede incluir:\r\n * FileContents|fileContents, FileDownloadName|fileDownloadName,\r\n * ContentType|contentType, title y message.\r\n *\r\n * Si el backend no cumple alguno de estos formatos, la conversión puede fallar\r\n * y el cliente recibirá data: null con isSuccess: false.\r\n */\r\n\r\n /**\r\n * Procesa un ServiceResult<FileData> para visualizar o descargar.\r\n */\r\n processFileResult(\r\n result: ServiceResult<FileData>,\r\n visualizar: boolean = false,\r\n ): void {\r\n if (!result.isSuccess || !result.data?.blob) {\r\n this._alertaService.alertaHtmlSuccess(result.title, result.message, {\r\n icon: 'question',\r\n icono: '',\r\n showConfirmButton: true,\r\n });\r\n return;\r\n }\r\n\r\n const { blob, fileName } = result.data;\r\n\r\n if (visualizar) {\r\n this.PdfView(blob);\r\n return;\r\n }\r\n\r\n this.descargarBlob(blob, fileName);\r\n }\r\n\r\n /**\r\n * Realiza un GET para descarga y normaliza la respuesta a ServiceResult<FileData>.\r\n *\r\n * Nota de integración backend:\r\n * - Para nombre de archivo en binario directo, enviar Content-Disposition.\r\n * - Para mensajes de éxito, enviar x-title/x-message o title/message en JSON.\r\n * - Si se envía JSON serializado, incluir los campos de FileContentResult.\r\n */\r\n getDownloadableFile(\r\n url: string,\r\n options: BlobRequestOptions = {},\r\n ): Observable<ServiceResult<FileData>> {\r\n return this.http\r\n .get(url, {\r\n responseType: 'blob' as const,\r\n observe: 'response' as const,\r\n params: this.toHttpParams(options.params),\r\n headers: options.headers,\r\n withCredentials: options.withCredentials,\r\n })\r\n .pipe(\r\n switchMap((response: HttpResponse<Blob>) =>\r\n from(this.mapResponseToServiceResult(response)),\r\n ),\r\n catchError((error) =>\r\n of({\r\n data: null,\r\n isSuccess: false,\r\n title: error?.title || 'Error de Servidor',\r\n message:\r\n error?.message ||\r\n 'No se pudo obtener el archivo desde el servidor.',\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n PdfView(blob: Blob): void {\r\n const pdfUrl = URL.createObjectURL(blob);\r\n window.open(pdfUrl, '_blank');\r\n\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(pdfUrl);\r\n }, 100);\r\n }\r\n\r\n descargarBlob(\r\n blob: Blob | null | undefined,\r\n fileName: string | null | undefined,\r\n ): void {\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n const fileUrl = URL.createObjectURL(blob);\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = (fileName || 'archivo_descargado').trim();\r\n downloadLink.click();\r\n\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n private async mapResponseToServiceResult(\r\n response: HttpResponse<Blob>,\r\n ): Promise<ServiceResult<FileData>> {\r\n const fileBlob = response.body;\r\n\r\n if (!fileBlob) {\r\n return {\r\n data: null,\r\n isSuccess: false,\r\n title: 'Error de Servidor',\r\n message: 'La respuesta no contiene un archivo válido.',\r\n };\r\n }\r\n\r\n const serializedResult = await this.tryParseServiceResultBlob(fileBlob);\r\n if (serializedResult) {\r\n return this.mapSerializedResultToFileData(serializedResult, response);\r\n }\r\n\r\n const headerFileName = this.getFileNameFromContentDisposition(\r\n response.headers,\r\n );\r\n const headerTitle = this.getHeaderValue(response.headers, [\r\n 'x-title',\r\n 'x-service-title',\r\n 'title',\r\n ]);\r\n const headerMessage = this.getHeaderValue(response.headers, [\r\n 'x-message',\r\n 'x-service-message',\r\n 'message',\r\n ]);\r\n\r\n return {\r\n data: {\r\n blob: fileBlob,\r\n fileName: headerFileName || 'document',\r\n },\r\n isSuccess: true,\r\n title: headerTitle || '',\r\n message: headerMessage || '',\r\n };\r\n }\r\n\r\n private async tryParseServiceResultBlob(blob: Blob): Promise<any | null> {\r\n // Solo intentamos parsear cuando el servidor marca explícitamente JSON.\r\n if (!blob.type.toLowerCase().includes('json')) {\r\n return null;\r\n }\r\n\r\n try {\r\n const text = await blob.text();\r\n const parsed = JSON.parse(text);\r\n return parsed && typeof parsed === 'object' && 'isSuccess' in parsed\r\n ? parsed\r\n : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private mapSerializedResultToFileData(\r\n serializedResult: any,\r\n response: HttpResponse<Blob>,\r\n ): ServiceResult<FileData> {\r\n // Soporta variantes de nombres en PascalCase/camelCase según backend.\r\n if (!serializedResult.isSuccess) {\r\n return {\r\n data: null,\r\n isSuccess: false,\r\n title: serializedResult.title || 'Error de Servidor',\r\n message:\r\n serializedResult.message ||\r\n 'No se pudo obtener el archivo desde el servidor.',\r\n };\r\n }\r\n\r\n const payload = serializedResult.data || {};\r\n const fileName =\r\n payload.fileDownloadName ||\r\n payload.FileDownloadName ||\r\n payload.fileName ||\r\n payload.FileName ||\r\n this.getFileNameFromContentDisposition(response.headers) ||\r\n 'document';\r\n\r\n const contentType =\r\n payload.contentType || payload.ContentType || 'application/octet-stream';\r\n const content = payload.fileContents || payload.FileContents;\r\n const blob =\r\n this.toBlob(content, contentType) || response.body || new Blob();\r\n\r\n return {\r\n data: {\r\n blob,\r\n fileName,\r\n },\r\n isSuccess: true,\r\n title: serializedResult.title || '',\r\n message: serializedResult.message || '',\r\n };\r\n }\r\n\r\n private toBlob(content: unknown, contentType: string): Blob | null {\r\n if (!content) {\r\n return null;\r\n }\r\n\r\n if (typeof content === 'string') {\r\n const binary = atob(content);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let index = 0; index < binary.length; index++) {\r\n bytes[index] = binary.charCodeAt(index);\r\n }\r\n return new Blob([bytes], { type: contentType });\r\n }\r\n\r\n if (Array.isArray(content)) {\r\n return new Blob([new Uint8Array(content)], { type: contentType });\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // ----------------------------------------------------------\r\n // METODOS PRIVADOS PARA CONVERTIR PARAMETROS A HTTPPARAMS\r\n // ----------------------------------------------------------\r\n private getFileNameFromContentDisposition(\r\n headers: HttpHeaders,\r\n ): string | null {\r\n const contentDisposition = headers.get('content-disposition');\r\n\r\n if (!contentDisposition) return null;\r\n\r\n const matches = /filename\\*?[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i.exec(\r\n contentDisposition,\r\n );\r\n\r\n if (!matches || !matches[1]) return null;\r\n\r\n let fileName = matches[1].replace(/['\"]/g, '').trim();\r\n\r\n if (fileName.toLowerCase().includes(\"utf-8''\")) {\r\n fileName = decodeURIComponent(fileName.split(\"''\")[1] || '');\r\n }\r\n\r\n return fileName;\r\n }\r\n\r\n private getHeaderValue(\r\n headers: HttpHeaders,\r\n headerNames: string[],\r\n ): string | null {\r\n for (const headerName of headerNames) {\r\n const value = headers.get(headerName);\r\n if (value && value.trim()) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private toHttpParams(\r\n params?: BlobRequestOptions['params'],\r\n ): HttpParams | undefined {\r\n if (!params) {\r\n return undefined;\r\n }\r\n\r\n if (params instanceof HttpParams) {\r\n return params;\r\n }\r\n\r\n let httpParams = new HttpParams();\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value === null || value === undefined) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (const item of value) {\r\n if (item === null || item === undefined) {\r\n continue;\r\n }\r\n httpParams = httpParams.append(key, this.normalizeParamValue(item));\r\n }\r\n continue;\r\n }\r\n\r\n httpParams = httpParams.set(key, this.normalizeParamValue(value));\r\n }\r\n\r\n return httpParams;\r\n }\r\n\r\n private normalizeParamValue(\r\n value: Exclude<HttpParamValue, null | undefined>,\r\n ): string {\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport {\r\n ENVIRONMENT,\r\n SWEET_ALERT_THEMES,\r\n} from '../../../injections/environment.token';\r\nimport { ActionMessageConfig } from '../../../models/src/action-message.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n cancelButtonText?: string;\r\n confirmButtonText?: string;\r\n icon?: SweetAlertIcon;\r\n icono?: string;\r\n imageHeight?: number;\r\n imageWidth?: number;\r\n showCancelButton?: boolean;\r\n showCloseButton?: boolean;\r\n showConfirmButton?: boolean;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n timer?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SweetAlert2DialogService {\r\n /**\r\n * Configuración del entorno inyectada (opcional).\r\n * Se usa para obtener el tema global de SweetAlert2 desde el environment.\r\n */\r\n private environment = inject(ENVIRONMENT, { optional: true });\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Se inicializa desde el environment si está configurado, o puede establecerse\r\n * manualmente llamando a setDefaultTheme().\r\n *\r\n * **Prioridad de temas:**\r\n * 1. Tema específico pasado en options de cada alerta\r\n * 2. Tema establecido con setDefaultTheme()\r\n * 3. Tema configurado en environment.sweetAlertTheme\r\n * 4. Tema por defecto de SweetAlert2\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n constructor() {\r\n // Inicializar el tema desde el environment si está disponible\r\n if (this.environment?.sweetAlertTheme) {\r\n const allowed = SWEET_ALERT_THEMES as readonly string[];\r\n const themeValue = this.environment.sweetAlertTheme;\r\n if (typeof themeValue === 'string' && !allowed.includes(themeValue)) {\r\n console.warn(\r\n `[SweetAlert2DialogService] Tema de SweetAlert2 inválido: '${themeValue}'. Se utilizará el tema por defecto.`,\r\n );\r\n } else {\r\n this.defaultTheme = themeValue as SweetAlertTheme;\r\n }\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n /**\r\n * Muestra un diálogo de confirmación con SweetAlert2.\r\n * Puedes usar un icono SweetAlert2 (ico) o una imagen personalizada (icono), pero no ambos.\r\n *\r\n * @param title - Título principal del diálogo.\r\n * @param text - Cuerpo del mensaje; admite HTML (se inyecta como `html`).\r\n * @param ico - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional, exclusivo con icono.\r\n * @param icono - Ruta relativa de la imagen dentro de `assets/dsxResource/`. Opcional, exclusivo con ico.\r\n * @param options - Opciones adicionales de configuración.\r\n * @returns `Promise<boolean>` que resuelve en `true` si el usuario pulsó **Aceptar**,\r\n * o en `false` si pulsó **Cancelar** o cerró el diálogo.\r\n *\r\n * @example\r\n * // Con icono SweetAlert2\r\n * await this.sweetDialogService.SweetDialog('Título', 'Mensaje', 'success', null, { confirmButtonText: 'OK' });\r\n *\r\n * @example\r\n * // Con imagen personalizada\r\n * await this.sweetDialogService.SweetDialog('Título', 'Mensaje', null, 'icon2/mi-imagen.png', { confirmButtonText: 'OK' });\r\n */\r\n // 1. Nueva Sobrecarga: Acepta el objeto de configuración completo directamente\r\n Dialog(config: ActionMessageConfig): Promise<boolean>;\r\n\r\n // 2. Sobrecarga existente: Solo título y texto\r\n Dialog(title: string, text: string): Promise<boolean>;\r\n\r\n // 3. Sobrecarga existente: Con icono nativo\r\n Dialog(\r\n title: string,\r\n text: string,\r\n icoOrIcono: SweetAlertIcon | null | undefined,\r\n options?: AlertOptions,\r\n ): Promise<boolean>;\r\n\r\n // 4. Sobrecarga existente: Con ruta de imagen\r\n Dialog(\r\n title: string,\r\n text: string,\r\n icoOrIcono: string | null | undefined,\r\n options?: AlertOptions,\r\n ): Promise<boolean>;\r\n\r\n // 4. Implementación real del método\r\n // 5. Implementación unificada final\r\n Dialog(\r\n firstParam: string | ActionMessageConfig,\r\n text?: string,\r\n icoOrIcono?: SweetAlertIcon | string | null,\r\n options: AlertOptions = {},\r\n ): Promise<boolean> {\r\n let title = '';\r\n let finalOptions = { ...options };\r\n let finalIcoOrIcono = icoOrIcono;\r\n\r\n // DETECTAR SI EL PRIMER PARÁMETRO ES EL OBJETO COMPLETO\r\n if (typeof firstParam === 'object' && firstParam !== null) {\r\n const {\r\n title: cTitle,\r\n message: cMessage,\r\n icon,\r\n icono,\r\n ...cOptions\r\n } = firstParam;\r\n\r\n title = cTitle;\r\n text = cMessage;\r\n finalIcoOrIcono = icon || icono || '';\r\n finalOptions = { ...cOptions };\r\n } else {\r\n title = firstParam;\r\n }\r\n\r\n // A partir de aquí, tu lógica interna se mantiene exactamente igual usando las variables normalizadas\r\n let ico: SweetAlertIcon | null = null;\r\n let iconoImg: string | null = null;\r\n\r\n if (finalIcoOrIcono) {\r\n const nativeIcons: string[] = [\r\n 'success',\r\n 'error',\r\n 'warning',\r\n 'info',\r\n 'question',\r\n ];\r\n if (nativeIcons.includes(finalIcoOrIcono)) {\r\n ico = finalIcoOrIcono as SweetAlertIcon;\r\n } else {\r\n iconoImg = finalIcoOrIcono;\r\n }\r\n }\r\n\r\n // Configuración por defecto de botones y estilos\r\n const {\r\n confirmButtonText = `Aceptar!`,\r\n cancelButtonText = `Cancelar`,\r\n showCloseButton = true,\r\n showCancelButton = true,\r\n imageWidth = 150,\r\n imageHeight = 150,\r\n theme,\r\n ...rest\r\n } = finalOptions;\r\n\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n const year = new Date().getFullYear();\r\n const baseFooter = this.environment?.sweetAlertFooter ?? 'DEVSOFTXela';\r\n const footer = `${baseFooter} <strong>${year}</strong>`;\r\n const alertConfig: SweetAlertOptions = {\r\n title,\r\n html: text,\r\n footer,\r\n showCloseButton,\r\n showCancelButton,\r\n confirmButtonText,\r\n cancelButtonText,\r\n //reverseButtons: true,\r\n ...(alertTheme !== undefined && { theme: alertTheme as SweetAlertTheme }),\r\n ...rest,\r\n };\r\n\r\n if (iconoImg) {\r\n alertConfig.imageUrl = `/${iconoImg}`;\r\n alertConfig.imageWidth = imageWidth;\r\n alertConfig.imageHeight = imageHeight;\r\n alertConfig.imageAlt = 'icon';\r\n return this.preloadImage(iconoImg).then(() =>\r\n Swal.fire(alertConfig).then((result) => result.isConfirmed),\r\n );\r\n } else if (ico) {\r\n alertConfig.icon = ico;\r\n return Swal.fire(alertConfig).then((result) => result.isConfirmed);\r\n }\r\n\r\n return Swal.fire(alertConfig).then((result) => result.isConfirmed);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { showToast } from 'nextjs-toast-notify';\r\n\r\n// CORRECCIÓN: Importación directa desde la raíz del paquete o su dist\r\nimport type { ToastOptions as NextToastOptions } from 'nextjs-toast-notify';\r\n\r\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\r\n\r\nexport interface ToastOptions extends NextToastOptions {\r\n duration?: number;\r\n progress?: boolean;\r\n sound?: boolean;\r\n position?:\r\n | 'top-right'\r\n | 'top-left'\r\n | 'bottom-right'\r\n | 'bottom-left'\r\n | 'top-center'\r\n | 'bottom-center';\r\n // Corregido: cambiamos 'bounceInUp' por 'slideInUp' para cumplir con la librería\r\n transition?:\r\n | 'fadeIn'\r\n | 'bounceIn'\r\n | 'swingInverted'\r\n | 'popUp'\r\n | 'topBounce'\r\n | 'bounceInDown'\r\n | 'slideInUp';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NextToastNotifyService {\r\n // Configuraciones iniciales por defecto (ambos activados como en tus switches)\r\n private defaultOptions: ToastOptions = {\r\n duration: 1500,\r\n progress: true,\r\n sound: true,\r\n position: 'top-right',\r\n transition: 'bounceIn',\r\n };\r\n\r\n show(type: ToastType, message: string, customOptions?: ToastOptions): void {\r\n const opciones = { ...this.defaultOptions, ...customOptions };\r\n\r\n if (showToast[type]) {\r\n showToast[type](message, opciones);\r\n } else {\r\n showToast.info(message, opciones);\r\n }\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ServiceResult, ServiceResultVoid } from '../../../models';\r\nimport { SweetAlert2DialogService } from '../messages/sweet-alert2-dialog.service';\r\nimport { NextToastNotifyService } from '../helpers/next-toast-notify.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ResultResponseService {\r\n private readonly _nextToastNotifyService = inject(NextToastNotifyService);\r\n private readonly _sweetAlert2DialogService = inject(SweetAlert2DialogService);\r\n\r\n /* Metodo para manejar la respuesta de un servicio y mostrar notificaciones o alertas según el resultado */\r\n public handleResponseService<T>(\r\n response: ServiceResult<T> | ServiceResultVoid,\r\n ): boolean {\r\n try {\r\n // Evaluar el resultado\r\n if (response.isSuccess) {\r\n // Mostrar la notificación de éxito utilizando NextToastNotifyService\r\n this._nextToastNotifyService.show('info', response.message);\r\n return true;\r\n } else {\r\n const guideHtml = this.buildAssociatedGuideHtml(\r\n (response as any)?.data,\r\n );\r\n const mainMessage = this.formatPrimaryAlertMessage(response.message);\r\n\r\n this._sweetAlert2DialogService.Dialog(\r\n response.title,\r\n `${mainMessage}${guideHtml}`, // Se concatena limpiamente sin alterar la lógica\r\n 'icon/sign.png',\r\n {\r\n showCancelButton: false,\r\n showConfirmButton: true,\r\n },\r\n );\r\n return false;\r\n }\r\n } catch (error) {\r\n // Mostrar la notificación de error no controlado\r\n this._nextToastNotifyService.show(\r\n 'error',\r\n error instanceof Error ? error.message : String(error),\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n private buildAssociatedGuideHtml(data: unknown): string {\r\n if (!Array.isArray(data) || data.length === 0) {\r\n return '';\r\n }\r\n\r\n const itemsHtml = data\r\n .map((item: any) => {\r\n const cantidadRegistros = String(item?.cantidadRegistros ?? '0');\r\n const vista = String(item?.vista ?? 'No disponible');\r\n\r\n return (\r\n `<li style=\"display: list-item; margin: 0.35rem 0;\">` +\r\n `<div><strong>Ingrese a:</strong> ${vista}</div>` +\r\n `<div><strong>Registros asociados:</strong> ${cantidadRegistros}</div>` +\r\n `</li>`\r\n );\r\n })\r\n .join('');\r\n\r\n return (\r\n `<div style=\"margin-top: 0.65rem;\">` +\r\n `<div style=\"margin-bottom: 0.55rem;\">Sugerencia(s):</div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${itemsHtml}</ol>` +\r\n `</div>`\r\n );\r\n }\r\n\r\n private formatPrimaryAlertMessage(message: string): string {\r\n return `<div style=\"font-family: 'Oswald', sans-serif; font-weight: normal; font-style: italic; margin-bottom: 0.3rem;\">${message}</div>`;\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ArrayHelpersService } from './helpers/array-helpers.service';\r\nimport { ResultFileService } from './helpers/result-file.service';\r\nimport { ResultResponseService } from './response-html/result-response.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HelpersService {\r\n public readonly Array = inject(ArrayHelpersService);\r\n public readonly ServiceResultFile = inject(ResultFileService);\r\n public readonly ServiceResultResponse = inject(ResultResponseService);\r\n}\r\n","export function containsFile(obj: any): boolean {\r\n for (const key in obj) {\r\n const value = obj[key];\r\n\r\n if (value instanceof File || value instanceof Blob) {\r\n return true;\r\n }\r\n\r\n if (value instanceof FileList) {\r\n return true;\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n if (containsFile(value)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Convierte un objeto plano a una instancia de FormData compatible con ASP.NET Core [FromForm].\r\n * Desglosa automáticamente arreglos primitivos, archivos sueltos y FileLists.\r\n */\r\nexport function toFormData(obj: Record<string, unknown>): FormData {\r\n const formData = new FormData();\r\n\r\n Object.keys(obj).forEach((key) => {\r\n const value = obj[key];\r\n\r\n // Ignorar valores nulos o indefinidos\r\n if (value === null || value === undefined) {\r\n return;\r\n }\r\n\r\n // CASO 1: Es un Arreglo (int[], string[], File[])\r\n if (Array.isArray(value)) {\r\n value.forEach((item) => {\r\n if (item instanceof File || item instanceof Blob) {\r\n formData.append(key, item);\r\n } else if (item !== null && item !== undefined) {\r\n // Envía múltiples llaves repetidas con el mismo nombre\r\n formData.append(key, String(item));\r\n }\r\n });\r\n }\r\n // CASO 2: Es un FileList (Múltiples archivos desde un input html)\r\n else if (value instanceof FileList) {\r\n for (let i = 0; i < value.length; i++) {\r\n const file = value.item(i);\r\n if (file) formData.append(key, file);\r\n }\r\n }\r\n // CASO 3: Es un único Archivo o Blob\r\n else if (value instanceof File || value instanceof Blob) {\r\n formData.append(key, value);\r\n }\r\n // CASO 4: Tipos primitivos ordinarios (string, number, boolean)\r\n else {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n\r\n return formData;\r\n}\r\n","import {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n HttpResponse,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { toFormData } from '../../utils/src/form-data.util';\r\n\r\ntype HttpParamValue = string | number | boolean | Date | null | undefined;\r\ntype HttpParamsRecord = Record<string, HttpParamValue | HttpParamValue[]>;\r\n\r\ninterface BlobRequestOptions {\r\n params?: HttpParamsRecord | HttpParams;\r\n headers?: HttpHeaders | Record<string, string | string[]>;\r\n withCredentials?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * HttpHelperService\r\n *\r\n * Servicio diseñado para endpoints que usan [FromForm] en ASP.NET Core.\r\n * Siempre convierte el objeto a FormData, independientemente de si contiene\r\n * un archivo o no. Si el campo de tipo File/Blob/FileList es null o undefined,\r\n * simplemente se omite del FormData.\r\n *\r\n * Ejemplo sin archivo:\r\n *\r\n * this.api.post('puesto/guardar', { puestoId: 1, nombre: 'Admin' });\r\n *\r\n * Ejemplo con archivo (el campo puede ser null si no se seleccionó):\r\n *\r\n * this.api.post('puesto/cargar-funciones', {\r\n * puestoId: 1,\r\n * puestoNombre: 'Administrador',\r\n * file: this.file // puede ser null\r\n * });\r\n */\r\nexport class HttpHelpersService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * POST orientado a endpoints `[FromForm]` en backend (ASP.NET Core u otros).\r\n *\r\n * Convierte automáticamente `data` a `FormData`, por lo que permite enviar\r\n * campos simples y archivos (`File`, `Blob`, `FileList`) en una sola llamada.\r\n *\r\n * Casos de uso comunes:\r\n * - Crear/actualizar recursos con adjuntos.\r\n * - Subir archivos junto con metadata (id, nombre, observaciones, etc.).\r\n * - Mantener un único método de POST para formularios multipart.\r\n *\r\n * @typeParam T Tipo de respuesta esperada del backend.\r\n * @param url Endpoint relativo o absoluto.\r\n * @param data Objeto plano que se transformará a `FormData`.\r\n * @returns `Observable<T>` con la respuesta del backend.\r\n *\r\n * @example\r\n * this.httpHelpers.postForm<{ ok: boolean }>('documentos/subir', {\r\n * documentoId: 15,\r\n * descripcion: 'Contrato firmado',\r\n * archivo: this.archivoSeleccionado // File | null\r\n * });\r\n */\r\n postForm<T>(url: string, data: object): Observable<T> {\r\n return this.http.post<T>(url, toFormData(data as Record<string, unknown>));\r\n }\r\n\r\n /**\r\n * PUT orientado a endpoints `[FromForm]` en backend (ASP.NET Core u otros).\r\n *\r\n * Equivalente a `postForm`, pero usando el verbo HTTP PUT para actualizar recursos existentes.\r\n *\r\n * @typeParam T Tipo de respuesta esperada del backend.\r\n * @param url Endpoint relativo o absoluto.\r\n * @param data Objeto plano que se transformará a `FormData`.\r\n * @returns `Observable<T>` con la respuesta del backend.\r\n *\r\n * @example\r\n * this.httpHelpers.putForm<{ ok: boolean }>('documentos/actualizar/15', {\r\n * documentoId: 15,\r\n * descripcion: 'Contrato actualizado',\r\n * archivo: this.archivoSeleccionado // File | null\r\n * });\r\n */\r\n putForm<T>(url: string, data: object): Observable<T> {\r\n return this.http.put<T>(url, toFormData(data as Record<string, unknown>));\r\n }\r\n\r\n /**\r\n * GET para descarga de archivos en formato Blob.\r\n * Útil cuando solo se necesita el contenido del archivo.\r\n */\r\n getBlob(url: string, options: BlobRequestOptions = {}): Observable<Blob> {\r\n return this.http.get(url, {\r\n responseType: 'blob',\r\n params: this.toHttpParams(options.params),\r\n headers: options.headers,\r\n withCredentials: options.withCredentials,\r\n });\r\n }\r\n\r\n /**\r\n * GET para descarga de archivos devolviendo HttpResponse completo.\r\n * Útil para leer headers como `content-disposition` (nombre de archivo) o status.\r\n *\r\n * Consideraciones de backend:\r\n * - Validar `fileName`/id en route params antes de construir la ruta física.\r\n * - Definir query params opcionales (ej. versión, idioma, tenant) y documentarlos.\r\n * - Si se requiere cookie/sesión, habilitar `withCredentials` en frontend y CORS en backend.\r\n */\r\n getBlobResponse(\r\n url: string,\r\n options: BlobRequestOptions = {},\r\n ): Observable<HttpResponse<Blob>> {\r\n return this.http.get(url, {\r\n responseType: 'blob',\r\n observe: 'response',\r\n params: this.toHttpParams(options.params),\r\n headers: options.headers,\r\n withCredentials: options.withCredentials,\r\n });\r\n }\r\n\r\n private toHttpParams(\r\n params?: BlobRequestOptions['params'],\r\n ): HttpParams | undefined {\r\n if (!params) {\r\n return undefined;\r\n }\r\n\r\n if (params instanceof HttpParams) {\r\n return params;\r\n }\r\n\r\n let httpParams = new HttpParams();\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value === null || value === undefined) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (const item of value) {\r\n if (item === null || item === undefined) {\r\n continue;\r\n }\r\n httpParams = httpParams.append(key, this.normalizeParamValue(item));\r\n }\r\n continue;\r\n }\r\n\r\n httpParams = httpParams.set(key, this.normalizeParamValue(value));\r\n }\r\n\r\n return httpParams;\r\n }\r\n\r\n private normalizeParamValue(\r\n value: Exclude<HttpParamValue, null | undefined>,\r\n ): string {\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nfunction pickByKeys<T extends object, K extends keyof T>(\r\n source: T,\r\n keys: readonly K[],\r\n): Pick<T, K> {\r\n const result = {} as Pick<T, K>;\r\n\r\n for (const key of keys) {\r\n result[key] = source[key];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction tryParseDateValue(value: unknown): number | null {\r\n if (value instanceof Date) {\r\n const time = value.getTime();\r\n\r\n return Number.isNaN(time) ? null : time;\r\n }\r\n\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n const parsed = new Date(value);\r\n const time = parsed.getTime();\r\n\r\n return Number.isNaN(time) ? null : time;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeComparableValue(base: unknown, current: unknown): unknown {\r\n const baseDateValue = tryParseDateValue(base);\r\n\r\n if (baseDateValue !== null) {\r\n const currentDateValue = tryParseDateValue(current);\r\n\r\n return currentDateValue ?? current;\r\n }\r\n\r\n return current;\r\n}\r\n\r\nfunction normalizeBaseEntity<TBase extends object>(\r\n baseValue: TBase,\r\n keys?: ReadonlyArray<keyof TBase>,\r\n): Partial<Record<keyof TBase, unknown>> {\r\n const normalized: Partial<Record<keyof TBase, unknown>> = {};\r\n const selectedKeys = keys ?? (Object.keys(baseValue) as Array<keyof TBase>);\r\n\r\n for (const key of selectedKeys) {\r\n const base = (baseValue as Record<string, unknown>)[key as string];\r\n\r\n normalized[key] = normalizeComparableValue(base, base);\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nfunction normalizeRawEntityAgainstBase<TBase extends object>(\r\n baseValue: TBase,\r\n rawValue: MasterDetailRawEntity<TBase>,\r\n keys?: ReadonlyArray<keyof TBase>,\r\n useBaseValueForNullish = true,\r\n): Partial<Record<keyof TBase, unknown>> {\r\n const coerceByBaseType = (base: unknown, current: unknown): unknown => {\r\n if (typeof base === 'number') {\r\n if (typeof current === 'string' && current.trim() !== '') {\r\n const normalizedText = current.trim();\r\n const direct = Number(normalizedText);\r\n\r\n if (!Number.isNaN(direct)) return direct;\r\n\r\n const commaDecimal = Number(normalizedText.replace(',', '.'));\r\n\r\n if (!Number.isNaN(commaDecimal)) return commaDecimal;\r\n\r\n const noSpaces = normalizedText.replace(/\\s+/g, '');\r\n const noThousandsDots = Number(\r\n noSpaces.replace(/\\./g, '').replace(',', '.'),\r\n );\r\n\r\n if (!Number.isNaN(noThousandsDots)) return noThousandsDots;\r\n\r\n return current;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n if (typeof base === 'boolean') {\r\n if (typeof current === 'string') {\r\n const lowered = current.trim().toLowerCase();\r\n\r\n if (lowered === 'true') return true;\r\n if (lowered === 'false') return false;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n if (base instanceof Date) {\r\n if (current instanceof Date) return current;\r\n\r\n if (typeof current === 'string' || typeof current === 'number') {\r\n const parsed = new Date(current);\r\n\r\n return Number.isNaN(parsed.getTime()) ? current : parsed;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n if (typeof base === 'string') {\r\n if (current === null || current === undefined) return current;\r\n\r\n return typeof current === 'string' ? current : String(current);\r\n }\r\n\r\n return current;\r\n };\r\n\r\n const normalized: Partial<Record<keyof TBase, unknown>> = {};\r\n const selectedKeys = keys ?? (Object.keys(baseValue) as Array<keyof TBase>);\r\n\r\n for (const key of selectedKeys) {\r\n const base = (baseValue as Record<string, unknown>)[key as string];\r\n const current = rawValue[key as string];\r\n const isNullish = current === null || current === undefined;\r\n const isEmptyString = typeof current === 'string' && current.trim() === '';\r\n const treatEmptyAsNullish = isEmptyString && typeof base !== 'string';\r\n const shouldUseBase =\r\n useBaseValueForNullish && (isNullish || treatEmptyAsNullish);\r\n\r\n normalized[key] = shouldUseBase ? base : coerceByBaseType(base, current);\r\n\r\n normalized[key] = normalizeComparableValue(base, normalized[key]);\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\n/**\r\n * Estado maestro-detalle usado por el tracker.\r\n */\r\nexport interface MasterDetailState<TMaster, TDetail> {\r\n /** Entidad principal (cabecera o maestro). */\r\n master: TMaster;\r\n /** Coleccion de entidades detalle asociadas al maestro. */\r\n detail: TDetail[];\r\n}\r\n\r\n/**\r\n * Tipo crudo para valores provenientes de formularios.\r\n */\r\nexport type MasterDetailRawEntity<TBase extends object> = Partial<\r\n Record<keyof TBase, unknown>\r\n> &\r\n Record<string, unknown>;\r\n\r\n/**\r\n * Opciones simplificadas para comparar estado base vs valores crudos de formulario.\r\n */\r\nexport interface MasterDetailSimpleFormOptions<\r\n TBaseMaster extends object,\r\n TBaseDetail extends object,\r\n> {\r\n /** Campos del maestro a seguir. */\r\n masterKeys?: ReadonlyArray<keyof TBaseMaster>;\r\n\r\n /** Campos del detalle a seguir. */\r\n detailKeys?: ReadonlyArray<keyof TBaseDetail>;\r\n\r\n /**\r\n * Si es `true` (default), cuando el valor actual sea `null` o `undefined`\r\n * se usa el valor base para evitar falsos positivos en formularios.\r\n */\r\n useBaseValueForNullish?: boolean;\r\n}\r\n\r\nexport interface MasterDetailDifference {\r\n scope: 'master' | 'detail';\r\n path: string;\r\n baseValue: unknown;\r\n currentValue: unknown;\r\n}\r\n\r\n/**\r\n * Resultado detallado de comparacion entre estado inicial y actual.\r\n */\r\nexport interface MasterDetailChangeResult {\r\n hasChanges: boolean;\r\n masterChanged: boolean;\r\n detailChanged: boolean;\r\n firstDifference: MasterDetailDifference | null;\r\n}\r\n\r\n/**\r\n * Tracker simplificado para comparar estado base vs `getRawValue()`.\r\n */\r\nexport interface MasterDetailSimpleFormTracker<\r\n TBaseMaster extends object,\r\n TBaseDetail extends object,\r\n> {\r\n /**\r\n * Indica si existe cualquier cambio entre el estado inicial y el actual.\r\n */\r\n hasChanges: (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ) => boolean;\r\n\r\n /**\r\n * Retorna un desglose de cambios por seccion (maestro/detalle).\r\n */\r\n getChanges: (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ) => MasterDetailChangeResult;\r\n\r\n /**\r\n * Reemplaza el estado base de comparacion con uno nuevo.\r\n */\r\n reset: (state: MasterDetailState<TBaseMaster, TBaseDetail>) => void;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio utilitario para detectar cambios en formularios o vistas\r\n * maestro-detalle sin acoplarse a una estructura de dominio concreta.\r\n */\r\nexport class MasterDetailChangeService {\r\n private static findFirstDifference(\r\n leftValue: unknown,\r\n rightValue: unknown,\r\n path = 'root',\r\n ): { path: string; leftValue: unknown; rightValue: unknown } | null {\r\n if (leftValue instanceof Date && rightValue instanceof Date) {\r\n return leftValue.getTime() === rightValue.getTime()\r\n ? null\r\n : { path, leftValue, rightValue };\r\n }\r\n\r\n if (Array.isArray(leftValue) && Array.isArray(rightValue)) {\r\n if (leftValue.length !== rightValue.length) {\r\n return {\r\n path: `${path}.length`,\r\n leftValue: leftValue.length,\r\n rightValue: rightValue.length,\r\n };\r\n }\r\n\r\n for (let index = 0; index < leftValue.length; index += 1) {\r\n const difference = MasterDetailChangeService.findFirstDifference(\r\n leftValue[index],\r\n rightValue[index],\r\n `${path}[${index}]`,\r\n );\r\n\r\n if (difference) {\r\n return difference;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (\r\n leftValue != null &&\r\n rightValue != null &&\r\n typeof leftValue === 'object' &&\r\n typeof rightValue === 'object'\r\n ) {\r\n const leftKeys = Object.keys(leftValue);\r\n const rightKeys = Object.keys(rightValue);\r\n\r\n if (leftKeys.length !== rightKeys.length) {\r\n return {\r\n path: `${path}.__keys__`,\r\n leftValue: leftKeys,\r\n rightValue: rightKeys,\r\n };\r\n }\r\n\r\n for (const key of leftKeys) {\r\n const difference = MasterDetailChangeService.findFirstDifference(\r\n (leftValue as Record<string, unknown>)[key],\r\n (rightValue as Record<string, unknown>)[key],\r\n `${path}.${key}`,\r\n );\r\n\r\n if (difference) {\r\n return difference;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return Object.is(leftValue, rightValue)\r\n ? null\r\n : { path, leftValue, rightValue };\r\n }\r\n\r\n /**\r\n * Version simplificada para formularios: recibe `getRawValue()` directamente\r\n * y compara por claves sin requerir mapeo manual en el consumidor.\r\n */\r\n createSimpleFormTracker<\r\n TBaseMaster extends object,\r\n TBaseDetail extends object,\r\n >(\r\n initialState: MasterDetailState<TBaseMaster, TBaseDetail>,\r\n options?: MasterDetailSimpleFormOptions<TBaseMaster, TBaseDetail>,\r\n ): MasterDetailSimpleFormTracker<TBaseMaster, TBaseDetail> {\r\n const defaultMasterKeys = Object.keys(initialState.master) as Array<\r\n keyof TBaseMaster\r\n >;\r\n const defaultDetailKeys =\r\n initialState.detail.length > 0\r\n ? (Object.keys(initialState.detail[0]) as Array<keyof TBaseDetail>)\r\n : ([] as Array<keyof TBaseDetail>);\r\n\r\n const masterKeys = options?.masterKeys ?? defaultMasterKeys;\r\n const detailKeys = options?.detailKeys ?? defaultDetailKeys;\r\n const useBaseValueForNullish = options?.useBaseValueForNullish ?? true;\r\n\r\n let initialMaster = structuredClone(initialState.master);\r\n let initialDetail = structuredClone(initialState.detail);\r\n\r\n const buildComparisonPayload = (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ) => {\r\n const normalizedBaseMaster = normalizeBaseEntity(\r\n initialMaster,\r\n masterKeys,\r\n );\r\n const normalizedCurrentMaster = normalizeRawEntityAgainstBase(\r\n initialMaster,\r\n currentState.master,\r\n masterKeys,\r\n useBaseValueForNullish,\r\n );\r\n\r\n const normalizedBaseDetail = initialDetail.map((item) =>\r\n normalizeBaseEntity(item, detailKeys),\r\n );\r\n\r\n const normalizedCurrentDetail = currentState.detail.map((item, index) =>\r\n normalizeRawEntityAgainstBase(\r\n initialDetail[index] ?? ({} as TBaseDetail),\r\n item,\r\n detailKeys,\r\n useBaseValueForNullish,\r\n ),\r\n );\r\n\r\n return {\r\n normalizedBaseMaster,\r\n normalizedCurrentMaster,\r\n normalizedBaseDetail,\r\n normalizedCurrentDetail,\r\n };\r\n };\r\n\r\n const resolveChanges = (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ): MasterDetailChangeResult => {\r\n const {\r\n normalizedBaseMaster,\r\n normalizedCurrentMaster,\r\n normalizedBaseDetail,\r\n normalizedCurrentDetail,\r\n } = buildComparisonPayload(currentState);\r\n\r\n const masterDifference = MasterDetailChangeService.findFirstDifference(\r\n normalizedBaseMaster,\r\n normalizedCurrentMaster,\r\n 'master',\r\n );\r\n\r\n const detailDifference = MasterDetailChangeService.findFirstDifference(\r\n normalizedBaseDetail,\r\n normalizedCurrentDetail,\r\n 'detail',\r\n );\r\n\r\n return {\r\n hasChanges: masterDifference !== null || detailDifference !== null,\r\n masterChanged: masterDifference !== null,\r\n detailChanged: detailDifference !== null,\r\n firstDifference: masterDifference\r\n ? {\r\n scope: 'master',\r\n path: masterDifference.path,\r\n baseValue: masterDifference.leftValue,\r\n currentValue: masterDifference.rightValue,\r\n }\r\n : detailDifference\r\n ? {\r\n scope: 'detail',\r\n path: detailDifference.path,\r\n baseValue: detailDifference.leftValue,\r\n currentValue: detailDifference.rightValue,\r\n }\r\n : null,\r\n };\r\n };\r\n\r\n return {\r\n hasChanges: (currentState) => resolveChanges(currentState).hasChanges,\r\n getChanges: (currentState) => resolveChanges(currentState),\r\n\r\n reset: (state: MasterDetailState<TBaseMaster, TBaseDetail>) => {\r\n initialMaster = structuredClone(state.master);\r\n initialDetail = structuredClone(state.detail);\r\n },\r\n };\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { AlertaService } from './alerta.service';\r\nimport { SweetAlert2DialogService } from './messages/sweet-alert2-dialog.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DsxMessagesService {\r\n public readonly AlertaService = inject(AlertaService);\r\n public readonly SweetDialog = inject(SweetAlert2DialogService);\r\n}\r\n","// form-preview.service.ts\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormPreviewService {\r\n /**\r\n * Genera resumen HTML desde un objeto plano\r\n * @param data - Objeto con los datos (ej: form.value)\r\n * @param fields - Array de campos a mostrar\r\n * @param options - Opciones adicionales\r\n */\r\n buildObjectSummaryHtml(\r\n data: any,\r\n fields: Array<{\r\n key: string;\r\n label: string;\r\n format?: (value: any) => string; // Formateador personalizado opcional\r\n }>,\r\n options?: {\r\n title?: string;\r\n showEmpty?: boolean;\r\n compact?: boolean;\r\n debug?: boolean; // Activar logs de depuración\r\n },\r\n ): string {\r\n const debug = options?.debug ?? false;\r\n\r\n // Modo desarrollo: mostrar información de depuración\r\n if (debug) {\r\n this.debugInputData(data, fields, options);\r\n }\r\n\r\n if (!data) {\r\n if (debug) console.error('❌ FormPreview: data es null o undefined');\r\n return '';\r\n }\r\n\r\n if (!fields || fields.length === 0) {\r\n if (debug) console.error('❌ FormPreview: fields está vacío');\r\n return '';\r\n }\r\n\r\n const showEmpty = options?.showEmpty ?? false;\r\n const compact = options?.compact ?? true;\r\n const title = options?.title || 'Datos del formulario';\r\n\r\n const cells: Array<{ label: string; value: string }> = [];\r\n const propiedadesNoEncontradas: string[] = [];\r\n\r\n for (const field of fields) {\r\n // Obtener valor\r\n const value = this.getNestedValue(data, field.key);\r\n const valueText = field.format\r\n ? field.format(value)\r\n : this.formatValue(value);\r\n\r\n // Registrar si no se encontró la propiedad\r\n if (value === undefined) {\r\n propiedadesNoEncontradas.push(field.key);\r\n }\r\n\r\n // Filtrar vacíos\r\n if (!showEmpty && !valueText) continue;\r\n\r\n cells.push({\r\n label: field.label,\r\n value: valueText || '—',\r\n });\r\n }\r\n\r\n // Modo desarrollo: mostrar advertencias\r\n if (debug) {\r\n if (propiedadesNoEncontradas.length > 0) {\r\n console.warn(\r\n '⚠️ FormPreview: Propiedades no encontradas:',\r\n propiedadesNoEncontradas,\r\n );\r\n console.warn('📋 Propiedades disponibles en data:', Object.keys(data));\r\n console.warn(\r\n '💡 Sugerencia: Verifica que los nombres coincidan exactamente',\r\n );\r\n }\r\n\r\n if (cells.length === 0) {\r\n console.error(\r\n '❌ FormPreview: No se generaron celdas. Verifica tus campos y datos.',\r\n );\r\n console.log('📊 Data:', data);\r\n console.log('📋 Fields:', fields);\r\n } else {\r\n console.log('✅ FormPreview: HTML generado correctamente', { cells });\r\n }\r\n }\r\n\r\n if (!cells.length) return '';\r\n\r\n return this.generateHtml(title, cells, compact);\r\n }\r\n\r\n private getNestedValue(obj: any, path: string): any {\r\n if (!obj || !path) return undefined;\r\n\r\n const parts = path.split('.');\r\n let result = obj;\r\n\r\n for (const part of parts) {\r\n if (result === null || result === undefined) {\r\n return undefined;\r\n }\r\n result = result[part];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private formatValue(value: any): string {\r\n if (value === null || value === undefined) return '';\r\n if (value instanceof Date) return value.toLocaleDateString();\r\n if (typeof value === 'object') {\r\n // Para selects, mostrar propiedades comunes\r\n if (value.label) return String(value.label);\r\n if (value.nombre) return String(value.nombre);\r\n if (value.name) return String(value.name);\r\n if (value.value) return String(value.value);\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n return String(value);\r\n }\r\n\r\n private generateHtml(title: string, cells: any[], compact: boolean): string {\r\n if (compact) {\r\n return `\r\n <div style=\"margin: 8px 0; border: 1px solid #e9ecef; border-radius: 6px; overflow: hidden; background: #ffffff; font-size: 13px;\">\r\n <div style=\"padding: 8px 12px; background: #f8f9fa; border-bottom: 1px solid #e9ecef; font-weight: 600; color: #495057;\">\r\n ${this.escapeHtml(title)}\r\n </div>\r\n <table style=\"width: 100%; border-collapse: collapse;\">\r\n <tbody>\r\n ${cells\r\n .map(\r\n (cell, i) => `\r\n <tr style=\"border-bottom: ${i < cells.length - 1 ? '0.5px solid #f1f3f5' : 'none'}\">\r\n <td style=\"padding: 6px 12px; background: #f8f9fa; width: 130px; color: #6c757d; border-right: 0.5px solid #f1f3f5;\">\r\n ${this.escapeHtml(cell.label)}\r\n </td>\r\n <td style=\"padding: 6px 12px; color: #212529; font-weight: 500;\">\r\n ${this.escapeHtml(cell.value)}\r\n </td>\r\n </tr>\r\n `,\r\n )\r\n .join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n }\r\n\r\n // Versión no compacta (con más padding)\r\n return `\r\n <div style=\"margin: 12px 0; border: 1px solid #dee2e6; border-radius: 8px; overflow: hidden; background: #ffffff;\">\r\n <div style=\"padding: 12px; background: #f8f9fa; border-bottom: 1px solid #dee2e6; font-weight: 600; color: #495057;\">\r\n ${this.escapeHtml(title)}\r\n </div>\r\n <table style=\"width: 100%; border-collapse: collapse;\">\r\n <tbody>\r\n ${cells\r\n .map(\r\n (cell) => `\r\n <tr style=\"border-bottom: 1px solid #f1f3f5;\">\r\n <td style=\"padding: 10px 12px; width: 140px; background: #fafcff; color: #6c757d;\">\r\n ${this.escapeHtml(cell.label)}\r\n </td>\r\n <td style=\"padding: 10px 12px; color: #212529; font-weight: 500;\">\r\n ${this.escapeHtml(cell.value)}\r\n </td>\r\n </tr>\r\n `,\r\n )\r\n .join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n }\r\n\r\n private debugInputData(data: any, fields: any[], options?: any): void {\r\n console.group('🔍 FormPreview Debug');\r\n console.log('📊 Data:', data);\r\n console.log(\r\n '📋 Propiedades disponibles:',\r\n data ? Object.keys(data) : 'data es null',\r\n );\r\n console.log('🎯 Fields solicitados:', fields);\r\n console.log('⚙️ Options:', options);\r\n\r\n // Verificar cada campo\r\n if (data) {\r\n for (const field of fields) {\r\n const value = this.getNestedValue(data, field.key);\r\n const existe = value !== undefined;\r\n\r\n if (!existe) {\r\n console.warn(`❌ Campo \"${field.key}\" NO existe en data`);\r\n // Sugerir propiedades similares\r\n const similares = this.findSimilarProperties(\r\n field.key,\r\n Object.keys(data),\r\n );\r\n if (similares.length > 0) {\r\n console.warn(`💡 Quizás quisiste decir: ${similares.join(', ')}`);\r\n }\r\n } else {\r\n console.log(`✅ Campo \"${field.key}\" existe:`, value);\r\n }\r\n }\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n\r\n private findSimilarProperties(\r\n search: string,\r\n properties: string[],\r\n ): string[] {\r\n const searchLower = search.toLowerCase();\r\n return properties\r\n .filter((prop) => {\r\n const propLower = prop.toLowerCase();\r\n return (\r\n propLower.includes(searchLower) || searchLower.includes(propLower)\r\n );\r\n })\r\n .slice(0, 3);\r\n }\r\n\r\n private escapeHtml(str: string): string {\r\n if (!str) return '';\r\n const htmlEntities: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\r\n };\r\n return str.replace(/[&<>\"']/g, (char) => htmlEntities[char]);\r\n }\r\n}\r\n","// table-preview.service.ts\r\nimport { Injectable, isDevMode } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TablePreviewService {\r\n buildSingleRowSummaryHtml(\r\n row: any,\r\n columns: Array<string | { key: string; label?: string }>,\r\n options?: {\r\n rowId?: string;\r\n headerMap?: Record<string, string>;\r\n includeEmpty?: boolean;\r\n showLabel?: boolean;\r\n debug?: boolean; // Nuevo: activa logs de depuración\r\n },\r\n ): string {\r\n const debug = options?.debug ?? false; // Por defecto false\r\n\r\n // Solo mostrar logs si debug está activado\r\n if (debug) {\r\n this.debugInputData(row, columns, options);\r\n }\r\n\r\n if (!row) {\r\n if (debug) console.error('❌ TablePreview: row es null o undefined');\r\n return '';\r\n }\r\n\r\n if (!columns || columns.length === 0) {\r\n if (debug) console.error('❌ TablePreview: columns está vacío');\r\n return '';\r\n }\r\n\r\n const includeEmpty = options?.includeEmpty ?? false;\r\n const headerMap = options?.headerMap ?? {};\r\n const showLabel = options?.showLabel ?? true;\r\n const rowId = options?.rowId?.trim() || '1';\r\n\r\n const cells: Array<{ label: string; value: string }> = [];\r\n const propiedadesNoEncontradas: string[] = [];\r\n\r\n for (const col of columns) {\r\n // Obtener key\r\n const key = typeof col === 'string' ? col : col.key;\r\n\r\n // Obtener valor con validación\r\n const value = this.getNestedValue(row, key);\r\n const valueText = this.formatValue(value);\r\n\r\n // Registrar si no se encontró la propiedad\r\n if (value === undefined) {\r\n propiedadesNoEncontradas.push(key);\r\n }\r\n\r\n // Filtrar vacíos\r\n if (!includeEmpty && !valueText) continue;\r\n\r\n // Obtener label\r\n let label = headerMap[key];\r\n if (!label && typeof col === 'object' && col.label) label = col.label;\r\n if (!label) label = this.humanizeKey(key);\r\n\r\n cells.push({ label, value: valueText || '—' });\r\n }\r\n\r\n // Solo mostrar logs si debug está activado\r\n if (debug) {\r\n if (propiedadesNoEncontradas.length > 0) {\r\n console.warn(\r\n '⚠️ TablePreview: Propiedades no encontradas:',\r\n propiedadesNoEncontradas,\r\n );\r\n console.warn(\r\n '📋 Propiedades disponibles en rowData:',\r\n Object.keys(row),\r\n );\r\n console.warn(\r\n '💡 Sugerencia: Verifica que los nombres coincidan exactamente',\r\n );\r\n }\r\n\r\n if (cells.length === 0) {\r\n console.error(\r\n '❌ TablePreview: No se generaron celdas. Verifica tus columnas y datos.',\r\n );\r\n console.log('📊 RowData:', row);\r\n console.log('📋 Columns:', columns);\r\n } else {\r\n console.log('✅ TablePreview: HTML generado correctamente', { cells });\r\n }\r\n }\r\n\r\n if (!cells.length) return '';\r\n\r\n return this.generateCompactHtml(rowId, cells, showLabel);\r\n }\r\n\r\n private getNestedValue(obj: any, path: string): any {\r\n if (!obj || !path) return undefined;\r\n\r\n const parts = path.split('.');\r\n let result = obj;\r\n\r\n for (const part of parts) {\r\n if (result === null || result === undefined) {\r\n return undefined;\r\n }\r\n result = result[part];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private formatValue(value: any): string {\r\n if (value === null || value === undefined) return '';\r\n if (value instanceof Date) return value.toLocaleDateString();\r\n if (typeof value === 'object') {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n return String(value);\r\n }\r\n\r\n private humanizeKey(key: string): string {\r\n return key\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/[._-]/g, ' ')\r\n .trim()\r\n .split(' ')\r\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\r\n .join(' ');\r\n }\r\n\r\n private generateCompactHtml(\r\n rowId: string,\r\n cells: any[],\r\n showLabel: boolean,\r\n ): string {\r\n const rowIdWidth = Math.min(Math.max(rowId.length, 1), 3);\r\n\r\n return `\r\n <div style=\"margin: 8px 0; border: 1px solid #e9ecef; border-radius: 6px; overflow: hidden; background: #ffffff; font-size: 13px;\">\r\n <table style=\"width: 100%; border-collapse: collapse; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\">\r\n <tbody>\r\n ${cells\r\n .map(\r\n (cell, i) => `\r\n <tr style=\"border-bottom: ${i < cells.length - 1 ? '0.5px solid #f1f3f5' : 'none'}\">\r\n ${\r\n i === 0\r\n ? `\r\n <td style=\"padding: 6px 8px; background: #f8f9fa; font-weight: 600; color: #6c757d; border-right: 0.5px solid #f1f3f5; vertical-align: top;\">\r\n ${this.escapeHtml(rowId)}\r\n </td>\r\n `\r\n : ''\r\n }\r\n ${\r\n showLabel\r\n ? `\r\n <td style=\"padding: 6px 8px; background: #f8f9fa; width: 130px; color: #6c757d; border-right: 0.5px solid #f1f3f5;\">\r\n ${this.escapeHtml(cell.label)}\r\n </td>\r\n `\r\n : ''\r\n }\r\n <td style=\"padding: 6px 8px; color: #212529; font-weight: 500;\">\r\n ${this.escapeHtml(cell.value)}\r\n </td>\r\n </tr>\r\n `,\r\n )\r\n .join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n }\r\n\r\n private debugInputData(row: any, columns: any[], options?: any): void {\r\n console.group('🔍 TablePreview Debug');\r\n console.log('📊 RowData:', row);\r\n console.log(\r\n '📋 Propiedades disponibles:',\r\n row ? Object.keys(row) : 'row es null',\r\n );\r\n console.log('🎯 Columns solicitadas:', columns);\r\n console.log('⚙️ Options:', options);\r\n\r\n // Verificar cada columna\r\n if (row) {\r\n for (const col of columns) {\r\n const key = typeof col === 'string' ? col : col.key;\r\n const value = this.getNestedValue(row, key);\r\n const existe = value !== undefined;\r\n\r\n if (!existe) {\r\n console.warn(`❌ Propiedad \"${key}\" NO existe en rowData`);\r\n // Sugerir propiedades similares\r\n const similares = this.findSimilarProperties(key, Object.keys(row));\r\n if (similares.length > 0) {\r\n console.warn(`💡 Quizás quisiste decir: ${similares.join(', ')}`);\r\n }\r\n } else {\r\n console.log(`✅ Propiedad \"${key}\" existe:`, value);\r\n }\r\n }\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n\r\n private findSimilarProperties(\r\n search: string,\r\n properties: string[],\r\n ): string[] {\r\n const similares: string[] = [];\r\n const searchLower = search.toLowerCase();\r\n\r\n for (const prop of properties) {\r\n const propLower = prop.toLowerCase();\r\n // Buscar similitudes (contiene o es similar)\r\n if (propLower.includes(searchLower) || searchLower.includes(propLower)) {\r\n similares.push(prop);\r\n }\r\n // Distancia de Levenshtein simple (máximo 3 caracteres de diferencia)\r\n else if (this.levenshteinDistance(searchLower, propLower) <= 3) {\r\n similares.push(prop);\r\n }\r\n }\r\n\r\n return similares.slice(0, 3); // Máximo 3 sugerencias\r\n }\r\n\r\n private levenshteinDistance(a: string, b: string): number {\r\n if (a.length === 0) return b.length;\r\n if (b.length === 0) return a.length;\r\n\r\n const matrix = [];\r\n\r\n for (let i = 0; i <= b.length; i++) {\r\n matrix[i] = [i];\r\n }\r\n\r\n for (let j = 0; j <= a.length; j++) {\r\n matrix[0][j] = j;\r\n }\r\n\r\n for (let i = 1; i <= b.length; i++) {\r\n for (let j = 1; j <= a.length; j++) {\r\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\r\n matrix[i][j] = matrix[i - 1][j - 1];\r\n } else {\r\n matrix[i][j] = Math.min(\r\n matrix[i - 1][j - 1] + 1,\r\n matrix[i][j - 1] + 1,\r\n matrix[i - 1][j] + 1,\r\n );\r\n }\r\n }\r\n }\r\n\r\n return matrix[b.length][a.length];\r\n }\r\n\r\n private escapeHtml(str: string): string {\r\n if (!str) return '';\r\n const htmlEntities: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\r\n };\r\n return str.replace(/[&<>\"']/g, (char) => htmlEntities[char]);\r\n }\r\n}\r\n","/**\r\n * Formateador de moneda por defecto para Guatemala.\r\n *\r\n * Usa la configuración regional `es-GT` y el código de moneda `GTQ`.\r\n * Siempre muestra 2 decimales.\r\n *\r\n * Ejemplo de uso:\r\n * ```ts\r\n * GTQFormatter.format(1234.5); // \"Q 1,234.50\"\r\n * ```\r\n */\r\nexport const GTQFormatter = new Intl.NumberFormat('es-GT', {\r\n style: 'currency',\r\n currency: 'GTQ',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n});\r\n\r\n/**\r\n * Crea un formateador de moneda personalizado.\r\n *\r\n * Permite definir la configuración regional (`locale`) y el código de moneda (`currency`)\r\n * manteniendo 2 decimales fijos.\r\n *\r\n * Ejemplos de uso:\r\n * ```ts\r\n * const usdFormatter = createCurrencyFormatter('en-US', 'USD');\r\n * usdFormatter.format(1000); // \"$1,000.00\"\r\n *\r\n * const mxnFormatter = createCurrencyFormatter('es-MX', 'MXN');\r\n * mxnFormatter.format(1500.75); // \"$1,500.75\"\r\n * ```\r\n *\r\n * @param locale Código de configuración regional, por ejemplo: `es-GT`, `en-US`.\r\n * @param currency Código de moneda ISO 4217, por ejemplo: `GTQ`, `USD`, `EUR`.\r\n * @returns Instancia de `Intl.NumberFormat` configurada para moneda.\r\n */\r\nexport function createCurrencyFormatter(\r\n locale: string,\r\n currency: string,\r\n): Intl.NumberFormat {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n });\r\n}\r\n","import { isDevMode } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\n\r\nexport function chainControlGroups(form: FormGroup, groups: string[][]): void {\r\n groups.forEach((group) => {\r\n chainControls(form, group);\r\n });\r\n}\r\n\r\nfunction chainControls(form: FormGroup, controls: string[]): void {\r\n for (let i = 1; i < controls.length; i++) {\r\n const previousName = controls[i - 1];\r\n const currentName = controls[i];\r\n\r\n const previous = form.get(previousName);\r\n const current = form.get(currentName);\r\n\r\n // 🔥 Validación visual en desarrollo\r\n if (!previous) {\r\n showDevAlert(\r\n `[chainControls] El control \"${previousName}\" no existe en el FormGroup.`,\r\n );\r\n\r\n continue;\r\n }\r\n\r\n if (!current) {\r\n showDevAlert(\r\n `[chainControls] El control \"${currentName}\" no existe en el FormGroup.`,\r\n );\r\n\r\n continue;\r\n }\r\n\r\n // Estado inicial\r\n if (!hasValue(previous.value)) {\r\n current.disable({ emitEvent: false });\r\n }\r\n\r\n previous.valueChanges.subscribe((value) => {\r\n if (hasValue(value)) {\r\n current.enable({ emitEvent: false });\r\n } else {\r\n current.reset('', { emitEvent: false });\r\n\r\n current.disable({ emitEvent: false });\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction hasValue(value: any): boolean {\r\n return (\r\n value !== null && value !== undefined && value.toString().trim() !== ''\r\n );\r\n}\r\n\r\nfunction showDevAlert(message: string): void {\r\n if (isDevMode()) {\r\n alert(message);\r\n }\r\n}\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport {\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n Observable,\r\n of,\r\n switchMap,\r\n} from 'rxjs';\r\n\r\n/**\r\n * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).\r\n */\r\nexport function dateRangeValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const dates: Date[] = control.value;\r\n\r\n // Verificar si el valor es un array con exactamente dos elementos\r\n if (Array.isArray(dates) && dates.length === 2) {\r\n const [startDate, endDate] = dates;\r\n\r\n // Verificar que las fechas sean válidas y no nulas\r\n if (\r\n startDate &&\r\n endDate &&\r\n !isNaN(new Date(startDate).getTime()) &&\r\n !isNaN(new Date(endDate).getTime())\r\n ) {\r\n return null; // Válido\r\n } else {\r\n return {\r\n invalidDateRange: {\r\n message: 'Ambas fechas deben ser válidas y no nulas.',\r\n requiredLength: 2,\r\n },\r\n }; // Error si alguna fecha es nula o inválida\r\n }\r\n }\r\n return null; // Si el control no contiene un array válido, no hay error\r\n}\r\n\r\n/**\r\n * Validador a nivel de formulario que verifica que la fecha \"hasta\"\r\n * (toKey) sea mayor o igual que la fecha \"desde\" (fromKey),\r\n * comparando ambas como instancias de Date.\r\n *\r\n * Reglas:\r\n * - Si una o ambas fechas están vacías (null/undefined), no se genera error\r\n * y se delega la obligatoriedad a otros validadores como `required`.\r\n * - Si ambas fechas tienen valor, la fecha \"hasta\" debe ser >= fecha \"desde\"\r\n * según su valor numérico (`getTime()`).\r\n * - Si los valores no son fechas válidas, el comportamiento dependerá\r\n * de cómo los controles entreguen el valor (se recomienda usar Date).\r\n *\r\n * @param fromKey Nombre del control que representa la fecha inicial.\r\n * @param toKey Nombre del control que representa la fecha final.\r\n * @returns Un ValidatorFn que devuelve `null` si el rango es válido o está\r\n * incompleto; y un objeto con la clave `invalidDateRange` si el\r\n * rango es inválido.\r\n */\r\nexport function dateRangeValidatorFromTo(\r\n fromKey: string,\r\n toKey: string,\r\n): ValidatorFn {\r\n return (group: AbstractControl): ValidationErrors | null => {\r\n const fromControl = group.get(fromKey);\r\n const toControl = group.get(toKey);\r\n\r\n const from = fromControl?.value as Date | null;\r\n const to = toControl?.value as Date | null;\r\n\r\n if (!from || !to) return null;\r\n\r\n // Rango válido: limpiar error en el control \"hasta\" si existe\r\n if (to.getTime() >= from.getTime()) {\r\n if (toControl && toControl.errors?.['invalidDateRange']) {\r\n const { invalidDateRange, ...rest } = toControl.errors;\r\n toControl.setErrors(Object.keys(rest).length ? rest : null);\r\n }\r\n return null;\r\n }\r\n\r\n // Rango inválido: asignar error tanto al grupo como al control \"hasta\"\r\n const error: ValidationErrors = {\r\n invalidDateRange: {\r\n message: 'La fecha final debe ser mayor o igual que la fecha inicial.',\r\n requiredLength: 2,\r\n },\r\n };\r\n\r\n if (toControl) {\r\n const currentErrors = toControl.errors || {};\r\n toControl.setErrors({ ...currentErrors, ...error });\r\n }\r\n\r\n return error;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que una fecha única esté dentro de un rango mínimo y máximo.\r\n * Las fechas deben utilizar la función de convertirFechaISOString para asegurar el formato correcto y que funcione con el componente primeNg.\r\n * @param minDate Fecha mínima permitida.\r\n * @param maxDate Fecha máxima permitida.\r\n */\r\nexport function dateMinMaxValidator(minDate: Date, maxDate: Date) {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const date: Date = control.value;\r\n\r\n // Verificar si el valor es una fecha válida\r\n if (date && !isNaN(new Date(date).getTime())) {\r\n const currentDate = new Date(date);\r\n\r\n // Validar si la fecha está fuera del rango permitido\r\n if (currentDate < minDate || currentDate > maxDate) {\r\n return {\r\n dateNotRange: {\r\n message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,\r\n minDate: minDate.toISOString(),\r\n maxDate: maxDate.toISOString(),\r\n },\r\n };\r\n }\r\n\r\n return null; // Fecha válida y dentro del rango\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que al menos uno de los campos especificados esté lleno.\r\n * @param fields Los nombres de los campos a validar.\r\n */\r\nexport function atLeastOneFieldRequiredValidator(fields: string[]) {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Obtener el FormGroup para poder acceder a los controles\r\n const form = formGroup as FormGroup;\r\n\r\n // Verificar si al menos uno de los campos tiene un valor\r\n const isAnyFieldFilled = fields.some((field) => {\r\n const control = form.get(field);\r\n return control?.value !== null && control?.value !== '';\r\n });\r\n\r\n // Si al menos un campo tiene un valor, la validación es exitosa\r\n if (isAnyFieldFilled) {\r\n return null; // Validación pasada\r\n } else {\r\n // Construir el mensaje dinámico con los campos no llenados\r\n const emptyFields = fields.filter((field) => {\r\n const control = form.get(field);\r\n return control?.value === null || control?.value === '';\r\n });\r\n\r\n const fieldNames = emptyFields.join(', ');\r\n const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;\r\n\r\n // Si ninguno tiene valor, devolver el mensaje con el error\r\n return {\r\n atLeastOneRequired: {\r\n message: message,\r\n },\r\n };\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un NIT (Número de Identificación Tributaria) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del NIT.\r\n * @returns Un objeto de error si el NIT no es válido, o `null` si el NIT es válido.\r\n */\r\nexport function nitValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const nit = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!nit) {\r\n return null;\r\n }\r\n\r\n // Validar el NIT utilizando la función NITCorrecto\r\n const esValido = NITCorrecto(nit);\r\n\r\n // Si el NIT no es válido, retornar un objeto de error con el formato deseado\r\n if (!esValido) {\r\n return {\r\n invalidNIT: {\r\n message: 'El NIT ingresado no es válido.', // Mensaje de error personalizado\r\n requiredLength: nit.length, // Longitud del NIT ingresado (opcional)\r\n },\r\n };\r\n }\r\n\r\n // Si el NIT es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función auxiliar para validar un NIT según un algoritmo específico.\r\n *\r\n * @param nit - El NIT a validar.\r\n * @returns `true` si el NIT es válido, `false` en caso contrario.\r\n */\r\nfunction NITCorrecto(nit: string): boolean {\r\n try {\r\n const largo = nit.length;\r\n // Invertir el NIT (excepto el último dígito) para facilitar el cálculo\r\n const validar = nit\r\n .substring(0, largo - 1)\r\n .split('')\r\n .reverse()\r\n .join('');\r\n const cadena = validar.split('');\r\n const comparador = nit.substring(largo - 1, largo); // Último dígito del NIT\r\n let posicion = 2; // Factor de ponderación inicial\r\n let sumaValidar = 0; // Acumulador para la suma ponderada\r\n\r\n // Calcular la suma ponderada de los dígitos del NIT\r\n for (const c of cadena) {\r\n sumaValidar += parseInt(c, 10) * posicion;\r\n posicion += 1;\r\n }\r\n\r\n // Calcular el residuo de la operación de validación\r\n const residuo = operacionValidar(11 - operacionValidar(sumaValidar));\r\n\r\n // Validar el NIT según el residuo y el último dígito\r\n if (residuo === 10 && comparador.toUpperCase() === 'K') {\r\n return true; // El NIT es válido si el residuo es 10 y el último dígito es 'K'\r\n } else if (residuo.toString() === comparador) {\r\n return true; // El NIT es válido si el residuo coincide con el último dígito\r\n } else {\r\n return false; // El NIT no es válido\r\n }\r\n } catch (error) {\r\n // Si ocurre un error durante la validación, el NIT no es válido\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Función auxiliar para calcular el residuo de una operación aritmética.\r\n *\r\n * @param valor - El valor sobre el cual se calculará el residuo.\r\n * @returns El residuo de la división del valor entre 11.\r\n */\r\nfunction operacionValidar(valor: number): number {\r\n return valor % 11;\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un CUI (Código Único de Identificación) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del CUI.\r\n * @returns Un objeto de error si el CUI no es válido, o `null` si el CUI es válido.\r\n */\r\nexport function cuiValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const cui = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!cui) {\r\n return null;\r\n }\r\n\r\n // Validar el CUI\r\n const esValido = CUICorrecto(cui);\r\n\r\n // Si el CUI no es válido, retornar un objeto de error\r\n if (!esValido) {\r\n return {\r\n invalidCUI: {\r\n message: 'El CUI ingresado no es válido.',\r\n requiredLength: 13,\r\n actualLength: cui.length,\r\n },\r\n };\r\n }\r\n\r\n // Si el CUI es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función que implementa el algoritmo de validación del CUI\r\n * @param cui Número de CUI a validar (debe tener 13 dígitos)\r\n * @returns boolean indicando si el CUI es válido\r\n */\r\nfunction CUICorrecto(cui: string | number): boolean {\r\n // Convertir a string si es número\r\n const cuiStr = typeof cui === 'number' ? cui.toString() : cui;\r\n\r\n // Validar longitud y que sean solo dígitos\r\n if (cuiStr.length !== 13 || !/^\\d+$/.test(cuiStr)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const primeros8 = cuiStr.substring(0, 8);\r\n const digitoVerificador = parseInt(cuiStr.substring(8, 9), 10);\r\n let suma = 0;\r\n\r\n // Calcular la suma ponderada\r\n for (let i = 0; i < primeros8.length; i++) {\r\n const digito = parseInt(primeros8[i], 10);\r\n suma += digito * (i + 2); // Los pesos son 2, 3, 4, ..., 9\r\n }\r\n\r\n // Calcular residuo y validar\r\n const residuo = suma % 11;\r\n return residuo === digitoVerificador;\r\n } catch (error) {\r\n console.error('Error validando CUI:', error);\r\n return false;\r\n }\r\n}\r\n\r\nexport interface AsyncExistsValidatorOptions {\r\n /**\r\n * Identificador del registro actual.\r\n * Si no se define, se enviará `0` por defecto para mantener contrato value+id.\r\n */\r\n currentId?: string | number | null;\r\n /**\r\n * Nombre del campo para construir un mensaje dinámico.\r\n * Si no se define, se intentará inferir automáticamente desde el FormGroup padre.\r\n */\r\n fieldName?: string;\r\n /** Mensaje personalizado del error; si se define, tiene prioridad */\r\n errorMessage?: string;\r\n}\r\n\r\nfunction resolveControlName(control: AbstractControl): string | null {\r\n const parent = control.parent;\r\n if (!parent) return null;\r\n\r\n if (parent instanceof FormGroup) {\r\n for (const [key, childControl] of Object.entries(parent.controls)) {\r\n if (childControl === control) {\r\n return key;\r\n }\r\n }\r\n }\r\n\r\n const parentControls = (parent as { controls?: AbstractControl[] }).controls;\r\n if (Array.isArray(parentControls)) {\r\n const index = parentControls.indexOf(control);\r\n if (index >= 0) {\r\n return index.toString();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction buildAlreadyExistsMessage(\r\n control: AbstractControl,\r\n options: Pick<AsyncExistsValidatorOptions, 'fieldName' | 'errorMessage'>,\r\n): string {\r\n if (options.errorMessage) {\r\n return options.errorMessage;\r\n }\r\n\r\n const resolvedFieldName = options.fieldName || resolveControlName(control);\r\n return resolvedFieldName\r\n ? `El valor en ${resolvedFieldName} ya existe.`\r\n : 'El valor ingresado ya existe';\r\n}\r\n\r\n/**\r\n * Validador asíncrono que verifica si un valor ya existe mediante una llamada a un servicio.\r\n * Útil para validar unicidad de campos como nombres de usuario, correos electrónicos, etc.\r\n *\r\n * Aplica `debounceTime(400)` y `distinctUntilChanged()` para evitar llamadas innecesarias\r\n * al servicio mientras el usuario escribe.\r\n *\r\n * @template T Tipo del valor del control a validar.\r\n * @param serviceMethod Función que recibe el valor del control y, opcionalmente,\r\n * el identificador del registro actual. Debe retornar un `Observable<boolean>`\r\n * emitiendo `true` si el valor ya existe (en otro registro), `false` en caso contrario.\r\n * @param options Opciones del validador:\r\n * - `currentId`: Id opcional del registro en edición para excluirlo en backend.\r\n * - `fieldName`: Nombre del campo para construir el mensaje dinámico\r\n * (si se omite, se intenta inferir del control).\r\n * - `errorMessage`: Mensaje personalizado (si se omite y se resuelve nombre\r\n * de campo, se usa `El valor {campo} ya existe`).\r\n * @returns Un `AsyncValidatorFn` que emite `null` si el valor no existe o el control está vacío,\r\n * o un objeto `ValidationErrors` con la clave fija `alreadyValueExists` si el valor ya existe.\r\n *\r\n * @example\r\n * ```ts\r\n * // Creación\r\n * email: ['', [], asyncExistsValidator(\r\n * (value, id) => this.userService.emailExists({ value, id: Number(id) })\r\n * )]\r\n *\r\n * // Edición (excluyendo el registro actual por id)\r\n * email: ['', [], asyncExistsValidator(\r\n * (value, id) => this.userService.emailExists(value, id),\r\n * { currentId: this.id, fieldName: 'email' }\r\n * )]\r\n * ```\r\n */\r\nexport function asyncExistsValidator<\r\n T extends string | number = string | number,\r\n>(\r\n serviceMethod: (value: T, currentId: string | number) => Observable<boolean>,\r\n options: AsyncExistsValidatorOptions = {},\r\n): AsyncValidatorFn {\r\n const { currentId = null, fieldName, errorMessage } = options;\r\n const errorKey = 'alreadyValueExists';\r\n\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n if (!control.value) return of(null);\r\n\r\n return of(control.value).pipe(\r\n debounceTime(800),\r\n distinctUntilChanged(),\r\n switchMap((value) => {\r\n const resolvedId = currentId ?? 0;\r\n return serviceMethod(value as T, resolvedId);\r\n }),\r\n map((exists) => {\r\n if (exists) {\r\n return {\r\n [errorKey]: {\r\n message: buildAlreadyExistsMessage(control, {\r\n fieldName,\r\n errorMessage,\r\n }),\r\n value: control.value,\r\n },\r\n };\r\n }\r\n return null;\r\n }),\r\n catchError(() => of(null)),\r\n );\r\n };\r\n}\r\n\r\nexport function templateVariablesValidator(\r\n allowedKeys: readonly string[],\r\n): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value: string = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const errors: string[] = [];\r\n\r\n const regex = /{{(.*?)}}/g;\r\n const matches = value.matchAll(regex);\r\n\r\n for (const match of matches) {\r\n const raw = match[1];\r\n const trimmed = raw.trim();\r\n\r\n // ❌ espacios al inicio/fin\r\n if (raw !== trimmed) {\r\n errors.push(`Espacios inválidos en \"{{${raw}}}\"`);\r\n continue;\r\n }\r\n\r\n // ❌ formato inválido\r\n if (!/^[A-Z0-9_]+$/.test(trimmed)) {\r\n errors.push(`Formato inválido en \"{{${raw}}}\"`);\r\n continue;\r\n }\r\n\r\n // ❌ no existe en catálogo\r\n if (!allowedKeys.includes(trimmed)) {\r\n errors.push(`Variable no definida: \"{{${trimmed}}}\"`);\r\n continue;\r\n }\r\n }\r\n\r\n // ❌ llaves desbalanceadas\r\n const open = (value.match(/{{/g) || []).length;\r\n const close = (value.match(/}}/g) || []).length;\r\n\r\n if (open !== close) {\r\n errors.push('Llaves desbalanceadas {{ }}');\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n invalidTemplateVariables: {\r\n message: 'El template contiene errores.',\r\n details: errors,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\nexport function templateStructureValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const value: string = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const errors: string[] = [];\r\n\r\n // 1) Validar que todas las etiquetas estén en el catálogo permitido.\r\n const allowedTags = new Set(['<negrita>', '</negrita>', '</salto>']);\r\n const tags = value.match(/<[^>\\n]+>/g) || [];\r\n\r\n for (const tag of tags) {\r\n if (!allowedTags.has(tag)) {\r\n errors.push(\r\n `Etiqueta inválida: \"${tag}\". Etiquetas permitidas: <negrita>, </negrita>, </salto>.`,\r\n );\r\n }\r\n }\r\n\r\n // 2) Validar estructura de apertura/cierre de <negrita>...</negrita>.\r\n const negritaTokens = tags.filter(\r\n (tag) => tag === '<negrita>' || tag === '</negrita>',\r\n );\r\n let negritaDepth = 0;\r\n\r\n for (const token of negritaTokens) {\r\n if (token === '<negrita>') {\r\n negritaDepth += 1;\r\n } else {\r\n negritaDepth -= 1;\r\n if (negritaDepth < 0) {\r\n errors.push(\r\n 'Estructura incorrecta: Se encontró \"</negrita>\" sin una apertura \"<negrita>\" previa.',\r\n );\r\n negritaDepth = 0;\r\n }\r\n }\r\n }\r\n\r\n if (negritaDepth > 0) {\r\n errors.push(\r\n 'Estructura incorrecta: Falta cerrar una o más etiquetas \"</negrita>\".',\r\n );\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n invalidTemplateStructure: {\r\n message: 'El formato del texto contiene errores estructurales.',\r\n details: errors,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function minimumAgeValidator(\r\n minimumAge: number,\r\n referenceDate?: Date,\r\n): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const birthDate = new Date(value);\r\n\r\n if (isNaN(birthDate.getTime())) {\r\n return {\r\n invalidDate: {\r\n message: 'La fecha ingresada no es válida.',\r\n },\r\n };\r\n }\r\n\r\n const today = referenceDate ?? new Date();\r\n\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n\r\n const monthDiff = today.getMonth() - birthDate.getMonth();\r\n\r\n // Ajustar si aún no ha cumplido años\r\n if (\r\n monthDiff < 0 ||\r\n (monthDiff === 0 && today.getDate() < birthDate.getDate())\r\n ) {\r\n age--;\r\n }\r\n\r\n if (age < minimumAge) {\r\n return {\r\n minimumAge: {\r\n requiredAge: minimumAge,\r\n actualAge: age,\r\n message: `Edad mínima requerida ${minimumAge} años.`,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n","// sorensen-dice.validators.ts\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { Observable, isObservable, of } from 'rxjs';\r\nimport { map, take } from 'rxjs/operators';\r\nimport { calcularSimilitud } from '../../models/src/similarity.util';\r\n\r\nexport function sorensenDiceValidator(\r\n dataSource: any[] | Observable<any[]>,\r\n key?: string,\r\n umbral: number = 0.7,\r\n): AsyncValidatorFn {\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n // Si no hay valor, el control es válido de inmediato\r\n if (!control.value || String(control.value).trim() === '') {\r\n return of(null);\r\n }\r\n\r\n const textoIngresado = String(control.value).trim();\r\n const data$: Observable<any[]> = isObservable(dataSource)\r\n ? dataSource\r\n : of(dataSource);\r\n\r\n // 🎯 IMPORTANTE: Retornamos el flujo mapeado que Angular resolverá internamente\r\n return data$.pipe(\r\n take(1),\r\n map((items) => {\r\n // Maneja arrays directos o respuestas paginadas del API\r\n const coleccion = Array.isArray(items)\r\n ? items\r\n : (items && (items as any).data) || [];\r\n\r\n const coincidencia = coleccion.find((item) => {\r\n const textoAComparar =\r\n key && item && typeof item === 'object' ? item[key] : item;\r\n if (typeof textoAComparar !== 'string') return false;\r\n\r\n return calcularSimilitud(textoIngresado, textoAComparar) >= umbral;\r\n });\r\n\r\n if (coincidencia) {\r\n const nombreSugerido = key ? coincidencia[key] : coincidencia;\r\n\r\n // 🎯 RETORNAMOS UN OBJETO DE ERROR SÍNCRONO FINAL (NO UN OBSERVABLE)\r\n return {\r\n similitudDetectada: {\r\n sugerencia: nombreSugerido,\r\n umbralUsado: umbral,\r\n message: `Ya existe un registro muy similar en el sistema: \"${nombreSugerido}\".`,\r\n },\r\n };\r\n }\r\n\r\n return null; // Si no hay similitud, el campo es válido\r\n }),\r\n );\r\n };\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/components';\r\nexport * from './lib/components/src/app-message-error/app-message-error.component';\r\nexport * from './lib/components/src/app-message-help/app-message-help.component';\r\nexport * from './lib/components/src/button/dsx-button/dsx-button';\r\nexport * from './lib/components/src/icon-dsx/icon-dsx.component';\r\nexport * from './lib/components/src/inputs/file/file.component';\r\nexport * from './lib/components/src/json/json-values-debuj/json-values-debuj.component';\r\nexport * from './lib/components/src/label/ico-label/ico-label';\r\nexport * from './lib/components/src/loading-lottie/loading-lottie.component';\r\nexport * from './lib/components/src/loading/css-v2/css-v2.component';\r\nexport * from './lib/components/src/loading/loading.component';\r\nexport * from './lib/components/src/logo/logo-dsx/logo-dsx.component';\r\nexport * from './lib/components/src/navbar-dsx/navbar-dsx.component';\r\nexport * from './lib/components/src/qr/qr-generator/qr-generator';\r\nexport * from './lib/components/src/security/token-purpose-login/token-purpose-login';\r\nexport * from './lib/components/src/status/network-status/network-status.component';\r\nexport * from './lib/components/src/view/screen-inspector/screen-inspector';\r\nexport * from './lib/directives/src/arrow-navigation.directive';\r\nexport * from './lib/directives/src/auto-scroll-height.directive';\r\nexport * from './lib/directives/src/only-rango-pattern.directive';\r\nexport * from './lib/directives/src/select-all-on-focus.directive';\r\nexport * from './lib/guards/src/guard-token-purpose.guard';\r\nexport * from './lib/injections/cache.token';\r\nexport {\r\n ENVIRONMENT,\r\n provideEnvironment,\r\n SWEET_ALERT_THEMES,\r\n validateEnvironmentConfig,\r\n type EnvironmentConfig,\r\n type SweetAlertThemeType,\r\n} from './lib/injections/environment.token';\r\nexport * from './lib/injections/parameterSecurity';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/models';\r\nexport * from './lib/models/src/action-message.model';\r\nexport * from './lib/models/src/environment-base';\r\nexport * from './lib/models/src/field-config.model';\r\nexport * from './lib/models/src/file-data.model';\r\nexport * from './lib/models/src/parameterSecurity.model';\r\nexport * from './lib/models/src/token.model';\r\nexport * from './lib/modules/src/dsx-add-tools.module';\r\nexport * from './lib/modules/src/prime-ng.module';\r\nexport * from './lib/pipe';\r\nexport * from './lib/primengdsx';\r\nexport * from './lib/services';\r\nexport * from './lib/services/src/alerta.service';\r\nexport * from './lib/services/src/authorize.service';\r\nexport * from './lib/services/src/base-crud.service';\r\nexport * from './lib/services/src/cache.provider';\r\nexport * from './lib/services/src/cache.service';\r\nexport * from './lib/services/src/dte.service';\r\nexport * from './lib/services/src/endpoint.service';\r\nexport * from './lib/services/src/error-handler.service';\r\nexport * from './lib/services/src/helpers.service';\r\nexport * from './lib/services/src/helpers/result-file.service';\r\nexport * from './lib/services/src/http-helpers.service';\r\nexport * from './lib/services/src/master-detail-change.service';\r\nexport * from './lib/services/src/messages.service';\r\nexport * from './lib/services/src/messages/sweet-alert2-dialog.service';\r\nexport * from './lib/services/src/parameter-values.service';\r\nexport * from './lib/services/src/response-html/form-preview.service';\r\nexport * from './lib/services/src/response-html/table-preview.service';\r\nexport * from './lib/services/src/security.service';\r\nexport * from './lib/services/src/spinner-loading.service';\r\nexport * from './lib/services/src/utility-add.service';\r\nexport * from './lib/utils';\r\nexport * from './lib/utils/src/form-chain.helper';\r\nexport * from './lib/validations/addons.validators';\r\nexport * from './lib/validations/src/sorensen-dice.validators';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i1.IconDsxService","shareReplay","map","distinctUntilChanged","debounceTime","i3","i4","i5","switchMap","take"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-dsxlibrary.mjs","sources":["../../../projects/ngx-dsx/src/lib/components/src/button/dsx-status-toggle/dsx-status-toggle.ts","../../../projects/ngx-dsx/src/lib/components/src/button/dsx-status-toggle/dsx-status-toggle.html","../../../projects/ngx-dsx/src/lib/components/src/checkBox/enable-disable/enable-disable.ts","../../../projects/ngx-dsx/src/lib/components/src/checkBox/enable-disable/enable-disable.html","../../../projects/ngx-dsx/src/lib/components/src/json/json-viewer/json-viewer.component.ts","../../../projects/ngx-dsx/src/lib/components/src/json/json-viewer/json-viewer.component.html","../../../projects/ngx-dsx/src/lib/components/src/status/date-indicator/date-indicator.ts","../../../projects/ngx-dsx/src/lib/components/src/status/date-indicator/date-indicator.html","../../../projects/ngx-dsx/src/lib/components/src/status/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/src/status/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/components/src/view/docx-preview/docx-preview.component.ts","../../../projects/ngx-dsx/src/lib/components/src/view/docx-preview/docx-preview.component.html","../../../projects/ngx-dsx/src/lib/components/src/view/pdf-preview/pdf-preview.component.ts","../../../projects/ngx-dsx/src/lib/components/src/view/pdf-preview/pdf-preview.component.html","../../../projects/ngx-dsx/src/lib/components/src/view/template-highlight/template-highlight.ts","../../../projects/ngx-dsx/src/lib/components/src/view/template-highlight/template-highlight.html","../../../projects/ngx-dsx/src/lib/services/src/icon-dsx.service.ts","../../../projects/ngx-dsx/src/lib/components/src/icon-dsx/icon-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/src/icon-dsx/icon-dsx.component.html","../../../projects/ngx-dsx/src/lib/components/src/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/src/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/models/src/similarity.util.ts","../../../projects/ngx-dsx/src/lib/components/src/app-message-help/app-message-help.component.ts","../../../projects/ngx-dsx/src/lib/components/src/app-message-help/app-message-help.component.html","../../../projects/ngx-dsx/src/lib/injections/environment.token.ts","../../../projects/ngx-dsx/src/lib/injections/parameterSecurity.ts","../../../projects/ngx-dsx/src/lib/services/src/security.service.ts","../../../projects/ngx-dsx/src/lib/services/src/alerta.service.ts","../../../projects/ngx-dsx/src/lib/services/src/utility-add.service.ts","../../../projects/ngx-dsx/src/lib/services/src/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/models/src/action-message.model.ts","../../../projects/ngx-dsx/src/lib/components/src/button/dsx-button/dsx-button.ts","../../../projects/ngx-dsx/src/lib/components/src/button/dsx-button/dsx-button.html","../../../projects/ngx-dsx/src/lib/components/src/inputs/file/file.component.ts","../../../projects/ngx-dsx/src/lib/components/src/inputs/file/file.component.html","../../../projects/ngx-dsx/src/lib/pipe/src/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/components/src/json/json-values-debuj/json-values-debuj.component.ts","../../../projects/ngx-dsx/src/lib/components/src/json/json-values-debuj/json-values-debuj.component.html","../../../projects/ngx-dsx/src/lib/components/src/label/ico-label/ico-label.ts","../../../projects/ngx-dsx/src/lib/components/src/label/ico-label/ico-label.html","../../../projects/ngx-dsx/src/lib/services/src/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/src/logo/logo-dsx/logo-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/src/logo/logo-dsx/logo-dsx.component.html","../../../projects/ngx-dsx/src/lib/components/src/loading-lottie/loading-lottie.component.ts","../../../projects/ngx-dsx/src/lib/components/src/loading-lottie/loading-lottie.component.html","../../../projects/ngx-dsx/src/lib/components/src/loading/css-v2/css-v2.component.ts","../../../projects/ngx-dsx/src/lib/components/src/loading/css-v2/css-v2.component.html","../../../projects/ngx-dsx/src/lib/components/src/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/src/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/models/src/environment-base.ts","../../../projects/ngx-dsx/src/lib/services/src/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/src/request-metrics.service.ts","../../../projects/ngx-dsx/src/lib/components/src/status/network-status/network-status.component.ts","../../../projects/ngx-dsx/src/lib/components/src/status/network-status/network-status.component.html","../../../projects/ngx-dsx/src/lib/components/src/navbar-dsx/navbar-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/src/navbar-dsx/navbar-dsx.component.html","../../../projects/ngx-dsx/src/lib/services/src/qr.service.ts","../../../projects/ngx-dsx/src/lib/components/src/qr/qr-generator/qr-generator.ts","../../../projects/ngx-dsx/src/lib/components/src/qr/qr-generator/qr-generator.html","../../../projects/ngx-dsx/src/lib/components/src/security/token-purpose-login/token-purpose-login.ts","../../../projects/ngx-dsx/src/lib/components/src/security/token-purpose-login/token-purpose-login.html","../../../projects/ngx-dsx/src/lib/components/src/view/screen-inspector/screen-inspector.ts","../../../projects/ngx-dsx/src/lib/components/src/view/screen-inspector/screen-inspector.html","../../../projects/ngx-dsx/src/lib/directives/src/arrow-navigation.directive.ts","../../../projects/ngx-dsx/src/lib/services/src/scroll-view/scroll-measurement.service.ts","../../../projects/ngx-dsx/src/lib/directives/src/auto-scroll-height.directive.ts","../../../projects/ngx-dsx/src/lib/directives/src/only-rango-pattern.directive.ts","../../../projects/ngx-dsx/src/lib/directives/src/select-all-on-focus.directive.ts","../../../projects/ngx-dsx/src/lib/guards/src/guard-token-purpose.guard.ts","../../../projects/ngx-dsx/src/lib/injections/cache.token.ts","../../../projects/ngx-dsx/src/lib/services/src/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/models/src/cache.types.ts","../../../projects/ngx-dsx/src/lib/primengdsx/src/fieldset/header/header-dsx/header-dsx.ts","../../../projects/ngx-dsx/src/lib/primengdsx/src/fieldset/header/header-dsx/header-dsx.html","../../../projects/ngx-dsx/src/lib/modules/src/dsx-add-tools.module.ts","../../../projects/ngx-dsx/src/lib/modules/src/prime-ng.module.ts","../../../projects/ngx-dsx/src/lib/pipe/src/join-by.pipe.ts","../../../projects/ngx-dsx/src/lib/pipe/src/truncate.pipe.ts","../../../projects/ngx-dsx/src/lib/services/src/endpoint.service.ts","../../../projects/ngx-dsx/src/lib/services/src/base-crud.service.ts","../../../projects/ngx-dsx/src/lib/services/src/cache.service.ts","../../../projects/ngx-dsx/src/lib/services/src/cache.provider.ts","../../../projects/ngx-dsx/src/lib/services/src/dte.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers/array-helpers.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers/result-file.service.ts","../../../projects/ngx-dsx/src/lib/services/src/messages/sweet-alert2-dialog.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers/next-toast-notify.service.ts","../../../projects/ngx-dsx/src/lib/services/src/response-html/result-response.service.ts","../../../projects/ngx-dsx/src/lib/services/src/helpers.service.ts","../../../projects/ngx-dsx/src/lib/utils/src/form-data.util.ts","../../../projects/ngx-dsx/src/lib/services/src/http-helpers.service.ts","../../../projects/ngx-dsx/src/lib/services/src/master-detail-change.service.ts","../../../projects/ngx-dsx/src/lib/services/src/messages.service.ts","../../../projects/ngx-dsx/src/lib/services/src/response-html/form-preview.service.ts","../../../projects/ngx-dsx/src/lib/services/src/response-html/table-preview.service.ts","../../../projects/ngx-dsx/src/lib/utils/src/currency.util.ts","../../../projects/ngx-dsx/src/lib/utils/src/form-chain.helper.ts","../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/lib/validations/src/sorensen-dice.validators.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { Component, forwardRef, input } from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\n\r\n@Component({\r\n selector: 'dsx-status-toggle',\r\n imports: [FormsModule, ToggleButtonModule],\r\n templateUrl: './dsx-status-toggle.html',\r\n styleUrl: './dsx-status-toggle.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DsxStatusToggle),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DsxStatusToggle implements ControlValueAccessor {\r\n disabled = input<boolean>(false);\r\n formDisabled = false;\r\n isViewOnly = input<boolean>(false);\r\n offLabel = input<string>('Inactivo');\r\n onLabel = input<string>('Activo');\r\n value = false;\r\n\r\n onChange = (_: boolean) => {};\r\n onTouched = () => {};\r\n\r\n writeValue(value: boolean): void {\r\n this.value = !!value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled = disabled;\r\n }\r\n\r\n change(value: boolean) {\r\n this.value = value;\r\n this.onChange(value);\r\n this.onTouched();\r\n }\r\n}\r\n","@if(isViewOnly()){\r\n<p-toggleButton\r\n fluid\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"change($event)\"\r\n [onLabel]=\"onLabel()\"\r\n [offLabel]=\"offLabel()\"\r\n [disabled]=\"disabled() || formDisabled\"\r\n [onIcon]=\"'pi pi-check-circle'\"\r\n [offIcon]=\"'pi pi-times-circle'\"\r\n class=\"dsx-status-toggle\"\r\n/>\r\n}\r\n","import { Component, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'dsx-checkbox',\r\n imports: [],\r\n templateUrl: './enable-disable.html',\r\n styleUrl: './enable-disable.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DsxEnableDisable),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DsxEnableDisable implements ControlValueAccessor {\r\n checked = false;\r\n\r\n writeValue(value: boolean): void {\r\n this.checked = !!value;\r\n }\r\n\r\n // El componente es solo lectura; no necesita propagar cambios\r\n registerOnChange(_fn: unknown): void {}\r\n registerOnTouched(_fn: unknown): void {}\r\n}\r\n","<!-- From Uiverse.io by adamgiebl -->\r\n<div class=\"container\">\r\n <input type=\"checkbox\" [checked]=\"checked\" disabled />\r\n <div class=\"checkmark\"></div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n effect,\r\n EventEmitter,\r\n forwardRef,\r\n input,\r\n Output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { TreeNode } from 'primeng/api';\r\nimport { TreeModule } from 'primeng/tree';\r\n\r\ntype JsonPathSegment = string | number;\r\n\r\ntype JsonViewerMode = 'view' | 'edit' | boolean;\r\n\r\ntype JsonNodeMeta = {\r\n kind: 'compact-item' | 'group-active' | 'text-primitive' | 'active-primitive';\r\n indexLabel?: string;\r\n text?: string;\r\n activeVisual?: string;\r\n activeBoolean?: boolean | null;\r\n textPath?: JsonPathSegment[];\r\n activePath?: JsonPathSegment[];\r\n title?: string;\r\n key?: string;\r\n value?: string;\r\n path?: JsonPathSegment[];\r\n};\r\n\r\n@Component({\r\n selector: 'app-json-viewer',\r\n standalone: true,\r\n imports: [CommonModule, TreeModule],\r\n templateUrl: './json-viewer.component.html',\r\n styleUrl: './json-viewer.component.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => JsonViewerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class JsonViewerComponent implements ControlValueAccessor {\r\n data = input<unknown>(null);\r\n mode = input<JsonViewerMode>('view');\r\n textKey = input<string>('Texto');\r\n activeKey = input<string>('Activo');\r\n itemsKey = input<string>('Items');\r\n showStatusAsSymbol = input<boolean>(true);\r\n\r\n @Output() valueChange = new EventEmitter<unknown>();\r\n\r\n nodes: TreeNode[] = [];\r\n selectedNode: TreeNode | null = null;\r\n disabled = false;\r\n\r\n private controlValue: unknown = null;\r\n private normalizedValue: unknown = {};\r\n private readonly maxNormalizationDepth = 20;\r\n private onChange: (value: unknown) => void = () => undefined;\r\n private onTouched: () => void = () => undefined;\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.controlValue === null || this.controlValue === undefined) {\r\n this.updateNodes(this.data(), false);\r\n }\r\n });\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n this.controlValue = value;\r\n this.updateNodes(value, false);\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onNodeSelect(event: { node?: TreeNode }): void {\r\n const node = event?.node;\r\n\r\n if (!node?.children?.length) return;\r\n\r\n node.expanded = !node.expanded;\r\n this.selectedNode = null;\r\n this.nodes = [...this.nodes];\r\n }\r\n\r\n isEditMode(): boolean {\r\n const modeValue = this.mode();\r\n const editEnabled =\r\n typeof modeValue === 'boolean' ? modeValue : modeValue === 'edit';\r\n\r\n return editEnabled && !this.disabled;\r\n }\r\n\r\n getNodeMeta(node: TreeNode): JsonNodeMeta | null {\r\n const nodeData = node.data;\r\n\r\n if (!nodeData || typeof nodeData !== 'object') return null;\r\n\r\n const kind = (nodeData as { kind?: string }).kind;\r\n if (!kind) return null;\r\n\r\n return nodeData as JsonNodeMeta;\r\n }\r\n\r\n onTextEdit(\r\n path: JsonPathSegment[],\r\n value: string,\r\n nodeMeta: JsonNodeMeta,\r\n ): void {\r\n if (!this.isEditMode()) return;\r\n\r\n this.setValueAtPath(path, value);\r\n\r\n // Actualiza solo el meta del nodo para reflejar el cambio sin reconstruir el árbol.\r\n if (nodeMeta.kind === 'compact-item') {\r\n nodeMeta.text = value;\r\n } else if (nodeMeta.kind === 'text-primitive') {\r\n nodeMeta.value = value;\r\n }\r\n\r\n this.emitCurrentValue();\r\n }\r\n\r\n onTextBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n onActiveToggle(\r\n path: JsonPathSegment[],\r\n checked: boolean,\r\n nodeMeta: JsonNodeMeta,\r\n ): void {\r\n if (!this.isEditMode()) return;\r\n\r\n this.setValueAtPath(path, checked);\r\n\r\n // Actualiza el meta del nodo y recalcula el visual del símbolo.\r\n nodeMeta.activeBoolean = checked;\r\n nodeMeta.activeVisual = checked\r\n ? this.showStatusAsSymbol()\r\n ? '✓'\r\n : 'true'\r\n : this.showStatusAsSymbol()\r\n ? '✗'\r\n : 'false';\r\n\r\n // Fuerza detección de cambio en el array sin reconstruir el árbol.\r\n this.nodes = [...this.nodes];\r\n this.emitCurrentValue();\r\n this.onTouched();\r\n }\r\n\r\n private updateNodes(value: unknown, emit: boolean): void {\r\n this.normalizedValue = this.parseIfNeeded(value);\r\n this.nodes = this.buildTree(this.normalizedValue);\r\n\r\n if (emit) {\r\n this.emitCurrentValue();\r\n }\r\n }\r\n\r\n private parseIfNeeded(data: unknown): unknown {\r\n if (data === null || data === undefined || data === '') return {};\r\n\r\n return this.normalizeData(data, 0);\r\n }\r\n\r\n private normalizeData(data: unknown, depth: number): unknown {\r\n if (depth > this.maxNormalizationDepth) return data;\r\n\r\n if (typeof data === 'string') {\r\n const parsed = this.tryParseJsonString(data);\r\n\r\n if (parsed.parsed) {\r\n return this.normalizeData(parsed.value, depth + 1);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return data.map((item) => this.normalizeData(item, depth + 1));\r\n }\r\n\r\n if (typeof data === 'object' && data !== null) {\r\n return Object.entries(data as Record<string, unknown>).reduce(\r\n (acc, [key, value]) => {\r\n acc[key] = this.normalizeData(value, depth + 1);\r\n return acc;\r\n },\r\n {} as Record<string, unknown>,\r\n );\r\n }\r\n\r\n return data;\r\n }\r\n\r\n private tryParseJsonString(value: string): {\r\n parsed: boolean;\r\n value: unknown;\r\n } {\r\n const trimmed = value.trim();\r\n\r\n // Solo intentamos parsear si parece JSON para evitar costo innecesario\r\n // en strings de texto común.\r\n const looksLikeJson =\r\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\r\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\r\n\r\n if (!looksLikeJson) {\r\n return { parsed: false, value };\r\n }\r\n\r\n try {\r\n return { parsed: true, value: JSON.parse(trimmed) };\r\n } catch {\r\n return { parsed: false, value };\r\n }\r\n }\r\n\r\n private buildTree(\r\n data: unknown,\r\n parentKey: string = '0',\r\n path: JsonPathSegment[] = [],\r\n ): TreeNode[] {\r\n if (Array.isArray(data)) {\r\n return data.map((item, index) => {\r\n const key = `${parentKey}-${index}`;\r\n const itemPath = [...path, index];\r\n\r\n const compactItem = this.toCompactTextAndActive(\r\n item,\r\n itemPath,\r\n `[${String(index).padStart(2, '0')}]`,\r\n );\r\n if (compactItem) {\r\n return {\r\n key,\r\n label: `${compactItem.indexLabel} Texto: ${compactItem.text} | ${compactItem.activeVisual}`,\r\n icon: 'pi pi-file',\r\n data: compactItem,\r\n };\r\n }\r\n\r\n if (this.isComplex(item)) {\r\n return {\r\n key,\r\n label: `[${index}]`,\r\n icon: this.getIcon(item),\r\n children: this.buildTree(item, key, itemPath),\r\n };\r\n }\r\n\r\n return {\r\n key,\r\n label: `[${index}]: ${this.formatPrimitive(item)}`,\r\n icon: 'pi pi-file',\r\n };\r\n });\r\n }\r\n\r\n if (typeof data === 'object' && data !== null) {\r\n const objectData = data as Record<string, unknown>;\r\n\r\n return Object.keys(objectData).flatMap((key, index) => {\r\n const value = objectData[key];\r\n const nodeKey = `${parentKey}-${index}`;\r\n const childPath = [...path, key];\r\n const activeKeyName = this.activeKey();\r\n const itemsKeyName = this.itemsKey();\r\n const textKeyName = this.textKey();\r\n\r\n if (key === itemsKeyName && Array.isArray(value)) {\r\n return this.buildTree(value, nodeKey, childPath);\r\n }\r\n\r\n if (this.isItemsContainer(value)) {\r\n const container = value as Record<string, unknown>;\r\n const hasActive = Object.prototype.hasOwnProperty.call(\r\n container,\r\n activeKeyName,\r\n );\r\n const label = hasActive\r\n ? `${key} | ${this.formatActiveSymbol(container[activeKeyName])}`\r\n : key;\r\n\r\n const itemsChildren = this.buildTree(\r\n container[itemsKeyName],\r\n `${nodeKey}-0`,\r\n [...childPath, itemsKeyName],\r\n );\r\n const additionalChildren = Object.keys(container)\r\n .filter(\r\n (childKey) =>\r\n childKey !== itemsKeyName && childKey !== activeKeyName,\r\n )\r\n .flatMap((childKey, childIndex) => {\r\n return this.buildTree(\r\n { [childKey]: container[childKey] },\r\n `${nodeKey}-${childIndex + 1}`,\r\n childPath,\r\n );\r\n });\r\n\r\n const nodeMeta: JsonNodeMeta | undefined = hasActive\r\n ? {\r\n kind: 'group-active',\r\n title: key,\r\n activeVisual: this.formatActiveSymbol(container[activeKeyName]),\r\n activeBoolean: this.toBooleanLike(container[activeKeyName]),\r\n activePath: [...childPath, activeKeyName],\r\n }\r\n : undefined;\r\n\r\n return {\r\n key: nodeKey,\r\n label,\r\n icon: 'pi pi-folder',\r\n children: [...itemsChildren, ...additionalChildren],\r\n data: nodeMeta,\r\n };\r\n }\r\n\r\n const compactValue = this.toCompactTextAndActive(value, childPath, key);\r\n if (compactValue) {\r\n return {\r\n key: nodeKey,\r\n label: `${key}: Texto: ${compactValue.text} | ${compactValue.activeVisual}`,\r\n icon: 'pi pi-file',\r\n data: compactValue,\r\n };\r\n }\r\n\r\n const groupedValue = this.toGroupWithActive(value);\r\n if (groupedValue) {\r\n groupedValue.meta.title = key;\r\n groupedValue.meta.activePath = [...childPath, activeKeyName];\r\n\r\n return {\r\n key: nodeKey,\r\n label: `${key} | ${groupedValue.activeSymbol}`,\r\n icon: 'pi pi-folder',\r\n children: this.buildTree(groupedValue.children, nodeKey, childPath),\r\n data: groupedValue.meta,\r\n };\r\n }\r\n\r\n if (this.isComplex(value)) {\r\n return {\r\n key: nodeKey,\r\n label: key,\r\n icon: this.getIcon(value),\r\n children: this.buildTree(value, nodeKey, childPath),\r\n };\r\n }\r\n\r\n const primitiveMeta: JsonNodeMeta | undefined =\r\n key === textKeyName\r\n ? {\r\n kind: 'text-primitive',\r\n key,\r\n value: this.formatPrimitive(value),\r\n path: childPath,\r\n }\r\n : key === activeKeyName\r\n ? {\r\n kind: 'active-primitive',\r\n key,\r\n activeVisual: this.formatActiveSymbol(value),\r\n activeBoolean: this.toBooleanLike(value),\r\n path: childPath,\r\n }\r\n : undefined;\r\n\r\n return {\r\n key: nodeKey,\r\n label:\r\n key === activeKeyName\r\n ? `${key}: ${this.formatActiveSymbol(value)}`\r\n : `${key}: ${this.formatPrimitive(value)}`,\r\n icon: 'pi pi-file',\r\n data: primitiveMeta,\r\n };\r\n });\r\n }\r\n\r\n return [\r\n {\r\n key: parentKey,\r\n label: this.formatPrimitive(data),\r\n icon: 'pi pi-file',\r\n },\r\n ];\r\n }\r\n\r\n private isComplex(value: unknown): boolean {\r\n return (\r\n Array.isArray(value) || (typeof value === 'object' && value !== null)\r\n );\r\n }\r\n\r\n private formatPrimitive(value: unknown): string {\r\n if (value === null || value === undefined) return '-';\r\n\r\n if (typeof value === 'string') return value;\r\n\r\n return String(value);\r\n }\r\n\r\n private toCompactTextAndActive(\r\n value: unknown,\r\n basePath: JsonPathSegment[],\r\n indexLabel: string,\r\n ): JsonNodeMeta | null {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return null;\r\n }\r\n\r\n const record = value as Record<string, unknown>;\r\n const textKeyName = this.textKey();\r\n const activeKeyName = this.activeKey();\r\n const hasText = Object.prototype.hasOwnProperty.call(record, textKeyName);\r\n const hasActive = Object.prototype.hasOwnProperty.call(\r\n record,\r\n activeKeyName,\r\n );\r\n\r\n if (!hasText || !hasActive) return null;\r\n\r\n const activeValue = record[activeKeyName];\r\n\r\n return {\r\n kind: 'compact-item',\r\n indexLabel,\r\n text: this.formatPrimitive(record[textKeyName]),\r\n activeVisual: this.formatActiveSymbol(activeValue),\r\n activeBoolean: this.toBooleanLike(activeValue),\r\n textPath: [...basePath, textKeyName],\r\n activePath: [...basePath, activeKeyName],\r\n };\r\n }\r\n\r\n private isItemsContainer(value: unknown): boolean {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n return Array.isArray((value as Record<string, unknown>)[this.itemsKey()]);\r\n }\r\n\r\n private toGroupWithActive(value: unknown): {\r\n activeSymbol: string;\r\n children: Record<string, unknown>;\r\n meta: JsonNodeMeta;\r\n } | null {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return null;\r\n }\r\n\r\n const record = value as Record<string, unknown>;\r\n const activeKeyName = this.activeKey();\r\n const hasActive = Object.prototype.hasOwnProperty.call(\r\n record,\r\n activeKeyName,\r\n );\r\n\r\n if (!hasActive) return null;\r\n\r\n const childEntries = Object.entries(record).filter(\r\n ([childKey]) => childKey !== activeKeyName,\r\n );\r\n\r\n if (childEntries.length === 0) return null;\r\n\r\n const hasComplexChildren = childEntries.some(([, childValue]) =>\r\n this.isComplex(childValue),\r\n );\r\n\r\n if (!hasComplexChildren) return null;\r\n\r\n return {\r\n activeSymbol: this.formatActiveSymbol(record[activeKeyName]),\r\n children: Object.fromEntries(childEntries),\r\n meta: {\r\n kind: 'group-active',\r\n title: '',\r\n activeVisual: this.formatActiveSymbol(record[activeKeyName]),\r\n activeBoolean: this.toBooleanLike(record[activeKeyName]),\r\n },\r\n };\r\n }\r\n\r\n private formatActiveSymbol(value: unknown): string {\r\n const boolLike = this.toBooleanLike(value);\r\n\r\n if (boolLike === true) return this.showStatusAsSymbol() ? '✓' : 'true';\r\n if (boolLike === false) return this.showStatusAsSymbol() ? '✗' : 'false';\r\n\r\n return this.formatPrimitive(value);\r\n }\r\n\r\n private toBooleanLike(value: unknown): boolean | null {\r\n if (typeof value === 'boolean') return value;\r\n\r\n if (typeof value === 'number') {\r\n if (value === 1) return true;\r\n if (value === 0) return false;\r\n return null;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === 'true' || normalized === '1') return true;\r\n if (normalized === 'false' || normalized === '0') return false;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private getIcon(value: unknown): string {\r\n if (Array.isArray(value)) return 'pi pi-list';\r\n\r\n if (typeof value === 'object') return 'pi pi-folder';\r\n\r\n return 'pi pi-file';\r\n }\r\n\r\n private setValueAtPath(path: JsonPathSegment[], value: unknown): void {\r\n if (\r\n !path.length ||\r\n typeof this.normalizedValue !== 'object' ||\r\n this.normalizedValue === null\r\n ) {\r\n return;\r\n }\r\n\r\n let target: any = this.normalizedValue;\r\n\r\n for (let index = 0; index < path.length - 1; index += 1) {\r\n const segment = path[index];\r\n\r\n if (target === null || target === undefined) return;\r\n\r\n target = target[segment as any];\r\n }\r\n\r\n const lastSegment = path[path.length - 1];\r\n\r\n if (target !== null && target !== undefined) {\r\n target[lastSegment as any] = value;\r\n }\r\n }\r\n\r\n private emitUpdatedValue(): void {\r\n this.nodes = this.buildTree(this.normalizedValue);\r\n this.emitCurrentValue();\r\n this.onTouched();\r\n }\r\n\r\n private emitCurrentValue(): void {\r\n const payload = this.cloneValue(this.normalizedValue);\r\n this.controlValue = payload;\r\n this.onChange(payload);\r\n this.valueChange.emit(payload);\r\n }\r\n\r\n private cloneValue<T>(value: T): T {\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n } catch {\r\n return value;\r\n }\r\n }\r\n}\r\n","<p-tree\r\n [value]=\"nodes\"\r\n class=\"json-tree w-full\"\r\n selectionMode=\"single\"\r\n [(selection)]=\"selectedNode\"\r\n [highlightOnSelect]=\"false\"\r\n (onNodeSelect)=\"onNodeSelect($event)\"\r\n>\r\n <ng-template let-node pTemplate=\"default\">\r\n <div class=\"json-node\">\r\n <ng-container *ngIf=\"getNodeMeta(node) as meta; else defaultLabel\">\r\n <ng-container [ngSwitch]=\"meta.kind\">\r\n <ng-container *ngSwitchCase=\"'compact-item'\">\r\n <span class=\"json-prefix\">{{ meta.indexLabel || \"\" }}</span>\r\n <span class=\"json-key\"> Texto: </span>\r\n <ng-container *ngIf=\"isEditMode(); else compactTextView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [class.json-text-inactive]=\"meta.activeBoolean === false\"\r\n [value]=\"meta.text || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit(\r\n $any(meta.textPath),\r\n $any($event.target).value,\r\n meta\r\n )\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #compactTextView>\r\n <span [class.json-text-inactive]=\"meta.activeBoolean === false\">{{\r\n meta.text || \"\"\r\n }}</span>\r\n </ng-template>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'group-active'\">\r\n <span>{{ meta.title || \"\" }}</span>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode() && meta.activePath\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'text-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <ng-container *ngIf=\"isEditMode(); else textPrimitiveView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [value]=\"meta.value || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit($any(meta.path), $any($event.target).value, meta)\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #textPrimitiveView>\r\n <span>{{ meta.value || \"\" }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'active-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.path),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ node.label }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultLabel>\r\n {{ node.label }}\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n</p-tree>\r\n","import { Component, input, OnChanges } from '@angular/core';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'dsx-date-indicator',\r\n imports: [TagModule, TooltipModule],\r\n templateUrl: './date-indicator.html',\r\n styleUrl: './date-indicator.css',\r\n})\r\nexport class DateIndicator implements OnChanges {\r\n date = input<Date | string>('');\r\n minDays = input<number>(1);\r\n maxDays = input<number>(365);\r\n\r\n status = 'Correcto';\r\n\r\n severity: 'success' | 'warn' | 'info' | 'danger' = 'success';\r\n\r\n icon = 'pi pi-check-circle';\r\n\r\n tooltip = '';\r\n\r\n ngOnChanges(): void {\r\n this.calculate();\r\n }\r\n\r\n private calculate(): void {\r\n const rawDate = this.date();\r\n\r\n if (!rawDate) {\r\n this.setEmptyCriticalState();\r\n return;\r\n }\r\n\r\n const targetDate = new Date(rawDate);\r\n\r\n if (Number.isNaN(targetDate.getTime())) {\r\n this.setEmptyCriticalState();\r\n return;\r\n }\r\n\r\n const today = new Date();\r\n\r\n const diffMs = today.getTime() - targetDate.getTime();\r\n\r\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));\r\n\r\n const range = this.maxDays() - this.minDays();\r\n\r\n const step = range / 4;\r\n\r\n const level1 = this.minDays() + step;\r\n const level2 = this.minDays() + step * 2;\r\n const level3 = this.minDays() + step * 3;\r\n\r\n if (days <= level1) {\r\n this.status = 'Correcto';\r\n this.severity = 'success';\r\n this.icon = 'pi pi-check-circle';\r\n } else if (days <= level2) {\r\n this.status = 'Atención';\r\n this.severity = 'warn';\r\n this.icon = 'pi pi-exclamation-triangle';\r\n } else if (days <= level3) {\r\n this.status = 'Riesgo';\r\n this.severity = 'info';\r\n this.icon = 'pi pi-clock';\r\n } else {\r\n this.status = 'Crítico';\r\n this.severity = 'danger';\r\n this.icon = 'pi pi-times-circle';\r\n }\r\n\r\n this.tooltip = `Última actualización: ${targetDate.toLocaleDateString()} • ${days} días`;\r\n }\r\n\r\n private setEmptyCriticalState(): void {\r\n this.status = 'Crítico';\r\n this.severity = 'danger';\r\n this.icon = 'pi pi-times-circle';\r\n this.tooltip = 'Última actualización: Sin valor • 0 días';\r\n }\r\n}\r\n","<p-tag\r\n [severity]=\"severity\"\r\n [icon]=\"icon\"\r\n [value]=\"status\"\r\n [pTooltip]=\"tooltip\"\r\n>\r\n</p-tag>\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpDirective } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpDirective],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer' | 'percent'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<\r\n | 'light'\r\n | 'dark'\r\n | 'aqua'\r\n | 'sunset'\r\n | 'mint'\r\n | 'peach'\r\n | 'plasma'\r\n | 'nebula'\r\n >('light');\r\n\r\n options: Record<'currency' | 'integer' | 'percent', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n //prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n percent: {\r\n startVal: 0,\r\n duration: 0.5,\r\n suffix: '%',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div [class]=\"`kpi-card ${color()} ${theme()}-theme`\">\r\n <div class=\"kpi-container\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [countUpOptions]=\"getSelectedOption()\"\r\n [class]=\"`card-value-${theme()}`\"\r\n >0</span\r\n >\r\n <span [class]=\"`card-text-${theme()}`\">{{ label() }}</span>\r\n </div>\r\n <i [class]=\"`${iconType()} icon icon-${theme()}`\"></i>\r\n</div>\r\n","import {\r\n Component,\r\n effect,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n input,\r\n Output,\r\n signal,\r\n viewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\ntype DocxRenderOptions = {\r\n ignoreWidth?: boolean;\r\n renderHeaders?: boolean;\r\n renderFooters?: boolean;\r\n};\r\n\r\ntype DocxPreviewModule = {\r\n renderAsync: (\r\n document: Blob,\r\n bodyContainer: HTMLElement,\r\n styleContainer?: HTMLElement,\r\n options?: DocxRenderOptions,\r\n ) => Promise<void>;\r\n};\r\n\r\n@Component({\r\n selector: 'app-docx-preview',\r\n imports: [DialogModule, AvatarModule],\r\n templateUrl: './docx-preview.component.html',\r\n styleUrl: './docx-preview.component.css',\r\n})\r\nexport class DocxPreviewComponent {\r\n view = viewChild<ElementRef>('viewer');\r\n private visibleState: WritableSignal<boolean> = signal(false);\r\n loading = signal(false);\r\n rendered = signal(false);\r\n private renderToken = 0;\r\n\r\n @Input()\r\n set visible(value: boolean) {\r\n this.visibleState.set(!!value);\r\n }\r\n\r\n get visible(): boolean {\r\n return this.visibleState();\r\n }\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n blob = input<Blob | null>(null);\r\n\r\n constructor() {\r\n effect(() => {\r\n const container = this.view()?.nativeElement;\r\n const isVisible = this.visibleState();\r\n const fileBlob = this.blob();\r\n\r\n if (!container) {\r\n return;\r\n }\r\n\r\n if (!isVisible) {\r\n this.resetViewer(container);\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.rendered.set(false);\r\n\r\n if (!(fileBlob instanceof Blob)) {\r\n this.finishWithFallback(container);\r\n container.innerHTML =\r\n '<p>No hay un archivo .docx válido para previsualizar.</p>';\r\n return;\r\n }\r\n\r\n if (!fileBlob.size) {\r\n this.finishWithFallback(container);\r\n container.innerHTML = '<p>El archivo .docx está vacío.</p>';\r\n return;\r\n }\r\n\r\n const token = ++this.renderToken;\r\n container.innerHTML = '';\r\n const options: DocxRenderOptions = {\r\n ignoreWidth: true,\r\n renderHeaders: true,\r\n renderFooters: true,\r\n };\r\n\r\n void this.renderDocx(fileBlob, container, options, token);\r\n });\r\n }\r\n\r\n private resetViewer(container: HTMLElement): void {\r\n this.renderToken++;\r\n this.loading.set(false);\r\n this.rendered.set(false);\r\n container.innerHTML = '';\r\n }\r\n\r\n private finishWithFallback(container: HTMLElement): void {\r\n this.renderToken++;\r\n this.loading.set(false);\r\n this.rendered.set(true);\r\n container.innerHTML = '';\r\n }\r\n\r\n private async renderDocx(\r\n fileBlob: Blob,\r\n container: HTMLElement,\r\n options: DocxRenderOptions,\r\n token: number,\r\n ) {\r\n try {\r\n const viteDocxModulePath = '/@id/docx-preview';\r\n\r\n // Import dinámico en runtime para mantener docx-preview como peer opcional.\r\n const docxPreviewModule = (await import(\r\n /* @vite-ignore */ viteDocxModulePath\r\n )) as unknown as DocxPreviewModule;\r\n\r\n if (token !== this.renderToken || !this.visibleState()) {\r\n return;\r\n }\r\n\r\n await docxPreviewModule.renderAsync(\r\n fileBlob,\r\n container,\r\n undefined,\r\n options,\r\n );\r\n\r\n if (token === this.renderToken && this.visibleState()) {\r\n this.loading.set(false);\r\n this.rendered.set(true);\r\n }\r\n } catch (error) {\r\n if (token !== this.renderToken || !this.visibleState()) {\r\n return;\r\n }\r\n\r\n console.error(\r\n '[DocxPreview] Error al renderizar el archivo DOCX.',\r\n error,\r\n );\r\n\r\n container.innerHTML =\r\n '<p>No se pudo renderizar la vista previa DOCX. Verifica la consola para más detalles.</p>';\r\n this.loading.set(false);\r\n this.rendered.set(true);\r\n }\r\n }\r\n\r\n onHide() {\r\n const container = this.view()?.nativeElement;\r\n\r\n if (container) {\r\n this.renderToken++;\r\n container.innerHTML = '';\r\n }\r\n\r\n this.visibleChange.emit(false);\r\n }\r\n}\r\n","<p-dialog\r\n [visible]=\"visible\"\r\n (onHide)=\"onHide()\"\r\n [modal]=\"true\"\r\n [breakpoints]=\"{ '1199px': '75vw', '575px': '90vw' }\"\r\n [style]=\"{ width: '80vw' }\"\r\n [draggable]=\"false\"\r\n [resizable]=\"false\"\r\n [closable]=\"true\"\r\n [maximizable]=\"true\"\r\n>\r\n <ng-template #header>\r\n <div class=\"flex justify-content-center align-items-center gap-2 px-2\">\r\n <p-avatar image=\"icon2/word-2019.png\" />\r\n <span class=\"font-bold\">Vista preliminar del documento</span>\r\n </div>\r\n </ng-template>\r\n <div class=\"docx-preview-shell\">\r\n @if (loading()) {\r\n <div class=\"docx-preview-loading\">\r\n <span class=\"docx-preview-spinner\"></span>\r\n <span>Cargando vista previa del documento...</span>\r\n </div>\r\n }\r\n\r\n <div\r\n #viewer\r\n class=\"docx-preview-viewer\"\r\n [class.is-hidden]=\"loading() && !rendered()\"\r\n ></div>\r\n </div>\r\n</p-dialog>\r\n","import { Component, OnDestroy, effect, input, model } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\n@Component({\r\n selector: 'app-pdf-preview',\r\n imports: [DialogModule],\r\n templateUrl: './pdf-preview.component.html',\r\n styleUrl: './pdf-preview.component.css',\r\n})\r\nexport class PdfPreviewComponent implements OnDestroy {\r\n visible = model<boolean>(false);\r\n blob = input<Blob | null>(null);\r\n private objectUrl: string | null = null;\r\n pdfUrl: SafeResourceUrl | null = null;\r\n\r\n constructor(private sanitizer: DomSanitizer) {\r\n effect((onCleanup) => {\r\n const file = this.blob();\r\n const isVisible = this.visible();\r\n\r\n if (!isVisible || file === null) {\r\n this.limpiarUrlAnterior();\r\n return;\r\n }\r\n\r\n if (file.type !== 'application/pdf') {\r\n this.limpiarUrlAnterior();\r\n console.warn('El archivo recibido no es un PDF válido');\r\n return;\r\n }\r\n\r\n this.limpiarUrlAnterior();\r\n const currentObjectUrl = URL.createObjectURL(file);\r\n this.objectUrl = currentObjectUrl;\r\n this.pdfUrl =\r\n this.sanitizer.bypassSecurityTrustResourceUrl(currentObjectUrl);\r\n\r\n onCleanup(() => {\r\n URL.revokeObjectURL(currentObjectUrl);\r\n if (this.objectUrl === currentObjectUrl) {\r\n this.objectUrl = null;\r\n this.pdfUrl = null;\r\n }\r\n });\r\n });\r\n }\r\n\r\n private limpiarUrlAnterior(): void {\r\n if (this.objectUrl) {\r\n URL.revokeObjectURL(this.objectUrl);\r\n this.objectUrl = null;\r\n }\r\n this.pdfUrl = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.limpiarUrlAnterior();\r\n }\r\n}\r\n","<p-dialog\r\n header=\"Vista previa del documento de soporte\"\r\n [(visible)]=\"visible\"\r\n [style]=\"{ width: '80vw', height: '90vh' }\"\r\n [closable]=\"true\"\r\n [maximizable]=\"true\"\r\n>\r\n @if (pdfUrl) {\r\n <iframe\r\n [src]=\"pdfUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n style=\"border: none\"\r\n ></iframe>\r\n }\r\n</p-dialog>\r\n","import { Component, computed, inject, input } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { TabsModule } from 'primeng/tabs';\r\n\r\n@Component({\r\n selector: 'dsx-template-highlight',\r\n imports: [TabsModule],\r\n templateUrl: './template-highlight.html',\r\n styleUrl: './template-highlight.css',\r\n})\r\nexport class TemplateHighlight {\r\n text = input<string | null>(null);\r\n allowedKeys = input<readonly string[]>([]);\r\n\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n highlightedText = computed<SafeHtml>(() => {\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n this.processText(this.text(), this.allowedKeys()),\r\n );\r\n });\r\n\r\n private processText(\r\n raw: string | null,\r\n allowedKeys: readonly string[],\r\n ): string {\r\n if (!raw) return '';\r\n\r\n // Primero marcamos variables y etiquetas en el texto crudo usando placeholders.\r\n const spanMap = new Map<string, string>();\r\n let idx = 0;\r\n let result = raw;\r\n\r\n // Variables {{...}}\r\n result = result.replace(/{{(.*?)}}/g, (match, content) => {\r\n const trimmed = content.trim();\r\n let span: string;\r\n\r\n if (content !== trimmed) {\r\n span = `<span class=\"var-invalid\" title=\"Espacios inválidos\">${this.escapeHtml(match)}</span>`;\r\n } else if (!/^[A-Z0-9_]+$/.test(trimmed)) {\r\n span = `<span class=\"var-invalid\" title=\"Formato inválido\">${this.escapeHtml(match)}</span>`;\r\n } else if (!allowedKeys.includes(trimmed)) {\r\n span = `<span class=\"var-invalid\" title=\"Variable no definida\">${this.escapeHtml(match)}</span>`;\r\n } else {\r\n span = `<span class=\"var-valid\">${this.escapeHtml(match)}</span>`;\r\n }\r\n\r\n const placeholder = `__SPAN_${idx++}__`;\r\n spanMap.set(placeholder, span);\r\n return placeholder;\r\n });\r\n\r\n // Etiquetas estructurales: <negrita>, </negrita>, </salto>\r\n const tagRegex = /<[^>\\n]+>/g;\r\n const allowedTags = new Set(['<negrita>', '</negrita>', '</salto>']);\r\n const tagMatches = [...raw.matchAll(tagRegex)];\r\n const invalidTagReasonByIndex = new Map<number, string>();\r\n const negritaStack: number[] = [];\r\n\r\n for (let i = 0; i < tagMatches.length; i++) {\r\n const tag = tagMatches[i][0];\r\n\r\n if (!allowedTags.has(tag)) {\r\n invalidTagReasonByIndex.set(\r\n i,\r\n `Etiqueta inválida: \"${tag}\". Etiquetas permitidas: <negrita>, </negrita>, </salto>.`,\r\n );\r\n continue;\r\n }\r\n\r\n if (tag === '<negrita>') {\r\n negritaStack.push(i);\r\n continue;\r\n }\r\n\r\n if (tag === '</negrita>' && negritaStack.length === 0) {\r\n invalidTagReasonByIndex.set(\r\n i,\r\n 'Estructura incorrecta: Se encontró \"</negrita>\" sin una apertura \"<negrita>\" previa.',\r\n );\r\n continue;\r\n }\r\n\r\n if (tag === '</negrita>') {\r\n negritaStack.pop();\r\n }\r\n }\r\n\r\n for (const openTagIndex of negritaStack) {\r\n invalidTagReasonByIndex.set(\r\n openTagIndex,\r\n 'Estructura incorrecta: Falta cerrar una o más etiquetas \"</negrita>\".',\r\n );\r\n }\r\n\r\n let tagIndex = 0;\r\n result = result.replace(tagRegex, (tag) => {\r\n const reason = invalidTagReasonByIndex.get(tagIndex);\r\n const span = reason\r\n ? `<span class=\"tag-invalid\" title=\"${this.escapeAttr(reason)}\">${this.escapeHtml(tag)}</span>`\r\n : `<span class=\"tag-valid\">${this.escapeHtml(tag)}</span>`;\r\n\r\n const placeholder = `__SPAN_${idx++}__`;\r\n spanMap.set(placeholder, span);\r\n tagIndex += 1;\r\n return placeholder;\r\n });\r\n\r\n // Escapamos el resto del texto (fuera de placeholders).\r\n result = this.escapeHtml(result);\r\n\r\n // Ahora marcamos llaves sueltas: {{ o }} que no estén en pareja de variable.\r\n result = result.replace(/{{|}}/g, (m) => {\r\n return `<span class=\"var-brace-error\" title=\"Llave desbalanceada\">${m}</span>`;\r\n });\r\n\r\n // Restauramos los spans reales\r\n for (const [placeholder, span] of spanMap) {\r\n result = result.replace(placeholder, span);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private escapeHtml(text: string | null): string {\r\n if (!text) return '';\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n }\r\n\r\n private escapeAttr(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n }\r\n}\r\n","<p-tabs value=\"0\">\r\n <p-tablist>\r\n <p-tab value=\"0\">\r\n <i class=\"pi pi-file-edit tab-icon\" aria-hidden=\"true\"></i>\r\n <span>Preliminar</span>\r\n </p-tab>\r\n <p-tab value=\"1\">\r\n <i class=\"pi pi-list tab-icon\" aria-hidden=\"true\"></i>\r\n <span>Variables</span>\r\n </p-tab>\r\n </p-tablist>\r\n <p-tabpanels>\r\n <p-tabpanel value=\"0\">\r\n <div class=\"template-highlight\" [innerHTML]=\"highlightedText()\"></div>\r\n </p-tabpanel>\r\n <p-tabpanel value=\"1\">\r\n @if (allowedKeys().length) {\r\n <ul class=\"template-vars-list\">\r\n @for (key of allowedKeys(); track key) {\r\n <li>\r\n <strong>{{ key }}</strong>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </p-tabpanel>\r\n </p-tabpanels>\r\n</p-tabs>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { catchError, map, Observable, of, shareReplay } from 'rxjs';\r\n\r\n/** SVG del icono help como fallback de emergencia */\r\nconst HELP_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M440-200h80v-80h-80v80Zm40-400q-33 0-56.5 18.5T390-530l70 30q5-17 15-26.5t25-9.5q17 0 28.5 11.5T540-495q0 12-7.5 22T510-450q-35 24-52.5 44T440-340h80q0-22 12.5-39.5T570-412q30-21 40-41t10-42q0-51-35-88t-105-37q-60 0-94.5 29.5T340-510l70 30q8-25 23.5-37.5T480-530Zm0 500q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/></svg>`;\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio de carga de iconos SVG para `icon-dsx`.\r\n *\r\n * Flujo de resolución:\r\n * 1) Intenta cargar el recurso solicitado en `mdio/{name}.svg`.\r\n * 2) Si falla, registra un `console.warn` para depuración.\r\n * 3) Usa `mdio/help.svg` como fallback visual para mantener buena UX.\r\n * 4) Si también falla ese recurso, usa un SVG inline de `help` como último respaldo.\r\n *\r\n * Nota de mantenimiento:\r\n * Los recursos SVG deben mantenerse actualizados en la carpeta de assets (`mdio`),\r\n * de lo contrario se activará el fallback y el warning de ícono no encontrado.\r\n */\r\nexport class IconDsxService {\r\n private cache = new Map<string, Observable<SafeHtml>>();\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private sanitizer: DomSanitizer,\r\n ) {}\r\n\r\n /**\r\n * Carga un SVG por nombre desde `mdio/{name}.svg` y retorna contenido seguro para renderizar.\r\n */\r\n getIcon(\r\n name: string,\r\n style: 'outlined' | 'rounded' | 'sharp' = 'outlined',\r\n ): Observable<SafeHtml> {\r\n const cacheKey = `${style}:${name}`;\r\n if (this.cache.has(cacheKey)) {\r\n return this.cache.get(cacheKey)!;\r\n }\r\n\r\n let prefix = 'mdio';\r\n if (style === 'rounded') prefix = 'mdir';\r\n else if (style === 'sharp') prefix = 'mdis';\r\n\r\n const iconPath = `${prefix}/${name}.svg`;\r\n const helpIconPath = `${prefix}/help.svg`;\r\n\r\n //console.log(`[IconDsxService] Cargando icono: ${iconPath}`);\r\n\r\n const request$ = this.http.get(iconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n catchError((error) => {\r\n console.warn('[IconDsxService] Icono no encontrado, usando fallback', {\r\n name,\r\n path: iconPath,\r\n status: error?.status,\r\n message: error?.message,\r\n });\r\n\r\n return this.http.get(helpIconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n catchError(() => {\r\n return of(this.sanitizer.bypassSecurityTrustHtml(HELP_SVG));\r\n }),\r\n );\r\n }),\r\n shareReplay(1),\r\n );\r\n\r\n this.cache.set(cacheKey, request$);\r\n return request$;\r\n }\r\n}\r\n","import { Component, effect, input, isDevMode } from '@angular/core';\r\nimport { AsyncPipe } from '@angular/common';\r\nimport { SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconDsxService } from '../../../services/src/icon-dsx.service';\r\n\r\n@Component({\r\n selector: 'icon-dsx',\r\n imports: [AsyncPipe],\r\n templateUrl: './icon-dsx.component.html',\r\n styleUrl: './icon-dsx.component.css',\r\n})\r\nexport class IconDsxComponent {\r\n name = input<string>('');\r\n style = input<'outlined' | 'rounded' | 'sharp'>('rounded');\r\n\r\n debug = input<boolean>(false);\r\n\r\n svg$!: Observable<SafeHtml>;\r\n\r\n private readonly instanceId = Math.random().toString(36).substring(2, 8);\r\n\r\n private effectRuns = 0;\r\n\r\n constructor(private iconService: IconDsxService) {\r\n effect(() => {\r\n this.effectRuns++;\r\n\r\n if (this.debug() && isDevMode()) {\r\n console.log(`[icon-dsx:${this.instanceId}] effect`, {\r\n runs: this.effectRuns,\r\n name: this.name(),\r\n style: this.style(),\r\n });\r\n }\r\n\r\n this.svg$ = this.iconService.getIcon(this.name(), this.style());\r\n });\r\n }\r\n}\r\n","<span class=\"dsx-icon\" [innerHTML]=\"svg$ | async\"></span>\r\n","// app-message-error.component.ts\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n DoCheck,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n} from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { IconDsxComponent } from '../icon-dsx/icon-dsx.component';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n standalone: true,\r\n imports: [TagModule, IconDsxComponent],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.css',\r\n})\r\nexport class AppMessageErrorComponent\r\n implements AfterViewInit, DoCheck, OnDestroy\r\n{\r\n private readonly defaultFloatLabelErrorSpace = '1.3rem';\r\n private readonly templateFloatLabelErrorSpace = '1.3rem';\r\n private readonly templateFloatLabelLongErrorSpace = '2.4rem';\r\n private readonly templateLongErrorThreshold = 165;\r\n\r\n private floatLabelElement: HTMLElement | null = null;\r\n private previousInlineMarginBottom = '';\r\n private lastAppliedVisibleState = false;\r\n private lastAppliedErrorSpace = '';\r\n\r\n private lastControlStatus: string = '';\r\n private lastControlTouched: boolean = false;\r\n private lastControlDirty: boolean = false;\r\n private lastErrorsCount: number = 0;\r\n\r\n // Control nativo de visualización en el DOM\r\n private isElementAttachedAndVisible = false;\r\n private observer: IntersectionObserver | null = null;\r\n\r\n private _control: AbstractControl | null | undefined = null;\r\n\r\n @Input() set control(nuevoControl: AbstractControl | null | undefined) {\r\n this._control = nuevoControl;\r\n\r\n // Solo inicializa estados e imprime logs si el componente REALMENTE se está usando en pantalla\r\n if (nuevoControl && this.isElementAttachedAndVisible) {\r\n this.lastControlStatus = nuevoControl.status;\r\n this.lastControlTouched = nuevoControl.touched;\r\n this.lastControlDirty = nuevoControl.dirty;\r\n this.lastErrorsCount = nuevoControl.errors\r\n ? Object.keys(nuevoControl.errors).length\r\n : 0;\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n '🚨 [ERROR-COMPONENT DEBUG] Control reactivo activado y visible en pantalla:',\r\n {\r\n status: nuevoControl.status,\r\n keys: nuevoControl.errors ? Object.keys(nuevoControl.errors) : [],\r\n fullErrors: nuevoControl.errors,\r\n },\r\n );\r\n }\r\n\r\n this.syncFloatLabelSpacing();\r\n }\r\n }\r\n\r\n get control(): AbstractControl | null | undefined {\r\n return this._control;\r\n }\r\n\r\n @Input() form: FormGroup | null = null;\r\n\r\n // 🎯 NUEVO INPUT PARA EL CONTROL DE DEPURACIÓN EN CONSOLA\r\n @Input() debugMode: boolean = false;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef<HTMLElement>,\r\n private readonly renderer: Renderer2,\r\n ) {}\r\n\r\n ngAfterViewInit(): void {\r\n this.floatLabelElement = this.elementRef.nativeElement.closest(\r\n '.p-floatlabel',\r\n ) as HTMLElement | null;\r\n\r\n if (this.floatLabelElement) {\r\n this.previousInlineMarginBottom =\r\n this.floatLabelElement.style.marginBottom;\r\n }\r\n\r\n // Detecta de forma nativa si el modal se abrió o cerró visualmente\r\n if (typeof window !== 'undefined' && 'IntersectionObserver' in window) {\r\n this.observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n this.isElementAttachedAndVisible = entry.isIntersecting;\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `👁️ [ERROR-COMPONENT DEBUG] Visibilidad cambiada por IntersectionObserver. ¿Está visible?: ${this.isElementAttachedAndVisible}`,\r\n );\r\n }\r\n\r\n if (this.isElementAttachedAndVisible && this.control) {\r\n this.syncFloatLabelSpacing();\r\n }\r\n });\r\n },\r\n { threshold: 0.1 },\r\n );\r\n\r\n this.observer.observe(this.elementRef.nativeElement);\r\n } else {\r\n this.isElementAttachedAndVisible = true;\r\n }\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Si el componente está oculto en el fondo, ignora por completo el ciclo de detección de cambios\r\n if (!this.control || !this.isElementAttachedAndVisible) return;\r\n\r\n const currentErrorsCount = this.control.errors\r\n ? Object.keys(this.control.errors).length\r\n : 0;\r\n\r\n if (\r\n this.control.status !== this.lastControlStatus ||\r\n this.control.touched !== this.lastControlTouched ||\r\n this.control.dirty !== this.lastControlDirty ||\r\n currentErrorsCount !== this.lastErrorsCount\r\n ) {\r\n if (this.debugMode) {\r\n console.log(\r\n '🔄 [ERROR-COMPONENT DEBUG] Cambio de estado interno detectado por ngDoCheck:',\r\n {\r\n statusAntes: this.lastControlStatus,\r\n statusAhora: this.control.status,\r\n erroresContados: currentErrorsCount,\r\n },\r\n );\r\n }\r\n\r\n this.lastControlStatus = this.control.status;\r\n this.lastControlTouched = this.control.touched;\r\n this.lastControlDirty = this.control.dirty;\r\n this.lastErrorsCount = currentErrorsCount;\r\n\r\n this.syncFloatLabelSpacing();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\r\n\r\n if (!this.floatLabelElement) return;\r\n\r\n if (this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n return;\r\n }\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n\r\n private syncFloatLabelSpacing(): void {\r\n if (!this.floatLabelElement || !this.isElementAttachedAndVisible) return;\r\n\r\n const isVisible = this.isControlErrorVisible();\r\n const desiredSpace = this.getFloatLabelErrorSpace();\r\n\r\n if (\r\n isVisible === this.lastAppliedVisibleState &&\r\n (!isVisible || desiredSpace === this.lastAppliedErrorSpace)\r\n ) {\r\n return;\r\n }\r\n\r\n this.lastAppliedVisibleState = isVisible;\r\n if (isVisible) {\r\n this.lastAppliedErrorSpace = desiredSpace;\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n desiredSpace,\r\n );\r\n return;\r\n }\r\n\r\n this.lastAppliedErrorSpace = '';\r\n\r\n if (this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n return;\r\n }\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n\r\n isControlErrorVisible(): boolean {\r\n if (\r\n !this.control ||\r\n !this.control.invalid ||\r\n !this.isElementAttachedAndVisible\r\n ) {\r\n return false;\r\n }\r\n return !!(this.control.touched || this.control.dirty);\r\n }\r\n\r\n private getFloatLabelErrorSpace(): string {\r\n const templateError =\r\n this.control?.errors?.['invalidTemplateVariables'] ||\r\n this.control?.errors?.['invalidTemplateStructure'];\r\n\r\n if (templateError) {\r\n const errorData = templateError as {\r\n message?: string;\r\n details?: string[];\r\n };\r\n const firstDetail = Array.isArray(errorData.details)\r\n ? (errorData.details[0] ?? '')\r\n : '';\r\n const messageLength = `${errorData.message ?? ''} ${firstDetail}`.trim()\r\n .length;\r\n\r\n return messageLength > this.templateLongErrorThreshold\r\n ? this.templateFloatLabelLongErrorSpace\r\n : this.templateFloatLabelErrorSpace;\r\n }\r\n\r\n return this.defaultFloatLabelErrorSpace;\r\n }\r\n\r\n formatNumber(value: unknown): string {\r\n const num = Number(value);\r\n if (isNaN(num)) return String(value ?? '');\r\n return num % 1 === 0 ? String(num) : parseFloat(num.toFixed(2)).toString();\r\n }\r\n}\r\n","<!-- app-message-error.component.html -->\r\n<div class=\"dsx-error-slot\" [class.is-visible]=\"isControlErrorVisible()\">\r\n <div class=\"dsx-error-message\">\r\n <div class=\"dsx-error-message-content\">\r\n <!-- 🎯 INYECTA ESTA LÍNEA TEMPORAL DE DEPURACIÓN AQUÍ -->\r\n <!-- <span\r\n style=\"\r\n color: blue;\r\n font-size: 10px;\r\n display: block;\r\n word-break: break-all;\r\n \"\r\n >\r\n DEBUG ERRORES: {{ control?.errors | json }}\r\n </span> -->\r\n\r\n <icon-dsx name=\"warning\"></icon-dsx>\r\n\r\n @if (control?.errors?.[\"required\"]) {\r\n El campo <strong>es requerido.</strong>\r\n } @else if (control?.errors?.[\"invalidNIT\"]) {\r\n <strong>{{ control?.errors?.[\"invalidNIT\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidCUI\"]) {\r\n <strong>{{ control?.errors?.[\"invalidCUI\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidDateRange\"]) {\r\n <strong>{{ control?.errors?.[\"invalidDateRange\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"dateNotRange\"]) {\r\n <strong>{{ control?.errors?.[\"dateNotRange\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidDate\"]) {\r\n <strong>{{ control?.errors?.[\"invalidDate\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"minimumAge\"]) {\r\n <strong>{{ control?.errors?.[\"minimumAge\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"minlength\"]) {\r\n Debe tener al menos\r\n <strong>{{ control?.errors?.[\"minlength\"]?.requiredLength }}</strong>\r\n caracteres.\r\n } @else if (control?.errors?.[\"maxlength\"]) {\r\n Debe tener como máximo\r\n <strong>{{ control?.errors?.[\"maxlength\"]?.requiredLength }}</strong>\r\n caracteres.\r\n } @else if (control?.errors?.[\"min\"]) {\r\n El valor mínimo permitido es\r\n <strong>{{ formatNumber(control?.errors?.[\"min\"]?.min) }}</strong>\r\n } @else if (control?.errors?.[\"max\"]) {\r\n El valor máximo permitido es\r\n <strong>{{ formatNumber(control?.errors?.[\"max\"]?.max) }}</strong>\r\n } @else if (control?.errors?.[\"email\"]) {\r\n Debe ser una dirección de correo válida.\r\n } @else if (control?.errors?.[\"pattern\"]) {\r\n El campo no tiene el formato requerido.\r\n } @else if (control?.errors?.[\"alreadyValueExists\"]) {\r\n <strong>{{ control?.errors?.[\"alreadyValueExists\"]?.message }}</strong>\r\n } @else if (control?.errors?.[\"invalidTemplateVariables\"]) {\r\n <div class=\"dsx-template-error\">\r\n <strong>\r\n {{ control?.errors?.[\"invalidTemplateVariables\"]?.message }}\r\n </strong>\r\n @if (control?.errors?.[\"invalidTemplateVariables\"]?.details?.length) {\r\n <span class=\"dsx-template-error-detail\">\r\n {{ control?.errors?.[\"invalidTemplateVariables\"]?.details?.[0] }}\r\n </span>\r\n }\r\n </div>\r\n } @else if (control?.errors?.[\"invalidTemplateStructure\"]) {\r\n <div class=\"dsx-template-error\">\r\n <strong>\r\n {{ control?.errors?.[\"invalidTemplateStructure\"]?.message }}\r\n </strong>\r\n @if (control?.errors?.[\"invalidTemplateStructure\"]?.details?.length) {\r\n <span class=\"dsx-template-error-detail\">\r\n {{ control?.errors?.[\"invalidTemplateStructure\"]?.details?.[0] }}\r\n </span>\r\n }\r\n </div>\r\n } @else if (control?.errors?.[\"similitudDetectada\"]) {\r\n <!-- 🎯 Estructuración del mensaje con el nombre aislado en negrita -->\r\n Ya existe un registro muy similar en el sistema:\r\n <strong\r\n >\"{{ control?.errors?.[\"similitudDetectada\"]?.sugerencia }}\"</strong\r\n >.\r\n } @else {\r\n Existe un error aún no identificado.\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Mensaje para formulario en general (Cambiado form.touched por form.dirty para evitar falsos positivos al clicar el fondo) -->\r\n@if (form?.invalid && form?.dirty) {\r\n <div class=\"mt-2 mb-2\">\r\n @if (this.form?.errors?.[\"atLeastOneRequired\"]) {\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}\r\n </p-tag>\r\n }\r\n </div>\r\n}\r\n","export function limpiarTexto(texto: string): string {\r\n return texto\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '') // Elimina tildes y diacríticos\r\n .replace(/[.\\s]+/g, ' ') // Convierte puntos y múltiples espacios en un solo espacio\r\n .trim();\r\n}\r\n\r\nexport function calcularSimilitud(str1: string, str2: string): number {\r\n const s1 = limpiarTexto(str1);\r\n const s2 = limpiarTexto(str2);\r\n\r\n if (s1 === s2) return 1.0;\r\n if (s1.length < 2 || s2.length < 2) return 0.0;\r\n\r\n const getBigrams = (str: string) => {\r\n const bigrams = new Set<string>();\r\n for (let i = 0; i < str.length - 1; i++) {\r\n bigrams.add(str.substring(i, i + 2));\r\n }\r\n return bigrams;\r\n };\r\n\r\n const b1 = getBigrams(s1);\r\n const b2 = getBigrams(s2);\r\n\r\n let intersection = 0;\r\n b1.forEach((bigram) => {\r\n if (b2.has(bigram)) intersection++;\r\n });\r\n\r\n return (2.0 * intersection) / (b1.size + b2.size);\r\n}\r\n","// app-message-help.component.ts\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n DoCheck,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n} from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { isObservable, Observable, of, Subject, Subscription } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n shareReplay,\r\n switchMap,\r\n} from 'rxjs/operators';\r\nimport {\r\n calcularSimilitud,\r\n limpiarTexto,\r\n} from '../../../models/src/similarity.util';\r\nimport { IconDsxComponent } from '../icon-dsx/icon-dsx.component';\r\n\r\n@Component({\r\n selector: 'dsx-message-help',\r\n templateUrl: './app-message-help.component.html',\r\n imports: [IconDsxComponent],\r\n styleUrl: './app-message-help.component.css',\r\n})\r\nexport class AppMessageHelpComponent\r\n implements AfterViewInit, DoCheck, OnDestroy\r\n{\r\n private readonly defaultFloatLabelHelpSpace = '1.6rem';\r\n private floatLabelElement: HTMLElement | null = null;\r\n private previousInlineMarginBottom = '';\r\n private lastAppliedVisibleState = false;\r\n\r\n private controlSubscription = new Subscription();\r\n private procesadorSubscription = new Subscription();\r\n private currentIdSubscription = new Subscription();\r\n\r\n private inputSubject$ = new Subject<string>();\r\n private currentIdSubject$ = new Subject<string | number | null>();\r\n protected sugerenciasDetectadas: Array<{ texto: string; similitud: number }> =\r\n [];\r\n private currentIdValue: string | number | null = null;\r\n private initialValidationDone = false; // 🔴 Evitar validación múltiple\r\n\r\n private _control: AbstractControl | null | undefined = null;\r\n private _currentIdControl: AbstractControl | null | undefined = null;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef<HTMLElement>,\r\n private readonly renderer: Renderer2,\r\n ) {\r\n this.inicializarProcesadorSimilitud();\r\n }\r\n\r\n @Input() set control(nuevoControl: AbstractControl | null | undefined) {\r\n this._control = nuevoControl;\r\n\r\n this.controlSubscription.unsubscribe();\r\n this.controlSubscription = new Subscription();\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n '🔄 [DSX-HELP DEBUG] El control cambió o fue reasignado por el Modal.',\r\n { hasControl: !!nuevoControl },\r\n );\r\n }\r\n\r\n if (this.helperFunction === 'similarity' && nuevoControl) {\r\n const valorInicial = nuevoControl.value;\r\n const textoInicial =\r\n valorInicial !== null && valorInicial !== undefined\r\n ? String(valorInicial).trim()\r\n : '';\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n '🚀 [DSX-HELP DEBUG] Evaluando valor inicial del control:',\r\n `\"${textoInicial}\"`,\r\n );\r\n }\r\n this.inputSubject$.next(textoInicial);\r\n\r\n this.controlSubscription.add(\r\n nuevoControl.valueChanges\r\n .pipe(debounceTime(350), distinctUntilChanged())\r\n .subscribe((value) => {\r\n if (this.debugMode) {\r\n console.log(\r\n '⌨️ [DSX-HELP DEBUG] Usuario escribiendo en el control ACTIVO:',\r\n value,\r\n );\r\n }\r\n const textoLimpio =\r\n value !== null && value !== undefined ? String(value).trim() : '';\r\n this.inputSubject$.next(textoLimpio);\r\n // 🔴 Resetear flag cuando el usuario escribe\r\n this.initialValidationDone = false;\r\n }),\r\n );\r\n }\r\n }\r\n\r\n get control(): AbstractControl | null | undefined {\r\n return this._control;\r\n }\r\n\r\n @Input() set currentIdControl(control: AbstractControl | null | undefined) {\r\n this._currentIdControl = control;\r\n\r\n this.currentIdSubscription.unsubscribe();\r\n this.currentIdSubscription = new Subscription();\r\n\r\n if (this.debugMode) {\r\n console.log('🆔 [DSX-HELP DEBUG] Control de ID configurado:', !!control);\r\n }\r\n\r\n if (control && this.helperFunction === 'similarity') {\r\n const idInicial = control.value;\r\n this.currentIdSubject$.next(idInicial);\r\n this.currentIdValue = idInicial;\r\n\r\n this.currentIdSubscription.add(\r\n control.valueChanges\r\n .pipe(debounceTime(100), distinctUntilChanged())\r\n .subscribe((id) => {\r\n if (this.debugMode) {\r\n console.log('🆔 [DSX-HELP DEBUG] ID actualizado:', id);\r\n }\r\n this.currentIdValue = id;\r\n this.currentIdSubject$.next(id);\r\n if (this.control?.value) {\r\n const textoActual = String(this.control.value).trim();\r\n this.inputSubject$.next(textoActual);\r\n }\r\n }),\r\n );\r\n }\r\n }\r\n\r\n get currentIdControl(): AbstractControl | null | undefined {\r\n return this._currentIdControl;\r\n }\r\n\r\n @Input() helperFunction: 'dateLong' | 'similarity' | string = 'dateLong';\r\n @Input() dataSource: any | any[] | Observable<any[]> | null | undefined =\r\n null;\r\n @Input() key?: string;\r\n @Input() umbral: number = 0.5;\r\n @Input() debugMode: boolean = false;\r\n @Input() idFieldName: string = 'id';\r\n @Input() maxSugerencias: number = 5;\r\n\r\n // 🔴 Método público para validación manual (opcional)\r\n public triggerValidation(): void {\r\n if (this.helperFunction === 'similarity' && this.control?.value) {\r\n const textoActual = String(this.control.value).trim();\r\n if (textoActual) {\r\n if (this.debugMode) {\r\n console.log('🎯 [DSX-HELP DEBUG] Validación manual:', textoActual);\r\n }\r\n this.inputSubject$.next(textoActual);\r\n }\r\n }\r\n }\r\n\r\n // 🔴 Validación inicial automática\r\n private triggerInitialValidation(): void {\r\n if (this.initialValidationDone) return;\r\n\r\n if (this.helperFunction === 'similarity' && this.control?.value) {\r\n const textoActual = String(this.control.value).trim();\r\n if (textoActual && this.sugerenciasDetectadas.length === 0) {\r\n if (this.debugMode) {\r\n console.log(\r\n '🎯 [DSX-HELP DEBUG] Validación inicial automática:',\r\n textoActual,\r\n );\r\n }\r\n this.inputSubject$.next(textoActual);\r\n this.initialValidationDone = true;\r\n }\r\n }\r\n }\r\n\r\n private obtenerIdDelItem(item: any): any {\r\n if (!item || typeof item !== 'object') return null;\r\n\r\n if (this.idFieldName && item[this.idFieldName] !== undefined) {\r\n return item[this.idFieldName];\r\n }\r\n\r\n const camposComunes = [\r\n 'id',\r\n 'ID',\r\n 'Id',\r\n 'requisitoId',\r\n 'categoriaId',\r\n 'productoId',\r\n 'userId',\r\n 'empresaId',\r\n ];\r\n for (const campo of camposComunes) {\r\n if (item[campo] !== undefined && item[campo] !== null) {\r\n if (this.debugMode) {\r\n console.log(\r\n `🔍 [DSX-HELP DEBUG] ID encontrado en campo: ${campo} = ${item[campo]}`,\r\n );\r\n }\r\n return item[campo];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private inicializarProcesadorSimilitud(): void {\r\n this.procesadorSubscription.add(\r\n this.inputSubject$\r\n .pipe(\r\n switchMap((textoIngresado) => {\r\n if (this.debugMode) {\r\n console.log(\r\n '🧪 [DSX-HELP DEBUG] Procesador activado para analizar:',\r\n `\"${textoIngresado}\"`,\r\n `ID actual: ${this.currentIdValue}`,\r\n `Tipo ID actual: ${typeof this.currentIdValue}`,\r\n );\r\n }\r\n\r\n if (!textoIngresado || textoIngresado.trim() === '') {\r\n if (this.debugMode)\r\n console.log(\r\n '⚠️ [DSX-HELP DEBUG] Texto vacío, limpiando sugerencia.',\r\n );\r\n return of([]);\r\n }\r\n\r\n if (!this.dataSource) {\r\n if (this.debugMode)\r\n console.log(\r\n '❌ [DSX-HELP DEBUG] dataSource es nulo o inválido.',\r\n );\r\n return of([]);\r\n }\r\n\r\n let data$: Observable<any>;\r\n\r\n if (typeof this.dataSource === 'function') {\r\n data$ = of((this.dataSource as Function)());\r\n } else if (isObservable(this.dataSource)) {\r\n // 🔴 Aplicar shareReplay para evitar múltiples suscripciones\r\n data$ = this.dataSource.pipe(shareReplay(1));\r\n } else {\r\n data$ = of(this.dataSource);\r\n }\r\n\r\n return data$.pipe(\r\n map((items) => {\r\n const coleccion: any[] = Array.isArray(items)\r\n ? items\r\n : (items && (items as any).data) || [];\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `📊 [DSX-HELP DEBUG] Total items en colección: ${coleccion.length}`,\r\n );\r\n if (this.currentIdValue) {\r\n const itemActual = coleccion.find((item) => {\r\n const itemId = this.obtenerIdDelItem(item);\r\n return (\r\n itemId && String(itemId) === String(this.currentIdValue)\r\n );\r\n });\r\n if (itemActual) {\r\n console.log(\r\n `✅ [DSX-HELP DEBUG] Item actual encontrado en colección:`,\r\n {\r\n id: this.obtenerIdDelItem(itemActual),\r\n [this.key || 'nombre']:\r\n itemActual[this.key || 'nombre'],\r\n },\r\n );\r\n } else {\r\n console.log(\r\n `⚠️ [DSX-HELP DEBUG] No se encontró el item con ID ${this.currentIdValue} en la colección`,\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (coleccion.length === 0) {\r\n if (this.debugMode)\r\n console.log(\r\n '⚠️ [DSX-HELP DEBUG] Colección vacía, esperando datos...',\r\n );\r\n return [];\r\n }\r\n\r\n let itemsAComparar = coleccion;\r\n\r\n if (this.currentIdValue) {\r\n itemsAComparar = coleccion.filter((item) => {\r\n if (!item || typeof item !== 'object') return true;\r\n const itemId = this.obtenerIdDelItem(item);\r\n const excluir =\r\n itemId && String(itemId) === String(this.currentIdValue);\r\n\r\n if (excluir && this.debugMode) {\r\n console.log(\r\n `🚫 [DSX-HELP DEBUG] Excluyendo item con ID ${itemId} de la comparación`,\r\n );\r\n }\r\n\r\n return !excluir;\r\n });\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `📊 [DSX-HELP DEBUG] Items después de filtrar: ${itemsAComparar.length} (excluido ID: ${this.currentIdValue})`,\r\n );\r\n }\r\n }\r\n\r\n const coincidencias = itemsAComparar\r\n .map((item) => {\r\n const textoAComparar =\r\n this.key && item && typeof item === 'object'\r\n ? item[this.key]\r\n : item;\r\n if (typeof textoAComparar !== 'string') return null;\r\n\r\n const porcentaje = calcularSimilitud(\r\n textoIngresado,\r\n textoAComparar,\r\n );\r\n\r\n if (this.debugMode && porcentaje >= this.umbral) {\r\n console.log(\r\n `🎯 [DSX-HELP DEBUG] Coincidencia encontrada! Comparando: In(\"${limpiarTexto(textoIngresado)}\") vs BD(\"${limpiarTexto(textoAComparar)}\") | Similitud: ${(porcentaje * 100).toFixed(1)}%`,\r\n );\r\n } else if (this.debugMode && porcentaje > 0) {\r\n console.log(\r\n `⚖️ [DSX-HELP DEBUG] Comparando: In(\"${limpiarTexto(textoIngresado)}\") vs BD(\"${limpiarTexto(textoAComparar)}\") | Similitud: ${(porcentaje * 100).toFixed(1)}%`,\r\n );\r\n }\r\n\r\n if (porcentaje >= this.umbral) {\r\n return {\r\n texto: this.key ? item[this.key] : item,\r\n similitud: porcentaje,\r\n };\r\n }\r\n return null;\r\n })\r\n .filter(\r\n (item): item is { texto: string; similitud: number } =>\r\n item !== null,\r\n )\r\n .sort((a, b) => b.similitud - a.similitud)\r\n .slice(0, this.maxSugerencias);\r\n\r\n if (this.debugMode) {\r\n console.log(\r\n `✅ [DSX-HELP DEBUG] Total coincidencias encontradas: ${coincidencias.length}`,\r\n );\r\n if (coincidencias.length > 0) {\r\n console.log(\r\n `📋 [DSX-HELP DEBUG] Coincidencias:`,\r\n coincidencias.map((c) => ({\r\n texto: c.texto,\r\n similitud: c.similitud,\r\n })),\r\n );\r\n }\r\n }\r\n\r\n return coincidencias;\r\n }),\r\n );\r\n }),\r\n )\r\n .subscribe((sugerencias) => {\r\n this.sugerenciasDetectadas = sugerencias;\r\n if (this.debugMode) {\r\n console.log(\r\n '🔄 [DSX-HELP DEBUG] Resultado asignado a la vista. Coincidencias encontradas:',\r\n sugerencias.length,\r\n );\r\n }\r\n this.syncFloatLabelSpacing();\r\n }),\r\n );\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.floatLabelElement = this.elementRef.nativeElement.closest(\r\n '.p-floatlabel',\r\n ) as HTMLElement | null;\r\n if (this.floatLabelElement) {\r\n this.previousInlineMarginBottom =\r\n this.floatLabelElement.style.marginBottom;\r\n this.syncFloatLabelSpacing();\r\n }\r\n\r\n // 🔴 Ejecutar validación inicial después de que la vista esté lista\r\n setTimeout(() => {\r\n this.triggerInitialValidation();\r\n }, 300);\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.syncFloatLabelSpacing();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.controlSubscription.unsubscribe();\r\n this.currentIdSubscription.unsubscribe();\r\n this.procesadorSubscription.unsubscribe();\r\n\r\n if (this.floatLabelElement && this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n } else if (this.floatLabelElement) {\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n }\r\n\r\n getHelpMessage(): string | null {\r\n if (this.helperFunction === 'dateLong') {\r\n return this.buildDateLongMessage();\r\n }\r\n if (\r\n this.helperFunction === 'similarity' &&\r\n this.sugerenciasDetectadas.length > 0\r\n ) {\r\n if (this.sugerenciasDetectadas.length === 1) {\r\n return `Existe una coincidencia: \"${this.sugerenciasDetectadas[0].texto}\". ¿Deseas agregarla de todos modos?`;\r\n } else {\r\n const listaCoincidencias = this.sugerenciasDetectadas\r\n .map((sug) => `\"${sug.texto}\"`)\r\n .join(', ');\r\n return `Existen ${this.sugerenciasDetectadas.length} coincidencias: ${listaCoincidencias}. ¿Deseas agregarla de todos modos?`;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n isHelpVisible(): boolean {\r\n if (!this.control) return false;\r\n if (this.helperFunction === 'dateLong') {\r\n if (this.control.disabled) return !!this.getHelpMessage();\r\n if (!this.control.valid) return false;\r\n return !!this.getHelpMessage();\r\n }\r\n if (this.helperFunction === 'similarity') {\r\n return this.sugerenciasDetectadas.length > 0;\r\n }\r\n return false;\r\n }\r\n\r\n private syncFloatLabelSpacing(): void {\r\n if (!this.floatLabelElement) return;\r\n const isVisible = this.isHelpVisible();\r\n if (isVisible === this.lastAppliedVisibleState) return;\r\n this.lastAppliedVisibleState = isVisible;\r\n\r\n if (isVisible) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.defaultFloatLabelHelpSpace,\r\n );\r\n } else if (this.previousInlineMarginBottom) {\r\n this.renderer.setStyle(\r\n this.floatLabelElement,\r\n 'margin-bottom',\r\n this.previousInlineMarginBottom,\r\n );\r\n } else {\r\n this.renderer.removeStyle(this.floatLabelElement, 'margin-bottom');\r\n }\r\n }\r\n\r\n private buildDateLongMessage(): string | null {\r\n const rawValue = this.getControlValue();\r\n if (!rawValue) return null;\r\n const date = this.parseDateInput(rawValue);\r\n if (!date) return null;\r\n\r\n const formattedDate = new Intl.DateTimeFormat('es-GT', {\r\n weekday: 'long',\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n }).format(date);\r\n\r\n return formattedDate.charAt(0).toUpperCase() + formattedDate.slice(1);\r\n }\r\n\r\n private getControlValue(): unknown {\r\n if (!this.control) return null;\r\n if (this.control.disabled && 'getRawValue' in this.control) {\r\n return (this.control as any).getRawValue();\r\n }\r\n return this.control.value;\r\n }\r\n\r\n private parseDateInput(value: unknown): Date | null {\r\n if (value instanceof Date)\r\n return Number.isNaN(value.getTime()) ? null : value;\r\n if (typeof value === 'string') {\r\n const ddmmyyyyMatch = value.match(/^(\\d{2})-(\\d{2})-(\\d{4})$/);\r\n if (ddmmyyyyMatch)\r\n return new Date(\r\n Number(ddmmyyyyMatch[3]),\r\n Number(ddmmyyyyMatch[2]) - 1,\r\n Number(ddmmyyyyMatch[1]),\r\n );\r\n const shortDateMatch = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (shortDateMatch)\r\n return new Date(\r\n Number(shortDateMatch[1]),\r\n Number(shortDateMatch[2]) - 1,\r\n Number(shortDateMatch[3]),\r\n );\r\n const parsedDate = new Date(value);\r\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\r\n }\r\n return null;\r\n }\r\n}\r\n","<div class=\"dsx-help-slot\" [class.is-visible]=\"isHelpVisible()\">\r\n @if (isHelpVisible()) {\r\n <div\r\n class=\"dsx-help-message\"\r\n [class.is-warning]=\"helperFunction === 'similarity'\"\r\n >\r\n @if (helperFunction === \"similarity\") {\r\n <icon-dsx name=\"emergency_home\"></icon-dsx>\r\n } @else {\r\n <icon-dsx name=\"chat_info\"></icon-dsx>\r\n }\r\n <span>{{ getHelpMessage() }}</span>\r\n </div>\r\n }\r\n</div>\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\n/**\r\n * Valores válidos para el tema de SweetAlert2.\r\n * Esta constante permite autocompletado y validación en tiempo de compilación.\r\n *\r\n * @example\r\n * ```typescript\r\n * // En environment.ts\r\n * export const environment: EnvironmentConfig = {\r\n * // ...otros campos\r\n * sweetAlertTheme: 'dark', // ✅ Autocompletado disponible\r\n * };\r\n * ```\r\n */\r\nexport const SWEET_ALERT_THEMES = [\r\n 'auto',\r\n 'light',\r\n 'dark',\r\n 'minimal',\r\n 'borderless',\r\n 'bootstrap-4',\r\n 'bootstrap-4-light',\r\n 'bootstrap-4-dark',\r\n 'bootstrap-5',\r\n 'bootstrap-5-light',\r\n 'bootstrap-5-dark',\r\n 'material-ui',\r\n 'material-ui-light',\r\n 'material-ui-dark',\r\n 'embed-iframe',\r\n 'bulma',\r\n 'bulma-light',\r\n 'bulma-dark',\r\n 'default',\r\n 'wordpress-admin',\r\n] as const;\r\n\r\n/**\r\n * Tipo literal para los temas válidos de SweetAlert2.\r\n * Se genera automáticamente desde la constante SWEET_ALERT_THEMES.\r\n */\r\nexport type SweetAlertThemeType = (typeof SWEET_ALERT_THEMES)[number];\r\n\r\n/**\r\n * Esquema de configuración del entorno - Fuente única de verdad (Single Source of Truth)\r\n *\r\n * Este objeto define todos los campos requeridos y sus tipos esperados para la configuración del entorno.\r\n * Sirve como referencia automática para:\r\n * - Generar el tipo TypeScript `EnvironmentConfig`\r\n * - Validar la presencia de campos requeridos\r\n * - Validar los tipos de datos en runtime\r\n * - Detectar automáticamente campos que requieren validación especial (URLs)\r\n *\r\n * **Cómo agregar una nueva propiedad:**\r\n * 1. Agrégala a este objeto con su tipo: 'string', 'boolean' o 'number'\r\n * 2. Todo lo demás se actualiza automáticamente (tipo TypeScript, validaciones, etc.)\r\n *\r\n * @example\r\n * ```typescript\r\n * const ENVIRONMENT_SCHEMA = {\r\n * production: 'boolean' as const,\r\n * myAppUrl: 'string' as const,\r\n * apiTimeout: 'number' as const, // ← Agregar nueva propiedad\r\n * } as const;\r\n * ```\r\n *\r\n * @internal\r\n */\r\nconst ENVIRONMENT_SCHEMA = {\r\n production: 'boolean' as const,\r\n myAppUrl: 'string' as const,\r\n SeguridadITApiUrl: 'string' as const,\r\n tokenName: 'string' as const,\r\n tokenPurpose: 'string' as const,\r\n tokenNameRF: 'string' as const,\r\n sessionStatus: 'string' as const,\r\n refreshTokenExpiry: 'string' as const,\r\n rolIndex: 'number' as const,\r\n} as const;\r\n\r\n/**\r\n * Tipo que define la configuración del entorno de la aplicación.\r\n *\r\n * Este tipo se genera automáticamente a partir de `ENVIRONMENT_SCHEMA` usando\r\n * TypeScript mapped types. No es necesario mantenerlo manualmente.\r\n *\r\n * **Características:**\r\n * - Se sincroniza automáticamente con ENVIRONMENT_SCHEMA\r\n * - Proporciona autocompletado en IDEs\r\n * - Garantiza type-safety en tiempo de compilación\r\n * - Se valida en runtime usando `provideEnvironment()`\r\n *\r\n * **Campos requeridos:**\r\n * @property production - Indica si la aplicación está en modo producción\r\n * @property myAppUrl - URL base de la aplicación principal (debe incluir protocolo http:// o https://)\r\n * @property SeguridadITApiUrl - URL base de la API de seguridad (debe incluir protocolo http:// o https://)\r\n * @property tokenName - Nombre del token de acceso en el almacenamiento local/sesión\r\n * @property tokenPurpose - Nombre del token de propósito para recursos sensibles\r\n * @property tokenNameRF - Nombre del refresh token en el almacenamiento local/sesión\r\n * @property sessionStatus - Nombre de la clave para el estado de sesión\r\n * @property refreshTokenExpiry - Tiempo de expiración del refresh token (ej: \"7d\", \"24h\")\r\n * @property rolIndex - Índice lógico (1-based) del rol principal asociado al entorno\r\n *\r\n * **Campos opcionales:**\r\n * @property sweetAlertTheme - Tema visual global para SweetAlert2 ('auto' | 'light' | 'dark' | 'default' | 'bootstrap-4' | 'borderless' | 'bulma' | 'material-ui' | 'minimal' | 'wordpress-admin')\r\n *\r\n * @example\r\n * ```typescript\r\n * // En tu archivo environment.ts\r\n * import { EnvironmentConfig } from '@devsoftxela/ngx-dsx';\r\n *\r\n * export const environment: EnvironmentConfig = {\r\n * production: false,\r\n * myAppUrl: 'http://localhost:4200/',\r\n * SeguridadITApiUrl: 'http://localhost:5000/',\r\n * tokenName: 'access_token',\r\n * tokenPurpose: 'token-Purpose',\r\n * tokenNameRF: 'refresh_token',\r\n * sessionStatus: 'session_status',\r\n * refreshTokenExpiry: '7d',\r\n * sweetAlertTheme: 'dark' // ← Tema global para alertas (opcional)\r\n * };\r\n * ```\r\n */\r\nexport type EnvironmentConfig = {\r\n [K in keyof typeof ENVIRONMENT_SCHEMA]: (typeof ENVIRONMENT_SCHEMA)[K] extends 'string'\r\n ? string\r\n : (typeof ENVIRONMENT_SCHEMA)[K] extends 'boolean'\r\n ? boolean\r\n : (typeof ENVIRONMENT_SCHEMA)[K] extends 'number'\r\n ? number\r\n : never;\r\n} & {\r\n /**\r\n * Tema visual global para las alertas SweetAlert2.\r\n * Es opcional. Si no se define, se usará el tema por defecto de SweetAlert2.\r\n *\r\n * Valores válidos: 'auto' | 'light' | 'dark' | 'default' | 'bootstrap-4' |\r\n * 'borderless' | 'bulma' | 'material-ui' | 'minimal' | 'wordpress-admin'\r\n *\r\n * @example\r\n * ```typescript\r\n * sweetAlertTheme: 'dark' // Tema oscuro\r\n * sweetAlertTheme: 'minimal' // Tema minimalista\r\n * sweetAlertTheme: 'auto' // Detecta según preferencias del sistema\r\n * ```\r\n */\r\n /**\r\n * Tema visual global para las alertas SweetAlert2.\r\n *\r\n * Se define como `SweetAlertThemeType` para que TypeScript emita un error\r\n * en tiempo de compilación cuando se utilice un valor no válido.\r\n *\r\n * Si por alguna razón necesitas permitir cadenas arbitrarias (no\r\n * recomendadas), utiliza `EnvironmentConfigLenient` exportado más abajo.\r\n */\r\n sweetAlertTheme?: SweetAlertThemeType;\r\n sweetAlertFooter?: string;\r\n /**\r\n * Controla el comportamiento global al guardar un registro nuevo (id === 0)\r\n * en utilidades como `handleResponseService`.\r\n *\r\n * - true: al éxito, navega automáticamente al listado (`urlHome`).\r\n * - false: permanece en la vista actual y ejecuta `getForm()` + `form.reset()`.\r\n *\r\n * Puede sobrescribirse por llamada usando el parámetro opcional\r\n * `navigateOnCreateSuccess` en `handleResponseService`.\r\n */\r\n navigateToListOnCreateSuccess?: boolean;\r\n /**\r\n * Control global para mostrar el botón de tipo `validate` (Validar).\r\n *\r\n * - false: oculta el botón por defecto.\r\n * - true: muestra el botón en toda la aplicación.\r\n *\r\n * Puede sobrescribirse por instancia desde `dsx-button` con\r\n * `showValidateButtonOverride`.\r\n */\r\n showValidateButton?: boolean;\r\n /**\r\n * Control global para mostrar el botón de tipo `restore` (Restaurar).\r\n *\r\n * - false: oculta el botón por defecto.\r\n * - true: muestra el botón en toda la aplicación.\r\n *\r\n * Puede sobrescribirse por instancia desde `dsx-button` con\r\n * `showRestoreButtonOverride`.\r\n */\r\n showRestoreButton?: boolean;\r\n /**\r\n * Control global para mostrar el mensaje toast al invalidar cache.\r\n *\r\n * - false: no muestra toast al ejecutar `cacheService.invalidate(...)`.\r\n * - true: muestra toast por defecto al invalidar cache.\r\n *\r\n * Puede sobrescribirse por llamada con el parámetro opcional\r\n * `showUpdatedCacheMessage` de `cacheService.invalidate(...)`.\r\n */\r\n showUpdatedCacheMessage?: boolean;\r\n /**\r\n * Lista de roles que se utilizan para las guardas de rutas.\r\n * Debe ser un arreglo no vacío de strings.\r\n */\r\n rolesGuards: string[];\r\n /**\r\n * Dominio compartido para cookies entre subdominios en ambientes locales.\r\n * Es opcional y solo necesario en ambientes locales sin certificado.\r\n *\r\n * **Formato requerido:**\r\n * - Debe empezar con un punto (.)\r\n * - Debe tener al menos dos partes separadas por puntos\r\n * - Solo caracteres alfanuméricos, puntos y guiones\r\n *\r\n * **Ejemplos válidos:**\r\n * - `.inalsa.local` → cookies compartidas entre `rrhh.inalsa.local`, `venta.inalsa.local`, etc.\r\n * - `.express.local` → cookies compartidas entre `app2.express.local`, `app3.express.local`, etc.\r\n * - `.example.com` → cookies compartidas en ambiente local con dominio personalizado\r\n *\r\n * **Ejemplos inválidos:**\r\n * - `inalsa.local` ❌ (falta el punto inicial)\r\n * - `.inalsa` ❌ (necesita al menos dos partes)\r\n * - `. inalsa.local` ❌ (contiene espacios)\r\n *\r\n * **Comportamiento:**\r\n * - Se valida automáticamente al iniciar la aplicación con `provideEnvironment()`\r\n * - En ambiente HTTPS público sin `cookieDomain`, se usa automáticamente `.itgtxela.com`\r\n * - Si no está configurado en ambiente local, las cookies no se compartirán entre subdominios\r\n *\r\n * @example\r\n * ```typescript\r\n * // En environment.ts (ambiente local)\r\n * export const environment: EnvironmentConfig = {\r\n * production: true,\r\n * cookieDomain: '.inalsa.local', // ✅ Válido\r\n * // ... otros campos\r\n * };\r\n *\r\n * // En environment.prod.ts (HTTPS público)\r\n * export const environment: EnvironmentConfig = {\r\n * production: true,\r\n * // Sin cookieDomain → usa automáticamente .itgtxela.com\r\n * // ... otros campos\r\n * };\r\n * ```\r\n *\r\n * @throws Error si el formato es inválido durante la validación del environment\r\n */\r\n cookieDomain?: string;\r\n};\r\n\r\n/**\r\n * Variante leniente del tipo `EnvironmentConfig` que permite strings\r\n * arbitrarios en `sweetAlertTheme` (mantiene compatibilidad hacia atrás).\r\n *\r\n * Úsalo solo si realmente necesitas pasar valores no listados en\r\n * `SWEET_ALERT_THEMES` y entiendes que no habrá chequeo estático.\r\n */\r\nexport type EnvironmentConfigLenient = Omit<\r\n EnvironmentConfig,\r\n 'sweetAlertTheme'\r\n> & {\r\n sweetAlertTheme?: SweetAlertThemeType | (string & {});\r\n};\r\n\r\n/**\r\n * Token de inyección de dependencias para la configuración del entorno.\r\n *\r\n * Este token se utiliza para inyectar la configuración del entorno en servicios y componentes.\r\n * **IMPORTANTE:** No uses este token directamente en providers. En su lugar, usa la función\r\n * `provideEnvironment()` que incluye validación automática.\r\n *\r\n * @example\r\n * ```typescript\r\n * // ✅ Forma correcta - En tu configuración de app\r\n * import { provideEnvironment } from '@devsoftxela/ngx-dsx';\r\n * import { environment } from './environments/environment';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideEnvironment(environment), // ← Con validación automática\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // ✅ Forma correcta - Inyectar en servicios\r\n * import { inject } from '@angular/core';\r\n * import { ENVIRONMENT, EnvironmentConfig } from '@devsoftxela/ngx-dsx';\r\n *\r\n * export class MiServicio {\r\n * private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // ❌ Forma incorrecta - Sin validación\r\n * providers: [\r\n * { provide: ENVIRONMENT, useValue: environment } // ← Sin validación\r\n * ]\r\n * ```\r\n *\r\n * @see {@link provideEnvironment} para configurar con validación\r\n * @see {@link EnvironmentConfig} para la estructura de datos\r\n */\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig',\r\n);\r\n\r\n/**\r\n * Valida que la configuración del entorno esté completa y correctamente configurada.\r\n *\r\n * Esta función verifica que:\r\n * - La configuración del entorno no sea null o undefined\r\n * - Todas las propiedades requeridas estén presentes y no estén vacías\r\n * - Las URLs tengan un formato válido\r\n *\r\n * @param environment - Configuración del entorno a validar\r\n * @throws Error si alguna validación falla, con un mensaje descriptivo del problema\r\n *\r\n * @example\r\n * ```typescript\r\n * const config: EnvironmentConfig = { ... };\r\n * validateEnvironmentConfig(config);\r\n * ```\r\n */\r\nexport function validateEnvironmentConfig(\r\n environment: EnvironmentConfig,\r\n): void {\r\n if (!environment) {\r\n throw new Error(\r\n '[ENVIRONMENT] La configuración del entorno no está definida. ' +\r\n 'Asegúrate de proporcionar una configuración válida usando provideEnvironment().',\r\n );\r\n }\r\n\r\n // Obtener automáticamente todos los campos requeridos del schema\r\n // Usamos keyof typeof ENVIRONMENT_SCHEMA para solo validar campos del schema base\r\n const requiredFields = Object.keys(\r\n ENVIRONMENT_SCHEMA,\r\n ) as (keyof typeof ENVIRONMENT_SCHEMA)[];\r\n\r\n const missingFields: string[] = [];\r\n const emptyFields: string[] = [];\r\n const wrongTypeFields: string[] = [];\r\n\r\n // Validar que todos los campos requeridos existan, no estén vacíos y tengan el tipo correcto\r\n requiredFields.forEach((field) => {\r\n const expectedType = ENVIRONMENT_SCHEMA[field];\r\n\r\n if (!(field in environment)) {\r\n missingFields.push(field);\r\n } else if (\r\n environment[field] === null ||\r\n environment[field] === undefined\r\n ) {\r\n emptyFields.push(field);\r\n } else {\r\n // Validar tipo de dato\r\n const actualType = typeof environment[field];\r\n if (actualType !== expectedType) {\r\n wrongTypeFields.push(\r\n `${field} (esperado: ${expectedType}, recibido: ${actualType})`,\r\n );\r\n }\r\n\r\n // Validar que strings no estén vacíos\r\n if (\r\n expectedType === 'string' &&\r\n typeof environment[field] === 'string' &&\r\n (environment[field] as string).trim() === ''\r\n ) {\r\n emptyFields.push(field);\r\n }\r\n }\r\n });\r\n\r\n // Reportar campos faltantes\r\n if (missingFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Faltan los siguientes campos en la configuración del entorno: ${missingFields.join(\r\n ', ',\r\n )}. ` + 'Por favor, verifica tu configuración de environment.',\r\n );\r\n }\r\n\r\n // Reportar campos vacíos\r\n if (emptyFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Los siguientes campos están vacíos en la configuración del entorno: ${emptyFields.join(\r\n ', ',\r\n )}. ` + 'Por favor, proporciona valores válidos para estos campos.',\r\n );\r\n }\r\n\r\n // Reportar campos con tipo incorrecto\r\n if (wrongTypeFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Los siguientes campos tienen un tipo de dato incorrecto: ${wrongTypeFields.join(\r\n ', ',\r\n )}. ` + 'Por favor, corrige los tipos de datos.',\r\n );\r\n }\r\n\r\n // Validar formato de URLs (solo para campos que contengan 'url' en su nombre)\r\n requiredFields.forEach((field) => {\r\n if (\r\n field.toLowerCase().includes('url') &&\r\n typeof environment[field] === 'string'\r\n ) {\r\n validateUrl(field as string, environment[field] as string);\r\n }\r\n });\r\n\r\n // Validar rolesGuards\r\n if (\r\n !Array.isArray(environment.rolesGuards) ||\r\n environment.rolesGuards.length === 0 ||\r\n !environment.rolesGuards.every(\r\n (r) => typeof r === 'string' && r.trim().length > 0,\r\n )\r\n ) {\r\n throw new Error(\r\n \"[ENVIRONMENT] El campo 'rolesGuards' debe ser un arreglo no vacío de cadenas de texto válidas.\",\r\n );\r\n }\r\n\r\n // Validar sweetAlertTheme si está definido: emitir warning y usar tema por defecto si es inválido\r\n if (\r\n environment.sweetAlertTheme !== undefined &&\r\n typeof environment.sweetAlertTheme === 'string'\r\n ) {\r\n const allowedThemes = SWEET_ALERT_THEMES as readonly string[];\r\n if (!allowedThemes.includes(environment.sweetAlertTheme)) {\r\n console.warn(\r\n `[ENVIRONMENT] Valor no reconocido para 'sweetAlertTheme': '${environment.sweetAlertTheme}'. Temas válidos: ${allowedThemes.join(\r\n ', ',\r\n )}. Se usará el tema por defecto de SweetAlert2.`,\r\n );\r\n }\r\n }\r\n\r\n // Validar cookieDomain si está definido\r\n if (environment.cookieDomain !== undefined) {\r\n validateCookieDomain(environment.cookieDomain);\r\n }\r\n\r\n // Validar showUpdatedCacheMessage si está definido\r\n if (\r\n environment.showUpdatedCacheMessage !== undefined &&\r\n typeof environment.showUpdatedCacheMessage !== 'boolean'\r\n ) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'showUpdatedCacheMessage' debe ser boolean. ` +\r\n `Tipo recibido: ${typeof environment.showUpdatedCacheMessage}.`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Valida que cookieDomain tenga un formato correcto para cookies.\r\n *\r\n * Reglas de validación:\r\n * - Debe ser un string no vacío\r\n * - Debe empezar con un punto (.)\r\n * - No puede contener espacios en blanco\r\n * - Solo puede contener caracteres alfanuméricos, puntos y guiones\r\n * - Debe tener al menos dos partes separadas por puntos (ej: .inalsa.local)\r\n *\r\n * Ejemplos válidos:\r\n * - `.inalsa.local`\r\n * - `.express.local`\r\n * - `.example.com`\r\n * - `.site.co.uk`\r\n *\r\n * Ejemplos inválidos:\r\n * - `inalsa.local` (falta el punto inicial)\r\n * - `.inalsa` (necesita al menos dos partes)\r\n * - `. inalsa.local` (contiene espacios)\r\n * - `.inalsa..local` (puntos consecutivos)\r\n *\r\n * @param cookieDomain - Dominio a validar\r\n * @throws Error si el dominio tiene un formato inválido\r\n */\r\nfunction validateCookieDomain(cookieDomain: unknown): void {\r\n // Validar tipo de dato\r\n if (typeof cookieDomain !== 'string') {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' debe ser una cadena de texto. ` +\r\n `Tipo recibido: ${typeof cookieDomain}. Valor: ${cookieDomain}`,\r\n );\r\n }\r\n\r\n const domain = cookieDomain.trim();\r\n\r\n // Validar que no esté vacío\r\n if (domain.length === 0) {\r\n throw new Error(\r\n \"[ENVIRONMENT] El campo 'cookieDomain' no puede estar vacío. \" +\r\n 'Si no necesitas un dominio compartido, omite este campo.',\r\n );\r\n }\r\n\r\n // Validar que empiece con un punto\r\n if (!domain.startsWith('.')) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' debe empezar con un punto (.). ` +\r\n `Valor inválido: '${domain}'. ` +\r\n \"Ejemplo correcto: '.inalsa.local'\",\r\n );\r\n }\r\n\r\n // Validar que no contenga espacios\r\n if (/\\s/.test(domain)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' no puede contener espacios en blanco. ` +\r\n `Valor inválido: '${domain}'`,\r\n );\r\n }\r\n\r\n // Validar caracteres permitidos: alfanuméricos, puntos y guiones\r\n if (!/^(\\.[a-zA-Z0-9-]+)+$/.test(domain)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' contiene caracteres no permitidos. ` +\r\n `Valor inválido: '${domain}'. ` +\r\n 'Solo se permiten caracteres alfanuméricos, puntos (.) y guiones (-). ' +\r\n \"Ejemplo correcto: '.inalsa.local'\",\r\n );\r\n }\r\n\r\n // Validar que tenga al menos dos partes (ej: .inalsa.local)\r\n const parts = domain.split('.').filter((part) => part.length > 0);\r\n if (parts.length < 2) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' debe tener al menos dos partes separadas por puntos. ` +\r\n `Valor inválido: '${domain}'. ` +\r\n \"Ejemplos correctos: '.inalsa.local', '.express.local'\",\r\n );\r\n }\r\n\r\n // Validar que no haya puntos consecutivos\r\n if (domain.includes('..')) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo 'cookieDomain' no puede tener puntos consecutivos. ` +\r\n `Valor inválido: '${domain}'. ` +\r\n \"Ejemplo correcto: '.inalsa.local'\",\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Valida que una URL tenga un formato válido.\r\n * Permite tanto URLs absolutas (http://..., https://...) como rutas relativas (/, /api, etc.).\r\n *\r\n * @param fieldName - Nombre del campo para mensajes de error\r\n * @param url - URL a validar\r\n * @throws Error si la URL no tiene un formato válido\r\n */\r\nfunction validateUrl(fieldName: string, url: string): void {\r\n // Patrón para rutas relativas (comienzan con /)\r\n const relativePathPattern = /^\\/[^/]*/;\r\n\r\n // Si es una ruta relativa, solo validar que sea válida\r\n if (relativePathPattern.test(url)) {\r\n // Validar que la URL termine con '/' para evitar problemas de concatenación\r\n if (!url.endsWith('/')) {\r\n console.warn(\r\n `[ENVIRONMENT] Advertencia: El campo '${fieldName}' no termina con '/'. ` +\r\n `Valor actual: '${url}'. Se recomienda que las URLs base terminen con '/' para evitar problemas de concatenación.`,\r\n );\r\n }\r\n return; // La ruta relativa es válida\r\n }\r\n\r\n // Si no es una ruta relativa, debe ser una URL absoluta\r\n try {\r\n // Intentar crear un objeto URL para validar el formato\r\n new URL(url);\r\n } catch {\r\n // Si falla, verificar si al menos tiene un formato básico válido\r\n const urlPattern = /^https?:\\/\\/.+/;\r\n if (!urlPattern.test(url)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo '${fieldName}' no tiene un formato de URL válido. ` +\r\n `Valor actual: '${url}'. Debe ser una URL absoluta (http://... o https://...) o una ruta relativa que comience con /`,\r\n );\r\n }\r\n }\r\n\r\n // Validar que la URL termine con '/' para evitar problemas de concatenación\r\n if (!url.endsWith('/')) {\r\n console.warn(\r\n `[ENVIRONMENT] Advertencia: El campo '${fieldName}' no termina con '/'. ` +\r\n `Valor actual: '${url}'. Se recomienda que las URLs base terminen con '/' para evitar problemas de concatenación.`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Proporciona una configuración de entorno validada para la inyección de dependencias.\r\n *\r\n * Esta función crea un provider que valida automáticamente la configuración del entorno\r\n * cuando la aplicación se inicializa. Si la configuración es inválida, lanza un error\r\n * descriptivo que indica qué está mal configurado.\r\n *\r\n * @param environment - Configuración del entorno a proporcionar\r\n * @returns Provider de Angular configurado con la validación integrada\r\n *\r\n * @example\r\n * ```typescript\r\n * // En app.config.ts o main.ts\r\n * import { provideEnvironment } from './path/to/environment.token';\r\n * import { environment } from './environments/environment';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideEnvironment(environment),\r\n * // ... otros providers\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Para módulos (NgModule)\r\n * import { provideEnvironment } from './path/to/environment.token';\r\n * import { environment } from './environments/environment';\r\n *\r\n * @NgModule({\r\n * providers: [\r\n * provideEnvironment(environment),\r\n * // ... otros providers\r\n * ]\r\n * })\r\n * export class AppModule { }\r\n * ```\r\n */\r\nexport function provideEnvironment(environment: EnvironmentConfig): Provider {\r\n return {\r\n provide: ENVIRONMENT,\r\n useFactory: () => {\r\n // Validar la configuración al momento de la inyección\r\n validateEnvironmentConfig(environment);\r\n return environment;\r\n },\r\n };\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/parameterSecurity.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\r\n);\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { ServiceResult } from '../../models';\r\nimport { SeguridadITParameter } from '../../models/src/parameterSecurity.model';\r\nimport { DataLoginModel, DataToken } from '../../models/src/token.model';\r\n\r\n/**\r\n * Servicio de seguridad que gestiona la autenticación y autorización mediante tokens JWT.\r\n *\r\n * Este servicio proporciona métodos para:\r\n * - Refrescar tokens de acceso\r\n * - Revocar tokens de refresco\r\n * - Obtener parámetros de seguridad\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private securityService: SecurityService) {}\r\n *\r\n * refreshToken() {\r\n * this.securityService.tokenRefresh(this.refreshToken)\r\n * .subscribe(data => console.log(data));\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n /** Servicio HttpClient para realizar peticiones HTTP */\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Configuración del entorno inyectada mediante el token ENVIRONMENT.\r\n * La validación se realiza automáticamente al usar provideEnvironment().\r\n */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /** URL base de la API JWT construida desde la configuración del entorno */\r\n private urlApi: string = `${this.environment.myAppUrl}api/parameter`;\r\n private SeguridadITApiJwt: string = `${this.environment.SeguridadITApiUrl}api/jwt`;\r\n private SeguridadITApiJwtSensitiveData: string = `${this.environment.SeguridadITApiUrl}api/jwtSensitiveData`;\r\n\r\n /**\r\n * Obtiene un nuevo token de acceso utilizando un refresh token válido.\r\n *\r\n * Este método envía una solicitud POST al endpoint de refresco de token\r\n * y devuelve un nuevo par de tokens (access token y refresh token).\r\n *\r\n * @param refreshToken - El refresh token válido para obtener un nuevo token de acceso\r\n * @returns Observable que emite un objeto DataToken con el nuevo par de tokens\r\n *\r\n * @example\r\n * ```typescript\r\n * this.securityService.tokenRefresh('your-refresh-token')\r\n * .subscribe({\r\n * next: (data) => console.log('Nuevo token:', data.accessToken),\r\n * error: (err) => console.error('Error al refrescar token:', err)\r\n * });\r\n * ```\r\n */\r\n tokenRefresh(refreshToken: string): Observable<ServiceResult<DataToken>> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.post<ServiceResult<DataToken>>(\r\n `${this.SeguridadITApiJwt}/refresh-token/`,\r\n body,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Revoca un refresh token para invalidarlo y prevenir su uso futuro.\r\n *\r\n * Este método envía una solicitud POST al endpoint de revocación de token\r\n * para invalidar permanentemente el refresh token proporcionado.\r\n *\r\n * @param refreshToken - El refresh token que se desea revocar\r\n * @returns Observable que emite true si la revocación fue exitosa, false en caso contrario\r\n *\r\n * @example\r\n * ```typescript\r\n * this.securityService.tokenRevok('your-refresh-token')\r\n * .subscribe({\r\n * next: (success) => {\r\n * if (success) console.log('Token revocado exitosamente');\r\n * },\r\n * error: (err) => console.error('Error al revocar token:', err)\r\n * });\r\n * ```\r\n */\r\n tokenRevok(refreshToken: string): Observable<boolean> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n // Realiza una solicitud POST al endpoint de revocación de token\r\n return this.http.post<boolean>(\r\n `${this.SeguridadITApiJwt}/revoke-token/`,\r\n body,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n },\r\n );\r\n }\r\n\r\n /**\r\n *\r\n * @param credencial\r\n * @returns\r\n */\r\n tokenPurposeGenerate(\r\n credencial: DataLoginModel,\r\n ): Observable<ServiceResult<DataToken>> {\r\n return this.http.post<ServiceResult<DataToken>>(\r\n `${this.SeguridadITApiJwtSensitiveData}/token-purpose/`,\r\n credencial,\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene los parámetros de seguridad de la aplicación desde el servidor.\r\n *\r\n * Este método recupera la configuración de seguridad que incluye políticas de contraseñas,\r\n * tiempos de expiración de sesión, y otras configuraciones relacionadas con la seguridad.\r\n *\r\n * @param invalidCacheParam - Indica si se debe invalidar la caché del servidor.\r\n * Si es true, fuerza al servidor a devolver los datos más recientes\r\n * sin usar la caché. Por defecto es false.\r\n * @returns Observable que emite un objeto SeguridadITParameter con la configuración de seguridad\r\n *\r\n * @example\r\n * ```typescript\r\n * // Obtener parámetros usando caché\r\n * this.securityService.getParameterSecurity()\r\n * .subscribe(params => console.log('Parámetros:', params));\r\n *\r\n * // Obtener parámetros sin usar caché\r\n * this.securityService.getParameterSecurity(true)\r\n * .subscribe(params => console.log('Parámetros actualizados:', params));\r\n * ```\r\n */\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false,\r\n ): Observable<ServiceResult<SeguridadITParameter>> {\r\n // Crea los parámetros de la solicitud, incluyendo el parámetro invalidCacheParam,\r\n // parametro diseñado para invalidar la caché a traves del filtro\r\n const params = new HttpParams().set(\r\n 'invalidCacheParam',\r\n invalidCacheParam.toString(),\r\n );\r\n\r\n // Realiza una solicitud GET al endpoint de parámetros de seguridad\r\n return this.http.get<ServiceResult<SeguridadITParameter>>(\r\n `${this.urlApi}/security-parameter/`,\r\n { params },\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertResult,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport {\r\n ENVIRONMENT,\r\n SWEET_ALERT_THEMES,\r\n} from '../../injections/environment.token';\r\nimport { ResponseHttpModel } from '../../models/src/response-http.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n icono?: string;\r\n icon?: SweetAlertIcon;\r\n showConfirmButton?: boolean;\r\n confirmButtonText?: string;\r\n timer?: number;\r\n imageWidth?: number;\r\n imageHeight?: number;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private toastrService = inject(ToastrService);\r\n\r\n /**\r\n * Configuración del entorno inyectada (opcional).\r\n * Se usa para obtener el tema global de SweetAlert2 desde el environment.\r\n */\r\n private environment = inject(ENVIRONMENT, { optional: true });\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Se inicializa desde el environment si está configurado, o puede establecerse\r\n * manualmente llamando a setDefaultTheme().\r\n *\r\n * **Prioridad de temas:**\r\n * 1. Tema específico pasado en options de cada alerta\r\n * 2. Tema establecido con setDefaultTheme()\r\n * 3. Tema configurado en environment.sweetAlertTheme\r\n * 4. Tema por defecto de SweetAlert2\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n constructor() {\r\n // Inicializar el tema desde el environment si está disponible\r\n if (this.environment?.sweetAlertTheme) {\r\n const allowed = SWEET_ALERT_THEMES as readonly string[];\r\n const themeValue = this.environment.sweetAlertTheme;\r\n if (typeof themeValue === 'string' && !allowed.includes(themeValue)) {\r\n console.warn(\r\n `[AlertaService] Tema de SweetAlert2 inválido: '${themeValue}'. Se utilizará el tema por defecto.`,\r\n );\r\n } else {\r\n this.defaultTheme = themeValue as SweetAlertTheme;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Permite establecer el theme global para todas las alertas SweetAlert2.\r\n * Este tema sobrescribe el configurado en el environment.\r\n *\r\n * @param theme - Valor de theme válido para SweetAlert2 (por ejemplo: 'dark', 'minimal', etc).\r\n *\r\n * @example\r\n * ```typescript\r\n * // Cambiar el tema en tiempo de ejecución\r\n * alertaService.setDefaultTheme('dark');\r\n * ```\r\n */\r\n setDefaultTheme(theme: SweetAlertTheme) {\r\n this.defaultTheme = theme;\r\n }\r\n\r\n /**\r\n * Obtiene el tema actual configurado para SweetAlert2.\r\n * @returns El tema actual o undefined si no hay tema configurado.\r\n */\r\n getDefaultTheme(): SweetAlertTheme | undefined {\r\n return this.defaultTheme;\r\n }\r\n\r\n /**\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 4. bottom-center 5. bottom-right\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000,\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign,\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n /**\r\n * Muestra un diálogo de confirmación con SweetAlert2, espera la respuesta del usuario\r\n * y retorna `true` si confirmó o `false` si canceló/cerró.\r\n *\r\n * La imagen se precarga antes de mostrar el diálogo para evitar un parpadeo visual.\r\n *\r\n * @param title - Título principal del diálogo.\r\n * @param text - Cuerpo del mensaje; admite HTML (se inyecta como `html`).\r\n * @param icono - Ruta relativa de la imagen dentro de `assets/dsxResource/`.\r\n * Por defecto: `'icon2/garbage_make_empty_001.png'`.\r\n * @returns `Promise<boolean>` que resuelve en `true` si el usuario pulsó **Aceptar**,\r\n * o en `false` si pulsó **Cancelar** o cerró el diálogo.\r\n *\r\n * @example\r\n * // Uso con icono por defecto (papelera)\r\n * const confirmado = await this.alertaService.alertConfirm(\r\n * 'Eliminar',\r\n * 'Desea <strong>eliminar</strong> este registro?',\r\n * );\r\n *\r\n * @example\r\n * // Sobreescribir el icono pasando la ruta como tercer argumento\r\n * // La ruta es relativa a assets/dsxResource/\r\n * const confirmado = await this.alertaService.alertConfirm(\r\n * 'Archivar',\r\n * 'Desea <strong>archivar</strong> este registro?',\r\n * 'icon2/archive_001.png', // ← icono personalizado\r\n * );\r\n * @deprecated Este servicio sera sustuido\r\n */\r\n alertConfirm(\r\n title: string,\r\n text: string,\r\n icono: string = 'icon2/garbage_make_empty_001.png',\r\n ): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: `<strong>DEVSoftXela</strong> ${new Date().getFullYear()}`,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed),\r\n );\r\n }\r\n\r\n /**\r\n * Muestra una alerta de confirmación estándar para guardar o actualizar un registro.\r\n *\r\n * @param isNew - Indica si se trata de un nuevo registro (true = \"Salvar\", false = \"Actualizar\").\r\n * @returns Promise<boolean> que indica si el usuario confirmó la acción.\r\n */\r\n alertConfirmSaveOrUpdate(isNew: boolean): Promise<boolean> {\r\n const title = isNew ? 'Salvar' : 'Actualizar';\r\n const text = 'Desea <strong>guardar</strong> el registro?';\r\n const icono = 'icon2/save_2029637.png';\r\n return this.alertConfirm(title, text, icono);\r\n }\r\n\r\n /**\r\n * Variante de alerta de confirmación que recibe el id numérico del registro.\r\n *\r\n * Internamente evalúa si el registro es nuevo (`id === 0`) y delega en\r\n * alertConfirmSaveOrUpdate(isNew: boolean) para mostrar el mensaje.\r\n *\r\n * @param id - Identificador del registro. Se considera nuevo cuando `id === 0`.\r\n * @returns Promise<boolean> que indica si el usuario confirmó la acción.\r\n */\r\n alertConfirmSaveOrUpdateById(id: number): Promise<boolean> {\r\n const isNew = id === 0;\r\n return this.alertConfirmSaveOrUpdate(isNew);\r\n }\r\n\r\n /**\r\n * Muestra una alerta de confirmación estándar para eliminar, borrar (soft delete) o restaurar un registro.\r\n *\r\n * - Si se pasa un objeto con la propiedad `activo === false`, el mensaje se personaliza para \"Restaurar\".\r\n * - Si `activo` es true o no se envía, el comportamiento es el mismo de antes (Eliminar/Borrar según `softDelete`).\r\n *\r\n * @param softDelete - Si es true se muestra mensaje de borrado lógico, si es false eliminación definitiva.\r\n * @param data - Objeto opcional que puede incluir la propiedad `activo`. Si `activo === false` se mostrará un mensaje de restaurar.\r\n * @returns Promise<boolean> que indica si el usuario confirmó la acción.\r\n */\r\n alertConfirmDelete(\r\n softDelete: boolean,\r\n data?: { activo?: boolean },\r\n ): Promise<boolean> {\r\n const isActive = data?.activo; // true | false | undefined\r\n const isRestore = isActive === false; // solo si viene explícitamente en false\r\n\r\n const title = isRestore ? 'Restaurar' : 'Eliminar';\r\n\r\n const text = isRestore\r\n ? 'Desea <strong>restaurar</strong> el registro?'\r\n : softDelete\r\n ? 'Desea <strong>borrar</strong> el registro?'\r\n : 'Desea <strong>eliminar definitivmente</strong> el registro?';\r\n\r\n const icono = isRestore\r\n ? 'icon2/garbage_make_empty.png' // puedes usar otro icono de restaurar\r\n : softDelete\r\n ? 'icon2/recycle-bin_16854652.png'\r\n : 'icon2/delete2.png';\r\n\r\n return this.alertConfirm(title, text, icono);\r\n }\r\n\r\n alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'icon/notFound01.png',\r\n timer: number = 3500,\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i>${message}</i> <span> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n * Muestra una alerta visual personalizada usando SweetAlert2.\r\n *\r\n * Permite configurar el mensaje, el título, el icono, la imagen, el botón de confirmación,\r\n * el temporizador y el tema visual, entre otras opciones.\r\n *\r\n * @param titleAlert - Título principal de la alerta (obligatorio).\r\n * @param messageHtml - Mensaje en formato HTML (obligatorio).\r\n * @param options - Opciones configurables de la alerta (opcional). Permite personalizar icono, imagen, botón, temporizador, etc.\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta o cuando se cierra automáticamente.\r\n *\r\n * @example\r\n * // Alerta básica con icono de éxito y cierre automático\r\n * alertaHtmlSuccess('Operación exitosa', 'Los datos se guardaron correctamente');\r\n *\r\n * @example\r\n * // Alerta de error con imagen personalizada y temporizador\r\n * alertaHtmlSuccess('Error crítico', 'No se pudo conectar al servidor', {\r\n * icono: 'error-icon.png',\r\n * icon: 'error',\r\n * timer: 5000\r\n * });\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón personalizado y sin imagen\r\n * alertaHtmlSuccess('Confirmar acción', '¿Está seguro de eliminar este registro?', {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Sí, eliminar',\r\n * icon: 'warning',\r\n * showImage: false\r\n * }).then((result) => {\r\n * if (result.isConfirmed) {\r\n * // Lógica cuando el usuario confirma\r\n * }\r\n * });\r\n */\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n messageHtml: string,\r\n options: AlertOptions = {},\r\n ): Promise<SweetAlertResult> {\r\n const {\r\n icono = 'icon/check02.png',\r\n icon,\r\n showConfirmButton = false,\r\n confirmButtonText = 'Ok',\r\n timer = 2000,\r\n imageWidth = 125,\r\n imageHeight = 125,\r\n showImage = true,\r\n theme, // Puede venir por options o usar el global\r\n } = options;\r\n\r\n /**\r\n * Nota importante:\r\n * Para que el parámetro `theme` funcione correctamente, el proyecto que\r\n * consume esta librería debe importar el CSS del tema de SweetAlert2 en\r\n * sus estilos (por ejemplo en `styles.scss` o en `angular.json` -> \"styles\").\r\n * Si no se importa el CSS correspondiente al tema seleccionado, las\r\n * alertas no aplicarán el estilo del tema y se verán con el estilo por\r\n * defecto de SweetAlert2.\r\n */\r\n\r\n // Usa el theme global si no se especifica uno en options\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n html: messageHtml,\r\n draggable: true,\r\n showConfirmButton,\r\n confirmButtonText,\r\n timer: showConfirmButton ? undefined : timer, // Timer solo si no hay botón\r\n timerProgressBar: !showConfirmButton && timer > 0,\r\n imageUrl: showImage && icono ? `/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\r\n // Aplica el theme global o el específico (cast a SweetAlertTheme para compatibilidad)\r\n ...(alertTheme !== undefined && { theme: alertTheme as SweetAlertTheme }),\r\n };\r\n // Solo agrega el icono si está definido\r\n if (icon !== undefined) {\r\n alertConfig.icon = icon;\r\n }\r\n\r\n // Precargar imagen solo si es necesario\r\n if (showImage && icono) {\r\n return this.preloadImage(icono).then(() => Swal.fire(alertConfig));\r\n }\r\n\r\n return Swal.fire(alertConfig);\r\n }\r\n\r\n // private configureTimer(\r\n // config: SweetAlertOptions,\r\n // showConfirmButton: boolean,\r\n // timer: number\r\n // ) {\r\n // if (!showConfirmButton && timer > 0) {\r\n // config.timer = timer;\r\n // config.timerProgressBar = true;\r\n // }\r\n // }\r\n\r\n // No se puede utilizar por conflicto con primeng\r\n // notyfAlert(message: string) {\r\n // this.notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top',\r\n // },\r\n // });\r\n // }\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Muestra un mensaje tipo toast usando PrimeNG MessageService.\r\n *\r\n * @param severity - Tipo de severidad del mensaje. Valores posibles:\r\n * 'success' | 'info' | 'warn' | 'error' | 'contrast' | 'secondary'.\r\n * Por defecto: 'success'.\r\n * @param title - Título del mensaje (aparece como summary).\r\n * @param message - Detalle del mensaje (aparece como detail).\r\n * @param time - Duración en milisegundos que el mensaje estará visible. Por defecto: 1500 ms.\r\n *\r\n * @example\r\n * // Mensaje de éxito\r\n * alertaService.showPrimeMessage('success', 'Operación exitosa', 'El registro fue guardado correctamente');\r\n *\r\n * @example\r\n * // Mensaje de advertencia personalizado\r\n * alertaService.showPrimeMessage('warn', 'Advertencia', 'Faltan campos obligatorios', 3000);\r\n */\r\n // showPrimeMessage(\r\n // title: string,\r\n // message: string,\r\n // severity:\r\n // | 'success'\r\n // | 'info'\r\n // | 'warn'\r\n // | 'error'\r\n // | 'contrast'\r\n // | 'secondary' = 'success',\r\n // time: number = 1500\r\n // ) {\r\n // this.primeMessageService.add({\r\n // severity: severity,\r\n // summary: title,\r\n // detail: message,\r\n // life: time,\r\n // });\r\n // }\r\n}\r\n","import { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport moment from 'moment-timezone';\r\nimport {\r\n auditTime,\r\n debounceTime,\r\n distinctUntilChanged,\r\n merge,\r\n Observable,\r\n Subject,\r\n takeUntil,\r\n} from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { ResponseHttpModel, ServiceResult } from '../../models';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n} from '../../models/src/extensions.model';\r\nimport {\r\n FieldConfig,\r\n FormRule,\r\n ReactiveForm,\r\n TypedForm,\r\n} from '../../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\n\r\ninterface CreateTypedFormOptions {\r\n /**\r\n * Si es true, deshabilita por defecto los controles que no tengan\r\n * la propiedad \"disabled\" explícitamente definida en su configuración.\r\n */\r\n disableUnassignedControls?: boolean;\r\n}\r\n\r\ninterface SanitizarFormOptions {\r\n /**\r\n * Campos que se serializarán con JSON.stringify antes de retornar.\r\n * Ejemplo: ['funciones']\r\n */\r\n jsonFields?: string[];\r\n\r\n /**\r\n * Si es true, cuando falle la serialización de un campo listado en `jsonFields`,\r\n * ese campo se establece en null y el método continúa.\r\n */\r\n returnNullOnError?: boolean;\r\n\r\n /**\r\n * Si es true, ante cualquier error global retorna null en lugar de lanzar excepción.\r\n * Útil cuando se desea cortar el flujo por completo al fallar la sanitización.\r\n */\r\n returnFormNullOnError?: boolean;\r\n}\r\n\r\ntype DateInput = string | Date | null | undefined;\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UtilityAddService {\r\n private _serviceAlerta = inject(AlertaService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private _router = inject(Router);\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto formateada según la zona horaria especificada.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en la zona horaria especificada o null si la fecha es null.\r\n */\r\n convertirFechaSegunZonaHoraria(fecha: DateInput): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Cambia esto a la zona horaria que desees\r\n const zonaHoraria = 'America/Guatemala';\r\n return moment(fecha).tz(zonaHoraria).format();\r\n }\r\n\r\n /**\r\n * Convierte una fecha base y le inyecta la hora, minutos y segundos exactos del momento actual del sistema.\r\n *\r\n * @param {DateInput} fecha - La fecha base elegida (usualmente desde un Datepicker).\r\n * @returns {Date | null} - Objeto Date con la fecha modificada a la hora actual o null si la entrada es inválida.\r\n */\r\n convertDateTimeLive(fecha: DateInput): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n\r\n const fechaMoment = moment(fecha);\r\n const ahora = moment(); // Captura el instante exacto actual (horas, minutos, segundos)\r\n\r\n // Seteamos la hora, minutos, segundos y milisegundos del momento actual en la fecha base\r\n fechaMoment.set({\r\n hour: ahora.hour(),\r\n minute: ahora.minute(),\r\n second: ahora.second(),\r\n millisecond: ahora.millisecond(),\r\n });\r\n\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a un objeto Date en formato ISO, opcionalmente ajustando la hora al inicio del día.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {Date | null} - La fecha convertida en formato Date o null si la fecha es null.\r\n */\r\n convertirFechaISOString(\r\n fecha: DateInput,\r\n initHour: boolean = false,\r\n ): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena en formato ISO 8601.\r\n *\r\n * @param {string | Date} fecha - La fecha a convertir. Puede ser un string o un objeto Date.\r\n * @param {boolean} initHour - Si es true, ajusta la hora al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha en formato ISO 8601 (ejemplo: '2025-09-05T00:00:00.000Z') o null si la fecha es inválida.\r\n *\r\n * @example\r\n * // Fecha como string\r\n * service.convertirFechaISO8601('2025-09-05'); // '2025-09-05T00:00:00.000Z'\r\n * // Fecha como Date y ajustando al inicio del día\r\n * service.convertirFechaISO8601(new Date(), true); // '2025-09-05T00:00:00.000Z'\r\n */\r\n convertirFechaISO8601(\r\n fecha: DateInput,\r\n initHour: boolean = false,\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toISOString();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato corto (YYYY-MM-DD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha formateada en formato corto (YYYY-MM-DD) o null si la fecha es null.\r\n */\r\n convertirFechaShort(\r\n fecha: DateInput,\r\n initHour: boolean = false,\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n const fechaMoment = moment(fecha).format('YYYY-MM-DD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto que representa solo la hora (HH:mm).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La hora formateada (HH:mm) o null si la fecha es null.\r\n */\r\n convertirFechaTime(fecha: DateInput): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('HH:mm');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato timestamp (YYYYMMDD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en formato timestamp (YYYYMMDD) o null si la fecha es null.\r\n */\r\n convertirTimeStampString(fecha: DateInput): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('YYYYMMDD');\r\n return fechaMoment;\r\n }\r\n\r\n /* OPCIONES PARA FOMULARIOS REACTIVOS */\r\n /**\r\n * Crea un FormGroup tipado a partir de una configuración de campos.\r\n *\r\n * Soporta validadores síncronos (`validators`) y, de forma opcional,\r\n * validadores asíncronos (`asyncValidators`) por cada control.\r\n *\r\n * @param {FormBuilder} fb - Instancia de FormBuilder para crear el FormGroup.\r\n * @param {FieldConfig<T>} config - Configuración de los campos del formulario.\r\n * @param {ValidatorFn[]} groupValidators - Validadores adicionales a nivel de grupo.\r\n * @param {CreateTypedFormOptions} options - Opciones de creación del formulario.\r\n * - disableUnassignedControls: Si es true, deshabilita solo los campos que no\r\n * tienen \"disabled\" definido, respetando los valores explícitos del usuario.\r\n * @returns {FormGroup} - El FormGroup creado.\r\n *\r\n * @example\r\n * const form = this.utilityAddService.createTypedForm(\r\n * this.fb,\r\n * {\r\n * codigo: { value: 'A1' }, // Se deshabilita por opción global\r\n * nombre: { value: 'Demo', disabled: false }, // Se respeta explícitamente\r\n * email: {\r\n * value: '',\r\n * validators: [Validators.email],\r\n * asyncValidators: [\r\n * asyncExistsValidator(\r\n * (value, id) => this.userService.emailExists(value, id),\r\n * { currentId: this.id, fieldName: 'email' },\r\n * ),\r\n * ],\r\n * },\r\n * },\r\n * { disableUnassignedControls: true },\r\n * );\r\n */\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n options?: CreateTypedFormOptions,\r\n ): FormGroup;\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[],\r\n options?: CreateTypedFormOptions,\r\n ): FormGroup;\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidatorsOrOptions?: ValidatorFn[] | CreateTypedFormOptions,\r\n options: CreateTypedFormOptions = { disableUnassignedControls: false },\r\n ): FormGroup {\r\n const groupValidators = Array.isArray(groupValidatorsOrOptions)\r\n ? groupValidatorsOrOptions\r\n : undefined;\r\n const resolvedOptions = Array.isArray(groupValidatorsOrOptions)\r\n ? options\r\n : (groupValidatorsOrOptions ?? options);\r\n\r\n const formGroup: { [key in keyof T]?: FormControl } = {};\r\n\r\n // Crear controles de formulario individuales\r\n for (const key in config) {\r\n if (Object.prototype.hasOwnProperty.call(config, key)) {\r\n const fieldConfig = config[key];\r\n const {\r\n value,\r\n validators = [],\r\n asyncValidators = [],\r\n }: {\r\n value: T[keyof T] | null;\r\n validators?: ValidatorFn | ValidatorFn[] | null;\r\n asyncValidators?: AsyncValidatorFn | AsyncValidatorFn[] | null;\r\n } = fieldConfig;\r\n const hasAssignedDisabled = Object.prototype.hasOwnProperty.call(\r\n fieldConfig,\r\n 'disabled',\r\n );\r\n const disabled = hasAssignedDisabled\r\n ? Boolean(fieldConfig.disabled)\r\n : Boolean(resolvedOptions.disableUnassignedControls);\r\n\r\n formGroup[key] = new FormControl(\r\n { value, disabled },\r\n validators,\r\n asyncValidators,\r\n );\r\n }\r\n }\r\n\r\n // Crear el FormGroup con validadores adicionales a nivel de grupo si existen\r\n const group = fb.group(\r\n formGroup,\r\n groupValidators ? { validators: groupValidators } : {},\r\n );\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Crea un ReactiveForm tipado con capacidad de suscripción y limpieza.\r\n *\r\n * Extiende createTypedForm() agregando un Subject (destroy$) para manejar\r\n * la suscripción y limpieza automática de observables cuando el componente\r\n * se destruye.\r\n *\r\n * @template T - El tipo genérico del modelo para el formulario.\r\n * @param fb - Instancia de FormBuilder.\r\n * @param config - Configuración de los campos del formulario (FieldConfig<T>).\r\n * @param groupValidators - Validadores adicionales a nivel de grupo.\r\n * @param options - Opciones de creación del formulario.\r\n * - disableUnassignedControls: Si es true, deshabilita solo los campos que no\r\n * tienen \"disabled\" definido, respetando los valores explícitos del usuario.\r\n * @returns ReactiveForm<T> - FormGroup tipado con Subject destroy$ para limpieza.\r\n *\r\n * @example\r\n * ```typescript\r\n * interface LoginForm {\r\n * username: string;\r\n * password: string;\r\n * }\r\n *\r\n * const config: FieldConfig<LoginForm> = {\r\n * username: { value: '', validators: [Validators.required] },\r\n * password: { value: '', validators: [Validators.required] }\r\n * };\r\n *\r\n * const form = this.utilityAddService.createReactiveForm(\r\n * this.fb,\r\n * config,\r\n * [this.matchPasswordsValidator],\r\n * { disableUnassignedControls: true },\r\n * );\r\n *\r\n * // Al destruir el componente, limpiar todas las suscripciones\r\n * ngOnDestroy() {\r\n * form.destroy$.next();\r\n * form.destroy$.complete();\r\n * }\r\n * ```\r\n */\r\n createReactiveForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n options?: CreateTypedFormOptions,\r\n ): ReactiveForm<T>;\r\n createReactiveForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[],\r\n options?: CreateTypedFormOptions,\r\n ): ReactiveForm<T>;\r\n createReactiveForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidatorsOrOptions?: ValidatorFn[] | CreateTypedFormOptions,\r\n options: CreateTypedFormOptions = { disableUnassignedControls: false },\r\n ): ReactiveForm<T> {\r\n const groupValidators = Array.isArray(groupValidatorsOrOptions)\r\n ? groupValidatorsOrOptions\r\n : undefined;\r\n const resolvedOptions = Array.isArray(groupValidatorsOrOptions)\r\n ? options\r\n : (groupValidatorsOrOptions ?? options);\r\n\r\n const form = this.createTypedForm(\r\n fb,\r\n config,\r\n groupValidators,\r\n resolvedOptions,\r\n ) as TypedForm<T> & {\r\n destroy$: Subject<void>;\r\n };\r\n\r\n form.destroy$ = new Subject<void>();\r\n\r\n return form;\r\n }\r\n\r\n /**\r\n * Suscribe a los cambios de un control específico del formulario.\r\n *\r\n * Monitorea el control especificado y ejecuta un callback cada vez que su valor\r\n * cambia. Soporta debouncing y deduplicación automática de valores idénticos.\r\n *\r\n * @template T - El tipo del formulario.\r\n * @template K - La clave del control a monitorear.\r\n * @param form - El ReactiveForm a monitorear.\r\n * @param controlName - Nombre del control a observar.\r\n * @param callback - Función a ejecutar cuando cambia el valor. Recibe el nuevo valor y el formulario.\r\n * @param options - Opciones de configuración:\r\n * - debounce?: Milisegundos de espera antes de ejecutar el callback (default: sin debounce).\r\n * - distinct?: Si es true (default), solo ejecuta si el valor cambió (comparación por referencia).\r\n *\r\n * @example\r\n * ```typescript\r\n * this.utilityAddService.onControlChange(\r\n * form,\r\n * 'email',\r\n * (value, form) => {\r\n * console.log('Email cambió a:', value);\r\n * },\r\n * { debounce: 500, distinct: true }\r\n * );\r\n * ```\r\n */\r\n onControlChange<T, K extends keyof T>(\r\n form: ReactiveForm<T>,\r\n controlName: K,\r\n callback: (value: T[K] | null, form: ReactiveForm<T>) => void,\r\n options?: {\r\n debounce?: number;\r\n distinct?: boolean;\r\n },\r\n ) {\r\n let stream = form.get(controlName as string)!.valueChanges;\r\n\r\n if (options?.distinct !== false) {\r\n stream = stream.pipe(distinctUntilChanged());\r\n }\r\n\r\n if (options?.debounce) {\r\n stream = stream.pipe(debounceTime(options.debounce));\r\n }\r\n\r\n stream\r\n .pipe(takeUntil(form.destroy$))\r\n .subscribe((value) => callback(value as T[K], form));\r\n }\r\n\r\n /**\r\n * Suscribe a los cambios de múltiples controles del formulario.\r\n *\r\n * Monitorea una lista de controles y ejecuta un callback cuando cualquiera\r\n * de ellos cambia. Útil para reacciones complejas que dependen de varios campos.\r\n * Soporta operaciones asincrónicas en el callback.\r\n *\r\n * @template T - El tipo del formulario.\r\n * @param form - El ReactiveForm a monitorear.\r\n * @param controls - Array de nombres de controles a observar.\r\n * @param callback - Función a ejecutar cuando cambia cualquier control. Puede ser asincrónica.\r\n * @param options - Opciones de configuración:\r\n * - debounce?: Milisegundos de espera antes de ejecutar el callback.\r\n *\r\n * @example\r\n * ```typescript\r\n * this.utilityAddService.onControlsChange(\r\n * form,\r\n * ['startDate', 'endDate'],\r\n * async (form) => {\r\n * const startDate = form.get('startDate')?.value;\r\n * const endDate = form.get('endDate')?.value;\r\n * // Validar rango de fechas\r\n * await this.validateDateRange(startDate, endDate);\r\n * },\r\n * { debounce: 300 }\r\n * );\r\n * ```\r\n */\r\n onControlsChange<T>(\r\n form: ReactiveForm<T>,\r\n controls: (keyof T)[],\r\n callback: (form: ReactiveForm<T>) => void | Promise<void>,\r\n options?: { debounce?: number },\r\n ) {\r\n const observables = controls.map(\r\n (control) => form.get(control as string)!.valueChanges,\r\n );\r\n\r\n let stream = merge(...observables);\r\n\r\n if (options?.debounce) {\r\n stream = stream.pipe(debounceTime(options.debounce));\r\n }\r\n\r\n stream = stream.pipe(auditTime(0));\r\n\r\n stream.pipe(takeUntil(form.destroy$)).subscribe(() => callback(form));\r\n }\r\n\r\n /**\r\n * Registra reglas de validación personalizadas que se evalúan dinámicamente.\r\n *\r\n * Permite definir reglas complejas que se ejecutan cuando sus dependencias cambian.\r\n * Cada regla puede depender de múltiples campos y ejecutar lógica asincrónica\r\n * para actualizar otros campos del formulario.\r\n *\r\n * @template T - El tipo del formulario.\r\n * @param form - El ReactiveForm donde se aplicarán las reglas.\r\n * @param rules - Array de FormRule<T> que especifican:\r\n * - dependsOn: Campos que disparan la regla cuando cambian.\r\n * - compute: Función que actualiza el formulario en base a los cambios.\r\n * - debounce?: Milisegundos de espera opcional.\r\n *\r\n * @example\r\n * ```typescript\r\n * const rules: FormRule<MyForm>[] = [\r\n * {\r\n * dependsOn: ['country'],\r\n * debounce: 300,\r\n * compute: async (form) => {\r\n * const country = form.get('country')?.value;\r\n * const states = await this.getStatesByCountry(country);\r\n * form.get('state')?.setValue(states[0]);\r\n * }\r\n * }\r\n * ];\r\n *\r\n * this.utilityAddService.registerRules(form, rules);\r\n * ```\r\n */\r\n registerRules<T>(form: ReactiveForm<T>, rules: FormRule<T>[]) {\r\n const runningRules = new Set<FormRule<T>>();\r\n\r\n rules.forEach((rule) => {\r\n this.onControlsChange(\r\n form,\r\n rule.dependsOn,\r\n async (form) => {\r\n if (runningRules.has(rule)) return;\r\n\r\n try {\r\n runningRules.add(rule);\r\n await rule.compute(form);\r\n } finally {\r\n runningRules.delete(rule);\r\n }\r\n },\r\n { debounce: rule.debounce },\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Sanitiza un formulario obteniendo valores de un formulario, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del modelo a procesar.\r\n * @param form - El formulario reactivo de Angular del que se obtendrán los valores.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar. Cada objeto debe contener:\r\n * - `nombre`: El nombre del campo de fecha en el modelo.\r\n * - `tipo`: El tipo de conversión que se debe aplicar (por ejemplo, `'short'`, `'zh'`, `'iso').\r\n * @returns Un objeto del tipo `T` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo de fecha especificado no existe en los datos del formulario.\r\n *\r\n * @example\r\n * // Procesar varios campos de fecha\r\n * const precioValues = service.sanitizarModelo<ItemPrecioModel>(\r\n * form,\r\n * { nombre: 'fechaInicio', tipo: 'short' },\r\n * { nombre: 'fechaFin', tipo: 'zh' }\r\n * );\r\n */\r\n sanitizarForm<T>(\r\n form: any,\r\n options: SanitizarFormOptions & { returnFormNullOnError: true },\r\n ...campos: FechasConversion[]\r\n ): T | null;\r\n sanitizarForm<T>(\r\n form: any,\r\n options: SanitizarFormOptions,\r\n ...campos: FechasConversion[]\r\n ): T;\r\n sanitizarForm<T>(form: any, ...campos: FechasConversion[]): T;\r\n sanitizarForm<T>(\r\n form: any,\r\n ...args: Array<FechasConversion | SanitizarFormOptions>\r\n ): T | null {\r\n const hasOptions = this.isSanitizarFormOptions(args[0]);\r\n const options = hasOptions ? (args[0] as SanitizarFormOptions) : {};\r\n const campos = (hasOptions ? args.slice(1) : args) as FechasConversion[];\r\n\r\n try {\r\n // Obtén todos los valores del formulario\r\n const rawData = form?.getRawValue?.();\r\n\r\n if (!rawData) {\r\n throw new Error('El formulario no tiene valores.');\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue: Record<string, any> = { ...rawData };\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo)\r\n : null;\r\n });\r\n\r\n // Serializa campos JSON (ej: funciones) cuando se solicita.\r\n (options.jsonFields ?? []).forEach((fieldName) => {\r\n if (!(fieldName in updatedValue)) {\r\n if (options.returnNullOnError) {\r\n updatedValue[fieldName] = null;\r\n return;\r\n }\r\n\r\n throw new Error(`El campo \"${fieldName}\" no existe en el valor.`);\r\n }\r\n\r\n const fieldValue = updatedValue[fieldName];\r\n\r\n if (\r\n fieldValue === null ||\r\n fieldValue === undefined ||\r\n fieldValue === ''\r\n ) {\r\n updatedValue[fieldName] = null;\r\n return;\r\n }\r\n\r\n // Si ya es string, evitamos doble serialización.\r\n if (typeof fieldValue === 'string') {\r\n updatedValue[fieldName] = fieldValue;\r\n return;\r\n }\r\n\r\n try {\r\n const serialized = JSON.stringify(fieldValue);\r\n if (serialized === undefined) {\r\n throw new Error(\r\n `No fue posible serializar el campo \"${fieldName}\".`,\r\n );\r\n }\r\n\r\n updatedValue[fieldName] = serialized;\r\n } catch (error) {\r\n if (options.returnNullOnError) {\r\n this.logIfNotProduction(\r\n `sanitizarForm: campo \"${fieldName}\" establecido en null por error de serialización`,\r\n error,\r\n );\r\n updatedValue[fieldName] = null;\r\n return;\r\n }\r\n\r\n throw error;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n } catch (error) {\r\n if (options.returnFormNullOnError) {\r\n this.logIfNotProduction('sanitizarForm: retorno null por error', error);\r\n return null;\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n private isSanitizarFormOptions(\r\n value: FechasConversion | SanitizarFormOptions | undefined,\r\n ): value is SanitizarFormOptions {\r\n if (!value || typeof value !== 'object') return false;\r\n\r\n const candidate = value as Record<string, unknown>;\r\n\r\n // Si tiene llaves propias de conversión de fecha, no es options.\r\n if ('nombre' in candidate || 'tipo' in candidate) return false;\r\n\r\n return (\r\n 'jsonFields' in candidate ||\r\n 'returnNullOnError' in candidate ||\r\n 'returnFormNullOnError' in candidate\r\n );\r\n }\r\n\r\n /**\r\n * Sanitiza un objeto plano, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del objeto a procesar.\r\n * @param values - El objeto con los datos.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar.\r\n * @returns Un objeto del tipo T con las conversiones de fecha aplicadas.\r\n */\r\n sanitizarModel<T extends Record<string, any>>(\r\n values: T,\r\n ...campos: FechasConversion[]\r\n ): T {\r\n // Crear una copia del objeto para no modificar el original\r\n const updatedValue: Record<string, any> = { ...values };\r\n\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el objeto.`);\r\n }\r\n\r\n const valorActual = updatedValue[nombre];\r\n\r\n if (\r\n valorActual !== null &&\r\n valorActual !== undefined &&\r\n valorActual !== ''\r\n ) {\r\n updatedValue[nombre] = this.convertirFecha(valorActual, tipo);\r\n } else {\r\n updatedValue[nombre] = null;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Convierte una fecha al formato especificado.\r\n *\r\n * @param fecha - La fecha en formato string que se desea convertir.\r\n * Debe estar en un formato reconocible por `Date` o en ISO 8601.\r\n * @param tipo - El tipo de conversión a realizar. Soporta:\r\n * - `'short'`: Devuelve la fecha en formato corto (YYYY-MM-DD).\r\n * - `'zh'`: Devuelve la fecha ajustada a la zona horaria configurada.\r\n * - `'iso'`: Devuelve la fecha como objeto Date en formato ISO.\r\n * - `'iso8601'`: Devuelve la fecha como string en formato ISO 8601.\r\n * @returns La fecha convertida como string o Date según el tipo especificado, o null si la fecha es inválida.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n *\r\n * @example\r\n * // Formato corto\r\n * service.convertirFecha('2025-08-21', 'short'); // '2025-08-21'\r\n * // Zona horaria\r\n * service.convertirFecha('2025-08-21', 'zh'); // '2025-08-21T00:00:00-06:00' (ejemplo)\r\n * // Formato ISO (Date)\r\n * service.convertirFecha('2025-08-21', 'iso'); // Date { ... }\r\n * // Formato ISO 8601 (string)\r\n * service.convertirFecha('2025-08-21', 'iso8601'); // '2025-08-21T00:00:00.000Z'\r\n * // Formato live (fecha con hora actual)\r\n * service.convertirFecha('2025-08-21', 'live'); // Date { ... }\r\n */\r\n private convertirFecha(\r\n fecha: DateInput,\r\n tipo: TipoFechaConversion,\r\n ): Date | string | null {\r\n switch (tipo) {\r\n case 'short':\r\n // Implementación para el formato corto\r\n return this.convertirFechaShort(fecha);\r\n case 'zh':\r\n // Implementación para zonas horarias\r\n return this.convertirFechaSegunZonaHoraria(fecha);\r\n case 'iso': {\r\n return this.convertirFechaISOString(fecha);\r\n }\r\n case 'iso8601': {\r\n return this.convertirFechaISO8601(fecha);\r\n }\r\n case 'live': {\r\n return this.convertDateTimeLive(fecha);\r\n }\r\n default:\r\n throw new Error(`Tipo de conversión desconocido: ${tipo}`);\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable\r\n * @param fileObservable Observable que emite el Blob del archivo\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fileName Nombre del archivo sin extensión\r\n */\r\n handleFileResponse(\r\n fileObservable: Observable<Blob>,\r\n actionId: number = 0,\r\n fileName: string,\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (fileBlob: Blob) => {\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(fileUrl, actionId, fileName, fileExtension);\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable cuando se necesita\r\n * obtener el nombre de archivo desde los headers HTTP (Content-Disposition).\r\n *\r\n * @deprecated Usar ServiceResultService.getDownloadableFile() +\r\n * ServiceResultService.processFileResult() para un flujo unificado.\r\n * Mantener temporalmente para compatibilidad legacy.\r\n *\r\n * @param fileObservable Observable que emite HttpResponse<Blob>\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fallbackFileName Nombre de archivo por defecto si no viene en el header\r\n */\r\n handleFileResponseFromResponse(\r\n fileObservable: Observable<HttpResponse<Blob>>,\r\n actionId: number = 0,\r\n fallbackFileName: string = 'archivo sin nombre',\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (response) => {\r\n const fileBlob = response.body as Blob;\r\n\r\n if (!fileBlob) {\r\n console.error('La respuesta no contiene cuerpo (Blob)');\r\n return;\r\n }\r\n\r\n const headerFileName = this.getFileNameFromContentDisposition(\r\n response.headers,\r\n );\r\n const baseFileName = headerFileName || fallbackFileName;\r\n\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n this.logIfNotProduction(\r\n 'Manejando archivo con tipo:',\r\n fileBlob,\r\n fileBlob.type,\r\n 'nombre:',\r\n baseFileName,\r\n );\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, baseFileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(\r\n fileUrl,\r\n actionId,\r\n baseFileName,\r\n fileExtension,\r\n );\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n /**\r\n * Extrae el blob y el nombre del archivo desde una respuesta HTTP sin realizar la descarga.\r\n * Es útil cuando necesitas reutilizar el blob para múltiples operaciones.\r\n *\r\n * @deprecated Usar ServiceResultService.getDownloadableFile() que ya retorna\r\n * ServiceResult<FileData> con blob y fileName listos para consumo.\r\n * Mantener temporalmente para compatibilidad con proyectos consumidores legacy.\r\n *\r\n * @param fileObservable Observable que emite HttpResponse<Blob>\r\n * @param fallbackFileName Nombre de archivo por defecto si no viene en el header\r\n * @returns Observable que emite un objeto con { blob, fileName }\r\n *\r\n * @example\r\n * this.utilityAddService.extractFileDataFromResponse(this.fileService.getFile())\r\n * .subscribe(({ blob, fileName }) => {\r\n * // Usar blob y fileName para múltiples operaciones\r\n * this.utilityAddService.descargarManual(blob, fileName);\r\n * });\r\n */\r\n extractFileDataFromResponse(\r\n fileObservable: Observable<HttpResponse<Blob>>,\r\n fallbackFileName: string = 'archivo sin nombre',\r\n ): Observable<{ blob: Blob; fileName: string }> {\r\n return new Observable((observer) => {\r\n fileObservable.subscribe({\r\n next: (response) => {\r\n const fileBlob = response.body as Blob;\r\n\r\n if (!fileBlob) {\r\n observer.error('La respuesta no contiene cuerpo (Blob)');\r\n return;\r\n }\r\n\r\n const headerFileName = this.getFileNameFromContentDisposition(\r\n response.headers,\r\n );\r\n const baseFileName = headerFileName || fallbackFileName;\r\n const fullFileName = this.ensureFileNameWithExtension(\r\n baseFileName,\r\n fileBlob.type,\r\n );\r\n\r\n this.logIfNotProduction(\r\n 'Extrayendo archivo con tipo:',\r\n fileBlob.type,\r\n 'nombre:',\r\n fullFileName,\r\n );\r\n\r\n observer.next({\r\n blob: fileBlob,\r\n fileName: fullFileName,\r\n });\r\n observer.complete();\r\n },\r\n error: (err) => observer.error(err),\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Descarga un archivo manualmente usando el blob y nombre del archivo proporcionados.\r\n * Es útil como complemento a extractFileDataFromResponse para reutilizar blobs.\r\n *\r\n * @deprecated Usar ServiceResultService.descargarBlob() en flujos nuevos.\r\n * Mantener temporalmente para no romper consumidores actuales.\r\n *\r\n * @param blob Objeto Blob del archivo a descargar\r\n * @param fileName Nombre completo del archivo incluyendo extensión\r\n * @param expectedExtension Extensión esperada (opcional). Si se envía y no coincide\r\n * con la extensión final del archivo, se abrirá en una nueva pestaña en lugar de descargar.\r\n *\r\n * @example\r\n * // Opción 1: Usar directamente con un blob\r\n * this.utilityAddService.descargarBlob(blob, 'Reporte.xlsx');\r\n *\r\n * // Opción 2: Combinar con extractFileDataFromResponse\r\n * this.utilityAddService.extractFileDataFromResponse(httpResponse$)\r\n * .subscribe(({ blob, fileName }) => {\r\n * this.utilityAddService.descargarBlob(blob, fileName);\r\n * });\r\n */\r\n descargarBlob(\r\n blob: Blob | null | undefined,\r\n fileName: string | null | undefined,\r\n expectedExtension?: string | null,\r\n ): void {\r\n if (!blob) {\r\n console.warn('No se proporcionó un blob válido para descargar.');\r\n return;\r\n }\r\n\r\n const fileUrl = URL.createObjectURL(blob);\r\n const baseFileName = fileName?.trim() || 'archivo_descargado';\r\n const fullFileName = this.ensureFileNameWithExtension(\r\n baseFileName,\r\n blob.type,\r\n );\r\n\r\n const normalizedExpectedExtension = (expectedExtension || '')\r\n .trim()\r\n .toLowerCase();\r\n\r\n if (normalizedExpectedExtension) {\r\n const expectedWithDot = normalizedExpectedExtension.startsWith('.')\r\n ? normalizedExpectedExtension\r\n : `.${normalizedExpectedExtension}`;\r\n\r\n const currentExtensionMatch = /\\.[^./\\\\]+$/.exec(fullFileName);\r\n const currentExtension = currentExtensionMatch\r\n ? currentExtensionMatch[0].toLowerCase()\r\n : '';\r\n\r\n if (currentExtension !== expectedWithDot) {\r\n window.open(fileUrl, '_blank');\r\n this.revokeObjectUrl(fileUrl);\r\n return;\r\n }\r\n }\r\n\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n this.revokeObjectUrl(fileUrl);\r\n }\r\n\r\n /**\r\n * Verifica si un archivo es de tipo Excel.\r\n *\r\n * @param fileType - Tipo MIME del archivo a verificar.\r\n * @returns true si es un archivo Excel (.xlsx), false en caso contrario.\r\n * @private\r\n */\r\n private isExcelFile(fileType: string): boolean {\r\n return fileType.includes(\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n );\r\n }\r\n\r\n /**\r\n * Extrae el nombre del archivo desde el header Content-Disposition de una respuesta HTTP.\r\n *\r\n * Parsea el header Content-Disposition siguiendo el estándar RFC 5987 para\r\n * extraer el nombre del archivo, incluyendo manejo de caracteres especiales\r\n * y codificaciones UTF-8.\r\n *\r\n * @param headers - Headers HTTP de la respuesta.\r\n * @returns El nombre del archivo o null si no se encuentra.\r\n * @private\r\n *\r\n * @example\r\n * // Header: Content-Disposition: attachment; filename*=UTF-8''Reporte%202025.pdf\r\n * // Retorna: 'Reporte 2025.pdf'\r\n */\r\n private getFileNameFromContentDisposition(\r\n headers: HttpHeaders,\r\n ): string | null {\r\n const contentDisposition = headers.get('content-disposition');\r\n\r\n if (!contentDisposition) return null;\r\n\r\n const matches = /filename\\*?[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i.exec(\r\n contentDisposition,\r\n );\r\n if (!matches || !matches[1]) return null;\r\n\r\n let fileName = matches[1].replace(/['\"]/g, '').trim();\r\n\r\n // Manejar posibles codificaciones tipo RFC5987: filename*=UTF-8''Nombre.pdf\r\n if (fileName.toLowerCase().includes(\"utf-8''\")) {\r\n fileName = decodeURIComponent(fileName.split(\"''\")[1] || '');\r\n }\r\n\r\n return fileName;\r\n }\r\n\r\n /**\r\n * Determina la extensión de archivo basada en su tipo MIME.\r\n *\r\n * @param fileType - Tipo MIME del archivo.\r\n * @returns La extensión correspondiente:\r\n * - '.pdf' para archivos PDF.\r\n * - '.xlsx' para archivos Excel.\r\n * - Otras extensiones conocidas según el MIME.\r\n * - Cadena vacía si no se puede inferir.\r\n * @private\r\n */\r\n private getFileExtension(fileType: string): string {\r\n const normalizedType = fileType.toLowerCase();\r\n\r\n if (normalizedType.includes('pdf')) return '.pdf';\r\n if (normalizedType.includes('spreadsheetml')) return '.xlsx';\r\n if (normalizedType.includes('ms-excel')) return '.xls';\r\n if (normalizedType.includes('csv')) return '.csv';\r\n if (normalizedType.includes('zip')) return '.zip';\r\n if (normalizedType.includes('json')) return '.json';\r\n if (normalizedType.includes('xml')) return '.xml';\r\n if (normalizedType.includes('text/plain')) return '.txt';\r\n if (normalizedType.includes('png')) return '.png';\r\n if (normalizedType.includes('jpeg') || normalizedType.includes('jpg')) {\r\n return '.jpg';\r\n }\r\n\r\n return '';\r\n }\r\n\r\n /**\r\n * Asegura que el nombre del archivo tenga extensión.\r\n * Si ya trae extensión, lo respeta sin modificarlo.\r\n * Si no trae extensión, intenta inferirla desde el tipo MIME.\r\n *\r\n * @param fileName - Nombre del archivo, con o sin extensión.\r\n * @param fileType - Tipo MIME del archivo.\r\n * @returns Nombre de archivo con extensión cuando es posible.\r\n * @private\r\n */\r\n private ensureFileNameWithExtension(\r\n fileName: string,\r\n fileType: string,\r\n ): string {\r\n const hasExtension = /\\.[^./\\\\]+$/.test(fileName);\r\n if (hasExtension) return fileName;\r\n\r\n const fileExtension = this.getFileExtension(fileType);\r\n return fileExtension ? `${fileName}${fileExtension}` : fileName;\r\n }\r\n\r\n /**\r\n * Maneja archivos no Excel (como PDFs) realizando acciones de visualización o descarga.\r\n *\r\n * @param fileUrl - URL temporal del objeto Blob del archivo.\r\n * @param actionId - ID de acción:\r\n * - 0: Abre el archivo en una nueva pestaña.\r\n * - 1: Inicia la descarga del archivo.\r\n * @param fileName - Nombre base del archivo sin extensión.\r\n * @param fileExtension - Extensión del archivo incluyendo el punto (ej: '.pdf').\r\n * @private\r\n */\r\n private handleNonExcelFiles(\r\n fileUrl: string,\r\n actionId: number,\r\n fileName: string,\r\n fileExtension: string,\r\n ): void {\r\n switch (actionId) {\r\n case 0: // Abrir en nueva ventana\r\n window.open(fileUrl, '_blank');\r\n break;\r\n case 1: // Descargar archivo\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Abre un archivo PDF en una nueva pestaña del navegador.\r\n *\r\n * @deprecated Usar ServiceResultService.PdfView() en flujos nuevos.\r\n * Mantener temporalmente para compatibilidad con código existente.\r\n *\r\n * @param blob - Objeto Blob que contiene los datos del archivo PDF.\r\n *\r\n * @example\r\n * // Uso típico con respuesta de servicio HTTP\r\n * this.pdfService.getPdf(id).subscribe(blob => {\r\n * this.utilityAddService.PdfView(blob);\r\n * });\r\n *\r\n * @description\r\n * Este método crea un URL temporal para el Blob del PDF y lo abre en una nueva\r\n * pestaña del navegador. El URL se revoca automáticamente después de 100ms para\r\n * liberar memoria.\r\n */\r\n PdfView(blob: Blob): any {\r\n // Crear un URL temporal para el Blob\r\n const pdfUrl = URL.createObjectURL(blob);\r\n // Abrir el PDF en una nueva pestaña\r\n window.open(pdfUrl, '_blank');\r\n\r\n // Liberar el URL del Blob una vez que la pestaña ha sido abierta\r\n // Esperar un poco para asegurarse de que el archivo se ha abierto\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(pdfUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Descarga un archivo PDF con un nombre personalizado que incluye el prefijo \"DTE_\".\r\n *\r\n * @param blob - Objeto Blob que contiene los datos del archivo PDF a descargar.\r\n * @param filename - Nombre base del archivo sin extensión (se agregará automáticamente \".pdf\" y el prefijo \"DTE_\").\r\n *\r\n * @example\r\n * // Uso típico con respuesta de servicio HTTP\r\n * this.dteService.getDTE(operacionId).subscribe(blob => {\r\n * this.utilityAddService.downloadPdfFile(blob, '12345');\r\n * // Descarga el archivo como: DTE_12345.pdf\r\n * });\r\n *\r\n * @description\r\n * Este método crea un URL temporal para el Blob y simula un clic en un enlace de\r\n * descarga para iniciar la descarga automática del archivo. El nombre del archivo\r\n * sigue el formato: DTE_{filename}.pdf. El URL se revoca después de 100ms para\r\n * liberar memoria.\r\n */\r\n downloadPdfFile(blob: Blob, filename: string) {\r\n // Crear un URL temporal para el Blob\r\n const pdfUrl = URL.createObjectURL(blob);\r\n\r\n // Crear un enlace de descarga\r\n const link = document.createElement('a');\r\n link.href = pdfUrl;\r\n\r\n // Establecer el nombre del archivo utilizando el operacionId\r\n link.download = `DTE_${filename}.pdf`;\r\n\r\n // Simular un clic en el enlace para iniciar la descarga\r\n link.click();\r\n\r\n // Liberar el URL del Blob después de un pequeño retraso\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(pdfUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Inicia la descarga programada de un archivo.\r\n *\r\n * Crea un elemento <a> temporal, lo configura con el archivo y tipo MIME,\r\n * y simula un clic para iniciar la descarga del navegador.\r\n *\r\n * @param fileUrl - URL temporal (object URL) del archivo a descargar.\r\n * @param fullFileName - Nombre completo del archivo incluyendo extensión.\r\n * @private\r\n */\r\n private forceDownload(fileUrl: string, fullFileName: string): void {\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n }\r\n\r\n /**\r\n * Libera la memoria de un URL de objeto temporal.\r\n *\r\n * Revoca un object URL creado con URL.createObjectURL() después de un pequeño\r\n * retraso (100ms) para asegurar que el navegador ha terminado de usar el archivo.\r\n *\r\n * @param fileUrl - URL del objeto a revocar.\r\n * @private\r\n */\r\n private revokeObjectUrl(fileUrl: string): void {\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Muestra información en consola solo en desarrollo, permitiendo múltiples argumentos como console.log nativo.\r\n *\r\n * @param args - Argumentos a mostrar en consola (texto, objetos, etc).\r\n * @example\r\n * logIfNotProduction('Datos:', response);\r\n * logIfNotProduction('Error:', error, { extra: true });\r\n */\r\n logIfNotProduction(...args: any[]): void {\r\n if (!this.environment.production) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Valida todos los campos de un formulario y muestra una alerta.\r\n *\r\n * Marca todos los controles como tocados (triggereando la validación visual)\r\n * y muestra una notificación toastr indicando que hay validaciones pendientes.\r\n * Útil para formularios donde deseas mostrar todos los errores de validación\r\n * de una vez.\r\n *\r\n * @param form - El FormGroup a validar.\r\n *\r\n * @example\r\n * ```typescript\r\n * if (this.form.invalid) {\r\n * this.utilityAddService.checkFormValid(this.form);\r\n * return;\r\n * }\r\n * ```\r\n */\r\n checkFormValid(control: AbstractControl | null | undefined): boolean {\r\n // 👈 Cambiado a boolean\r\n if (!control) return false;\r\n\r\n // Marca todos los controles para activar los estilos de error en la UI\r\n control.markAllAsTouched();\r\n\r\n // Si el formulario es inválido, ejecutamos las alertas y logs\r\n if (control.invalid) {\r\n // Reporta en consola los campos inválidos solo en desarrollo.\r\n if (!this.environment.production) {\r\n const invalidControls = this.getInvalidControls(control);\r\n if (invalidControls.length > 0) {\r\n console.warn(\r\n 'UtilityAddService.checkFormValid: campos inválidos detectados:',\r\n );\r\n invalidControls.forEach(({ path, errors }) => {\r\n console.warn(`- ${path}`, errors);\r\n });\r\n }\r\n }\r\n\r\n // Muestra el toastr de advertencia\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Formulario',\r\n 'Revise los campos con validaciones pendientes',\r\n 2,\r\n );\r\n\r\n return false; // 👈 Retorna false si hay errores pendientes\r\n }\r\n\r\n return true; // 👈 Retorna true si el formulario es 100% válido\r\n }\r\n\r\n private getInvalidControls(\r\n control: AbstractControl,\r\n parentPath: string = '',\r\n ): Array<{ path: string; errors: Record<string, unknown> | null }> {\r\n const controls = (control as { controls?: unknown }).controls;\r\n\r\n if (!controls) {\r\n return control.invalid\r\n ? [\r\n {\r\n path: parentPath || '(raiz)',\r\n errors: control.errors as Record<string, unknown> | null,\r\n },\r\n ]\r\n : [];\r\n }\r\n\r\n const invalidControls: Array<{\r\n path: string;\r\n errors: Record<string, unknown> | null;\r\n }> = [];\r\n\r\n if (Array.isArray(controls)) {\r\n controls.forEach((childControl, index) => {\r\n const childPath = parentPath ? `${parentPath}[${index}]` : `[${index}]`;\r\n invalidControls.push(\r\n ...this.getInvalidControls(\r\n childControl as AbstractControl,\r\n childPath,\r\n ),\r\n );\r\n });\r\n\r\n return invalidControls;\r\n }\r\n\r\n Object.entries(controls as Record<string, AbstractControl>).forEach(\r\n ([controlName, childControl]) => {\r\n const childPath = parentPath\r\n ? `${parentPath}.${controlName}`\r\n : controlName;\r\n\r\n invalidControls.push(\r\n ...this.getInvalidControls(childControl, childPath),\r\n );\r\n },\r\n );\r\n\r\n return invalidControls;\r\n }\r\n\r\n /**\r\n * Extrae valores únicos de un campo específico de un array de objetos.\r\n *\r\n * Obtiene todos los valores distintos de una propiedad en un array de objetos,\r\n * retornando un array de objetos FilterOption tipado y ordenado alfabéticamente.\r\n * Incluye validaciones para detectar campos inexistentes con mensajes de alerta.\r\n *\r\n * @template T - Tipo de los objetos en el array.\r\n * @param data - Array de objetos del cual extraer valores únicos.\r\n * @param field - Nombre del campo del cual extraer valores únicos.\r\n * @returns Array de FilterOption ordenado alfabéticamente, o array vacío si hay errores.\r\n *\r\n * @example\r\n * ```typescript\r\n * interface Usuario {\r\n * id: number;\r\n * nombre: string;\r\n * departamento: string;\r\n * }\r\n *\r\n * const usuarios: Usuario[] = [\r\n * { id: 1, nombre: 'Juan', departamento: 'TI' },\r\n * { id: 2, nombre: 'María', departamento: 'RRHH' },\r\n * { id: 3, nombre: 'Pedro', departamento: 'TI' }\r\n * ];\r\n *\r\n * const deptosUnicos = this.utilityAddService.getUniqueValues(usuarios, 'departamento');\r\n * // Retorna: [\r\n * // { value: 'RRHH', field: 'departamento' },\r\n * // { value: 'TI', field: 'departamento' }\r\n * // ]\r\n * ```\r\n */\r\n getUniqueValues<T>(data: T[], field: keyof T): FilterOption[] {\r\n if (!data || data.length === 0) {\r\n console.warn(\r\n 'UtilityAddService.getUniqueValues: El array de datos está vacío. No se puede obtener valores únicos.',\r\n );\r\n return [];\r\n }\r\n\r\n const hasField = data.some((item) =>\r\n Object.prototype.hasOwnProperty.call(item as object, field as string),\r\n );\r\n\r\n if (!hasField) {\r\n const availableFields = Array.from(\r\n new Set(data.flatMap((item) => Object.keys(item as object))),\r\n ).sort();\r\n\r\n console.warn(\r\n `UtilityAddService.getUniqueValues: El campo \"${String(\r\n field,\r\n )}\" no existe en los objetos proporcionados. Campos disponibles: ${availableFields.join(\r\n ', ',\r\n )}`,\r\n );\r\n\r\n return [];\r\n }\r\n\r\n const uniqueValues = data.reduce((acc: FilterOption[], current) => {\r\n const fieldValue = current[field];\r\n\r\n if (\r\n typeof fieldValue === 'string' &&\r\n !acc.some((item) => item.value === fieldValue)\r\n ) {\r\n acc.push({\r\n value: fieldValue,\r\n field: field.toString(),\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return uniqueValues.sort((a, b) => a.value.localeCompare(b.value));\r\n }\r\n\r\n /**\r\n * Helper function para parsear fechas para filtro de primeNg en table\r\n * @param date - Fecha en formato string, Date o null/undefined\r\n * @returns Date | null - Objeto Date válido o null\r\n */\r\n parseDate(date: string | Date | null): Date | null {\r\n if (!date) return null;\r\n return typeof date === 'string' ? new Date(date) : date;\r\n }\r\n\r\n /**\r\n * Función pura que procesa una cadena de texto conteniendo números individuales y/o rangos numéricos,\r\n * devolviendo un array con todos los números expandidos.\r\n *\r\n * @param input - Cadena de texto con el formato: número[.número][.inicio-fin][...]\r\n * @returns Array de números con todos los valores individuales y rangos expandidos\r\n *\r\n * @example\r\n * // Uso básico\r\n * const result = parseNumericRanges('1.5.7.10-12');\r\n * // Retorna: [1, 5, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Con espacios y caracteres especiales\r\n * const result = parseNumericRanges(' 3. 5-7 .10-12abc');\r\n * // Retorna: [3, 5, 6, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Rangos invertidos (serán ignorados)\r\n * const result = parseNumericRanges('10-8');\r\n * // Retorna: [] (array vacío)\r\n *\r\n * @note\r\n * Características especiales:\r\n * - Elimina automáticamente espacios y caracteres no numéricos\r\n * - Los números deben estar separados por puntos (.)\r\n * - Los rangos deben usar guión (-) sin espacios entre números\r\n * - Es tolerante a formatos inconsistentes\r\n * - Omite elementos inválidos sin generar errores\r\n */\r\n parseNumericRanges(input: string): number[] {\r\n const cleanString = input.replace(/[^\\d.\\- ]/g, '').replace(/\\s+/g, '');\r\n\r\n const parts = cleanString.split('.');\r\n const result: number[] = [];\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.includes('-')) {\r\n const [startStr, endStr] = part.split('-');\r\n const start = parseInt(startStr, 10);\r\n const end = parseInt(endStr, 10);\r\n\r\n if (!isNaN(start) && !isNaN(end) && start <= end) {\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n }\r\n } else {\r\n const number = parseInt(part, 10);\r\n if (!isNaN(number)) {\r\n result.push(number);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adaptador para procesar eventos de input y extraer rangos numéricos.\r\n *\r\n * @param event - Objeto Event del DOM, preferiblemente de un elemento input\r\n * @returns\r\n * - Array de números generado a partir del valor del input, cuando hay\r\n * números/rangos.\r\n * - El carácter comodín \"*\" cuando el valor del input es exactamente \"*\".\r\n *\r\n * @example\r\n * // Uso en template Angular\r\n * <input (input)=\"processNumericRangesFromEvent($event)\">\r\n *\r\n * @example\r\n * // Uso directo\r\n * const result = processNumericRangesFromEvent(inputEvent);\r\n *\r\n * @note\r\n * Esta función es un wrapper que:\r\n * - Extrae el valor del input del evento\r\n * - Delega el procesamiento a parseNumericRanges()\r\n * - Mantiene compatibilidad con eventos de diferentes frameworks\r\n *\r\n * @dependencies\r\n * Requiere que el evento tenga la propiedad target.value (standard DOM)\r\n * Para otros tipos de eventos (ej. Angular Material) puede necesitar ajustes\r\n */\r\n processNumericRangesFromEvent(event: Event): number[] | '*' {\r\n const rawValue = (event.target as HTMLInputElement).value ?? '';\r\n const inputValue = rawValue.trim();\r\n\r\n // Si el valor es exactamente el comodín \"*\", lo devolvemos tal cual\r\n // para que el consumidor pueda interpretarlo como \"todos\".\r\n if (inputValue === '*') {\r\n return '*';\r\n }\r\n\r\n // Para mezclas de números y asteriscos, parseNumericRanges elimina\r\n // cualquier carácter no numérico/rango (como \"*\"), dando prioridad\r\n // a los números y omitiendo el comodín.\r\n return this.parseNumericRanges(inputValue);\r\n }\r\n\r\n private buildAssociatedGuideHtml(data: unknown): string {\r\n if (!Array.isArray(data) || data.length === 0) {\r\n return '';\r\n }\r\n\r\n const itemsHtml = data\r\n .map((item: any) => {\r\n const cantidadRegistros = String(item?.cantidadRegistros ?? '0');\r\n const vista = String(item?.vista ?? 'No disponible');\r\n\r\n return (\r\n `<li style=\"display: list-item; margin: 0.35rem 0;\">` +\r\n `<div><strong>Ingrese a:</strong> ${vista}</div>` +\r\n `<div><strong>Registros asociados:</strong> ${cantidadRegistros}</div>` +\r\n `</li>`\r\n );\r\n })\r\n .join('');\r\n\r\n return (\r\n `<div style=\"margin-top: 0.65rem;\">` +\r\n `<div style=\"margin-bottom: 0.55rem;\">Sugerencia(s):</div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${itemsHtml}</ol>` +\r\n `</div>`\r\n );\r\n }\r\n\r\n private formatPrimaryAlertMessage(message: string): string {\r\n return `<div style=\"font-family: 'Oswald', sans-serif; font-weight: normal; font-style: italic; margin-bottom: 0.3rem;\">${message}</div>`;\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP, mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @param response - Respuesta de la operación (debe tener isSuccess, title, statusMessage).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n * @param navigateOnCreateSuccess - Override opcional para decidir si un registro nuevo (id === 0)\r\n * navega al listado tras éxito. Tiene prioridad sobre environment.navigateToListOnCreateSuccess.\r\n *\r\n * @example\r\n * // Uso típico en un componente\r\n * this.utilityAddService.handleResponse(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponse(\r\n response: ResponseHttpModel,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number,\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.statusMessage,\r\n 2,\r\n );\r\n if (id > 0) {\r\n this._router.navigate([urlHome]);\r\n return;\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n const guideHtml = this.buildAssociatedGuideHtml(\r\n (response as any)?.data,\r\n );\r\n const mainMessage = this.formatPrimaryAlertMessage(\r\n response.statusMessage,\r\n );\r\n\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n `${mainMessage}${guideHtml}`,\r\n {\r\n icono: 'icon2/hard_drive_error.png',\r\n showConfirmButton: true,\r\n },\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponse:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP que devuelve un ServiceResult<T>,\r\n * mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @typeParam T - Tipo de dato contenido en la propiedad data de ServiceResult.\r\n * @param response - Respuesta del servicio (debe tener isSuccess, title, message, etc.).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n *\r\n * @example\r\n * // Uso típico en un componente con ServiceResult\r\n * this.utilityAddService.handleResponseService<MiModelo>(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponseService<T>(\r\n response: ServiceResult<T>,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number,\r\n navigateOnCreateSuccess?: boolean,\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n const shouldNavigateOnCreate =\r\n navigateOnCreateSuccess ??\r\n this.environment.navigateToListOnCreateSuccess ??\r\n true;\r\n\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.message,\r\n 2,\r\n );\r\n if (id > 0 || (id === 0 && shouldNavigateOnCreate)) {\r\n this._router.navigate([urlHome]);\r\n return;\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n const guideHtml = this.buildAssociatedGuideHtml(\r\n (response as any)?.data,\r\n );\r\n const mainMessage = this.formatPrimaryAlertMessage(response.message);\r\n\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n `${mainMessage}${guideHtml}`,\r\n {\r\n icono: 'icon/request.png',\r\n showConfirmButton: true,\r\n },\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponseService:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2,\r\n );\r\n }\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n delay,\r\n map,\r\n Observable,\r\n of,\r\n retry,\r\n throwError,\r\n} from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterSecurity,\r\n} from '../../models/src/parameterSecurity.model';\r\nimport { SecurityService } from './security.service';\r\nimport { UtilityAddService } from './utility-add.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio para gestionar los parámetros de seguridad de la aplicación.\r\n * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.\r\n * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.\r\n *\r\n * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)\r\n */\r\nexport class ParameterValuesService<T extends string = string> {\r\n /**\r\n * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.\r\n * Se usan para validar y mapear los parámetros recibidos de la API.\r\n */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /**\r\n * Cache interno para optimizar la comparación de valores de parámetros.\r\n * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.\r\n */\r\n private parameterCache = new Map<string, any>();\r\n\r\n private alertedParams = new Set<string>();\r\n private alertedParamsIsParameterValue = new Set<string>();\r\n\r\n /**\r\n * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.\r\n */\r\n private apiService = inject(SecurityService);\r\n\r\n private readonly _utilityServie = inject(UtilityAddService);\r\n\r\n /**\r\n * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.\r\n */\r\n private _dataParameter = signal<MyParameterValues<T>[]>(\r\n this.initializeData(),\r\n );\r\n\r\n /**\r\n * Flag que indica si ya se cargaron los parámetros desde la API.\r\n */\r\n private _loaded = signal(false);\r\n get loaded() {\r\n return this._loaded();\r\n }\r\n\r\n /**\r\n * Inicializa los datos de parámetros usando los valores inyectados.\r\n * @returns Array de parámetros iniciales tipados\r\n */\r\n private initializeData(): MyParameterValues<T>[] {\r\n return this.initialParameters.map((param) =>\r\n this.createMyParameterValue(param.parameterName as T, param.values),\r\n );\r\n }\r\n\r\n /**\r\n * Crea una instancia de MyParameterValues tipada y segura.\r\n * @param parameterName Nombre del parámetro\r\n * @param values Valores asociados al parámetro\r\n * @returns Objeto MyParameterValues\r\n */\r\n private createMyParameterValue(\r\n parameterName: T,\r\n values: any[],\r\n ): MyParameterValues<T> {\r\n return {\r\n parameterName,\r\n values: [...values],\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve los parámetros actuales como un array de solo lectura.\r\n */\r\n get dataParameter(): Readonly<MyParameterValues<T>[]> {\r\n return this._dataParameter();\r\n }\r\n\r\n /**\r\n * Setter privado para actualizar los parámetros.\r\n * Solo puede ser usado dentro del servicio para mantener la integridad de los datos.\r\n * @param values Array de parámetros a almacenar\r\n */\r\n private setDataParameter(values: MyParameterValues<T>[]): void {\r\n if (!Array.isArray(values)) {\r\n console.error('Error: valores inválidos para dataParameter');\r\n return;\r\n }\r\n this._dataParameter.set(values);\r\n }\r\n\r\n /**\r\n * Carga los parámetros desde la API.\r\n * Si ya se cargaron y force=false, devuelve la copia en memoria.\r\n * @param force Indica si se debe forzar la recarga desde la API (default: false)\r\n * @returns Observable que emite los parámetros cargados como MyParameterValues[]\r\n */\r\n loadParameters(force = false): Observable<MyParameterValues<T>[]> {\r\n if (this._loaded() && !force) {\r\n return of([...this.dataParameter]); // copia mutable\r\n }\r\n\r\n return this.apiService.getParameterSecurity(force).pipe(\r\n map((response) => {\r\n this._utilityServie.logIfNotProduction(\r\n 'Sistema API parámetros:',\r\n response.data?.sistema,\r\n );\r\n const apiParameters = response.data?.parameterSecurity ?? [];\r\n this.validateParameters(apiParameters);\r\n const values = this.mapToMyParameterValues(apiParameters);\r\n this.setDataParameter(values);\r\n this._loaded.set(true);\r\n return values;\r\n }),\r\n // 👇 fallback si falla la llamada pero ya teníamos data\r\n catchError((error) => {\r\n if (this._loaded() && this.dataParameter.length > 0) {\r\n return of([...this.dataParameter]);\r\n }\r\n this._loaded.set(false);\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Fuerza la recarga de los parámetros desde la API.\r\n * @returns Observable que emite los parámetros actualizados\r\n */\r\n refreshParameters(): Observable<MyParameterValues<T>[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /**\r\n * Crea una copia segura y mutable de los parámetros actuales.\r\n * @returns Array de parámetros\r\n */\r\n private createSafeCopy(): MyParameterValues<T>[] {\r\n return this.dataParameter.map((item) =>\r\n this.createMyParameterValue(item.parameterName, [...item.values]),\r\n );\r\n }\r\n\r\n /**\r\n * Mapea los parámetros recibidos de la API a objetos tipados y seguros.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n * @returns Array de MyParameterValues\r\n */\r\n private mapToMyParameterValues(\r\n apiParameters: ParameterSecurity[],\r\n ): MyParameterValues<T>[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => {\r\n // Función de conversión type-safe\r\n return this.convertToTypedParameter(param);\r\n })\r\n .filter((param): param is MyParameterValues<T> => param !== null);\r\n }\r\n\r\n /**\r\n * Convierte un parámetro de la API a un objeto tipado, validando el nombre.\r\n * @param param Parámetro recibido de la API\r\n * @returns Objeto MyParameterValues o null si no es válido\r\n */\r\n private convertToTypedParameter(\r\n param: ParameterSecurity,\r\n ): MyParameterValues<T> | null {\r\n const initialParam = this.initialParameters.find(\r\n (p) => p.parameterName === param.parameterName,\r\n );\r\n\r\n if (!initialParam) {\r\n return null;\r\n }\r\n\r\n // Conversión segura con verificación\r\n if (this.isValidParameterName(param.parameterName)) {\r\n return this.createMyParameterValue(\r\n param.parameterName as T,\r\n param.parameterValues?.map((v) => v.value) ?? [],\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Verifica si un nombre de parámetro es válido según los parámetros iniciales.\r\n * @param name Nombre a validar\r\n * @returns true si es válido\r\n */\r\n private isValidParameterName(name: string): name is T {\r\n // Verifica que el nombre esté en los parámetros iniciales\r\n return this.initialParameters.some((param) => param.parameterName === name);\r\n }\r\n\r\n /**\r\n * Valida que los parámetros devueltos por la API coincidan con los iniciales.\r\n * Muestra errores o advertencias en consola si existen diferencias.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n */\r\n private validateParameters(apiParameters: ParameterSecurity[]): void {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n const apiNames = apiParameters.map((p) => p.parameterName);\r\n\r\n const missing = initialNames.filter((name) => !apiNames.includes(name));\r\n const extra = apiNames.filter((name) => !initialNames.includes(name));\r\n\r\n if (missing.length) {\r\n console.warn(`Faltan en API: ${missing.join(', ')}`);\r\n const ok = confirm(`Faltan en API: ${missing.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (extra.length) {\r\n console.warn(`Extra en API: ${extra.join(', ')}`);\r\n const ok = confirm(`Extra en API: ${extra.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (initialNames.length !== apiNames.length) {\r\n console.warn(\r\n `Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Si `index` es null (valor por defecto), devuelve todo el arreglo de valores.\r\n * Devuelve `defaultValue` si no existe el parámetro o el índice es inválido.\r\n * Valida que el parámetro exista antes de acceder a su valor.\r\n * @param parameterName Nombre del parámetro\r\n * @param index Índice del valor dentro del array. Si es null (default), devuelve todos los valores.\r\n * @param defaultValue Valor por defecto si no existe (default: null)\r\n * @returns Valor del parámetro, todos los valores si index es null, o defaultValue si no existe o el índice es inválido\r\n */\r\n getValue<U = any>(parameterName: T): U[];\r\n getValue<U = any>(\r\n parameterName: T,\r\n index: number,\r\n defaultValue?: U | null,\r\n ): U;\r\n getValue<U = any>(\r\n parameterName: T,\r\n index: null,\r\n defaultValue?: U[] | null,\r\n ): U[];\r\n getValue<U = any>(\r\n parameterName: T,\r\n index: number | null = null,\r\n defaultValue: U | U[] | null = null,\r\n ): U | U[] {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName,\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParams.has(parameterName)) {\r\n alert(`Advertencia: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParams.add(parameterName);\r\n }\r\n return defaultValue as U | U[];\r\n }\r\n\r\n if (index === null) {\r\n return param.values as U[];\r\n }\r\n\r\n if (index < 0 || index >= param.values.length) {\r\n alert(\r\n `Advertencia: Índice ${index} fuera de rango para el parámetro '${parameterName}'.`,\r\n );\r\n return defaultValue as U;\r\n }\r\n\r\n return param.values[index] as U;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.\r\n * @param parameterName Nombre del parámetro\r\n * @param expectedValue Valor esperado\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @returns true si coincide, false en caso contrario\r\n */\r\n isParameterValue<U = any>(\r\n parameterName: T,\r\n expectedValue: U,\r\n index = 0,\r\n ): boolean {\r\n const cacheKey = `${String(parameterName)}_${index}`;\r\n\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName,\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParamsIsParameterValue.has(parameterName)) {\r\n alert(`Error: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParamsIsParameterValue.add(parameterName);\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.parameterCache.has(cacheKey)) {\r\n const value = this.getValue<U>(parameterName, index);\r\n this.parameterCache.set(cacheKey, value);\r\n }\r\n\r\n return this.parameterCache.get(cacheKey) === expectedValue;\r\n }\r\n\r\n /**\r\n * Limpia el cache interno de comparaciones de parámetros.\r\n */\r\n clearParameterCache(): void {\r\n this.parameterCache.clear();\r\n }\r\n\r\n /**\r\n * Verifica si un parámetro tiene al menos un valor.\r\n * @param parameterName Nombre del parámetro\r\n * @returns true si tiene al menos un valor, false si no tiene\r\n */\r\n hasAnyValue(parameterName: T): boolean {\r\n return this.getAllValues(parameterName).length > 0;\r\n }\r\n\r\n /**\r\n * Devuelve todos los valores de un parámetro.\r\n * @param parameterName Nombre del parámetro\r\n * @returns Array de valores\r\n */\r\n getAllValues<U = any>(parameterName: T): U[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as U[];\r\n }\r\n}\r\n","/**\r\n * action-message.model.ts\r\n *\r\n * Centraliza los tipos de acción y la configuración de mensajes para acciones de botones y operaciones comunes en la UI.\r\n *\r\n * - Define los tipos de acción estándar usados en dsx-button y otros componentes.\r\n * - Permite mantener uniformidad y evitar errores por typos en los tipos de acción.\r\n * - Provee la función getActionMessageConfig para obtener los textos, títulos e íconos de confirmación según la acción y el estado.\r\n * - Si se usa una acción válida pero sin mensaje configurado, en modo desarrollo muestra un warning para facilitar el mantenimiento.\r\n *\r\n * Uso recomendado:\r\n * - Importa ACTION_TYPES y ActionType donde se requiera validar o tipar acciones de botones.\r\n * - Usa getActionMessageConfig para obtener la configuración de confirmación antes de ejecutar acciones destructivas o de restauración.\r\n *\r\n * Ejemplo:\r\n * import { ACTION_TYPES, ActionType, getActionMessageConfig } from '.../action-message.model';\r\n * const config = getActionMessageConfig('softDelete', true);\r\n * // config: { title, message, icon }\r\n *\r\n * Si agregas un nuevo tipo de acción, recuerda añadir su mensaje en getActionMessageConfig.\r\n */\r\n\r\nimport { SweetAlertIcon } from 'sweetalert2';\r\n\r\n/**\r\n * Tipos de acción disponibles para el componente `dsx-button`.\r\n *\r\n * Usa `ACTION_TYPES` en el consumidor para evitar typos.\r\n *\r\n * **Persistencia de datos (formulario)**\r\n * - `create` → Navega a la ruta de nuevo registro (azul)\r\n * - `saveOrUpdate` → Muestra \"Guardar\" si `id` es 0, \"Actualizar\" si `id` > 0 (amarillo)\r\n *\r\n * **Eliminar**\r\n * - `delete` → Eliminar registro permanentemente (rojo)\r\n * - `softDelete` → Borrar registro con borrado lógico (amarillo)\r\n *\r\n * **Formulario**\r\n * - `validate` → Validar formulario sin guardar (gris)\r\n * - `restore` → Restaurar datos originales (gris)\r\n *\r\n * **Navegación / Utilidades**\r\n * - `home` → Ir al inicio (gris)\r\n * - `refresh` → Recargar datos desde el servidor (morado)\r\n *\r\n * **Consulta / Descarga**\r\n * - `details` → Ver el detalle de un registro (azul índigo)\r\n * - `view` → Previsualizar o abrir detalle (azul cielo)\r\n * - `export` → Exportar información a Excel (verde Excel)\r\n * - `download` → Descargar archivo o recurso (ámbar cálido)\r\n * - `import` → Importar datos desde archivo (azul acero)\r\n */\r\nexport const ACTION_TYPES = {\r\n hardDelete: 'hardDelete',\r\n softDelete: 'softDelete',\r\n return: 'return',\r\n home: 'home',\r\n validate: 'validate',\r\n restore: 'restore',\r\n edit: 'edit',\r\n create: 'create',\r\n save: 'save',\r\n update: 'update',\r\n refresh: 'refresh',\r\n details: 'details',\r\n view: 'view',\r\n export: 'export',\r\n download: 'download',\r\n import: 'import',\r\n} as const;\r\n\r\nexport type ActionType = (typeof ACTION_TYPES)[keyof typeof ACTION_TYPES];\r\n\r\nexport interface ActionMessageConfig {\r\n title: string;\r\n message: string;\r\n icon?: SweetAlertIcon | null | undefined;\r\n icono?: string | null | undefined;\r\n confirmButtonText?: string | undefined;\r\n cancelButtonText?: string | undefined;\r\n showConfirmButton?: boolean | undefined;\r\n showCancelButton?: boolean | undefined;\r\n}\r\n\r\nexport function getActionMessageConfig(\r\n action: Exclude<ActionType, 'softDelete' | 'hardDelete'>,\r\n dataPreview?: string,\r\n): ActionMessageConfig;\r\nexport function getActionMessageConfig(\r\n action: Extract<ActionType, 'softDelete' | 'hardDelete'>,\r\n isActive: boolean,\r\n dataPreview?: string,\r\n): ActionMessageConfig;\r\nexport function getActionMessageConfig(\r\n action: ActionType,\r\n secondArg?: boolean | string,\r\n thirdArg?: string,\r\n): ActionMessageConfig {\r\n const isActive =\r\n action === 'softDelete' || action === 'hardDelete'\r\n ? typeof secondArg === 'boolean'\r\n ? secondArg\r\n : true\r\n : true;\r\n const dataPreview =\r\n action === 'softDelete' || action === 'hardDelete'\r\n ? thirdArg\r\n : typeof secondArg === 'string'\r\n ? secondArg\r\n : undefined;\r\n\r\n // Valores por defecto para todas las propiedades\r\n const defaults: ActionMessageConfig = {\r\n title: '',\r\n message: '',\r\n icon: undefined,\r\n confirmButtonText: undefined,\r\n cancelButtonText: undefined,\r\n showConfirmButton: undefined,\r\n showCancelButton: undefined,\r\n };\r\n\r\n if (action === 'softDelete') {\r\n if (isActive) {\r\n return {\r\n ...defaults,\r\n title: '¿Archivar registro?',\r\n message:\r\n 'El registro dejará de estar visible en las listas principales, pero podrás recuperarlo más tarde.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon/folder01.png',\r\n confirmButtonText: 'Archivar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n } else {\r\n return {\r\n ...defaults,\r\n title: '¿Restaurar registro?',\r\n message:\r\n 'El registro volverá a estar <strong>activo</strong> y visible en todas las listas principales del sistema.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon/documentation.png',\r\n confirmButtonText: 'Sí, restaurar',\r\n cancelButtonText: 'Dejar archivado',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n }\r\n if (action === 'hardDelete') {\r\n return {\r\n ...defaults,\r\n title: '¿Eliminar permanentemente?',\r\n message:\r\n 'Esta acción <strong>no se puede deshacer</strong>. Se perderán todos los datos asociados a este registro de forma inmediata.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon/delete.png',\r\n confirmButtonText: 'Eliminar permanentemente',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (action === 'save') {\r\n return {\r\n ...defaults,\r\n title: '¿Guardar registro?',\r\n message:\r\n 'El nuevo registro se guardará en el sistema.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon2/save_2029637.png',\r\n confirmButtonText: 'Guardar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (action === 'update') {\r\n return {\r\n ...defaults,\r\n title: '¿Actualizar registro?',\r\n message:\r\n 'Los cambios realizados se actualizarán en el sistema.' +\r\n (dataPreview ? `<br>${dataPreview}` : ''),\r\n icono: 'icon2/save_2029637.png',\r\n confirmButtonText: 'Actualizar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (action === 'restore') {\r\n return {\r\n ...defaults,\r\n title: '¿Revertir cambios?',\r\n message:\r\n 'Se perderán todos los cambios que hayas realizado en el formulario y se volverán a cargar los datos originales.',\r\n icono: 'icon/data-recovery.png',\r\n confirmButtonText: 'Restaurar',\r\n cancelButtonText: 'Cancelar',\r\n showConfirmButton: true,\r\n showCancelButton: true,\r\n };\r\n }\r\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\r\n console.warn(\r\n `[getActionMessageConfig] Acción \"${action}\" existe pero no tiene mensaje configurado. ` +\r\n 'Agrega la configuración correspondiente para evitar este warning.',\r\n );\r\n }\r\n // Retorna los valores por defecto si la acción no es válida\r\n return { ...defaults };\r\n}\r\n","import {\r\n Component,\r\n HostBinding,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n output,\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Button } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../../../injections/environment.token';\r\nimport { ParameterValuesService } from '../../../../services/src/parameter-values.service';\r\nimport {\r\n ACTION_TYPES,\r\n ActionType,\r\n} from '../../../../models/src/action-message.model';\r\n\r\n/**\r\n * Paleta corporativa de colores para `dsx-button`.\r\n *\r\n * Cada token tiene un significado semántico fijo. Úsala como referencia\r\n * para asignar `colorToken` al añadir nuevos tipos de botón.\r\n *\r\n * | Token | Color | Uso semántico |\r\n * |-----------|----------------|---------------------------------------------------|\r\n * | danger | Coral rojo | Acción destructiva e irreversible (eliminar) |\r\n * | warning | Naranja cálido | Acción con riesgo moderado / borrado lógico |\r\n * | caution | Ámbar dorado | Requiere verificación del usuario (actualizar) |\r\n * | success | Verde menta | Guardar nuevo registro / agregar |\r\n * | primary | Azul claro | Editar / navegar con contexto de registro |\r\n * | info | Cian suave | Recargar datos / refrescar vista |\r\n * | neutral | Gris azulado | Acción secundaria / navegación sin contexto |\r\n * | restore | Violeta suave | Deshacer / restaurar estado anterior |\r\n * | view | Teal profundo | Ver / previsualizar detalle |\r\n * | excel | Verde Excel | Exportar información a hoja de cálculo |\r\n * | download | Naranja quemado| Descargar archivo o recurso |\r\n * | import | Azul acero | Importar información desde archivo |\r\n * | details | Azul índigo | Abrir detalle de registro |\r\n */\r\nexport const DSX_PALETTE = {\r\n danger: '#EF5350',\r\n warning: '#FF7043',\r\n caution: '#FFB300',\r\n success: '#0ba055', // Verde para Guardar\r\n primary: '#0066cc', // Azul para Actualizar\r\n info: '#26C6DA',\r\n neutral: '#90A4AE',\r\n restore: '#B0BEC5', // Gris suave, menos resaltado\r\n return: '#11438d', // Azul violeta para \"Regresar registro archivado\"\r\n view: '#00838F',\r\n excel: '#217346',\r\n download: '#E65100',\r\n import: '#546E7A',\r\n details: '#3949AB',\r\n magenta: '#D81B60', // Magenta vibrante\r\n cyan: '#00BCD4', // Cian brillante\r\n olive: '#808000', // Verde oliva\r\n brown: '#8D6E63', // Marrón suave\r\n slate: '#607D8B', // Azul pizarra\r\n} as const;\r\n\r\nexport type DsxColorToken = keyof typeof DSX_PALETTE;\r\n\r\ntype DsxButtonConfig = {\r\n label: string;\r\n /** Nombre de icono para Material Symbols (fallback cuando no se define primeIcon). */\r\n icon: string;\r\n tooltip: string;\r\n /** Token de la paleta corporativa que determina el color del botón. */\r\n colorToken: DsxColorToken;\r\n /** Clase de PrimeIcons para renderizado por `p-button` ([icon]). */\r\n primeIcon?: string;\r\n /** Si es `true`, el botón se renderiza con contorno en lugar de relleno sólido. */\r\n outlined?: boolean;\r\n};\r\n\r\n/** Tipos que necesitan un `[id]` mayor a 0 para poder mostrarse. */\r\nconst TYPES_REQUIRING_ID: ActionType[] = [\r\n 'hardDelete',\r\n 'softDelete',\r\n 'restore',\r\n];\r\n\r\n@Component({\r\n selector: 'dsx-button',\r\n imports: [Button, TooltipModule],\r\n templateUrl: './dsx-button.html',\r\n styleUrl: './dsx-button.css',\r\n})\r\nexport class DsxButtonComponent {\r\n debug = input<boolean>(false);\r\n private renderCount = 0;\r\n private readonly _paramService = inject(ParameterValuesService<string>);\r\n private readonly _router = inject(Router);\r\n private readonly _environment = inject(ENVIRONMENT, {\r\n optional: true,\r\n }) as EnvironmentConfig | undefined;\r\n\r\n constructor() {\r\n if (isDevMode()) {\r\n effect(() => {\r\n if (!this.debug()) return;\r\n\r\n this.renderCount++;\r\n\r\n console.log(`[dsx-button:${this.type()}] render #${this.renderCount}`, {\r\n id: this.id(),\r\n type: this.type(),\r\n disabled: this.disabled(),\r\n routerLink: this.routerLink(),\r\n });\r\n });\r\n }\r\n }\r\n\r\n @HostBinding('class.dsx-button-compact-host')\r\n get compactHostClass(): boolean {\r\n return this.isCompactIconButton;\r\n }\r\n\r\n type = input<ActionType>(ACTION_TYPES.hardDelete);\r\n disabled = input<boolean>(false);\r\n routerLink = input<string | any[] | undefined>(undefined);\r\n /**\r\n * Ruta de navegación simplificada. La `/` inicial se agrega automáticamente.\r\n * Cada segmento solo admite: letras, números, `-`, `_`, `.` y `:` (params de ruta).\r\n * Ejemplos válidos: `'home'`, `'container/nuevo'`, `'item/123'`\r\n * Ejemplos inválidos: `'item/*'`, `'item?foo=bar'`, `'item/../other'`\r\n * Para rutas dinámicas complejas usa `[routerLink]` directamente.\r\n */\r\n routerPath = input<string | undefined>(undefined);\r\n /** Ancho del botón. Usa `rem` para que escale con la preferencia de fuente del usuario.\r\n * Ejemplo: `'8rem'`, `'12rem'`. Valor por defecto: `'9rem'`.\r\n */\r\n width = input<string>('9rem');\r\n iconOnly = input<boolean>(false);\r\n iconOnlyWidth = input<string>('2.5rem');\r\n raised = input<boolean>(true);\r\n rounded = input<boolean>(true);\r\n\r\n parameterName = input<string | undefined>(undefined);\r\n parameterExpectedValue = input<any>(1);\r\n parameterIndex = input<number>(0);\r\n\r\n id = input<number | string | null | undefined>(undefined);\r\n requireIdInput = input<boolean>(false);\r\n requiresIdGreaterThanZero = input<boolean>(false);\r\n\r\n labelOverride = input<string | undefined>(undefined);\r\n tooltipOverride = input<string | undefined>(undefined);\r\n iconOverride = input<string | undefined>(undefined);\r\n primeIconOverride = input<string | undefined>(undefined);\r\n /** Permite personalizar el color usando únicamente tokens de la paleta DSX. */\r\n colorOverride = input<DsxColorToken | undefined>(undefined);\r\n /** Permite forzar estilo outlined o sólido por instancia. */\r\n outlinedOverride = input<boolean | undefined>(undefined);\r\n /**\r\n * Override por instancia para el botón `validate`.\r\n * Tiene prioridad sobre `environment.showValidateButton`.\r\n */\r\n showValidateButtonOverride = input<boolean | undefined>(undefined);\r\n /**\r\n * Override por instancia para el botón `restore`.\r\n * Tiene prioridad sobre `environment.showRestoreButton`.\r\n */\r\n showRestoreButtonOverride = input<boolean | undefined>(undefined);\r\n\r\n action = output<void>();\r\n\r\n /** Valida y normaliza `routerPath`: agrega `/` inicial y rechaza caracteres inválidos. */\r\n readonly resolvedRouterLink = computed<string | undefined>(() => {\r\n this.log('computed resolvedRouterLink');\r\n const raw = this.routerPath();\r\n if (!raw) return undefined;\r\n\r\n const VALID_SEGMENT = /^[a-zA-Z0-9\\-_.:]+$/;\r\n const normalizedRaw = raw.replace(/^\\/+/, '');\r\n const rawSegments = normalizedRaw.split('/');\r\n const hasEmptySegments =\r\n normalizedRaw.length > 0 && rawSegments.some((s) => s.length === 0);\r\n if (hasEmptySegments) {\r\n console.warn(\r\n `[dsx-button] routerPath contiene segmentos vacíos (\"//\" o \"/\" al final). ` +\r\n `Ruta recibida: \"${raw}\"`,\r\n );\r\n return undefined;\r\n }\r\n\r\n const segments = rawSegments.filter(Boolean);\r\n const invalid = segments.filter((s) => !VALID_SEGMENT.test(s));\r\n\r\n if (invalid.length > 0) {\r\n console.warn(\r\n `[dsx-button] routerPath contiene segmentos inválidos: \"${invalid.join('\", \"')}\". ` +\r\n `Solo se permiten letras, números, guion (-), guion bajo (_), punto (.) y dos puntos (:). ` +\r\n `Ruta recibida: \"${raw}\"`,\r\n );\r\n return undefined;\r\n }\r\n\r\n return `/${segments.join('/')}`;\r\n });\r\n\r\n /** Prioriza routerPath (validado) sobre routerLink (libre). */\r\n readonly effectiveRouterLink = computed<string | any[] | undefined>(() => {\r\n this.log('computed effectiveRouterLink');\r\n const resolvedPath = this.resolvedRouterLink();\r\n if (resolvedPath) {\r\n return resolvedPath;\r\n }\r\n\r\n const link = this.routerLink();\r\n if (typeof link !== 'string') {\r\n return link;\r\n }\r\n\r\n const trimmed = link.trim();\r\n if (!trimmed) {\r\n return link;\r\n }\r\n\r\n // URLs externas no se normalizan ni validan como rutas internas.\r\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(trimmed)) {\r\n return link;\r\n }\r\n\r\n const VALID_SEGMENT = /^[a-zA-Z0-9\\-_.:]+$/;\r\n const pathForValidation = trimmed.replace(/^\\/+/, '');\r\n const rawSegments = pathForValidation.split('/');\r\n const hasEmptySegments =\r\n pathForValidation.length > 0 &&\r\n rawSegments.some((segment) => segment.length === 0);\r\n\r\n if (hasEmptySegments) {\r\n console.warn(\r\n `[dsx-button] routerLink contiene segmentos vacíos (\"//\" o \"/\" al final). ` +\r\n `Ruta recibida: \"${link}\"`,\r\n );\r\n return link;\r\n }\r\n\r\n const invalid = rawSegments\r\n .filter(Boolean)\r\n .filter((segment) => !VALID_SEGMENT.test(segment));\r\n\r\n if (invalid.length > 0) {\r\n console.warn(\r\n `[dsx-button] routerLink contiene segmentos inválidos: \"${invalid.join('\", \"')}\". ` +\r\n `Solo se permiten letras, números, guion (-), guion bajo (_), punto (.) y dos puntos (:). ` +\r\n `Ruta recibida: \"${link}\"`,\r\n );\r\n return link;\r\n }\r\n\r\n // Si llega una ruta simple sin prefijo, se normaliza a absoluta para evitar navegación relativa inesperada.\r\n if (\r\n link.startsWith('/') ||\r\n link.startsWith('./') ||\r\n link.startsWith('../')\r\n ) {\r\n return link;\r\n }\r\n\r\n if (trimmed.includes('?') || trimmed.includes('#')) {\r\n return link;\r\n }\r\n\r\n return `/${trimmed.split('/').filter(Boolean).join('/')}`;\r\n });\r\n\r\n // get buttonStyle(): Record<string, string> {\r\n // this.log('getter buttonStyle');\r\n // const color = DSX_PALETTE[this.config.colorToken];\r\n // const width = this.iconOnly() ? this.iconOnlyWidth() : this.width();\r\n\r\n // if (this.isCompactIconButton) {\r\n // return {\r\n // width,\r\n // background: 'transparent',\r\n // borderColor: 'transparent',\r\n // color,\r\n // };\r\n // }\r\n\r\n // if (this.config.outlined) {\r\n // return { width, background: 'transparent', borderColor: color, color };\r\n // }\r\n\r\n // return { width, background: color, borderColor: color, color: '#ffffff' };\r\n // }\r\n\r\n readonly buttonStyleComputed = computed(() => {\r\n const color = DSX_PALETTE[this.config.colorToken];\r\n const width = this.iconOnly() ? this.iconOnlyWidth() : this.width();\r\n\r\n if (this.isCompactIconButton) {\r\n return {\r\n width,\r\n background: 'transparent',\r\n borderColor: 'transparent',\r\n color,\r\n };\r\n }\r\n\r\n if (this.config.outlined) {\r\n return {\r\n width,\r\n background: 'transparent',\r\n borderColor: color,\r\n color,\r\n };\r\n }\r\n\r\n return {\r\n width,\r\n background: color,\r\n borderColor: color,\r\n color: '#ffffff',\r\n };\r\n });\r\n\r\n get buttonLabel(): string | undefined {\r\n return this.iconOnly() ? undefined : this.label;\r\n }\r\n\r\n get buttonSize(): 'small' | undefined {\r\n return this.isCompactIconButton ? 'small' : undefined;\r\n }\r\n\r\n get buttonStyleClass(): string | undefined {\r\n return this.isCompactIconButton ? 'dsx-button-compact' : undefined;\r\n }\r\n\r\n get isCompactIconButton(): boolean {\r\n return this.rounded() && this.iconOnly();\r\n }\r\n\r\n get config(): DsxButtonConfig {\r\n const cfg = ACTION_CONFIG[this.type() as ActionType];\r\n const colorOverride = this.colorOverride();\r\n const outlinedOverride = this.outlinedOverride();\r\n\r\n // Ya no se gestiona softDelete/return como modo, cada acción es independiente\r\n\r\n return {\r\n ...cfg,\r\n colorToken: colorOverride ?? cfg.colorToken,\r\n outlined: outlinedOverride ?? cfg.outlined,\r\n };\r\n }\r\n\r\n get label(): string {\r\n return this.labelOverride() ?? this.config.label;\r\n }\r\n\r\n // get tooltip(): string {\r\n // this.log('getter tooltip');\r\n // return this.tooltipOverride() ?? this.config.tooltip;\r\n // }\r\n\r\n readonly tooltip = computed(() => {\r\n return this.tooltipOverride() ?? this.config.tooltip;\r\n });\r\n\r\n get icon(): string {\r\n return this.iconOverride() ?? this.config.icon;\r\n }\r\n\r\n get materialIcon(): string {\r\n return this.icon || 'file_export';\r\n }\r\n\r\n get primeIcon(): string | undefined {\r\n if (this.primeIconOverride()) {\r\n return this.primeIconOverride();\r\n }\r\n\r\n return 'primeIcon' in this.config ? this.config.primeIcon : undefined;\r\n }\r\n\r\n // showButton(): boolean {\r\n // this.time('showButton');\r\n\r\n // const result =\r\n // this.passesGlobalVisibilityPolicy() &&\r\n // this.passesParameterValidation() &&\r\n // this.passesIdValidation();\r\n\r\n // this.log('showButton()', {\r\n // result,\r\n // });\r\n\r\n // this.timeEnd('showButton');\r\n\r\n // return result;\r\n // }\r\n\r\n readonly visible = computed(() => {\r\n return (\r\n this.passesGlobalVisibilityPolicy() &&\r\n this.passesParameterValidation() &&\r\n this.passesIdValidation()\r\n );\r\n });\r\n\r\n private passesGlobalVisibilityPolicy(): boolean {\r\n const type = this.type();\r\n\r\n if (type === 'validate') {\r\n const override = this.showValidateButtonOverride();\r\n if (override !== undefined) {\r\n return override;\r\n }\r\n\r\n return this._environment?.showValidateButton ?? false;\r\n }\r\n\r\n if (type === 'restore') {\r\n const override = this.showRestoreButtonOverride();\r\n if (override !== undefined) {\r\n return override;\r\n }\r\n\r\n return this._environment?.showRestoreButton ?? false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async onButtonClick(): Promise<void> {\r\n this.log('click', {\r\n id: this.id(),\r\n target: this.effectiveRouterLink(),\r\n });\r\n\r\n this.action.emit();\r\n\r\n const target = this.effectiveRouterLink();\r\n if (target == null) {\r\n if (this.type() === 'home') {\r\n console.warn(\r\n '[dsx-button] El botón tipo \"home\" no tiene routerLink ni routerPath configurado.',\r\n );\r\n }\r\n return;\r\n }\r\n\r\n try {\r\n const start = performance.now();\r\n const navigated = await this.navigateToTarget(target);\r\n this.log('navigation', {\r\n target,\r\n navigated,\r\n durationMs: Math.round(performance.now() - start),\r\n });\r\n if (!navigated) {\r\n // El router rechazó la navegación, lo más común durante hot-reload\r\n // es que un guard de autenticación aún no tiene el estado listo.\r\n // Se reintenta una vez tras un tick para darle tiempo al guard.\r\n const retried = await new Promise<boolean>((resolve) =>\r\n setTimeout(\r\n async () => resolve(await this.navigateToTarget(target)),\r\n 0,\r\n ),\r\n );\r\n if (!retried) {\r\n console.warn(\r\n '[dsx-button] Navegación rechazada (posiblemente por un route guard). ' +\r\n 'Si ocurre solo tras hot-reload, es normal que el guard rechace ' +\r\n 'la primera navegación mientras los servicios de autenticación ' +\r\n 'no han terminado de restaurar su estado.',\r\n target,\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n console.warn(\r\n '[dsx-button] Error al navegar desde el botón.',\r\n target,\r\n error,\r\n );\r\n }\r\n }\r\n\r\n private passesIdValidation(): boolean {\r\n this.log('passesIdValidation');\r\n const explicitId = this.getNormalizedId();\r\n const routeId = this.getIdFromNavigationTarget(this.effectiveRouterLink());\r\n const id = explicitId ?? routeId;\r\n const requiresExistingRecord =\r\n this.requiresIdGreaterThanZero() ||\r\n this.type() === 'hardDelete' ||\r\n this.type() === 'softDelete' ||\r\n this.type() === 'restore' ||\r\n this.type() === 'return';\r\n\r\n // Permite exigir que venga [id] cuando el caso de uso lo requiera.\r\n if (this.requireIdInput() && typeof id !== 'number') {\r\n return false;\r\n }\r\n\r\n if (!requiresExistingRecord) {\r\n return true;\r\n }\r\n\r\n return typeof id === 'number' && id > 0;\r\n }\r\n\r\n private getIdFromNavigationTarget(\r\n target: string | any[] | undefined,\r\n ): number | undefined {\r\n if (Array.isArray(target)) {\r\n for (let index = target.length - 1; index >= 0; index--) {\r\n const parsed = this.parseFiniteNumber(target[index]);\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n if (typeof target === 'string') {\r\n const cleanPath = target.split('?')[0].split('#')[0];\r\n const segments = cleanPath.split('/').filter(Boolean);\r\n\r\n for (let index = segments.length - 1; index >= 0; index--) {\r\n const parsed = this.parseFiniteNumber(segments[index]);\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private parseFiniteNumber(value: unknown): number | undefined {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return undefined;\r\n }\r\n\r\n const parsed = Number(trimmed);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private getNormalizedId(): number | undefined {\r\n const value = this.id();\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : undefined;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return undefined;\r\n }\r\n\r\n const parsed = Number(trimmed);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private hasExplicitIdInput(): boolean {\r\n const value = this.id();\r\n\r\n if (value === null || value === undefined) {\r\n return false;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value.trim() !== '';\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private navigateToTarget(target: string | any[]): Promise<boolean> {\r\n if (Array.isArray(target)) {\r\n return this._router.navigate(target);\r\n }\r\n\r\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(target)) {\r\n window.location.assign(target);\r\n return Promise.resolve(true);\r\n }\r\n\r\n return this._router.navigateByUrl(target);\r\n }\r\n\r\n private passesParameterValidation(): boolean {\r\n this.log('passesParameterValidation');\r\n const parameterName = this.parameterName();\r\n\r\n // Si no se define un parámetro de seguridad, el botón se muestra sin restricción.\r\n if (!parameterName) {\r\n return true;\r\n }\r\n\r\n // Mantiene una UX estable durante refresh de parámetros: evita parpadeo\r\n // y no evalúa permisos hasta que ParameterValuesService termine de cargar.\r\n if (!this._paramService.loaded) {\r\n return false;\r\n }\r\n\r\n // Conserva el comportamiento original del servicio:\r\n // - retorna false si no cumple el valor esperado\r\n // - alerta si el parámetro no existe (ayuda a detectar typos)\r\n return this._paramService.isParameterValue(\r\n parameterName,\r\n this.parameterExpectedValue(),\r\n this.parameterIndex(),\r\n );\r\n }\r\n\r\n private log(message: string, data?: unknown): void {\r\n if (!this.debug()) return;\r\n\r\n console.log(\r\n `%c[dsx-button:${this.type()}] ${message}`,\r\n 'color:#1976d2;font-weight:bold',\r\n data ?? '',\r\n );\r\n }\r\n\r\n private warn(message: string, data?: unknown): void {\r\n if (!this.debug()) return;\r\n\r\n console.warn(`[dsx-button:${this.type()}] ${message}`, data ?? '');\r\n }\r\n\r\n private time(label: string): void {\r\n if (!this.debug()) return;\r\n\r\n console.time(`[dsx-button:${this.type()}] ${label}`);\r\n }\r\n\r\n private timeEnd(label: string): void {\r\n if (!this.debug()) return;\r\n\r\n console.timeEnd(`[dsx-button:${this.type()}] ${label}`);\r\n }\r\n}\r\n\r\nconst ACTION_CONFIG: Record<ActionType, DsxButtonConfig> = {\r\n hardDelete: {\r\n label: 'Eliminar',\r\n icon: 'delete_forever',\r\n primeIcon: 'pi pi-trash',\r\n colorToken: 'danger',\r\n tooltip: 'Eliminar registro',\r\n },\r\n softDelete: {\r\n label: 'Archivar',\r\n icon: 'archive',\r\n primeIcon: 'pi pi-thumbs-down',\r\n colorToken: 'warning',\r\n tooltip: 'Archivar registro',\r\n },\r\n return: {\r\n label: 'Restaurar',\r\n icon: 'history',\r\n primeIcon: 'pi pi-history',\r\n colorToken: 'return',\r\n tooltip: 'Restaurar registro archivado',\r\n outlined: true,\r\n },\r\n home: {\r\n label: 'Inicio',\r\n icon: 'home_app_logo',\r\n primeIcon: 'pi pi-home',\r\n colorToken: 'neutral',\r\n tooltip: 'Ir al inicio',\r\n outlined: true,\r\n },\r\n validate: {\r\n label: 'Validar',\r\n icon: 'help',\r\n primeIcon: 'pi pi-check-circle',\r\n colorToken: 'neutral',\r\n tooltip: 'Validar formulario',\r\n outlined: true,\r\n },\r\n restore: {\r\n label: 'Deshacer',\r\n icon: 'history',\r\n primeIcon: 'pi pi-history',\r\n colorToken: 'restore',\r\n tooltip: 'Restaurar los datos',\r\n outlined: true,\r\n },\r\n edit: {\r\n label: 'Editar',\r\n icon: 'edit',\r\n primeIcon: 'pi pi-file-edit',\r\n colorToken: 'primary',\r\n tooltip: 'Editar registro',\r\n },\r\n save: {\r\n label: 'Guardar',\r\n icon: 'save',\r\n primeIcon: 'pi pi-save',\r\n colorToken: 'success',\r\n tooltip: 'Guardar nuevo registro',\r\n },\r\n update: {\r\n label: 'Actualizar',\r\n icon: 'edit_note',\r\n primeIcon: 'pi pi-save',\r\n colorToken: 'primary',\r\n tooltip: 'Actualizar registro existente',\r\n },\r\n refresh: {\r\n label: 'Refrescar',\r\n icon: 'cloud_sync',\r\n primeIcon: 'pi pi-refresh',\r\n colorToken: 'info',\r\n tooltip: 'Sincronizar datos',\r\n outlined: true,\r\n },\r\n details: {\r\n label: 'Detalles',\r\n icon: 'list',\r\n primeIcon: 'pi pi-list',\r\n colorToken: 'details',\r\n tooltip: 'Detalle de registro',\r\n },\r\n create: {\r\n label: 'Agregar',\r\n icon: 'add_box',\r\n primeIcon: 'pi pi-plus',\r\n colorToken: 'success',\r\n tooltip: 'Nuevo registro',\r\n },\r\n view: {\r\n label: 'Visualizar',\r\n icon: 'visibility',\r\n primeIcon: 'pi pi-eye',\r\n colorToken: 'view',\r\n tooltip: 'Vista previa',\r\n },\r\n export: {\r\n label: 'Exportar',\r\n icon: 'file_export',\r\n primeIcon: 'pi pi-file-excel',\r\n colorToken: 'excel',\r\n tooltip: 'Exportar a Excel',\r\n },\r\n download: {\r\n label: 'Descargar',\r\n icon: 'download',\r\n primeIcon: 'pi pi-download',\r\n colorToken: 'download',\r\n tooltip: 'Descargar archivo',\r\n },\r\n import: {\r\n label: 'Importar',\r\n icon: 'database_upload',\r\n primeIcon: 'pi pi-upload',\r\n colorToken: 'import',\r\n tooltip: 'Importar desde archivo',\r\n },\r\n} as const;\r\n","<!--Botón con las configuraciones dinámicas para CRUD -->\r\n@if (visible()) {\r\n<p-button\r\n [label]=\"buttonLabel\"\r\n [style]=\"buttonStyleComputed()\"\r\n [styleClass]=\"buttonStyleClass\"\r\n [pTooltip]=\"tooltip()\"\r\n [tooltipDisabled]=\"disabled()\"\r\n tooltipPosition=\"top\"\r\n [rounded]=\"rounded()\"\r\n [text]=\"isCompactIconButton\"\r\n [size]=\"buttonSize\"\r\n severity=\"secondary\"\r\n [disabled]=\"disabled()\"\r\n [icon]=\"iconOnly() ? primeIcon : undefined\"\r\n (click)=\"onButtonClick()\"\r\n>\r\n @if (!iconOnly()) {\r\n <span class=\"material-symbols-outlined dsx-button-icon-small\"\r\n >{{ materialIcon }}</span\r\n >\r\n }\r\n</p-button>\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator,\r\n} from '@angular/forms';\r\nimport { Button } from 'primeng/button';\r\nimport { FileUpload } from 'primeng/fileupload';\r\nimport { Tooltip } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'dsx-file-upload',\r\n imports: [FileUpload, Tooltip, Button],\r\n templateUrl: './file.component.html',\r\n styleUrl: './file.component.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FileComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => FileComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FileComponent\r\n implements ControlValueAccessor, Validator, AfterViewInit, OnDestroy\r\n{\r\n // Inputs\r\n existingFileName = input<string | null>(null);\r\n debug = input<boolean>(false);\r\n required = input<boolean>(true);\r\n accept = input<string>('.xls,.xlsx');\r\n pTooltipOverride = input<string>('Seleccione un archivo');\r\n tooltipPositionOverride = input<string | undefined>('top');\r\n maxFileSize = input<number>(5);\r\n invalidSummary = input<string>('El formato es inválido.');\r\n invalidDetail = input<string>('Archivo debe tener un formato válido. ({0}).');\r\n invalidSizeSummary = input<string>('Tamaño de archivo inválido.');\r\n invalidSizeDetail = input<string>('El tamaño máximo permitido es {0}');\r\n\r\n // Signals de estado\r\n isReplacing = signal(false);\r\n disabled = signal<boolean>(false);\r\n private isViewActive = signal(false);\r\n private value: File | null = null;\r\n private touched = false;\r\n private control: AbstractControl | null = null;\r\n\r\n // Dependencias\r\n private cdr = inject(ChangeDetectorRef);\r\n fileUpload = viewChild<FileUpload>('fileUpload');\r\n\r\n // Computed properties (solo se \"activan\" si la vista está activa)\r\n hasExistingFile = computed(() => {\r\n if (!this.isViewActive()) return false;\r\n const hasFile = !!this.existingFileName() && !this.isReplacing();\r\n if (this.debug() && this.isViewActive())\r\n this.log('hasExistingFile', { hasFile });\r\n return hasFile;\r\n });\r\n\r\n showExistingFile = computed(() => {\r\n if (!this.isViewActive()) return false;\r\n const show = this.hasExistingFile() && !this.isReplacing();\r\n if (this.debug() && this.isViewActive())\r\n this.log('showExistingFile', { show });\r\n return show;\r\n });\r\n\r\n isFileUploadEnabled = computed(() => {\r\n if (!this.isViewActive()) return false;\r\n if (this.disabled()) return false;\r\n const enabled = !this.hasExistingFile() || this.isReplacing();\r\n if (this.debug() && this.isViewActive())\r\n this.log('isFileUploadEnabled', { enabled });\r\n return enabled;\r\n });\r\n\r\n isReplaceButtonDisabled = computed(() => {\r\n if (!this.isViewActive()) return true;\r\n if (this.disabled()) return true;\r\n if (this.isReplacing()) return true;\r\n return false;\r\n });\r\n\r\n // --- Constructor: Aquí se crean los effects (contexto de inyección válido) ---\r\n constructor() {\r\n // Efecto 1: Re-evaluar validación cuando cambie el estado relevante\r\n effect(() => {\r\n // Solo ejecutar si la vista está activa\r\n if (!this.isViewActive()) return;\r\n\r\n // \"Tocar\" estas signals para que el efecto dependa de ellas\r\n const hasFile = this.hasExistingFile();\r\n const replacing = this.isReplacing();\r\n const fileName = this.existingFileName();\r\n\r\n if (this.debug())\r\n this.log('Effect: validation trigger', {\r\n hasFile,\r\n replacing,\r\n fileName,\r\n });\r\n\r\n if (this.control) {\r\n // Usar untracked para no crear bucles infinitos\r\n untracked(() => {\r\n this.control?.updateValueAndValidity({ emitEvent: false });\r\n });\r\n }\r\n this.cdr.detectChanges();\r\n });\r\n\r\n // Efecto 2: Cancelar reemplazo si el componente se deshabilita\r\n effect(() => {\r\n if (!this.isViewActive()) return;\r\n\r\n const isDisabled = this.disabled();\r\n const isReplacingNow = this.isReplacing();\r\n\r\n if (this.debug())\r\n this.log('Effect: disabled changed', { isDisabled, isReplacingNow });\r\n\r\n if (isDisabled && isReplacingNow) {\r\n this.cancelReplace();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Activar el componente después de que la vista esté lista\r\n setTimeout(() => {\r\n this.isViewActive.set(true);\r\n if (this.debug()) console.log('[FileComponent] View activated');\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.isViewActive.set(false);\r\n if (this.debug()) console.log('[FileComponent] Component destroyed');\r\n }\r\n\r\n // --- Métodos públicos y ControlValueAccessor ---\r\n onSelect(event: any): void {\r\n if (!this.isViewActive()) return;\r\n if (!this.isFileUploadEnabled()) {\r\n console.warn('File upload is disabled');\r\n this.fileUpload()?.clear();\r\n return;\r\n }\r\n\r\n const file = event.files?.[0] ?? null;\r\n if (this.debug()) this.log('File selected', { name: file?.name });\r\n\r\n this.value = file;\r\n this.onChange(file);\r\n this.markAsTouched();\r\n\r\n if (this.isReplacing() && file) {\r\n this.isReplacing.set(false);\r\n }\r\n\r\n if (this.control) {\r\n this.control.updateValueAndValidity();\r\n }\r\n }\r\n\r\n clear(): void {\r\n if (!this.isViewActive()) return;\r\n this.fileUpload()?.clear();\r\n this.value = null;\r\n this.onChange(null);\r\n this.markAsTouched();\r\n if (this.control) this.control.updateValueAndValidity();\r\n }\r\n\r\n writeValue(value: File | null): void {\r\n if (!this.isViewActive()) return;\r\n if (this.debug()) this.log('writeValue', { value: value?.name || null });\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n if (!this.isViewActive()) return;\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n startReplace(): void {\r\n if (!this.isViewActive()) return;\r\n if (this.disabled()) return;\r\n this.fileUpload()?.clear();\r\n this.value = null;\r\n this.onChange(null);\r\n this.isReplacing.set(true);\r\n if (this.debug()) this.log('startReplace');\r\n }\r\n\r\n cancelReplace(): void {\r\n if (!this.isViewActive()) return;\r\n this.isReplacing.set(false);\r\n this.fileUpload()?.clear();\r\n this.value = null;\r\n this.onChange(null);\r\n this.markAsTouched();\r\n if (this.debug()) this.log('cancelReplace');\r\n }\r\n\r\n // --- Validación ---\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = control;\r\n if (!this.isViewActive()) return null;\r\n\r\n if (!this.required()) return null;\r\n if (this.hasExistingFile()) return null;\r\n if (this.isReplacing() && !this.value) return { required: true };\r\n if (!this.hasExistingFile() && !this.value) return { required: true };\r\n\r\n return null;\r\n }\r\n\r\n // --- Privados ---\r\n private onChange = (_: File | null) => {};\r\n private onTouched = () => {};\r\n\r\n private markAsTouched(): void {\r\n if (!this.touched) {\r\n this.touched = true;\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private log(method: string, data?: any): void {\r\n console.log(`[FileComponent] ${method}`, data || '');\r\n }\r\n}\r\n","@if (showExistingFile()) {\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"file-name\"> 📄 {{ existingFileName() }} </span>\r\n\r\n <p-button\r\n icon=\"pi pi-cloud-upload\"\r\n [rounded]=\"true\"\r\n severity=\"info\"\r\n (click)=\"startReplace()\"\r\n [disabled]=\"isReplaceButtonDisabled()\"\r\n pTooltip=\"Reemplazar archivo\"\r\n tooltipPosition=\"top\"\r\n />\r\n </div>\r\n} @else {\r\n <div class=\"flex items-center gap-2\">\r\n <p-fileUpload\r\n #fileUpload\r\n mode=\"basic\"\r\n [accept]=\"accept()\"\r\n [maxFileSize]=\"maxFileSize() * 1024 * 1024\"\r\n [invalidFileTypeMessageSummary]=\"invalidSummary()\"\r\n [invalidFileTypeMessageDetail]=\"invalidDetail()\"\r\n [invalidFileSizeMessageSummary]=\"invalidSizeSummary()\"\r\n [invalidFileSizeMessageDetail]=\"invalidSizeDetail()\"\r\n (onSelect)=\"onSelect($event)\"\r\n [disabled]=\"!isFileUploadEnabled()\"\r\n [pTooltip]=\"pTooltipOverride()\"\r\n [tooltipPosition]=\"tooltipPositionOverride()\"\r\n />\r\n\r\n @if (isReplacing()) {\r\n <p-button\r\n icon=\"pi pi-times\"\r\n [rounded]=\"true\"\r\n severity=\"secondary\"\r\n (click)=\"cancelReplace()\"\r\n [disabled]=\"disabled()\"\r\n pTooltip=\"Cancelar reemplazo\"\r\n tooltipPosition=\"top\"\r\n />\r\n }\r\n </div>\r\n}\r\n","import { isDevMode, Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n /**\r\n * Stringifica el JSON manteniendo arrays en una línea para una vista más compacta\r\n */\r\n private compactStringify(obj: any, indent: number = 0): string {\r\n const spaces = ' '.repeat(indent);\r\n\r\n if (obj === null) {\r\n return 'null';\r\n }\r\n\r\n if (typeof obj !== 'object') {\r\n if (typeof obj === 'string') {\r\n return JSON.stringify(obj);\r\n }\r\n return String(obj);\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return JSON.stringify(obj.toISOString());\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n // Mantener arrays en una línea\r\n const items = obj.map((item) => {\r\n if (item instanceof Date) {\r\n return JSON.stringify(item.toISOString());\r\n }\r\n if (typeof item === 'object' && item !== null) {\r\n return this.compactStringify(item, indent);\r\n }\r\n return typeof item === 'string'\r\n ? JSON.stringify(item)\r\n : item === null\r\n ? 'null'\r\n : String(item);\r\n });\r\n return `[${items.join(', ')}]`;\r\n }\r\n\r\n // Para objetos, mantener la indentación\r\n const keys = Object.keys(obj);\r\n if (keys.length === 0) {\r\n return '{}';\r\n }\r\n\r\n const innerIndent = indent + 2;\r\n const innerSpaces = ' '.repeat(innerIndent);\r\n const lines = keys.map((key) => {\r\n const value = obj[key];\r\n const stringified =\r\n value instanceof Date\r\n ? JSON.stringify(value.toISOString())\r\n : typeof value === 'object' && value !== null\r\n ? this.compactStringify(value, innerIndent)\r\n : typeof value === 'string'\r\n ? JSON.stringify(value)\r\n : value === null\r\n ? 'null'\r\n : String(value);\r\n return `${innerSpaces}\"${key}\": ${stringified}`;\r\n });\r\n\r\n return `{\\n${lines.join(',\\n')}\\n${spaces}}`;\r\n }\r\n\r\n private readonly instanceId = Math.random().toString(36).slice(2, 8);\r\n private executions = 0;\r\n\r\n transform(value: any): string {\r\n if (isDevMode()) {\r\n this.executions++;\r\n\r\n if (this.executions % 10 === 0) {\r\n console.log(`[jsonHighlight:${this.instanceId}] ${this.executions}`);\r\n }\r\n }\r\n\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = this.compactStringify(value);\r\n // Detecta fechas ISO: \"YYYY-MM-DDTHH:MM:SS.mmmZ\"\r\n const ISO_DATE_RE = /^\"(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\"$/;\r\n\r\n // Aplica estilo y colores para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Detectar fechas ISO (YYYY-MM-DDTHH:MM:SS.mmmZ)\r\n const isoMatch = match.match(ISO_DATE_RE);\r\n if (isoMatch) {\r\n return `<span class=\"json-string json-date\">\"<span class=\"json-date-part\">${isoMatch[1]}</span><span class=\"json-date-sep\">T</span><span class=\"json-date-time\">${isoMatch[2]}</span>\"</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, (match) => {\r\n if (match === 'null') {\r\n return '<span class=\"json-null\">null</span>';\r\n }\r\n return `<span class=\"json-boolean\">${match}</span>`;\r\n })\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n effect,\r\n input,\r\n signal,\r\n OnDestroy,\r\n isDevMode,\r\n} from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { JsonHighlightPipe } from '../../../../pipe/src/json-highlight.pipe';\r\n\r\nfunction uid() {\r\n return Math.random().toString(36).substring(2, 8);\r\n}\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n standalone: true,\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class JsonValuesDebujComponent implements OnDestroy {\r\n form = input<FormGroup | null>(null);\r\n debug = input<boolean>(false);\r\n\r\n debugValue = signal<any>(null);\r\n\r\n private id = uid();\r\n private subscription?: Subscription;\r\n private changesCount = 0;\r\n\r\n // Computed que indica si debemos mostrar debug\r\n get shouldDebug(): boolean {\r\n // Si debug está explícitamente true, mostrar\r\n if (this.debug()) return true;\r\n // Si está en modo desarrollo y debug no es false, mostrar\r\n if (isDevMode() && this.debug() !== false) return true;\r\n // En cualquier otro caso, no mostrar\r\n return false;\r\n }\r\n\r\n constructor() {\r\n if (this.shouldDebug) {\r\n console.log('CONSTRUCTOR', this.id);\r\n }\r\n\r\n effect((onCleanup) => {\r\n const form = this.form();\r\n\r\n if (!form) return; // 👈 CLAVE\r\n\r\n if (this.shouldDebug) {\r\n console.log(`[json-debug:${this.id}] EFFECT INIT`, {\r\n controls: Object.keys(form.controls).length,\r\n });\r\n }\r\n\r\n this.subscription?.unsubscribe();\r\n\r\n this.debugValue.set(form.getRawValue());\r\n\r\n this.subscription = form.valueChanges.subscribe(() => {\r\n this.debugValue.set(form.getRawValue());\r\n if (this.shouldDebug) {\r\n this.changesCount++;\r\n }\r\n });\r\n\r\n onCleanup(() => {\r\n this.subscription?.unsubscribe();\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.shouldDebug) {\r\n console.log('DESTROY', this.id);\r\n }\r\n\r\n this.subscription?.unsubscribe();\r\n\r\n if (this.shouldDebug) {\r\n console.log(`[json-debug:${this.id}] DESTROY`, {\r\n totalChanges: this.changesCount,\r\n });\r\n }\r\n }\r\n}\r\n","@if (form() && shouldDebug) {\r\n <div class=\"custom-container\">\r\n <pre class=\"custom-pre\" [innerHTML]=\"debugValue() | jsonHighlight\"></pre>\r\n </div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { IconDsxComponent } from '../../icon-dsx/icon-dsx.component';\r\n\r\n@Component({\r\n selector: 'dsx-ico-label',\r\n imports: [IconDsxComponent],\r\n templateUrl: './ico-label.html',\r\n styleUrl: './ico-label.css',\r\n})\r\nexport class IcoLabel {\r\n ico = input.required<string>();\r\n label = input.required<string>();\r\n}\r\n","<div class=\"flex\">\r\n <icon-dsx class=\"myIco\" [name]=\"ico()\"></icon-dsx>\r\n <span class=\"myLabel\">{{ label() }}</span>\r\n</div>\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio centralizado para controlar el estado de carga global.\r\n *\r\n * Expone una señal (`spinnerVisible`) que puede consumirse en componentes\r\n * para mostrar u ocultar un spinner.\r\n *\r\n * Uso recomendado:\r\n * - `show()` / `hide()` para flujos con múltiples operaciones concurrentes.\r\n * - `showImmediate()` para feedback visual inmediato (sin afectar contador).\r\n * - `reset()` para recuperar estado en errores inesperados.\r\n */\r\nexport class SpinnerLoadingService {\r\n /**\r\n * Señal reactiva que indica si el spinner debe mostrarse.\r\n *\r\n * Ejemplo:\r\n * ```ts\r\n * readonly isLoading = this.spinnerLoadingService.spinnerVisible;\r\n * ```\r\n */\r\n spinnerVisible = signal(false);\r\n\r\n /**\r\n * Contador interno de operaciones activas.\r\n * Permite que el spinner permanezca visible mientras haya procesos en curso.\r\n */\r\n private counter = 0;\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Incrementa el contador de cargas activas.\r\n *\r\n * Muestra el spinner solo en la transición de `0 -> 1` para evitar\r\n * renderizados redundantes cuando hay varias operaciones simultáneas.\r\n *\r\n * Cuándo usarlo:\r\n * - Antes de iniciar una petición HTTP manual.\r\n * - Antes de ejecutar una acción asíncrona larga.\r\n */\r\n show(): void {\r\n this.counter++;\r\n if (this.counter === 1) {\r\n this.spinnerVisible.set(true);\r\n }\r\n }\r\n\r\n /**\r\n * Muestra el spinner de forma inmediata sin modificar el contador.\r\n *\r\n * Cuándo usarlo:\r\n * - Para feedback instantáneo en la UI (por ejemplo, al hacer clic en un botón).\r\n * - Cuando otro mecanismo (ejemplo: interceptor HTTP) controlará `show()`/`hide()`.\r\n */\r\n showImmediate(): void {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n /**\r\n * Decrementa el contador de cargas activas.\r\n *\r\n * Oculta el spinner únicamente cuando el contador llega a `0`.\r\n * Si se llama más veces de las debidas, el contador no baja de `0`.\r\n *\r\n * Cuándo usarlo:\r\n * - Al finalizar una operación iniciada con `show()`.\r\n */\r\n hide(): void {\r\n if (this.counter > 0) {\r\n this.counter--;\r\n }\r\n\r\n if (this.counter === 0) {\r\n this.spinnerVisible.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Restablece el estado del servicio a su valor inicial.\r\n *\r\n * Fuerza `counter = 0` y oculta el spinner.\r\n * Útil en escenarios de recuperación por error o al reinicializar contexto.\r\n */\r\n reset(): void {\r\n this.counter = 0;\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, viewChild } from '@angular/core';\r\nimport { createTimeline } from 'animejs';\r\n\r\n@Component({\r\n selector: 'app-logo-dsx',\r\n imports: [],\r\n templateUrl: './logo-dsx.component.html',\r\n styleUrl: './logo-dsx.component.css',\r\n})\r\nexport class LogoDsxComponent implements AfterViewInit {\r\n logo = viewChild.required<ElementRef>('logo');\r\n hexagon = viewChild.required<ElementRef>('logoHexagon');\r\n circle = viewChild.required<ElementRef>('logoCircle');\r\n mask = viewChild.required<ElementRef>('logoMask');\r\n text = viewChild.required<ElementRef>('logoText');\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n createTimeline({\r\n autoplay: true,\r\n delay: 90,\r\n })\r\n .add(this.logo().nativeElement, {\r\n translateY: [-100, 0],\r\n opacity: [0, 1],\r\n duration: 420,\r\n easing: 'outCubic',\r\n })\r\n .add(\r\n this.hexagon().nativeElement,\r\n {\r\n rotate: [-54, 0],\r\n duration: 220,\r\n easing: 'outBack',\r\n },\r\n 60,\r\n )\r\n .add(\r\n this.circle().nativeElement,\r\n {\r\n scale: [0, 1],\r\n duration: 320,\r\n easing: 'outElastic(amplitude = 1, period = .2)',\r\n },\r\n 150,\r\n )\r\n .add(\r\n this.mask().nativeElement,\r\n {\r\n scale: [0, 1],\r\n duration: 300,\r\n easing: 'outElastic(amplitude = 1, period = .2)',\r\n },\r\n 170,\r\n )\r\n .add(\r\n this.text().nativeElement,\r\n {\r\n translateX: ['-60%', 0],\r\n opacity: [0, 1],\r\n duration: 380,\r\n easing: 'outExpo',\r\n },\r\n 650,\r\n )\r\n .add(\r\n this.logo().nativeElement,\r\n {\r\n translateY: -8,\r\n duration: 70,\r\n easing: 'outQuad',\r\n },\r\n 420,\r\n )\r\n .add(\r\n this.logo().nativeElement,\r\n {\r\n translateY: 0,\r\n duration: 150,\r\n easing: 'outBounce',\r\n },\r\n 490,\r\n );\r\n }\r\n}\r\n","<div class=\"site-logo\">\r\n <figure #logo>\r\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 148 128\">\r\n <defs>\r\n <linearGradient id=\"logo-gradient\" x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\">\r\n <stop offset=\"0%\" stop-color=\"#00ffff\" />\r\n <stop offset=\"100%\" stop-color=\"#ff00ff\" />\r\n </linearGradient>\r\n <linearGradient\r\n id=\"circle-gradient\"\r\n x1=\"0%\"\r\n y1=\"100%\"\r\n x2=\"100%\"\r\n y2=\"0%\"\r\n >\r\n <stop offset=\"0%\" stop-color=\"#ff00ff\" />\r\n <stop offset=\"100%\" stop-color=\"#00ffff\" />\r\n </linearGradient>\r\n <mask id=\"circle-mask\">\r\n <rect fill=\"white\" width=\"100%\" height=\"100%\"></rect>\r\n <circle\r\n #logoMask\r\n id=\"logo-mask\"\r\n fill=\"black\"\r\n cx=\"120\"\r\n cy=\"96\"\r\n r=\"28\"\r\n ></circle>\r\n </mask>\r\n </defs>\r\n <polygon\r\n #logoHexagon\r\n id=\"logo-hexagon\"\r\n fill=\"#475569\"\r\n stroke=\"#9ca3af\"\r\n stroke-width=\"2\"\r\n stroke-linejoin=\"round\"\r\n points=\"64 128 8.574 96 8.574 32 64 0 119.426 32 119.426 96\"\r\n mask=\"url(#circle-mask)\"\r\n ></polygon>\r\n <circle #logoCircle fill=\"#16a34a\" cx=\"120\" cy=\"96\" r=\"20\"></circle>\r\n </svg>\r\n </figure>\r\n <div class=\"site-title\">\r\n <div #logoText class=\"site-title-text\">\r\n DEV<span\r\n >SOFTXela<span style=\"font-size: small; vertical-align: super\"\r\n >&copy;</span\r\n >\r\n {{ currentYear }}</span\r\n >\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, effect, inject, input } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../../services/src/spinner-loading.service';\r\nimport { AnimationOptions, LottieComponent } from 'ngx-lottie';\r\nimport { LogoDsxComponent } from '../logo/logo-dsx/logo-dsx.component';\r\n\r\n@Component({\r\n selector: 'app-loading-lottie',\r\n imports: [LottieComponent, LogoDsxComponent],\r\n templateUrl: './loading-lottie.component.html',\r\n styleUrl: './loading-lottie.component.css',\r\n})\r\nexport class LoadingLottieComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n jsonUrl = input<string>('Loader_Liquid4');\r\n size = input<string>('250px');\r\n options: AnimationOptions = { path: '' };\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n effect(() => {\r\n this.options = {\r\n path: `jsonlottie/${this.jsonUrl() + '.json'}`,\r\n };\r\n });\r\n }\r\n}\r\n","@if (_spinnerService.spinnerVisible()) {\r\n <div class=\"loader-container\">\r\n <ng-lottie\r\n [options]=\"options\"\r\n [width]=\"size()\"\r\n [height]=\"size()\"\r\n ></ng-lottie>\r\n <!-- <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p> -->\r\n <app-logo-dsx></app-logo-dsx>\r\n </div>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../../../services/src/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading-v2',\r\n imports: [],\r\n templateUrl: './css-v2.component.html',\r\n styleUrl: './css-v2.component.css',\r\n})\r\nexport class CssV2Component {\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"spinner-container\">\r\n <div class=\"center_div\">\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n </div>\r\n <p class=\"loading-text\">Cargando...</p>\r\n </div>\r\n</div>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../../services/src/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.css',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { EnvironmentConfig } from '../../injections/environment.token';\r\n\r\n/**\r\n * Configuración base de entorno para la aplicación.\r\n *\r\n * Este tipo es un alias de {@link EnvironmentConfig} para usarlo en el\r\n * contexto de modelos de la librería (por ejemplo, para defaults de dev/prod).\r\n *\r\n * De esta forma, cualquier cambio en ENVIRONMENT_SCHEMA / EnvironmentConfig\r\n * se propaga automáticamente aquí y se evita la desincronización entre\r\n * definiciones.\r\n */\r\nexport interface AppEnvironment extends EnvironmentConfig {}\r\n\r\n/**\r\n * Configuración base que provee la librería para entornos de desarrollo.\r\n *\r\n * Se omiten `myAppUrl` y `rolIndex` porque normalmente dependen de cada\r\n * aplicación cliente. Esos campos se vuelven obligatorios al combinar este\r\n * tipo con {@link DevEnvironmentComplete} en el proyecto que consume.\r\n */\r\nexport type DevEnvironmentDefaults = Omit<\r\n AppEnvironment,\r\n 'myAppUrl' | 'rolIndex'\r\n>;\r\n\r\n/**\r\n * Configuración base que provee la librería para entornos de producción.\r\n *\r\n * Se omite únicamente `rolIndex`, que debe ser definido por cada\r\n * aplicación cliente. En el proyecto consumidor se recomienda usar\r\n * {@link ProdEnvironmentComplete} para forzar ese campo como requerido.\r\n */\r\nexport type ProdEnvironmentDefaults = Omit<AppEnvironment, 'rolIndex'>;\r\n\r\n/**\r\n * Tipo recomendado para el `environment` de desarrollo en las aplicaciones\r\n * que consumen la librería.\r\n *\r\n * Combina los valores por defecto de la librería con los campos que cada\r\n * app debe completar: `myAppUrl` y `rolIndex`.\r\n */\r\nexport type DevEnvironmentComplete = DevEnvironmentDefaults &\r\n Pick<AppEnvironment, 'myAppUrl' | 'rolIndex'>;\r\n\r\n/**\r\n * Tipo recomendado para el `environment` de producción en las aplicaciones\r\n * que consumen la librería.\r\n *\r\n * Combina los valores por defecto de la librería con el campo obligatorio\r\n * `rolIndex` que aporta cada aplicación cliente.\r\n */\r\nexport type ProdEnvironmentComplete = ProdEnvironmentDefaults &\r\n Pick<AppEnvironment, 'rolIndex'>;\r\n\r\n/**\r\n * Entorno de desarrollo.\r\n *\r\n * No define `myAppUrl` porque normalmente se toma de la configuración\r\n * de la aplicación Angular (por ejemplo, `environment.ts` del proyecto).\r\n */\r\nexport const developmentEnvironment: DevEnvironmentDefaults = {\r\n production: false,\r\n SeguridadITApiUrl: 'https://localhost:7197/',\r\n tokenName: 'securityIT-Authorize',\r\n tokenPurpose: 'token-Purpose',\r\n tokenNameRF: 'refresh-Authorize',\r\n sessionStatus: 'lastActivity',\r\n refreshTokenExpiry: 'refreshToken-Expiry',\r\n showUpdatedCacheMessage: false,\r\n rolesGuards: ['Administrador SIIT'],\r\n};\r\n\r\n/**\r\n * Entorno de producción.\r\n *\r\n * Define todas las propiedades de `AppEnvironment`, incluida `myAppUrl`.\r\n */\r\nexport const productionEnvironment: ProdEnvironmentDefaults = {\r\n production: true,\r\n myAppUrl: '/',\r\n SeguridadITApiUrl: 'https://securityapi.itgtxela.com/',\r\n tokenName: 'securityIT-Authorize',\r\n tokenPurpose: 'token-Purpose',\r\n tokenNameRF: 'refresh-Authorize',\r\n sessionStatus: 'lastActivity',\r\n refreshTokenExpiry: 'refreshToken-Expiry',\r\n showUpdatedCacheMessage: false,\r\n rolesGuards: ['Administrador SIIT'],\r\n};\r\n\r\n/**\r\n * Devuelve el índice 0-based del rol principal a partir del `rolIndex` 1-based\r\n * definido en el entorno.\r\n *\r\n * Úsalo cuando necesites indexar arreglos (por ejemplo, listas de roles) para\r\n * evitar repetir la resta de 1 en múltiples lugares del código.\r\n *\r\n * @example\r\n * ```ts\r\n * import { getZeroBasedRolIndex } from '@devsoftxela/ngx-dsx';\r\n *\r\n * const idx = getZeroBasedRolIndex(environment);\r\n * const rol = roles[idx];\r\n * ```\r\n */\r\nexport function getZeroBasedRolIndex(\r\n env: Pick<AppEnvironment, 'rolIndex'>,\r\n): number {\r\n return Math.max(0, env.rolIndex - 1);\r\n}\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { getZeroBasedRolIndex } from '../../models/src/environment-base';\r\nimport { DataToken, jwtSecurityModel } from '../../models/src/token.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n _cookieService = inject(CookieService);\r\n _router = inject(Router);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n private _productionWithoutHttpsWarningShown = false;\r\n private _securityService = inject(SecurityService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /**\r\n * Detecta si el host actual es local o de red privada.\r\n *\r\n * Se usa para evitar fallback de cookies en escenarios de desarrollo,\r\n * incluso cuando por configuración externa `environment.production`\r\n * viene en `true`.\r\n */\r\n private isLocalOrPrivateHost(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const host = window.location?.hostname ?? '';\r\n if (!host) {\r\n return false;\r\n }\r\n\r\n const normalizedHost = host.toLowerCase();\r\n if (\r\n normalizedHost === 'localhost' ||\r\n normalizedHost === '127.0.0.1' ||\r\n normalizedHost === '::1' ||\r\n normalizedHost.endsWith('.local')\r\n ) {\r\n return true;\r\n }\r\n\r\n const privateIpv4Pattern = /^(10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[0-1])\\.)/;\r\n return privateIpv4Pattern.test(normalizedHost);\r\n }\r\n\r\n /**\r\n * Resuelve el dominio a usar para cookies según entorno/host actual.\r\n *\r\n * Orden de prioridad:\r\n * 1. Si `environment.cookieDomain` está configurado, lo usa (para ambientes locales).\r\n * 2. Si HTTPS público, usa `.itgtxela.com`.\r\n * 3. Si no coincide nada, devuelve undefined (sin dominio compartido).\r\n */\r\n private resolveCookieDomain(\r\n isProduction: boolean,\r\n isHttps: boolean,\r\n ): string | undefined {\r\n if (!isProduction || typeof window === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n // 1️⃣ Si está configurado en environment, usarlo (para ambientes locales).\r\n if (this.environment.cookieDomain) {\r\n return this.environment.cookieDomain;\r\n }\r\n\r\n // 2️⃣ Producción pública con HTTPS: mantener dominio corporativo.\r\n if (isHttps) {\r\n return '.itgtxela.com';\r\n }\r\n\r\n // 3️⃣ Sin coincidencia: sin dominio compartido.\r\n return undefined;\r\n }\r\n\r\n private warnProductionWithoutHttpsOnce(): void {\r\n if (this._productionWithoutHttpsWarningShown) {\r\n return;\r\n }\r\n\r\n this._productionWithoutHttpsWarningShown = true;\r\n console.warn(\r\n '[AuthorizeService] Entorno en producción pero sin HTTPS. Ajustando opciones de cookie para evitar rechazo por Secure/SameSite.',\r\n );\r\n }\r\n\r\n // Función para obtener opciones de cookies estándar\r\n /**\r\n * Construye las opciones usadas por `CookieService` al crear cookies.\r\n *\r\n * Motivo del cambio:\r\n * - Los navegadores rechazan cookies con `SameSite=None` si no se envían sobre\r\n * `Secure` (HTTPS). En entornos locales HTTP esto causa que las cookies no\r\n * sean guardadas aunque el servicio intente crearlas.\r\n *\r\n * Comportamiento:\r\n * - En producción y cuando la página usa `https:` se aplica `secure: true`,\r\n * `sameSite: 'None'` y se establece `domain` (como antes).\r\n * - Si no hay HTTPS (p. ej. red local con HTTP) se fuerza `sameSite: 'Lax'`\r\n * y `secure` queda en `false` para evitar que el navegador rechace la cookie.\r\n * - Esto preserva el comportamiento original en entornos con HTTPS.\r\n */\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const isHttps =\r\n typeof window !== 'undefined' && window.location?.protocol === 'https:';\r\n const cookieDomain = this.resolveCookieDomain(isProduction, isHttps);\r\n\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isHttps,\r\n sameSite: isHttps ? 'None' : 'Lax',\r\n };\r\n\r\n // Asignar dominio cuando aplique (público HTTPS o red local .local en producción).\r\n if (cookieDomain) {\r\n cookieOptions.domain = cookieDomain;\r\n }\r\n\r\n if (isProduction && !isHttps) {\r\n this.warnProductionWithoutHttpsOnce();\r\n }\r\n\r\n return cookieOptions;\r\n }\r\n\r\n // Función para establecer una cookie\r\n /**\r\n * Crea una cookie de autenticación y controla un fallback seguro.\r\n *\r\n * Reglas de fallback (`document.cookie`):\r\n * - Solo aplica en ejecución real de producción.\r\n * - Solo aplica cuando la página NO está en HTTPS.\r\n * - Nunca aplica en `isDevMode()`.\r\n * - Nunca aplica en hosts locales/privados.\r\n *\r\n * Objetivo:\r\n * - Mantener política estricta en producción real.\r\n * - Evitar falsos positivos de fallback durante desarrollo local.\r\n */\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n const isHttps =\r\n typeof window !== 'undefined' && window.location?.protocol === 'https:';\r\n const isLocalOrPrivateHost = this.isLocalOrPrivateHost();\r\n const allowFallback =\r\n !isDevMode() &&\r\n this.environment.production &&\r\n !isHttps &&\r\n !isLocalOrPrivateHost;\r\n\r\n // Intentamos usar CookieService (respeta domain/secure/samesite cuando corresponde).\r\n // El fallback con document.cookie se limita a producción sin HTTPS.\r\n try {\r\n this._cookieService.set(\r\n name,\r\n value,\r\n options.expires,\r\n options.path,\r\n options.domain,\r\n options.secure,\r\n options.sameSite,\r\n );\r\n\r\n // Verificar si la cookie quedó creada; si no, intentar fallback con document.cookie\r\n const created = this._cookieService.get(name);\r\n if (!created && allowFallback) {\r\n try {\r\n const expires =\r\n options.expires instanceof Date\r\n ? options.expires.toUTCString()\r\n : '';\r\n // Fallback mínimo: no usar Secure ni domain para entornos HTTP locales.\r\n document.cookie = `${name}=${value}; path=/; ${expires ? 'expires=' + expires + '; ' : ''}SameSite=Lax`;\r\n console.warn(\r\n `[AuthorizeService] Cookie '${name}' creada via fallback document.cookie`,\r\n );\r\n } catch (err) {\r\n console.warn(\r\n `[AuthorizeService] No se pudo crear cookie fallback para '${name}':`,\r\n err,\r\n );\r\n }\r\n } else if (!created && this.environment.production) {\r\n console.warn(\r\n `[AuthorizeService] Cookie '${name}' no pudo verificarse con CookieService en entorno no elegible para fallback.`,\r\n );\r\n }\r\n } catch (err) {\r\n console.error(\r\n '[AuthorizeService] Error al crear cookie con CookieService:',\r\n err,\r\n );\r\n if (allowFallback) {\r\n try {\r\n const expires = expiryDate.toUTCString();\r\n document.cookie = `${name}=${value}; path=/; expires=${expires}; SameSite=Lax`;\r\n console.warn(\r\n `[AuthorizeService] Cookie '${name}' creada via fallback document.cookie tras error.`,\r\n );\r\n } catch (err2) {\r\n console.error(\r\n '[AuthorizeService] Fallback document.cookie falló:',\r\n err2,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n }\r\n\r\n getTokenPurpose(): string | null {\r\n return this._cookieService.get(this.environment.tokenPurpose);\r\n }\r\n\r\n setTokenPurpose(token: DataToken): void {\r\n this.setCookie(\r\n this.environment.tokenPurpose,\r\n token.token,\r\n new Date(token.refreshTokenExpiry),\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene el Refresh Token almacenado en cookies.\r\n *\r\n * - En modo desarrollo (isDevMode):\r\n * Si no existe un refresh token en cookies, genera uno temporal\r\n * para evitar errores durante pruebas locales.\r\n *\r\n * - En modo producción:\r\n * Simplemente devuelve el refresh token real almacenado por el backend.\r\n *\r\n * @returns string | null - El refresh token o null si no existe.\r\n */\r\n getTokenRefresh(): string | null {\r\n // 🔹 MODO DESARROLLO: asegura que siempre haya un token de prueba\r\n if (isDevMode()) {\r\n const tokenRefresh = this._cookieService.get(\r\n this.environment.tokenNameRF,\r\n );\r\n\r\n // Si no existe un refresh token, generamos uno de desarrollo\r\n if (!tokenRefresh) {\r\n const devTokens: DataToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c', // Token dummy para testing\r\n refreshTokenExpiry: new Date(),\r\n };\r\n\r\n // Carga y guarda las cookies necesarias\r\n this.tokenReload(devTokens);\r\n }\r\n }\r\n\r\n // 🔹 DEVUELVE el refresh token real o de desarrollo\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate,\r\n );\r\n }\r\n\r\n getLastActivity(): number | null {\r\n // Obtiene el valor de la cookie\r\n const lastActivity = this._cookieService.get(\r\n this.environment.sessionStatus,\r\n );\r\n\r\n if (lastActivity) {\r\n // Intenta convertir el valor en un número\r\n const timestamp = parseInt(lastActivity, 10);\r\n\r\n // Verifica que sea un número válido\r\n if (!isNaN(timestamp)) {\r\n return timestamp;\r\n }\r\n }\r\n\r\n // Si no hay cookie o el valor no es válido, devuelve null\r\n return null;\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: DataToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n // Usar la fecha de expiración que viene del servidor para el refresh token\r\n const refreshTokenExpiryDate = new Date(tokens.refreshTokenExpiry);\r\n\r\n // Guardar el access token y refresh token con sus fechas de expiración\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate,\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n\r\n getTokenPurposeValid(): boolean {\r\n const token = this.getTokenPurpose();\r\n\r\n if (!token) {\r\n return false;\r\n }\r\n\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n\r\n /**\r\n * Obtiene los valores principales del JWT almacenado (usuario, roles y estado).\r\n *\r\n * Este getter:\r\n * - Lee el access token desde cookies.\r\n * - Devuelve un objeto tipado (jwtSecurityModel).\r\n * - Decodifica el token para obtener `unique_name` y `role`.\r\n * - Determina si el token está expirado usando JwtHelperService.\r\n *\r\n * Si no existe token:\r\n * - Devuelve un objeto vacío con valores en null y `isTokenExpired = true`.\r\n *\r\n * Uso:\r\n * const info = this.authorize.getTokenValues;\r\n */\r\n get getTokenValues(): jwtSecurityModel {\r\n // Obtener el token almacenado\r\n const token = this.getToken();\r\n\r\n // Si no existe token → devolver estructura vacía\r\n if (!token) {\r\n return {\r\n userName: null,\r\n role: null,\r\n isTokenExpired: true,\r\n };\r\n }\r\n\r\n // Decodificar JWT\r\n const decoded = this.helperJwt.decodeToken(token) || {};\r\n\r\n return {\r\n userName: decoded.unique_name ?? null,\r\n\r\n // JWT puede traer role como string o como array → convertir a array\r\n role: decoded.role\r\n ? Array.isArray(decoded.role)\r\n ? decoded.role\r\n : [decoded.role]\r\n : null,\r\n\r\n // Validación de expiración del JWT\r\n isTokenExpired: this.helperJwt.isTokenExpired(token),\r\n };\r\n }\r\n\r\n /**\r\n * Rol principal calculado a partir del JWT y del rolIndex configurado\r\n * en el environment.\r\n *\r\n * - Usa getTokenValues para obtener el array de roles del token.\r\n * - Usa getZeroBasedRolIndex(environment) para convertir el rolIndex 1-based\r\n * del entorno a un índice 0-based.\r\n * - Si el rol viene con formato \"ROL~descripcion\", devuelve solo la parte\r\n * anterior al separador `~`.\r\n */\r\n get primaryRole(): string | null {\r\n const idx = getZeroBasedRolIndex(this.environment);\r\n const tokenValues = this.getTokenValues;\r\n const roles = tokenValues.role ?? [];\r\n const raw = roles[idx] ?? null;\r\n return typeof raw === 'string' ? raw.split('~')[0] : null;\r\n }\r\n\r\n /**\r\n * Verifica si el usuario está autenticado.\r\n *\r\n * La validación se basa en la existencia del refresh token en cookies.\r\n * El navegador gestiona automáticamente la expiración de las cookies.\r\n *\r\n * @returns `true` si el usuario está autenticado, `false` en caso contrario\r\n */\r\n isAuthenticated(): boolean {\r\n const refreshToken = this.getTokenRefresh();\r\n return !!(refreshToken && refreshToken.trim() !== '');\r\n }\r\n\r\n /**\r\n * Cierra la sesión del usuario de forma segura y controlada.\r\n *\r\n * Este método implementa un proceso de logout robusto que:\r\n * 1. Verifica el estado actual de la sesión y la ubicación del usuario\r\n * 2. Intenta revocar el refresh token en el servidor (si existe)\r\n * 3. Limpia todos los datos de sesión local\r\n * 4. Redirige al usuario a la página de login\r\n *\r\n * **Casos manejados:**\r\n * - Usuario ya en página de login: Solo limpia datos locales\r\n * - Sin refresh token: Limpia datos locales y redirige\r\n * - Con refresh token: Intenta revocarlo, luego limpia y redirige\r\n * - Error al revocar: Limpia datos locales de todas formas (seguridad)\r\n * - Modo desarrollo: Maneja tokens de prueba correctamente\r\n *\r\n * **Importante:** Este método es **asíncrono** en su ejecución interna pero no retorna una promesa.\r\n * La redirección al login ocurre después de limpiar la sesión, independientemente del resultado de la revocación.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Uso básico desde un componente\r\n * this.authorizeService.logout();\r\n *\r\n * // Uso con navegación posterior controlada\r\n * this.authorizeService.logout();\r\n * // La redirección al login es automática\r\n * ```\r\n *\r\n * @see {@link clearSessionData} para el proceso de limpieza de datos\r\n * @see {@link SecurityService.tokenRevok} para la revocación en el servidor\r\n */\r\n logout(): void {\r\n try {\r\n // 1️⃣ Prevenir acciones innecesarias si ya está en el login\r\n if (this._router.url === '/login') {\r\n console.info(\r\n '[AuthorizeService] Usuario ya en página de login, limpiando sesión local...',\r\n );\r\n this.clearSessionData();\r\n return;\r\n }\r\n\r\n // 2️⃣ Obtener el refresh token de forma segura\r\n const refreshToken = this.getTokenRefresh();\r\n\r\n // 3️⃣ Si no hay refresh token, proceder con limpieza directa\r\n if (!refreshToken || refreshToken.trim() === '') {\r\n console.warn(\r\n '[AuthorizeService] No se encontró refresh token, limpiando sesión local...',\r\n );\r\n this.clearSessionData();\r\n return;\r\n }\r\n\r\n // 4️⃣ Limpiar sesión local e ir a login INMEDIATAMENTE\r\n // La revocación en el servidor se hace en segundo plano para no bloquear la navegación.\r\n this.clearSessionData();\r\n\r\n // 5️⃣ Intentar revocar el token en el servidor (fire-and-forget)\r\n // console.info(\r\n // '[AuthorizeService] Revocando refresh token en el servidor (en segundo plano)...',\r\n // );\r\n\r\n this._securityService.tokenRevok(refreshToken).subscribe({\r\n next: (success) => {\r\n if (success) {\r\n // console.info(\r\n // '[AuthorizeService] Refresh token revocado exitosamente en el servidor',\r\n // );\r\n } else {\r\n console.warn(\r\n '[AuthorizeService] El servidor no pudo revocar el token.',\r\n );\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n '[AuthorizeService] Error al revocar el refresh token en segundo plano:',\r\n {\r\n message: error?.message || 'Error desconocido',\r\n status: error?.status,\r\n statusText: error?.statusText,\r\n url: error?.url,\r\n },\r\n );\r\n },\r\n complete: () => {\r\n //console.info('[AuthorizeService] Proceso de logout completado');\r\n },\r\n });\r\n } catch (error) {\r\n // 6️⃣ Capturar cualquier error inesperado en el proceso de logout\r\n console.error(\r\n '[AuthorizeService] Error crítico durante el proceso de logout:',\r\n error,\r\n );\r\n\r\n // Garantizar que la sesión se limpie incluso si ocurre un error inesperado\r\n try {\r\n this.clearSessionData();\r\n } catch (cleanupError) {\r\n console.error(\r\n '[AuthorizeService] Error crítico al limpiar sesión:',\r\n cleanupError,\r\n );\r\n // Último recurso: redirigir al login sin importar qué\r\n this._router.navigate(['/login']).catch((navError) => {\r\n console.error(\r\n '[AuthorizeService] Error al navegar a login:',\r\n navError,\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Limpia todos los datos de sesión del usuario de forma segura.\r\n *\r\n * Este método privado se encarga de:\r\n * - Eliminar todas las cookies relacionadas con autenticación\r\n * - Limpiar el localStorage completamente\r\n * - Redirigir al usuario a la página de login\r\n *\r\n * **Cookies eliminadas:**\r\n * - Token de acceso (access token)\r\n * - Token de refresco (refresh token)\r\n * - Estado de sesión (session status)\r\n *\r\n * **Consideraciones:**\r\n * - Se eliminan las cookies con path '/' para asegurar su borrado\r\n * - En producción, también se considera el dominio configurado\r\n * - El localStorage se limpia completamente por seguridad\r\n * - La redirección es forzada incluso si hay errores previos\r\n *\r\n * @private\r\n */\r\n private clearSessionData(): void {\r\n try {\r\n // console.info(\r\n // '[AuthorizeService] Iniciando limpieza de datos de sesión...',\r\n // );\r\n\r\n // 1️⃣ Eliminar cookies con path explícito\r\n const cookiesToDelete = [\r\n this.environment.tokenName,\r\n this.environment.tokenNameRF,\r\n this.environment.tokenPurpose,\r\n this.environment.sessionStatus,\r\n ];\r\n\r\n cookiesToDelete.forEach((cookieName) => {\r\n try {\r\n // Eliminar con path '/'\r\n this._cookieService.delete(cookieName, '/');\r\n\r\n // En producción, también intentar eliminar con dominio específico\r\n if (this.environment.production) {\r\n const isHttps =\r\n typeof window !== 'undefined' &&\r\n window.location?.protocol === 'https:';\r\n const dynamicDomain = this.resolveCookieDomain(\r\n this.environment.production,\r\n isHttps,\r\n );\r\n const domainsToDelete = Array.from(\r\n new Set(['.itgtxela.com', dynamicDomain].filter(Boolean)),\r\n ) as string[];\r\n\r\n domainsToDelete.forEach((domain) => {\r\n this._cookieService.delete(cookieName, '/', domain);\r\n });\r\n }\r\n\r\n //console.debug(`[AuthorizeService] Cookie eliminada: ${cookieName}`);\r\n } catch (error) {\r\n console.error(\r\n `[AuthorizeService] Error al eliminar cookie ${cookieName}:`,\r\n error,\r\n );\r\n }\r\n });\r\n\r\n // 2️⃣ Limpiar localStorage\r\n try {\r\n localStorage.clear();\r\n //console.debug('[AuthorizeService] localStorage limpiado');\r\n } catch (error) {\r\n console.error(\r\n '[AuthorizeService] Error al limpiar localStorage:',\r\n error,\r\n );\r\n }\r\n\r\n // 3️⃣ Redirigir al login\r\n //console.info('[AuthorizeService] Redirigiendo a página de login...');\r\n this._router.navigate(['/login']).then(\r\n () => console.info('[AuthorizeService] Redirección exitosa a /login'),\r\n (error) =>\r\n console.error('[AuthorizeService] Error en la redirección:', error),\r\n );\r\n } catch (error) {\r\n console.error(\r\n '[AuthorizeService] Error crítico en clearSessionData:',\r\n error,\r\n );\r\n\r\n // Último recurso: intentar redirigir sin importar qué\r\n this._router.navigate(['/login']).catch((navError) => {\r\n console.error(\r\n '[AuthorizeService] Error final al intentar redirigir:',\r\n navError,\r\n );\r\n });\r\n }\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport type NetworkScore = 100 | 75 | 50 | 25;\r\n\r\nexport interface RequestMetricsState {\r\n lastDurationMs: number;\r\n averageDurationMs: number;\r\n requestsCount: number;\r\n score: NetworkScore;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RequestMetricsService {\r\n private historySize = 20;\r\n private durations: number[] = [];\r\n\r\n readonly state = signal<RequestMetricsState>({\r\n lastDurationMs: 0,\r\n averageDurationMs: 0,\r\n requestsCount: 0,\r\n score: 100,\r\n });\r\n\r\n registerRequest(durationMs: number) {\r\n this.durations.push(durationMs);\r\n if (this.durations.length > this.historySize) {\r\n this.durations.shift();\r\n }\r\n\r\n const avg =\r\n this.durations.reduce((acc, d) => acc + d, 0) / this.durations.length;\r\n\r\n const score = this.mapDurationToScore(avg);\r\n\r\n this.state.set({\r\n lastDurationMs: durationMs,\r\n averageDurationMs: avg,\r\n requestsCount: this.durations.length,\r\n score,\r\n });\r\n }\r\n\r\n private mapDurationToScore(avgMs: number): NetworkScore {\r\n // Ajusta umbrales a tu realidad\r\n if (avgMs <= 325) return 100;\r\n if (avgMs <= 800) return 75;\r\n if (avgMs <= 1500) return 50;\r\n return 25;\r\n }\r\n}\r\n","import { DecimalPipe } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { RequestMetricsService } from '../../../../services/src/request-metrics.service';\r\n\r\n@Component({\r\n selector: 'app-network-status',\r\n imports: [Avatar, DecimalPipe, TooltipModule],\r\n templateUrl: './network-status.component.html',\r\n styleUrl: './network-status.component.css',\r\n})\r\nexport class NetworkStatusComponent {\r\n private readonly metrics = inject(RequestMetricsService);\r\n state = this.metrics.state; // signal\r\n\r\n get tooltipText(): string {\r\n const { score, averageDurationMs, requestsCount } = this.state();\r\n const avg = Math.round(averageDurationMs);\r\n return `Estado de la red: ${score}% (promedio ${avg} ms, últimas ${requestsCount} peticiones)`;\r\n }\r\n\r\n getStatusImage(): string {\r\n const score = this.state().score;\r\n\r\n // 100 hasta 76 -> imagen \"muy buena\"\r\n if (score >= 76) {\r\n return 'image/Status_Green.png';\r\n }\r\n\r\n // 75 hasta 50 -> imagen \"media\"\r\n if (score >= 50) {\r\n return 'image/Status_Yellow.png';\r\n }\r\n\r\n // 50 o menos -> última imagen (mala)\r\n return 'image/Status_Red.png';\r\n }\r\n}\r\n","<div class=\"network-status-container\">\r\n <p-avatar\r\n [image]=\"getStatusImage()\"\r\n [pTooltip]=\"tooltipText\"\r\n tooltipPosition=\"bottom\"\r\n />\r\n <span> {{ state().score }}% </span>\r\n <span> {{ state().averageDurationMs | number: \"1.0-0\" }}ms </span>\r\n</div>\r\n","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../../injections/environment.token';\r\nimport { AlertaService } from '../../../services/src/alerta.service';\r\nimport { AuthorizeService } from '../../../services/src/authorize.service';\r\nimport { ParameterValuesService } from '../../../services/src/parameter-values.service';\r\nimport { IconDsxComponent } from '../icon-dsx/icon-dsx.component';\r\nimport { NetworkStatusComponent } from '../status/network-status/network-status.component';\r\n\r\n@Component({\r\n selector: 'app-navbar-dsx',\r\n imports: [\r\n ButtonModule,\r\n FormsModule,\r\n IconDsxComponent,\r\n ImageModule,\r\n MenubarModule,\r\n NetworkStatusComponent,\r\n ],\r\n templateUrl: './navbar-dsx.component.html',\r\n styleUrl: './navbar-dsx.component.css',\r\n})\r\nexport class NavbarDsxComponent implements OnInit {\r\n _authorizeService = inject(AuthorizeService);\r\n appVersion = input<string>('V1.0.0');\r\n checked: boolean = false; // Estado del interruptor (tema claro/oscuro)\r\n logoWidth = input<string>('300');\r\n private readonly _alertaService = inject(AlertaService);\r\n private readonly _parameterSecurityService = inject(ParameterValuesService);\r\n urlLogo = input<string>('assets/image/logoApp.png');\r\n private readonly environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n ngOnInit(): void {\r\n // Inicializa el tema al cargar el componente\r\n this.initializeTheme();\r\n }\r\n\r\n // Rol actual calculado en base al token y al rolIndex del environment.\r\n // Se evalúa en cada ciclo de detección de cambios, por lo que refleja\r\n // automáticamente los cambios cuando se refresca el token.\r\n get currentRole(): string | null {\r\n return this._authorizeService.primaryRole;\r\n }\r\n\r\n // Inicializa el tema y el estado del interruptor\r\n initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') || 'light'; // Obtén el tema guardado o usa 'light' por defecto\r\n this.checked = savedTheme === 'dark'; // Actualiza el estado del interruptor\r\n this.applyTheme(savedTheme); // Aplica el tema\r\n }\r\n\r\n // Cambia el tema y actualiza el estado del interruptor\r\n onThemeChange(isDarkMode: boolean): void {\r\n // Determina el tema basado en el estado del interruptor\r\n const theme = isDarkMode ? 'dark' : 'light';\r\n // Aplica el tema\r\n this.applyTheme(theme);\r\n }\r\n\r\n // Aplica el tema y guarda la preferencia en localStorage\r\n applyTheme(theme: string): void {\r\n const html = document.documentElement;\r\n\r\n // Elimina las clases previas y agrega la nueva clase\r\n html.classList.remove('my-app-dark', 'my-app-light');\r\n html.classList.add(theme === 'dark' ? 'my-app-dark' : 'my-app-light');\r\n\r\n // Guarda el tema en localStorage\r\n localStorage.setItem('theme', theme);\r\n }\r\n\r\n actualizarSeguridadIT() {\r\n this._parameterSecurityService.refreshParameters().subscribe({\r\n next: (values) => {\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2,\r\n );\r\n //console.log('Parámetros cargados:', values);\r\n },\r\n error: (err) => {\r\n console.error('Error al actualizar parámetros de SeguridadIT', err);\r\n this._alertaService.toastrAlerts(\r\n 3,\r\n 'SeguridadIT',\r\n 'Error al actualizar parámetros!',\r\n 2,\r\n );\r\n },\r\n complete: () => this._parameterSecurityService.clearParameterCache(),\r\n });\r\n }\r\n}\r\n","<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n [src]=\"urlLogo()\"\r\n alt=\"Image\"\r\n [width]=\"logoWidth()\"\r\n />\r\n <span class=\"version-text\">{{ appVersion() }}</span>\r\n </ng-template>\r\n <ng-template #end>\r\n <div>\r\n <!-- Datos del usuario -->\r\n <div class=\"navbar-user-info\">\r\n <icon-dsx name=\"verified_user\" class=\"navbar-user-icon\"></icon-dsx>\r\n <div class=\"navbar-user-text\">\r\n <span class=\"navbar-user-name\">\r\n {{ _authorizeService.getTokenValues.userName }}\r\n </span>\r\n <span class=\"navbar-user-role\">\r\n {{ currentRole }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Componente de estado de red -->\r\n <app-network-status></app-network-status>\r\n\r\n <!-- Actualización de permisos -->\r\n <p-button\r\n size=\"small\"\r\n class=\"ml-2 mr-2\"\r\n label=\"Permisos\"\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n (click)=\"actualizarSeguridadIT()\"\r\n >\r\n <span class=\"material-symbols-outlined mr-1\">local_police</span>\r\n </p-button>\r\n\r\n <label class=\"ui-switch\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"checked\"\r\n (click)=\"onThemeChange(!checked ? true : false)\"\r\n />\r\n <div class=\"slider\">\r\n <div class=\"circle\"></div>\r\n </div>\r\n </label>\r\n <!-- <p-inputSwitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-inputSwitch> -->\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n","import { Injectable } from '@angular/core';\r\n\r\ntype QrCodeModule = {\r\n toDataURL: (\r\n text: string,\r\n options?: {\r\n errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';\r\n type?: string;\r\n width?: number;\r\n margin?: number;\r\n color?: { dark?: string; light?: string };\r\n },\r\n ) => Promise<string>;\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class QrService {\r\n private async loadQrCodeModule(): Promise<QrCodeModule> {\r\n try {\r\n const viteQrModulePath = '/@id/qrcode';\r\n const qrModule = (await import(\r\n /* @vite-ignore */ viteQrModulePath\r\n )) as unknown as {\r\n default?: QrCodeModule;\r\n } & QrCodeModule;\r\n\r\n return qrModule.default ?? qrModule;\r\n } catch (error) {\r\n throw new Error(\r\n \"No se encontro el paquete opcional 'qrcode'. Instala 'qrcode' para usar QrGenerator.\",\r\n { cause: error },\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Genera un código QR como Blob usando qrcode\r\n * Sin necesidad de llamadas HTTP externas, evita problemas de CORS\r\n */\r\n async getQrBlob(textToEncode: string): Promise<Blob> {\r\n try {\r\n const qrCode = await this.loadQrCodeModule();\r\n\r\n // Genera el QR como Data URL\r\n const dataUrl = await qrCode.toDataURL(textToEncode, {\r\n errorCorrectionLevel: 'H',\r\n type: 'image/png',\r\n width: 300,\r\n margin: 1,\r\n color: {\r\n dark: '#000000',\r\n light: '#FFFFFF',\r\n },\r\n });\r\n\r\n // Convierte Data URL a Blob\r\n const response = await fetch(dataUrl);\r\n return response.blob();\r\n } catch (err) {\r\n console.error('Error generando QR:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","import { Component, inject, signal, input, effect } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { QrService } from './../../../../services/src/qr.service';\r\n\r\n@Component({\r\n selector: 'dsx-qr-generator',\r\n imports: [FormsModule],\r\n templateUrl: './qr-generator.html',\r\n styleUrl: './qr-generator.css',\r\n})\r\nexport class QrGenerator {\r\n private qrService = inject(QrService);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n // Inputs del padre\r\n codigoQr = input<string | null>(null); // Contenido a codificar en el QR\r\n labelQr = input<string>('SCAN ME'); // Texto del banner inferior\r\n\r\n // Señales internas (copias escribibles de los inputs)\r\n qrImageUrl = signal<SafeUrl | null>(null);\r\n loading = signal(false);\r\n labelText = signal<string>('SCAN ME');\r\n textToEncode = signal<string>('');\r\n private previewObjectUrl: string | null = null;\r\n private lastGeneratedCode: string | null = null;\r\n private generationRequestId = 0;\r\n\r\n constructor() {\r\n effect(() => {\r\n // Sincronizar labelQr → labelText\r\n this.labelText.set(this.labelQr());\r\n\r\n // Sincronizar codigoQr → textToEncode y generar el QR\r\n const codigo = this.codigoQr()?.trim() ?? '';\r\n\r\n if (codigo) {\r\n if (codigo === this.lastGeneratedCode && this.currentRawBlob) {\r\n return;\r\n }\r\n\r\n this.lastGeneratedCode = codigo;\r\n this.textToEncode.set(codigo);\r\n this.loading.set(true);\r\n this.generateQrCode(codigo);\r\n } else {\r\n this.lastGeneratedCode = null;\r\n this.currentRawBlob = null;\r\n this.revokePreviewUrl();\r\n this.qrImageUrl.set(null);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private currentRawBlob: Blob | null = null;\r\n\r\n generateQrCode(codeToEncode: string): void {\r\n if (!codeToEncode) return;\r\n\r\n const requestId = ++this.generationRequestId;\r\n\r\n this.qrService\r\n .getQrBlob(codeToEncode)\r\n .then((blob: Blob) => {\r\n // Ignora respuestas de solicitudes viejas para evitar parpadeos.\r\n if (requestId !== this.generationRequestId) return;\r\n\r\n this.currentRawBlob = blob;\r\n this.generateDesignImage(requestId);\r\n })\r\n .catch((err) => {\r\n if (requestId !== this.generationRequestId) return;\r\n this.loading.set(false);\r\n console.error('Error generando QR:', err);\r\n });\r\n }\r\n\r\n onLabelChange(value: string): void {\r\n this.labelText.set(value);\r\n // Regenera la imagen de preview con la nueva etiqueta\r\n this.generateDesignImage();\r\n }\r\n\r\n private generateDesignImage(requestId?: number): void {\r\n if (!this.currentRawBlob) return;\r\n\r\n const qrImage = new Image();\r\n const qrUrl = URL.createObjectURL(this.currentRawBlob);\r\n qrImage.src = qrUrl;\r\n\r\n qrImage.onload = () => {\r\n if (requestId && requestId !== this.generationRequestId) {\r\n URL.revokeObjectURL(qrUrl);\r\n return;\r\n }\r\n\r\n const qrSize = qrImage.width || 300;\r\n const padding = 20;\r\n const labelAreaHeight = 70;\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = qrSize + padding * 2;\r\n canvas.height = qrSize + labelAreaHeight + padding;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n // Fondo blanco\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // DIBUJAR LAS ESQUINAS DE ENFOQUE\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = 5;\r\n const lineLength = 25;\r\n\r\n const xMin = padding - 10;\r\n const yMin = padding - 10;\r\n const xMax = padding + qrSize + 10;\r\n const yMax = padding + qrSize + 10;\r\n\r\n // Esquinas\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMin);\r\n ctx.lineTo(xMin, yMin);\r\n ctx.lineTo(xMin, yMin + lineLength);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMin);\r\n ctx.lineTo(xMax, yMin);\r\n ctx.lineTo(xMax, yMin + lineLength);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMax);\r\n ctx.lineTo(xMin, yMax);\r\n ctx.lineTo(xMin, yMax - lineLength);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMax);\r\n ctx.lineTo(xMax, yMax);\r\n ctx.lineTo(xMax, yMax - lineLength);\r\n ctx.stroke();\r\n\r\n // Dibujar el código QR\r\n ctx.drawImage(qrImage, padding, padding, qrSize, qrSize);\r\n\r\n // Configuración del banner\r\n const rectWidth = qrSize * 0.8;\r\n const rectHeight = 45;\r\n const rectX = padding + (qrSize - rectWidth) / 2;\r\n const rectY = yMax + 20;\r\n\r\n // Caja negra\r\n ctx.fillStyle = '#000000';\r\n ctx.fillRect(rectX, rectY, rectWidth, rectHeight);\r\n\r\n // Triángulo indicador\r\n ctx.beginPath();\r\n ctx.moveTo(canvas.width / 2, rectY - 8);\r\n ctx.lineTo(canvas.width / 2 - 10, rectY);\r\n ctx.lineTo(canvas.width / 2 + 10, rectY);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n // Texto\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.font = 'bold 18px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(\r\n this.labelText().toUpperCase(),\r\n canvas.width / 2,\r\n rectY + rectHeight / 2,\r\n );\r\n\r\n // Convertir a URL para mostrar en preview\r\n canvas.toBlob((blob) => {\r\n URL.revokeObjectURL(qrUrl);\r\n\r\n if (requestId && requestId !== this.generationRequestId) return;\r\n\r\n if (blob) {\r\n this.revokePreviewUrl();\r\n const previewUrl = URL.createObjectURL(blob);\r\n this.previewObjectUrl = previewUrl;\r\n this.qrImageUrl.set(\r\n this.sanitizer.bypassSecurityTrustUrl(previewUrl),\r\n );\r\n this.loading.set(false);\r\n } else {\r\n this.loading.set(false);\r\n }\r\n }, 'image/png');\r\n };\r\n\r\n qrImage.onerror = () => {\r\n URL.revokeObjectURL(qrUrl);\r\n if (requestId && requestId !== this.generationRequestId) return;\r\n this.loading.set(false);\r\n };\r\n }\r\n\r\n private revokePreviewUrl(): void {\r\n if (this.previewObjectUrl) {\r\n URL.revokeObjectURL(this.previewObjectUrl);\r\n this.previewObjectUrl = null;\r\n }\r\n }\r\n\r\n downloadWithLabel(): void {\r\n if (!this.currentRawBlob) return;\r\n\r\n const qrImage = new Image();\r\n const qrUrl = URL.createObjectURL(this.currentRawBlob);\r\n qrImage.src = qrUrl;\r\n\r\n qrImage.onload = () => {\r\n const qrSize = qrImage.width || 300;\r\n const padding = 20; // Margen compacto para reducir el espacio superior\r\n const labelAreaHeight = 70;\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = qrSize + padding * 2;\r\n canvas.height = qrSize + labelAreaHeight + padding;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n // Fondo blanco\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // DIBUJAR LAS ESQUINAS DE ENFOQUE (Estilo de tu imagen de referencia)\r\n ctx.strokeStyle = '#000000'; // Color negro para las líneas de enfoque\r\n ctx.lineWidth = 5; // Grosor de las esquinas\r\n const lineLength = 25; // Largo de cada segmento de la esquina\r\n\r\n // Área delimitadora donde se posicionará el QR\r\n const xMin = padding - 10;\r\n const yMin = padding - 10;\r\n const xMax = padding + qrSize + 10;\r\n const yMax = padding + qrSize + 10;\r\n\r\n // Esquina Superior Izquierda\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMin);\r\n ctx.lineTo(xMin, yMin);\r\n ctx.lineTo(xMin, yMin + lineLength);\r\n ctx.stroke();\r\n // Esquina Superior Derecha\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMin);\r\n ctx.lineTo(xMax, yMin);\r\n ctx.lineTo(xMax, yMin + lineLength);\r\n ctx.stroke();\r\n // Esquina Inferior Izquierda\r\n ctx.beginPath();\r\n ctx.moveTo(xMin + lineLength, yMax);\r\n ctx.lineTo(xMin, yMax);\r\n ctx.lineTo(xMin, yMax + lineLength);\r\n ctx.stroke();\r\n // Esquina Inferior Derecha\r\n ctx.beginPath();\r\n ctx.moveTo(xMax - lineLength, yMax);\r\n ctx.lineTo(xMax, yMax);\r\n ctx.lineTo(xMax, yMax + lineLength);\r\n ctx.stroke();\r\n\r\n // Dibujar el código QR original obtenido desde qrcoder.co.uk\r\n ctx.drawImage(qrImage, padding, padding, qrSize, qrSize);\r\n\r\n // Configuración geométrica de la etiqueta negra inferior\r\n const rectWidth = qrSize * 0.8;\r\n const rectHeight = 45;\r\n const rectX = padding + (qrSize - rectWidth) / 2;\r\n const rectY = yMax + 20; // Separado adecuadamente de la línea de enfoque inferior\r\n\r\n // Dibujar caja contenedora de texto\r\n ctx.fillStyle = '#000000';\r\n ctx.fillRect(rectX, rectY, rectWidth, rectHeight);\r\n\r\n // Pequeño triángulo indicador (Flecha superior de la caja)\r\n ctx.beginPath();\r\n ctx.moveTo(canvas.width / 2, rectY - 8);\r\n ctx.lineTo(canvas.width / 2 - 10, rectY);\r\n ctx.lineTo(canvas.width / 2 + 10, rectY);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n // Renderizar Texto de Referencia\r\n ctx.fillStyle = '#FFFFFF';\r\n ctx.font = 'bold 18px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(\r\n this.labelText().toUpperCase(),\r\n canvas.width / 2,\r\n rectY + rectHeight / 2,\r\n );\r\n\r\n // Conversión final y descarga en JPEG\r\n canvas.toBlob(\r\n (finalBlob) => {\r\n if (finalBlob) {\r\n const downloadUrl = URL.createObjectURL(finalBlob);\r\n const link = document.createElement('a');\r\n link.href = downloadUrl;\r\n\r\n const now = new Date();\r\n const timestamp =\r\n now.getFullYear().toString() +\r\n (now.getMonth() + 1).toString().padStart(2, '0') +\r\n now.getDate().toString().padStart(2, '0') +\r\n now.getHours().toString().padStart(2, '0') +\r\n now.getMinutes().toString().padStart(2, '0') +\r\n now.getSeconds().toString().padStart(2, '0');\r\n link.download = `qr-${timestamp}.jpg`;\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n\r\n URL.revokeObjectURL(downloadUrl);\r\n URL.revokeObjectURL(qrUrl);\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95,\r\n );\r\n };\r\n }\r\n}\r\n","<div class=\"w-full max-w-xs mx-auto text-center\">\r\n <!-- Encabezado -->\r\n <h2 class=\"font-semibold text-gray-500\">Generador QR</h2>\r\n\r\n <!-- Valor recibido como validación (solo lectura) -->\r\n <!-- <p class=\"text-xs text-gray-400 mb-3 truncate\">\r\n <span class=\"font-medium text-gray-500\">Contenido: </span>{{ textToEncode()\r\n }}\r\n </p> -->\r\n\r\n <div class=\"qr-preview-shell\">\r\n @if (loading()) {\r\n <div class=\"qr-loading-state\">\r\n <span class=\"qr-spinner\"></span>\r\n <span>Generando código QR...</span>\r\n </div>\r\n } @if (qrImageUrl()) {\r\n <div class=\"flex flex-col items-center gap-3 qr-content\">\r\n <!-- Imagen generada con esquinas y banner -->\r\n <div\r\n class=\"rounded-xl border border-gray-200 bg-white p-1 shadow-md inline-block\"\r\n >\r\n <img\r\n [src]=\"qrImageUrl()\"\r\n alt=\"Código QR\"\r\n class=\"w-44 h-auto block rounded\"\r\n />\r\n </div>\r\n\r\n <!-- Botón descarga -->\r\n <button\r\n style=\"\r\n background: #059669;\r\n color: #fff;\r\n font-size: 0.8rem;\r\n padding: 0.4rem 1rem;\r\n border-radius: 0.5rem;\r\n cursor: pointer;\r\n \"\r\n class=\"font-semibold hover:opacity-90 transition-opacity flex items-center justify-center gap-1\"\r\n (click)=\"downloadWithLabel()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 1rem; height: 1rem; flex-shrink: 0\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2M7 10l5 5 5-5M12 15V3\"\r\n />\r\n </svg>\r\n Descargar JPEG\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, inject } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { AuthorizeService } from './../../../../services/src/authorize.service';\r\nimport { SecurityService } from './../../../../services/src/security.service';\r\nimport { DataLoginModel } from './../../../../models/src/token.model';\r\nimport { AlertaService } from './../../../../services/src/alerta.service';\r\n\r\n@Component({\r\n selector: 'app-token-purpose-login',\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n DialogModule,\r\n AvatarModule,\r\n ButtonModule,\r\n TooltipModule,\r\n FloatLabelModule,\r\n PasswordModule,\r\n ],\r\n templateUrl: './token-purpose-login.html',\r\n styleUrl: './token-purpose-login.css',\r\n})\r\nexport class TokenPurposeLogin {\r\n private readonly fb = inject(FormBuilder);\r\n private readonly _authorizeService = inject(AuthorizeService);\r\n private readonly _securityService = inject(SecurityService);\r\n private readonly _alertService = inject(AlertaService);\r\n form!: FormGroup;\r\n visible: boolean = false;\r\n\r\n constructor() {\r\n this.getForm();\r\n }\r\n\r\n getForm() {\r\n this.form = this.fb.group({\r\n userName: [{ value: null, disabled: true }, [Validators.required]],\r\n password: [null, [Validators.required]],\r\n });\r\n }\r\n\r\n showDialog() {\r\n this.visible = true;\r\n }\r\n\r\n generarTokenPurpose() {\r\n //Validar el password\r\n if (this.form.valid) {\r\n this._securityService\r\n .tokenPurposeGenerate(this.form.getRawValue() as DataLoginModel)\r\n .subscribe({\r\n next: (result) => {\r\n if (result.isSuccess) {\r\n this._authorizeService.setTokenPurpose(result.data!);\r\n this._alertService.toastrAlerts(\r\n 1,\r\n result.title,\r\n result.message,\r\n 2,\r\n );\r\n this.visible = false;\r\n this.form.reset();\r\n } else {\r\n this._alertService.toastrAlerts(\r\n 4,\r\n result.title,\r\n result.message,\r\n 2,\r\n );\r\n }\r\n },\r\n error: (err) => console.error('Error al generar token purpose:', err),\r\n complete: () => '',\r\n });\r\n }\r\n }\r\n}\r\n","<div class=\"flex\">\r\n <p-button\r\n (click)=\"showDialog()\"\r\n label=\"Generar Token\"\r\n pTooltip=\"Ingrese sus credenciales para generar un token de acceso.\"\r\n tooltipPosition=\"top\"\r\n severity=\"secondary\"\r\n icon=\"pi pi-lock\"\r\n [rounded]=\"true\"\r\n [raised]=\"true\"\r\n />\r\n</div>\r\n<form [formGroup]=\"form\">\r\n <p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '30rem' }\">\r\n <ng-template #header>\r\n <div class=\"flex items-center gap-2 px-2\">\r\n <p-avatar image=\"icon/folder.png\" size=\"large\" />\r\n <h5>Token de Seguridad</h5>\r\n </div>\r\n </ng-template>\r\n <span class=\"text-surface-500 dark:text-surface-400 block\"\r\n >Ingrese sus credenciales para generar un token de acceso.</span\r\n >\r\n <div class=\"mt-3\">\r\n <p-floatLabel variant=\"in\">\r\n <p-password\r\n formControlName=\"password\"\r\n [invalid]=\"form.get('password')?.invalid && (form.get('password')?.dirty || form.get('password')?.touched)\"\r\n [feedback]=\"false\"\r\n [toggleMask]=\"true\"\r\n fluid\r\n />\r\n <label>Contraseña</label>\r\n </p-floatLabel>\r\n @if (form.get('password')?.invalid && (form.get('password')?.dirty ||\r\n form.get('password')?.touched)) {\r\n <small class=\"text-red-500\">La contraseña es obligatoria.</small>\r\n }\r\n </div>\r\n <ng-template #footer>\r\n <p-button\r\n label=\"Cancelar\"\r\n variant=\"outlined\"\r\n [rounded]=\"true\"\r\n icon=\"pi pi-times\"\r\n severity=\"danger\"\r\n (click)=\"visible = false\"\r\n />\r\n <p-button\r\n label=\"Generar\"\r\n variant=\"outlined\"\r\n [rounded]=\"true\"\r\n icon=\"pi pi-unlock\"\r\n severity=\"success\"\r\n [disabled]=\"!form.valid\"\r\n (click)=\"generarTokenPurpose()\"\r\n />\r\n </ng-template>\r\n </p-dialog>\r\n</form>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, HostListener, isDevMode } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'dsx-screen-inspector',\r\n imports: [CommonModule],\r\n templateUrl: './screen-inspector.html',\r\n styleUrl: './screen-inspector.css',\r\n})\r\nexport class ScreenInspector {\r\n private static readonly GRID_STORAGE_KEY = 'dsx-screen-inspector-show-grid';\r\n\r\n width: number = 0;\r\n height: number = 0;\r\n breakpoint: string = '';\r\n isDevelopment: boolean = false;\r\n\r\n // Estado para controlar la visibilidad de las líneas guía\r\n showGrid: boolean = true;\r\n\r\n ngOnInit() {\r\n this.isDevelopment = isDevMode();\r\n\r\n if (this.isDevelopment) {\r\n this.showGrid = this.readGridStateFromStorage();\r\n }\r\n\r\n this.updateDimensions();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n if (this.isDevelopment) {\r\n this.updateDimensions();\r\n }\r\n }\r\n\r\n // Captura el atajo Alt + Shift + I de forma global\r\n @HostListener('window:keydown', ['$event'])\r\n handleKeyboardEvent(event: KeyboardEvent) {\r\n if (\r\n this.isDevelopment &&\r\n event.altKey &&\r\n event.shiftKey &&\r\n (event.key === 'I' || event.key === 'i')\r\n ) {\r\n event.preventDefault(); // Evita cualquier comportamiento secundario\r\n this.showGrid = !this.showGrid; // Alterna encendido / apagado\r\n this.persistGridState();\r\n }\r\n }\r\n\r\n private readGridStateFromStorage(): boolean {\r\n if (typeof window === 'undefined') return true;\r\n\r\n try {\r\n const savedValue = window.localStorage.getItem(\r\n ScreenInspector.GRID_STORAGE_KEY,\r\n );\r\n if (savedValue === null) return true;\r\n return savedValue === 'true';\r\n } catch {\r\n return true;\r\n }\r\n }\r\n\r\n private persistGridState(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n window.localStorage.setItem(\r\n ScreenInspector.GRID_STORAGE_KEY,\r\n String(this.showGrid),\r\n );\r\n } catch {\r\n // Ignora errores de almacenamiento (modo privado, cuota, etc.)\r\n }\r\n }\r\n\r\n private updateDimensions() {\r\n this.width = window.innerWidth;\r\n this.height = window.innerHeight;\r\n this.breakpoint = this.getTailwindBreakpoint(this.width);\r\n }\r\n\r\n private getTailwindBreakpoint(width: number): string {\r\n if (width < 640) return 'XS';\r\n if (width < 768) return 'SM';\r\n if (width < 1024) return 'MD';\r\n if (width < 1280) return 'LG';\r\n if (width < 1536) return 'XL';\r\n return '2XL';\r\n }\r\n}\r\n","<!-- CONTROL DE ENTORNO: Solo se dibuja si estamos en modo desarrollo -->\r\n@if(isDevelopment){\r\n<ng-container>\r\n <!-- CONTENEDOR GENERAL TOTALMENTE TRANSPARENTE -->\r\n <div\r\n style=\"\r\n position: fixed !important;\r\n top: 0 !important;\r\n left: 0 !important;\r\n width: 100vw !important;\r\n height: 100vh !important;\r\n z-index: 999999 !important;\r\n background-color: transparent !important;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n \"\r\n >\r\n <!-- REGLA MILIMÉTRICA CONDICIONAL -->\r\n @if(showGrid) {\r\n <div class=\"inspector-ruler\"></div>\r\n }\r\n\r\n <!-- CONTENEDOR DE CONTENIDO CENTRAL -->\r\n <div\r\n style=\"\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n pointer-events: none;\r\n width: 100%;\r\n \"\r\n >\r\n <!-- LETRAS GIGANTES EN NEGRO CON OPACIDAD -->\r\n <h1\r\n style=\"\r\n font-size: 35vw !important;\r\n font-weight: 900 !important;\r\n font-family:\r\n system-ui,\r\n -apple-system,\r\n sans-serif !important;\r\n color: rgba(0, 0, 0, 0.05) !important;\r\n margin: 0;\r\n padding: 0;\r\n line-height: 0.8;\r\n letter-spacing: -0.05em;\r\n text-transform: uppercase;\r\n \"\r\n >\r\n {{ breakpoint }}\r\n </h1>\r\n\r\n <!-- CUADRO DE DIÁLOGO DE LAS MEDIDAS EXACTAS -->\r\n <div\r\n style=\"\r\n margin-top: 20px;\r\n background-color: #111827;\r\n border: 2px solid rgba(0, 0, 0, 0.15);\r\n border-radius: 12px;\r\n padding: 12px 32px;\r\n font-family: monospace;\r\n font-size: 22px;\r\n font-weight: bold;\r\n color: #34d399;\r\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);\r\n backdrop-filter: blur(8px);\r\n pointer-events: auto;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 4px;\r\n \"\r\n >\r\n <div>\r\n {{ width }}<span\r\n style=\"\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 16px;\r\n font-weight: normal;\r\n margin-left: 4px;\r\n \"\r\n >px ancho</span\r\n >\r\n <span style=\"color: rgba(255, 255, 255, 0.3); margin: 0 16px\">|</span>\r\n {{ height }}<span\r\n style=\"\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 16px;\r\n font-weight: normal;\r\n margin-left: 4px;\r\n \"\r\n >px alto</span\r\n >\r\n </div>\r\n\r\n <!-- Recordatorio del atajo de teclado con tipografía pequeña -->\r\n <span\r\n style=\"\r\n color: rgba(255, 255, 255, 0.35);\r\n font-size: 11px;\r\n font-weight: normal;\r\n letter-spacing: 0.5px;\r\n \"\r\n >\r\n Presiona\r\n <b style=\"color: #f3f4f6; font-weight: bold\">Alt + Shift + I</b> para\r\n ocultar/mostrar cuadrícula\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n}\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva de navegación por teclado entre elementos de una tabla.\r\n *\r\n * Uso: colocar el atributo [appKeyboardNav] en cada control navegable dentro\r\n * de un contenedor <table>. La directiva busca el <table> más cercano con\r\n * `closest('table')` y recorre todos los elementos marcados con ese atributo.\r\n *\r\n * Teclas soportadas:\r\n * - Enter / ArrowDown / ArrowRight → siguiente elemento\r\n * - Shift+Enter / ArrowUp / ArrowLeft → elemento anterior\r\n * La navegación es cíclica (del último vuelve al primero y viceversa).\r\n *\r\n * NOTA DE COMPATIBILIDAD — componentes PrimeNG:\r\n * Actualmente validado con <p-inputnumber>. Los componentes de PrimeNG (y otros\r\n * wrappers) no exponen un <input> nativo directamente en el host; en su lugar\r\n * renderizan el <input> como hijo en el shadow/light DOM interno.\r\n * Por eso esta directiva no hace `.focus()` sobre el host del componente, sino\r\n * que resuelve primero el control nativo enfocable interno mediante\r\n * `resolveFocusableTarget()`. Si en el futuro se integran otros componentes\r\n * (p-dropdown, p-select, etc.) puede ser necesario ampliar ese selector o agregar\r\n * lógica específica por tipo de componente, ya que cada uno renderiza su control\r\n * interno de forma diferente.\r\n */\r\n@Directive({\r\n selector: '[appKeyboardNav]',\r\n})\r\nexport class ArrowNavigationDirective {\r\n /**\r\n * Activa los logs de depuración en consola.\r\n * Cambiar a `true` para trazar el flujo de navegación durante el desarrollo.\r\n */\r\n private readonly debug = false;\r\n\r\n constructor(private el: ElementRef<HTMLElement>) {}\r\n\r\n @HostListener('keydown', ['$event'])\r\n handleKey(event: KeyboardEvent) {\r\n this.log('keydown recibido', {\r\n key: event.key,\r\n shiftKey: event.shiftKey,\r\n element: this.el.nativeElement,\r\n });\r\n\r\n const keys = ['Enter', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];\r\n if (!keys.includes(event.key)) {\r\n this.log('tecla ignorada', { key: event.key });\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n // Obtiene todos los elementos navegables no deshabilitados dentro del <table>\r\n const elements = this.getElements();\r\n const index = elements.indexOf(this.el.nativeElement);\r\n\r\n this.log('elementos navegables detectados', {\r\n total: elements.length,\r\n currentIndex: index,\r\n });\r\n\r\n // Si el elemento actual no está en la lista (p.ej. no tiene [appKeyboardNav]) se aborta\r\n if (index === -1) {\r\n this.log('elemento actual no encontrado en la lista navegable');\r\n return;\r\n }\r\n\r\n let nextIndex = index;\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n nextIndex = event.shiftKey ? index - 1 : index + 1;\r\n break;\r\n\r\n case 'ArrowDown':\r\n nextIndex = index + 1;\r\n break;\r\n\r\n case 'ArrowUp':\r\n nextIndex = index - 1;\r\n break;\r\n\r\n case 'ArrowRight':\r\n nextIndex = index + 1;\r\n break;\r\n\r\n case 'ArrowLeft':\r\n nextIndex = index - 1;\r\n break;\r\n }\r\n\r\n // Navegación cíclica: al pasar del último vuelve al primero y viceversa\r\n if (nextIndex >= elements.length) nextIndex = 0;\r\n if (nextIndex < 0) nextIndex = elements.length - 1;\r\n\r\n const nextElement = elements[nextIndex];\r\n this.log('moviendo foco', {\r\n from: index,\r\n to: nextIndex,\r\n nextElement,\r\n });\r\n\r\n this.focusElement(nextElement);\r\n }\r\n\r\n /**\r\n * Recoge todos los elementos con [appKeyboardNav] dentro del <table> contenedor\r\n * y filtra los que estén deshabilitados.\r\n */\r\n private getElements(): HTMLElement[] {\r\n const container = this.el.nativeElement.closest('table');\r\n\r\n if (!container) {\r\n this.log('no se encontró contenedor table con closest()');\r\n return [];\r\n }\r\n\r\n return Array.from(\r\n container.querySelectorAll<HTMLElement>('[appKeyboardNav]'),\r\n ).filter((el) => !el.hasAttribute('disabled'));\r\n }\r\n\r\n /**\r\n * Aplica el foco al control enfocable real dentro del elemento destino.\r\n * Necesario para componentes wrapper como <p-inputnumber>, donde el foco\r\n * debe recaer en el <input> interno y no en el host del componente.\r\n */\r\n private focusElement(element: HTMLElement) {\r\n const target = this.resolveFocusableTarget(element);\r\n\r\n this.log('target de foco resuelto', {\r\n source: element,\r\n target,\r\n });\r\n\r\n if (!target) {\r\n this.log('no se encontró target enfocable');\r\n return;\r\n }\r\n\r\n target.focus();\r\n\r\n // Selecciona el contenido del input para facilitar la edición inmediata\r\n if (\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLTextAreaElement\r\n ) {\r\n this.log('aplicando select() al target enfocable');\r\n target.select();\r\n }\r\n }\r\n\r\n /**\r\n * Resuelve el control interno enfocable de un elemento.\r\n *\r\n * Si el elemento es directamente enfocable (input, button, etc.) lo retorna tal cual.\r\n * De lo contrario busca el primer descendiente que sea un control nativo activo.\r\n *\r\n * NOTA: cada componente de PrimeNG u otras librerías puede renderizar su control\r\n * interno con una estructura diferente. Si un componente no recibe el foco\r\n * correctamente, revisar primero el HTML renderizado en DevTools y ajustar el\r\n * selector de `querySelector` según sea necesario.\r\n */\r\n private resolveFocusableTarget(element: HTMLElement): HTMLElement | null {\r\n if (this.isDirectlyFocusable(element)) return element;\r\n\r\n const nestedFocusable = element.querySelector<HTMLElement>(\r\n 'input:not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n\r\n return nestedFocusable ?? null;\r\n }\r\n\r\n /** Determina si un elemento puede recibir el foco directamente. */\r\n private isDirectlyFocusable(element: HTMLElement): boolean {\r\n if (element.hasAttribute('disabled')) return false;\r\n\r\n const tag = element.tagName.toLowerCase();\r\n if (['input', 'textarea', 'select', 'button'].includes(tag)) return true;\r\n\r\n return element.tabIndex >= 0;\r\n }\r\n\r\n /**\r\n * Traza un mensaje en consola cuando el modo debug está activo.\r\n * Para activar: cambiar `debug = false` a `debug = true`.\r\n */\r\n private log(message: string, data?: unknown) {\r\n if (!this.debug) return;\r\n // console.log('[ArrowNavigationDirective]', message, data ?? '');\r\n }\r\n}\r\n","// services/scroll-measurement.service.ts\r\nimport { Injectable, computed, signal } from '@angular/core';\r\n\r\nexport interface ScrollMeasurements {\r\n height: string;\r\n heightPx: number;\r\n rows: number;\r\n tableScrollHeight: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ScrollMeasurementService {\r\n private measurements = signal<ScrollMeasurements | null>(null);\r\n private instancesCount = 0;\r\n private lastUpdateHeight = '';\r\n\r\n readonly globalHeight = computed(\r\n () => this.measurements()?.height ?? '315px',\r\n );\r\n readonly globalHeightPx = computed(\r\n () => this.measurements()?.heightPx ?? 315,\r\n );\r\n readonly globalRows = computed(() => this.measurements()?.rows ?? 6);\r\n readonly globalTableScrollHeight = computed(\r\n () => this.measurements()?.tableScrollHeight ?? '280px',\r\n );\r\n\r\n readonly hasMeasurements = computed(() => this.measurements() !== null);\r\n\r\n getLatestMeasurements(): ScrollMeasurements | null {\r\n return this.measurements();\r\n }\r\n\r\n updateMeasurements(measurements: ScrollMeasurements) {\r\n // Evitar actualizaciones duplicadas\r\n if (this.lastUpdateHeight === measurements.height) {\r\n return;\r\n }\r\n\r\n this.lastUpdateHeight = measurements.height;\r\n this.measurements.set(measurements);\r\n }\r\n\r\n registerInstance(instanceId: string) {\r\n this.instancesCount++;\r\n }\r\n\r\n unregisterInstance(instanceId: string) {\r\n this.instancesCount = Math.max(0, this.instancesCount - 1);\r\n if (this.instancesCount === 0) {\r\n setTimeout(() => {\r\n if (this.instancesCount === 0) {\r\n this.measurements.set(null);\r\n this.lastUpdateHeight = '';\r\n }\r\n }, 5000);\r\n }\r\n }\r\n\r\n reset() {\r\n this.measurements.set(null);\r\n this.lastUpdateHeight = '';\r\n }\r\n}\r\n","// auto-scroll-height.directive.ts (versión estable sin IntersectionObserver)\r\nimport {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n NgZone,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { ScrollMeasurementService } from '../../services/src/scroll-view/scroll-measurement.service';\r\n\r\n@Directive({\r\n selector: '[appAutoScrollHeight]',\r\n})\r\nexport class AutoScrollHeightDirective implements AfterViewInit, OnDestroy {\r\n // Inputs públicos\r\n marginBottom = input<number>(75);\r\n minHeight = input<number>(315);\r\n rowHeight = input<number>(40);\r\n tableChromeReserve = input<number>(210);\r\n minRows = input<number>(6);\r\n maxRows = input<number>(25);\r\n tableScrollMinHeight = input<number>(140);\r\n\r\n shareMeasurements = input<boolean>(true);\r\n measurementGroup = input<string>('default');\r\n debugMode = input<boolean>(false);\r\n\r\n // Outputs\r\n heightCalculated = output<string>();\r\n rowsCalculated = output<number>();\r\n tableScrollHeightCalculated = output<string>();\r\n\r\n private readonly ngZone = inject(NgZone);\r\n private readonly el: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly measurementService = inject(ScrollMeasurementService);\r\n\r\n private resizeObserver?: ResizeObserver;\r\n private rafId: number | null = null;\r\n private debounceTimer: number | null = null;\r\n private initTimer: number | null = null;\r\n\r\n private lastEmitted = {\r\n height: '',\r\n heightPx: 0,\r\n rows: 0,\r\n tableScrollHeight: '',\r\n };\r\n\r\n private cachedViewportHeight = 0;\r\n private isInitialized = false;\r\n private instanceId = Math.random().toString(36).substring(4, 9);\r\n private hasPendingUpdate = false;\r\n\r\n private log(message: string, data?: any) {\r\n if (!this.debugMode()) return;\r\n const prefix = `🔍 [${this.instanceId}]`;\r\n if (data) {\r\n console.log(prefix, message, data);\r\n } else {\r\n console.log(prefix, message);\r\n }\r\n }\r\n\r\n constructor() {\r\n effect(() => {\r\n if (\r\n this.shareMeasurements() &&\r\n this.measurementService.hasMeasurements()\r\n ) {\r\n const globalHeight = this.measurementService.globalHeight();\r\n const globalRows = this.measurementService.globalRows();\r\n const globalScrollHeight =\r\n this.measurementService.globalTableScrollHeight();\r\n\r\n if (\r\n this.lastEmitted.height !== globalHeight &&\r\n !this.hasPendingUpdate\r\n ) {\r\n this.log(`📡 Recibiendo medidas: ${globalHeight}`);\r\n\r\n this.emitInZone(() => {\r\n this.heightCalculated.emit(globalHeight);\r\n this.rowsCalculated.emit(globalRows);\r\n this.tableScrollHeightCalculated.emit(globalScrollHeight);\r\n });\r\n\r\n this.lastEmitted = {\r\n height: globalHeight,\r\n heightPx: this.measurementService.globalHeightPx(),\r\n rows: globalRows,\r\n tableScrollHeight: globalScrollHeight,\r\n };\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.measurementService.registerInstance(this.instanceId);\r\n this.setupResizeObserver();\r\n this.scheduleInitialCalculation();\r\n this.log(`🚀 Inicializado`);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resizeObserver?.disconnect();\r\n this.measurementService.unregisterInstance(this.instanceId);\r\n this.cleanup();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n if (typeof window !== 'undefined') {\r\n this.cachedViewportHeight = window.innerHeight;\r\n }\r\n\r\n // Verificar si esta tab está visible\r\n if (this.isTabVisible() && this.isInitialized) {\r\n this.log(`🪟 Resize - visible, recalculando`);\r\n this.scheduleDebouncedRecalculation();\r\n }\r\n }\r\n\r\n private isTabVisible(): boolean {\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n const style = window.getComputedStyle(this.el.nativeElement);\r\n return (\r\n rect.width > 0 &&\r\n rect.height > 0 &&\r\n style.display !== 'none' &&\r\n style.visibility !== 'hidden'\r\n );\r\n }\r\n\r\n private setupResizeObserver() {\r\n if (typeof window === 'undefined') return;\r\n\r\n this.cachedViewportHeight = window.innerHeight;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n if (this.isTabVisible() && this.isInitialized) {\r\n this.scheduleDebouncedRecalculation();\r\n }\r\n });\r\n\r\n this.resizeObserver.observe(this.el.nativeElement);\r\n }\r\n\r\n private scheduleInitialCalculation() {\r\n const existing = this.measurementService.getLatestMeasurements();\r\n\r\n if (existing && this.measurementService.hasMeasurements()) {\r\n // Usar medidas existentes\r\n setTimeout(() => {\r\n this.log(`📦 Usando medidas existentes: ${existing.height}`);\r\n this.emitInZone(() => {\r\n this.heightCalculated.emit(existing.height);\r\n this.rowsCalculated.emit(existing.rows);\r\n this.tableScrollHeightCalculated.emit(existing.tableScrollHeight);\r\n });\r\n this.lastEmitted = {\r\n height: existing.height,\r\n heightPx: existing.heightPx,\r\n rows: existing.rows,\r\n tableScrollHeight: existing.tableScrollHeight,\r\n };\r\n this.isInitialized = true;\r\n this.log(`✅ Listo`);\r\n }, 50);\r\n } else {\r\n // Primera carga, calcular\r\n this.scheduleRafRecalculation();\r\n\r\n this.initTimer = window.setTimeout(() => {\r\n this.initTimer = null;\r\n this.scheduleRafRecalculation();\r\n setTimeout(() => {\r\n this.isInitialized = true;\r\n this.log(`✅ Listo (primer cálculo)`);\r\n }, 50);\r\n }, 100);\r\n }\r\n }\r\n\r\n private scheduleDebouncedRecalculation() {\r\n if (!this.isInitialized) return;\r\n\r\n if (this.debounceTimer) {\r\n clearTimeout(this.debounceTimer);\r\n }\r\n\r\n this.debounceTimer = window.setTimeout(() => {\r\n this.debounceTimer = null;\r\n this.scheduleRafRecalculation();\r\n }, 150);\r\n }\r\n\r\n private scheduleRafRecalculation() {\r\n if (this.rafId !== null) {\r\n cancelAnimationFrame(this.rafId);\r\n }\r\n\r\n this.rafId = requestAnimationFrame(() => {\r\n this.rafId = null;\r\n this.recalculate();\r\n });\r\n }\r\n\r\n private recalculate() {\r\n if (!this.isTabVisible()) {\r\n this.log(`👻 Tab no visible, omitiendo recálculo`);\r\n return;\r\n }\r\n\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n const elementTop = rect.top;\r\n\r\n let availableHeight =\r\n this.cachedViewportHeight - elementTop - this.marginBottom();\r\n availableHeight = Math.max(availableHeight, this.minHeight());\r\n const alturaPx = Math.floor(availableHeight);\r\n const alturaCalculada = `${alturaPx}px`;\r\n\r\n const heightDiff = Math.abs(alturaPx - this.lastEmitted.heightPx);\r\n const isSignificantChange = heightDiff >= 5;\r\n\r\n if (!isSignificantChange && this.lastEmitted.heightPx > 0) {\r\n return;\r\n }\r\n\r\n const suggestedRows = this.calculateSuggestedRows(alturaPx);\r\n const suggestedTableScrollHeight =\r\n this.calculateTableScrollHeight(suggestedRows);\r\n\r\n this.log(`📐 Recalculando: ${this.lastEmitted.heightPx}px → ${alturaPx}px`);\r\n\r\n // Actualizar medidas globales (cualquier tab visible puede hacerlo)\r\n this.hasPendingUpdate = true;\r\n this.measurementService.updateMeasurements({\r\n height: alturaCalculada,\r\n heightPx: alturaPx,\r\n rows: suggestedRows,\r\n tableScrollHeight: suggestedTableScrollHeight,\r\n });\r\n\r\n // Pequeño delay para evitar loops\r\n setTimeout(() => {\r\n this.hasPendingUpdate = false;\r\n }, 100);\r\n\r\n this.emitInZone(() => {\r\n if (this.lastEmitted.height !== alturaCalculada) {\r\n this.heightCalculated.emit(alturaCalculada);\r\n }\r\n\r\n if (this.lastEmitted.rows !== suggestedRows) {\r\n this.rowsCalculated.emit(suggestedRows);\r\n }\r\n\r\n if (this.lastEmitted.tableScrollHeight !== suggestedTableScrollHeight) {\r\n this.tableScrollHeightCalculated.emit(suggestedTableScrollHeight);\r\n }\r\n });\r\n\r\n this.lastEmitted = {\r\n height: alturaCalculada,\r\n heightPx: alturaPx,\r\n rows: suggestedRows,\r\n tableScrollHeight: suggestedTableScrollHeight,\r\n };\r\n }\r\n\r\n private calculateSuggestedRows(availablePx: number): number {\r\n const rowPx = Math.max(20, Math.floor(this.rowHeight()));\r\n const reservePx = this.getEffectiveTableChromeReserve();\r\n const minRows = Math.max(1, Math.floor(this.minRows()));\r\n const maxRows = Math.max(minRows, this.getEffectiveMaxRows(minRows));\r\n\r\n const usablePx = Math.max(0, availablePx - reservePx);\r\n const calculated = Math.max(minRows, Math.floor(usablePx / rowPx));\r\n\r\n return Math.min(calculated, maxRows);\r\n }\r\n\r\n private getEffectiveMaxRows(minRows: number): number {\r\n const baseMaxRows = Math.max(minRows, Math.floor(this.maxRows()));\r\n const vh = this.cachedViewportHeight;\r\n\r\n if (vh <= 640) return Math.min(baseMaxRows, 8);\r\n if (vh <= 700) return Math.min(baseMaxRows, 10);\r\n if (vh <= 760) return Math.min(baseMaxRows, 12);\r\n return baseMaxRows;\r\n }\r\n\r\n private getEffectiveTableChromeReserve(): number {\r\n const baseReserve = Math.max(0, Math.floor(this.tableChromeReserve()));\r\n const vh = this.cachedViewportHeight;\r\n\r\n if (vh <= 640) return 200;\r\n if (vh <= 700) return baseReserve + 56;\r\n if (vh <= 760) return baseReserve + 32;\r\n if (vh > 820) return Math.max(120, baseReserve - 80);\r\n if (vh > 700) return Math.max(140, baseReserve - 40);\r\n return baseReserve;\r\n }\r\n\r\n private calculateTableScrollHeight(suggestedRows: number): string {\r\n const rowPx = Math.max(20, Math.floor(this.rowHeight()));\r\n const minHeightPx = Math.max(120, Math.floor(this.tableScrollMinHeight()));\r\n\r\n const adjustment =\r\n this.cachedViewportHeight > 0 && this.cachedViewportHeight <= 640\r\n ? 40\r\n : 24;\r\n const calculatedPx = Math.max(\r\n minHeightPx,\r\n suggestedRows * rowPx - adjustment,\r\n );\r\n\r\n return `${calculatedPx}px`;\r\n }\r\n\r\n private emitInZone(fn: () => void) {\r\n if (NgZone.isInAngularZone()) {\r\n fn();\r\n } else {\r\n this.ngZone.run(fn);\r\n }\r\n }\r\n\r\n private cleanup() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n if (this.rafId !== null) {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n\r\n if (this.debounceTimer !== null) {\r\n clearTimeout(this.debounceTimer);\r\n this.debounceTimer = null;\r\n }\r\n\r\n if (this.initTimer !== null) {\r\n clearTimeout(this.initTimer);\r\n this.initTimer = null;\r\n }\r\n }\r\n}\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva que permite solo la entrada de:\r\n * - Dígitos (0-9)\r\n * - Separadores punto (.)\r\n * - Rango con guión (-)\r\n * - O bien un comodín completo \"*\" que representa \"todos\"\r\n *\r\n * Ejemplos válidos:\r\n * - 1.2.3\r\n * - 4-6\r\n * - 1.3.5-9\r\n * - * (comodín: todos)\r\n *\r\n * Restringe:\r\n * - Letras\r\n * - Espacios\r\n * - Caracteres especiales (salvo \"*\")\r\n * - Doble punto (..), doble guión (--), o combinaciones como (.-)\r\n * - Mezclas de comodín con números (por ejemplo: *1, 1.*)\r\n */\r\n@Directive({\r\n selector: '[appOnlyRangoPattern]',\r\n})\r\nexport class OnlyRangoPatternDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n /**\r\n * Expresión regular para permitir caracteres válidos individualmente (tecla por tecla).\r\n */\r\n private keyRegex: RegExp = /^[0-9.\\-]$/;\r\n\r\n /**\r\n * Escucha el evento de teclado y permite únicamente teclas válidas.\r\n * También evita combinaciones inválidas como `..`, `--`, `.1`, etc.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const input = this.el.nativeElement;\r\n const currentValue = input.value;\r\n const cursorPos = input.selectionStart ?? 0;\r\n const selectionStart = input.selectionStart ?? 0;\r\n const selectionEnd = input.selectionEnd ?? 0;\r\n const hasFullSelection =\r\n selectionStart === 0 && selectionEnd === currentValue.length;\r\n const nextValue =\r\n currentValue.slice(0, cursorPos) +\r\n event.key +\r\n currentValue.slice(cursorPos);\r\n\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Tab',\r\n 'Home',\r\n 'End',\r\n ];\r\n\r\n if (allowedKeys.includes(event.key)) return;\r\n\r\n // Si ya hay comodín \"*\" sin selección completa, no se permiten más caracteres\r\n // (solo borrar/navegar). Si todo el texto está seleccionado, se permite\r\n // sobrescribirlo.\r\n if (currentValue === '*' && !hasFullSelection) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // Permitir comodín \"*\" si el campo está vacío o si todo el contenido\r\n // está seleccionado (para poder reemplazar rápidamente los números).\r\n if (event.key === '*') {\r\n if (!currentValue || hasFullSelection) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (!this.keyRegex.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir más de un punto o guión seguido, o combinaciones como \".-\", \"-.\", etc.\r\n if (/(\\.\\.|--|-\\.)|(\\.-)/.test(nextValue)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir iniciar con punto o guión\r\n if (cursorPos === 0 && (event.key === '.' || event.key === '-')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Previene el pegado de cadenas que no cumplan con la estructura válida.\r\n * Solo permite: número o número separados por punto o guión correctamente.\r\n */\r\n @HostListener('paste', ['$event'])\r\n onPaste(event: ClipboardEvent): void {\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const sanitized = pasted.trim();\r\n\r\n // Permitir comodín completo \"*\" pegado\r\n if (sanitized === '*') {\r\n return;\r\n }\r\n\r\n // Patrón completo de cadena válida: ej. 1.2.3.4-6\r\n const pattern = /^(\\d+(-\\d+)?)(\\.\\d+(-\\d+)?)*$/;\r\n\r\n if (!pattern.test(sanitized)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appSelectAllOnFocus]',\r\n})\r\nexport class SelectAllOnFocusDirective {\r\n @HostListener('onFocus', ['$event'])\r\n @HostListener('focus', ['$event'])\r\n selectAll(event: Event): void {\r\n const htmlInput = event.target as HTMLInputElement;\r\n if (htmlInput) {\r\n htmlInput.select();\r\n }\r\n }\r\n}\r\n","import { Location } from '@angular/common';\r\nimport { CanActivateFn } from '@angular/router';\r\nimport { AuthorizeService } from './../../services/src/authorize.service';\r\nimport { inject } from '@angular/core';\r\n\r\nexport const guardTokenPurposeGuard: CanActivateFn = (route, state) => {\r\n const authService = inject(AuthorizeService);\r\n const location = inject(Location);\r\n\r\n //console.log('[guardTokenPurposeGuard] ruta capturada:', state.url);\r\n\r\n if (authService.getTokenPurposeValid()) {\r\n // Permite pasar a la edición\r\n return true;\r\n }\r\n\r\n // Si no es válido:\r\n console.warn('Permiso denegado: Token Purpose no válido');\r\n\r\n // Regresa a la pantalla anterior del navegador.\r\n location.back();\r\n return false;\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const CACHE_KEYS = new InjectionToken<Record<string, string>>(\r\n 'CACHE_KEYS'\r\n);\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { EMPTY, throwError } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n // Activar en true cuando se necesite depurar en desarrollo.\r\n private readonly enableDevConsoleLogs = false && isDevMode();\r\n\r\n private isPurposeTokenError(error: HttpErrorResponse): boolean {\r\n const payload = error.error as any;\r\n return payload?.error === 'token_purpose_error';\r\n }\r\n\r\n private getPurposeTokenDescription(error: HttpErrorResponse): string {\r\n const payload = error.error as any;\r\n return (\r\n payload?.error_description ||\r\n 'Se requiere un token especial para acceder a este recurso.'\r\n );\r\n }\r\n\r\n handleErrorResponse(error: HttpErrorResponse | Error) {\r\n // Si el error ya no es un HttpErrorResponse (por ejemplo, un Error relanzado\r\n // desde otro catch), sólo lo propagamos sin volver a mostrar mensajes.\r\n if (!(error instanceof HttpErrorResponse)) {\r\n if (this.enableDevConsoleLogs) {\r\n // console.error(\r\n // 'Error no HTTP capturado por ErrorHandlerService:',\r\n // error,\r\n // );\r\n }\r\n\r\n return throwError(() => error);\r\n }\r\n\r\n let alertTitle = 'Servicio de Errores';\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n let isUnhandledSystemError = false;\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage = `<div style=\"font-family: 'Oswald', sans-serif; font-weight: normal; font-style: italic; margin-bottom: 0.3rem;\">Verifica los datos ingresados o validaciones existentes</div>`;\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = this.isPurposeTokenError(error)\r\n ? '<b>Acceso a recurso sensible no autorizado</b> (401).'\r\n : '<b>Acceso no autorizado</b> (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage =\r\n 'Se ha generado un error no controlado por el sistema en el último proceso realizado, comuníquese con el administrador.';\r\n isUnhandledSystemError = true;\r\n break;\r\n }\r\n\r\n // Preparar detalle del error para mostrar, priorizando solo la parte \"errors\" del objeto\r\n let errorDetail = '';\r\n let errorDetailHtml = '';\r\n\r\n if (!isUnhandledSystemError && this.isPurposeTokenError(error)) {\r\n errorDetail = this.getPurposeTokenDescription(error);\r\n } else if (\r\n !isUnhandledSystemError &&\r\n error &&\r\n typeof error.error === 'object' &&\r\n error.error !== null\r\n ) {\r\n const anyError: any = error.error as any;\r\n\r\n const getAssociatedPayload = (source: any) => {\r\n const resolveItemsArray = (value: any): any[] => {\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const nested =\r\n value.data ??\r\n value.Data ??\r\n value.details ??\r\n value.Details ??\r\n value.items ??\r\n value.Items;\r\n\r\n if (Array.isArray(nested)) {\r\n return nested;\r\n }\r\n }\r\n\r\n return [];\r\n };\r\n\r\n const candidates = [\r\n source,\r\n source?.error,\r\n source?.Error,\r\n source?.detail,\r\n source?.details,\r\n source?.payload,\r\n source?.response,\r\n source?.response?.data,\r\n source?.result,\r\n ].filter((item) => item && typeof item === 'object');\r\n\r\n for (const candidate of candidates) {\r\n const title = candidate.title ?? candidate.Title;\r\n const message = candidate.message ?? candidate.Message;\r\n const rawItems =\r\n candidate.data ??\r\n candidate.Data ??\r\n candidate.details ??\r\n candidate.Details ??\r\n candidate.items ??\r\n candidate.Items;\r\n\r\n const items = resolveItemsArray(rawItems);\r\n\r\n if (typeof title === 'string' && typeof message === 'string') {\r\n return {\r\n title,\r\n message,\r\n items,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const associatedPayload = getAssociatedPayload(anyError);\r\n\r\n if (this.enableDevConsoleLogs) {\r\n // console.log('[ErrorHandler] anyError payload:', anyError);\r\n // console.log(\r\n // '[ErrorHandler] associatedPayload detectado:',\r\n // associatedPayload,\r\n // );\r\n }\r\n\r\n if (associatedPayload) {\r\n alertTitle = associatedPayload.title || alertTitle;\r\n userMessage = associatedPayload.message || userMessage;\r\n\r\n const associatedItems =\r\n associatedPayload.items.length > 0\r\n ? associatedPayload.items\r\n : Array.isArray(anyError?.data)\r\n ? anyError.data\r\n : [];\r\n\r\n if (this.enableDevConsoleLogs) {\r\n // console.log(\r\n // '[ErrorHandler] associatedItems procesados:',\r\n // associatedItems,\r\n // );\r\n }\r\n\r\n if (associatedItems.length > 0) {\r\n const guideItems = associatedItems\r\n .map((item: any) => {\r\n const seccionOTabla = String(\r\n item?.seccionOTabla ?? 'No disponible',\r\n );\r\n const cantidadRegistros = String(item?.cantidadRegistros ?? '0');\r\n const vista = String(item?.vista ?? 'No disponible');\r\n const ruta = String(item?.ruta ?? 'No disponible');\r\n\r\n return (\r\n `<li style=\"display: list-item; margin: 0.35rem 0;\">` +\r\n `<div><strong>Vista:</strong> ${vista}</div>` +\r\n `<div><strong>Sección o tabla:</strong> ${seccionOTabla}</div>` +\r\n `<div><strong>Registros asociados:</strong> ${cantidadRegistros}</div>` +\r\n `<div><strong>Ruta:</strong> ${ruta}</div>` +\r\n `</li>`\r\n );\r\n })\r\n .join('');\r\n\r\n errorDetailHtml =\r\n `<div style=\"margin-top: 0.6rem;\">` +\r\n `<div style=\"font-family: 'Roboto', sans-serif; font-size: small; margin-bottom: 0.7rem;\">Sugerencia(s):<br/></div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${guideItems}</ol>` +\r\n `</div>`;\r\n }\r\n } else {\r\n // Si existe la propiedad \"errors\" (típica de ASP.NET Core ProblemDetails), usar solo esa\r\n const validationErrors = anyError.errors ?? anyError.Errors;\r\n\r\n if (validationErrors && typeof validationErrors === 'object') {\r\n // Mostrar solo los mensajes, sin prefijo de nombre de campo\r\n const parts: string[] = [];\r\n for (const key of Object.keys(validationErrors)) {\r\n const value = validationErrors[key];\r\n if (Array.isArray(value)) {\r\n parts.push(...value.map((msg) => String(msg)));\r\n } else {\r\n parts.push(String(value));\r\n }\r\n }\r\n\r\n if (parts.length > 0) {\r\n const listItems = parts\r\n .map(\r\n (msg) =>\r\n `<li style=\"display: list-item; margin: 0.15rem 0;\">${msg}</li>`,\r\n )\r\n .join('');\r\n errorDetailHtml =\r\n `<div style=\"margin-top: 0.15rem;\">` +\r\n `<div style=\"font-family: 'Roboto', sans-serif; font-size: small; margin-bottom: 0.7rem;\">Corrige lo(s) siguiente(s):<br/></div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1.05rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${listItems}</ol>` +\r\n `</div>`;\r\n }\r\n } else {\r\n // Si no hay \"errors\", usar el objeto completo serializado\r\n errorDetail = JSON.stringify(anyError);\r\n }\r\n }\r\n } else if (!isUnhandledSystemError) {\r\n errorDetail = (error?.error ?? '') as string;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n const alertBody =\r\n `<div class=\"alertMessageDsx\"><strong>${userMessage}</strong></div>` +\r\n (errorDetailHtml ? `<div>${errorDetailHtml}</div>` : '') +\r\n (errorDetail\r\n ? `<div class=\"alertMessageDsx\" style=\"font-size: 1.02rem; margin-top: 0.35rem;\">${errorDetail}</div>`\r\n : '');\r\n\r\n this._serviceAlerta.alertaHtmlSuccess(alertTitle, alertBody, {\r\n icon: 'error',\r\n icono: '',\r\n showConfirmButton: true,\r\n });\r\n\r\n // Imprimir el mensaje técnico\r\n if (this.enableDevConsoleLogs) {\r\n //console.error('error-handler:', err);\r\n }\r\n\r\n // El error HTTP ya fue tratado y notificado al usuario.\r\n // Se completa el flujo para evitar relanzarlo al consumidor cuando no es necesario.\r\n return EMPTY;\r\n }\r\n}\r\n","// Interceptor HTTP para manejar autorización y refresco de tokens en peticiones HTTP.\r\n// Permite agregar el token de autorización, manejar errores 401 y refrescar el token automáticamente.\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n EMPTY,\r\n filter,\r\n finalize,\r\n switchMap,\r\n take,\r\n} from 'rxjs';\r\nimport { ServiceResult } from '../models/src/response-http.model';\r\nimport { DataToken } from '../models/src/token.model';\r\nimport { AuthorizeService } from '../services/src/authorize.service';\r\nimport { ErrorHandlerService } from '../services/src/error-handler.service';\r\nimport { SecurityService } from '../services/src/security.service';\r\nimport { SpinnerLoadingService } from '../services/src/spinner-loading.service';\r\nimport { RequestMetricsService } from '../services/src/request-metrics.service';\r\n// Indica si se está realizando un refresh de token\r\nlet isRefreshing = false;\r\n// Subject para emitir el nuevo token tras el refresh\r\nlet refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n/**\r\n * Interceptor principal para autorización HTTP.\r\n * - Agrega el token de autorización a cada petición.\r\n * - Muestra/oculta el spinner de carga según el número de peticiones activas.\r\n * - Maneja errores 401 (Unauthorized) refrescando el token si es posible.\r\n * - Repite la petición original tras refrescar el token.\r\n */\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n const _metricsService = inject(RequestMetricsService);\r\n const _token = _authorizeService.getToken();\r\n const _tokenPurpose = _authorizeService.getTokenPurpose();\r\n let authReq = req;\r\n\r\n // Si la URL de la petición es inválida, retorna un observable vacío\r\n // Surgio a partir de angular V21\r\n if (!req.url || req.url.trim() === '' || req.url === '/') {\r\n return EMPTY;\r\n }\r\n\r\n // Justo después del console.log(...)\r\n const url = req.url || '';\r\n\r\n const isAssetRequest = url.includes('/assets/') || url.startsWith('mdio/'); // ajusta según tu caso\r\n\r\n if (isAssetRequest) {\r\n // No agregar token ni mostrar spinner para estos recursos\r\n return next(req);\r\n }\r\n\r\n if (_token) {\r\n authReq = req.clone({\r\n setHeaders: { Authorization: `Bearer ${_token}` },\r\n });\r\n }\r\n\r\n // Validar si el token de propósito es válido y agregarlo a la petición si es necesario\r\n if (_tokenPurpose && _authorizeService.getTokenPurposeValid()) {\r\n authReq = authReq.clone({\r\n setHeaders: { 'X-Special-Token': _tokenPurpose },\r\n });\r\n // Debería incluir X-Special-Token\r\n // console.log('Cabeceras enviadas:', authReq.headers.keys());\r\n }\r\n\r\n //console.log('Interceptor - Petición HTTP iniciada:', req.url);\r\n\r\n // Para depuración: muestra el token agregado\r\n //console.log('Interceptor - Token agregado a la petición:', authReq);\r\n\r\n // Notifica que inicia una petición (el servicio lleva el conteo interno)\r\n _spinnerService.show();\r\n\r\n const start = performance.now();\r\n\r\n // Ejecuta la petición HTTP\r\n return next(authReq).pipe(\r\n // Manejo de errores en la respuesta\r\n catchError((error: HttpErrorResponse) => {\r\n // Si el error es 401 (no autorizado), intenta refrescar el token\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n const refreshToken = _authorizeService.getTokenRefresh();\r\n // Si no hay refresh token, delega el manejo del error\r\n if (!refreshToken) {\r\n return _handleErrorService.handleErrorResponse(error);\r\n }\r\n\r\n // Si no se está refrescando el token, inicia el proceso de refresh\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n // Reiniciar el subject en cada ciclo de refresh para evitar estados cerrados por error\r\n refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n // Solicita el refresh del token\r\n return _securityService.tokenRefresh(refreshToken).pipe(\r\n switchMap((response: ServiceResult<DataToken>) => {\r\n // Si el servicio de refresh indica fallo o no retorna datos, mostrar error y cortar flujo\r\n if (!response.isSuccess || !response.data) {\r\n //console.log('Refresh token fallido:', response);\r\n isRefreshing = false;\r\n const refreshError = new HttpErrorResponse({\r\n status: HttpStatusCode.Unauthorized,\r\n statusText: 'Token de refresco inválido',\r\n error: response.message,\r\n url: req.url,\r\n });\r\n\r\n // Notificar a las peticiones en espera que el refresh falló\r\n refreshTokenSubject.error(refreshError);\r\n\r\n // Enviamos el error al manejador centralizado para mostrar el mensaje al usuario\r\n return _handleErrorService.handleErrorResponse(refreshError);\r\n }\r\n\r\n // Refresh exitoso: actualizar tokens y repetir la petición original\r\n isRefreshing = false;\r\n _authorizeService.tokenReload(response.data); // Actualiza el token en el servicio\r\n refreshTokenSubject.next(response.data.token); // Emite el nuevo token\r\n\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.data.token}`,\r\n },\r\n }),\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n refreshTokenSubject.error(err); // Emite el error en el subject\r\n return _handleErrorService.handleErrorResponse(err);\r\n }),\r\n );\r\n } else {\r\n // Si ya se está refrescando, espera a que el subject emita el nuevo token\r\n return refreshTokenSubject.pipe(\r\n filter((token) => token != null), // Espera a que el token sea válido\r\n take(1), // Toma solo la primera emisión válida\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n }),\r\n ),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n // Para otros errores, delega al servicio de manejo de errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n // Al finalizar la petición (éxito o error), actualiza el conteo y oculta el spinner si corresponde\r\n // comentarizar el hide para verificar el spinner en la aplicacion final\r\n finalize(() => {\r\n const duration = performance.now() - start;\r\n _metricsService.registerRequest(duration);\r\n _spinnerService.hide();\r\n }),\r\n );\r\n};\r\n","export type InferCacheKeyType<T extends Record<string, string>> = keyof T;\r\n\r\n/**\r\n * Transforma un tipo de mapa `T` cuyas claves son simbólicas\r\n * y cuyos valores son nombres de propiedades reales de caché,\r\n * a un objeto donde esas propiedades reales son claves booleanas.\r\n *\r\n * @example\r\n * ```ts\r\n * type T = { cliente: 'invalidateCacheCliente' };\r\n * InferCacheOptions<T> // { invalidateCacheCliente: boolean }\r\n * ```\r\n */\r\nexport type InferCacheOptions<T extends Record<string, string>> = {\r\n [K in keyof T as T[K]]: boolean;\r\n};\r\n\r\nexport function createInitialCache<T extends Record<string, string>>(\r\n cacheKeys: T\r\n): {\r\n -readonly [K in keyof T as T[K]]: boolean;\r\n} {\r\n return Object.fromEntries(\r\n Object.values(cacheKeys).map((key) => [key, false])\r\n ) as any;\r\n}\r\n","import { Component, input, OnInit } from '@angular/core';\r\nimport { AvatarModule } from 'primeng/avatar';\r\n\r\n@Component({\r\n selector: 'header-dsx',\r\n imports: [AvatarModule],\r\n templateUrl: './header-dsx.html',\r\n styleUrl: './header-dsx.css',\r\n})\r\nexport class HeaderDsx implements OnInit {\r\n id = input<number | null>(null);\r\n etiqueta = input.required<string>();\r\n defaultPNG = input<string>('icon/folder_001.png');\r\n defaultGIF = input<string>('gif/file.gif');\r\n icoPNG = input<string | null>(null);\r\n icoGIF = input<string | null>(null);\r\n icono: string | null = null;\r\n textoEncabezado: string | null = null;\r\n subTitulo = input<string | null>(null);\r\n\r\n ngOnInit(): void {\r\n this.definirTexto();\r\n //throw new Error('Method not implemented.');\r\n }\r\n\r\n private definirTexto(): void {\r\n // Validaciones para el texto del encabezado según el valor de ID\r\n // Caso 1: No se proporcionó ID (indefinido o nulo) -> Plural\r\n if (this.id() === null) {\r\n this.textoEncabezado = this.etiqueta();\r\n }\r\n // Caso 2: El ID existe y vale exactamente 0 -> Registrar\r\n else if (this.id() === 0) {\r\n this.textoEncabezado = `Registrar ${this.etiqueta()}`;\r\n }\r\n // Caso 3: El ID es mayor que 0 -> Editar\r\n else if (this.id()! > 0) {\r\n this.textoEncabezado = `Editar ${this.etiqueta()}`;\r\n }\r\n\r\n // Validaciones para el icono según el valor de ID\r\n // Caso 1: No se proporcionó ningún icono -> Usar el icono por defecto\r\n if (this.icoPNG() === null && this.icoGIF() === null) {\r\n this.icono = this.defaultPNG();\r\n }\r\n // Caso 2: Se proporcionó un icono PNG -> Usar el icono PNG\r\n else if (this.icoPNG() !== null) {\r\n this.icono = this.icoPNG();\r\n }\r\n // Caso 3: Se proporcionó un icono GIF -> Usar el icono GIF\r\n else if (this.icoGIF() !== null) {\r\n this.icono = this.icoGIF();\r\n }\r\n }\r\n}\r\n","<div class=\"area-fieldset-header flex items-center gap-2 px-2\">\r\n <p-avatar [image]=\"icono!\"></p-avatar>\r\n <div class=\"flex flex-col\">\r\n <h3>{{ textoEncabezado }}</h3>\r\n @if(subTitulo() !== null ){\r\n <ng-container>\r\n <span class=\"text-xs text-gray-600\">{{ subTitulo() }}</span>\r\n </ng-container>\r\n }\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterLink } from '@angular/router';\r\nimport { DsxButtonComponent } from '../../components/src/button/dsx-button/dsx-button';\r\nimport { DsxStatusToggle } from '../../components/src/button/dsx-status-toggle/dsx-status-toggle';\r\nimport { DsxEnableDisable } from '../../components/src/checkBox/enable-disable/enable-disable';\r\nimport { IconDsxComponent } from '../../components/src/icon-dsx/icon-dsx.component';\r\nimport { JsonValuesDebujComponent } from '../../components/src/json/json-values-debuj/json-values-debuj.component';\r\nimport { HeaderDsx } from '../../primengdsx/src/fieldset/header/header-dsx/header-dsx';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n DsxButtonComponent,\r\n DsxEnableDisable,\r\n DsxStatusToggle,\r\n HeaderDsx,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n RouterLink,\r\n ],\r\n exports: [\r\n CommonModule,\r\n DsxButtonComponent,\r\n DsxEnableDisable,\r\n DsxStatusToggle,\r\n FormsModule,\r\n HeaderDsx,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n RouterLink,\r\n ],\r\n providers: [],\r\n})\r\nexport class DsxAddToolsModule {}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//PrimeNG\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { AutoFocusModule } from 'primeng/autofocus';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { AvatarGroupModule } from 'primeng/avatargroup';\r\nimport { BadgeModule } from 'primeng/badge';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CardModule } from 'primeng/card';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ContextMenuModule } from 'primeng/contextmenu';\r\nimport { DataViewModule } from 'primeng/dataview';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { FieldsetModule } from 'primeng/fieldset';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { InputMaskModule } from 'primeng/inputmask';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { KeyFilterModule } from 'primeng/keyfilter';\r\nimport { KnobModule } from 'primeng/knob';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { OrganizationChartModule } from 'primeng/organizationchart';\r\nimport { OverlayBadgeModule } from 'primeng/overlaybadge';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { PickListModule } from 'primeng/picklist';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { RatingModule } from 'primeng/rating';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { ScrollerModule } from 'primeng/scroller';\r\nimport { ScrollPanelModule } from 'primeng/scrollpanel';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { SelectButtonModule } from 'primeng/selectbutton';\r\nimport { SliderModule } from 'primeng/slider';\r\nimport { SpeedDialModule } from 'primeng/speeddial';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { StepperModule } from 'primeng/stepper';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TextareaModule } from 'primeng/textarea';\r\nimport { TimelineModule } from 'primeng/timeline';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { TreeModule } from 'primeng/tree';\r\nimport { TreeTableModule } from 'primeng/treetable';\r\n\r\nconst PRIME_NG_MODULES = [\r\n AccordionModule,\r\n AutoCompleteModule,\r\n AutoFocusModule,\r\n AvatarGroupModule,\r\n AvatarModule,\r\n BadgeModule,\r\n ButtonModule,\r\n CardModule,\r\n CheckboxModule,\r\n ContextMenuModule,\r\n DataViewModule,\r\n DatePickerModule,\r\n DialogModule,\r\n DividerModule,\r\n DrawerModule,\r\n FieldsetModule,\r\n FileUploadModule,\r\n FloatLabelModule,\r\n IconFieldModule,\r\n ImageModule,\r\n InputIconModule,\r\n InputMaskModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n KeyFilterModule,\r\n KnobModule,\r\n MenubarModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n OrganizationChartModule,\r\n OverlayBadgeModule,\r\n PanelMenuModule,\r\n PasswordModule,\r\n PickListModule,\r\n PopoverModule,\r\n RadioButtonModule,\r\n RatingModule,\r\n RippleModule,\r\n ScrollerModule,\r\n ScrollPanelModule,\r\n SelectButtonModule,\r\n SelectModule,\r\n SliderModule,\r\n SpeedDialModule,\r\n SplitButtonModule,\r\n StepperModule,\r\n TableModule,\r\n TabsModule,\r\n TagModule,\r\n TextareaModule,\r\n TimelineModule,\r\n ToastModule,\r\n ToggleButtonModule,\r\n TooltipModule,\r\n TreeModule,\r\n TreeTableModule,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [...PRIME_NG_MODULES],\r\n providers: [],\r\n})\r\nexport class PrimeNgModule {}\r\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Pipe `joinByPipe`\n *\n * Une los valores de una propiedad de un arreglo de objetos en una sola cadena\n * separado por el `separator` proporcionado.\n *\n * Uso (template):\n * - `items | joinByPipe:'name'` => une la propiedad `name` con `, ` como separador\n * - `items | joinByPipe:'name':'; '` => usa `; ` como separador\n *\n * Ejemplo:\n * const items = [{ name: 'Ana' }, { name: 'Luis' }, { other: 'x' }];\n * // Resultado: 'Ana, Luis'\n *\n * Comportamiento:\n * - Si el arreglo es nulo, indefinido o vacío devuelve `''`.\n * - Si la propiedad no existe en el primer elemento devuelve `''` y registra\n * una advertencia en la consola.\n * - Convierte cada valor a `string`, filtra valores vacíos y los concatena.\n */\n@Pipe({\n name: 'joinBy',\n standalone: true,\n})\nexport class JoinByPipe implements PipeTransform {\n /**\n * Transforma un arreglo de objetos en una cadena unida por `separator` usando\n * la propiedad indicada.\n *\n * @param array - Arreglo de objetos o `null`/`undefined`.\n * @param property - Clave del objeto cuyos valores se van a unir.\n * @param separator - Cadena que separará los valores (por defecto `', '`).\n * @returns Una cadena con los valores unidos o `''` si no hay datos válidos.\n */\n transform<T extends Record<string, any>>(\n array: T[] | null | undefined,\n property: keyof T,\n separator: string = ', ',\n ): string {\n // Si el arreglo está vacío o es nulo/indefinido retornamos cadena vacía\n if (!array?.length) return '';\n\n // Validar que la propiedad exista al menos en el primer elemento\n if (!(property in array[0])) {\n console.warn(\n `JoinByPipe: La propiedad \"${String(property)}\" no existe en el objeto.`,\n );\n return '';\n }\n\n // Convertir valores a string, eliminar vacíos y unir con el separador\n return array\n .map((item) => String(item[property] ?? ''))\n .filter((value) => value.length > 0)\n .join(separator);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate',\r\n standalone: true,\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n /**\r\n * Transforma una cadena de texto truncándola según los parámetros proporcionados.\r\n *\r\n * @param value - La cadena de texto que se desea truncar.\r\n * @param limit - El número máximo de caracteres permitidos. Por defecto es 100. Si no se encuentra un espacio dentro del límite, usa el límite original (15).\r\n * @param completeWords - Si es true, evita cortar palabras a la mitad. Por defecto es false.\r\n * @param ellipsis - La cadena que se añadirá al final del texto truncado. Por defecto es '...'.\r\n * @returns La cadena truncada con el ellipsis añadido, si es necesario.\r\n */\r\n transform(\r\n value: string,\r\n limit: number = 20,\r\n completeWords: boolean = false,\r\n ellipsis: string = '...'\r\n ): string {\r\n // Si el valor es nulo o indefinido, devuelve una cadena vacía para evitar errores.\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n // Si completeWords es true, ajusta el límite para no cortar palabras.\r\n if (completeWords) {\r\n // Encuentra el último espacio dentro del límite para evitar cortar palabras.\r\n limit = value.slice(0, limit).lastIndexOf(' ');\r\n\r\n // Si no se encuentra un espacio dentro del límite, usa el límite original.\r\n if (limit < 0) {\r\n limit = 15; // Valor por defecto si no hay espacios.\r\n }\r\n }\r\n\r\n // Trunca el texto y añade el ellipsis si la longitud del texto supera el límite.\r\n return value.length > limit ? value.slice(0, limit) + ellipsis : value;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport {\r\n ServiceResult,\r\n ServiceResultVoid,\r\n} from '../../models/src/response-http.model';\r\n\r\n/**\r\n * Servicio genérico para consumir endpoints REST de la API.\r\n *\r\n * @typeParam T Tipo base de la entidad. Puede sobrescribirse por método.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EndpointService<T> {\r\n /** Cliente HTTP de Angular utilizado para realizar las peticiones. */\r\n private http = inject(HttpClient);\r\n\r\n /** Configuración de entorno que contiene la URL base de la API. */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /**\r\n * Construye la URL completa del endpoint a partir de la configuración de entorno.\r\n *\r\n * @param endpoint Segmento del endpoint (por ejemplo: 'usuarios', 'facturas').\r\n * @returns URL absoluta del endpoint.\r\n */\r\n private getUrl(endpoint: string): string {\r\n return `${this.environment.myAppUrl}api/${endpoint}`;\r\n }\r\n\r\n /**\r\n * Obtiene un listado de recursos del endpoint especificado.\r\n *\r\n * @typeParam TList Tipo de cada elemento del listado (por defecto `T`).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param invalidateCache Indica si se invalida la caché del lado del servidor.\r\n * @returns Observable con un arreglo de elementos del tipo `TList`.\r\n */\r\n list<TList = T>(\r\n endpoint: string,\r\n invalidateCache: boolean = false,\r\n ): Observable<TList[]> {\r\n return this.http.get<TList[]>(\r\n `${this.getUrl(endpoint)}/listar/${invalidateCache}`,\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene un recurso por su identificador.\r\n *\r\n * @typeParam TEdit Tipo del recurso retornado (por defecto `T`).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param id Identificador del recurso a recuperar.\r\n * @returns Observable con el elemento del tipo `TEdit`.\r\n */\r\n edit<TEdit = T>(endpoint: string, id: number): Observable<TEdit> {\r\n return this.http.get<TEdit>(`${this.getUrl(endpoint)}/get-id/${id}`);\r\n }\r\n\r\n /**\r\n * Crea o actualiza un recurso en el endpoint especificado.\r\n *\r\n * @typeParam TSave Tipo del payload enviado al backend (por defecto `T`).\r\n * @typeParam TResponse Tipo de la entidad en la respuesta (por defecto `T`).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param values Objeto con los datos del recurso a guardar.\r\n * @returns Observable con el resultado del servicio que envuelve `TResponse`.\r\n */\r\n save<TSave = T, TResponse = T>(\r\n endpoint: string,\r\n values: TSave,\r\n ): Observable<ServiceResult<TResponse>> {\r\n return this.http.put<ServiceResult<TResponse>>(\r\n `${this.getUrl(endpoint)}/save`,\r\n values,\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene el listado agrupado de recursos del endpoint especificado.\r\n *\r\n * @typeParam TGroup Tipo del resultado agrupado (flexible por petición).\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param invalidateCache Indica si se invalida la caché del lado del servidor.\r\n * @returns Observable con el resultado tipado como `TGroup`.\r\n */\r\n listGroup<TGroup = T>(\r\n endpoint: string,\r\n invalidateCache: boolean = false,\r\n ): Observable<TGroup> {\r\n return this.http.get<TGroup>(\r\n `${this.getUrl(endpoint)}/listar-grupo/${invalidateCache}`,\r\n );\r\n }\r\n\r\n /**\r\n * Elimina un recurso del endpoint especificado.\r\n *\r\n * @param endpoint Segmento del endpoint (sin la parte de `api/`).\r\n * @param id Identificador del recurso a eliminar (numérico o textual).\r\n * @param softDelete Indica si la eliminación es lógica (por defecto) o física.\r\n * @returns Observable con el modelo de respuesta HTTP genérico.\r\n */\r\n delete(\r\n endpoint: string,\r\n id: number | string,\r\n softDelete: boolean = true,\r\n ): Observable<ServiceResultVoid> {\r\n return this.http.delete<ServiceResultVoid>(\r\n `${this.getUrl(endpoint)}/delete/${id}/${softDelete}`,\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { EndpointService } from './endpoint.service';\r\n\r\n/**\r\n * Clase base para servicios CRUD tipados.\r\n *\r\n * @typeParam TBase Modelo base que representa la entidad principal.\r\n * @typeParam TGroup Tipo del resultado de `listGroup`. Debe pasarse explícitamente;\r\n * si no se usa `listGroup`, omitir o dejar `never`.\r\n * @typeParam TEdit Modelo de respuesta para la operación de edición/consulta por id.\r\n * @typeParam TSave Modelo de entrada para guardar (create/update).\r\n * @typeParam TList Modelo de cada elemento del listado.\r\n * @typeParam TDelete Tipo del identificador usado para eliminar (number o string).\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport abstract class BaseCRUDService<\r\n TBase,\r\n TGroup = never,\r\n TEdit = TBase,\r\n TSave = TBase,\r\n TList = TBase,\r\n TDelete extends string | number = number,\r\n> {\r\n /** Segmento del endpoint (sin prefijo api/). */\r\n protected abstract endpoint: string;\r\n\r\n /** Servicio HTTP base para operaciones REST. */\r\n protected readonly _endpointService = inject(EndpointService);\r\n\r\n /**\r\n * Obtiene el listado de registros.\r\n * @param invalidateCache Si es true, solicita invalidar caché en backend.\r\n */\r\n list(invalidateCache: boolean = false) {\r\n return this._endpointService.list<TList>(this.endpoint, invalidateCache);\r\n }\r\n\r\n /**\r\n * Obtiene un registro por id para edición.\r\n * @param id Identificador numérico del registro.\r\n */\r\n edit(id: number) {\r\n return this._endpointService.edit<TEdit>(this.endpoint, id);\r\n }\r\n\r\n /**\r\n * Guarda un registro (creación o actualización).\r\n * @param values Payload tipado para persistir.\r\n */\r\n save(values: TSave) {\r\n return this._endpointService.save<TSave, TBase>(this.endpoint, values);\r\n }\r\n\r\n /**\r\n * Elimina un registro por identificador.\r\n * @param value Identificador del registro a eliminar.\r\n * @param softDelete Si es true, realiza eliminación lógica.\r\n */\r\n delete(value: TDelete, softDelete: boolean = true) {\r\n return this._endpointService.delete(this.endpoint, value, softDelete);\r\n }\r\n\r\n /**\r\n * Obtiene el listado agrupado. El tipo de retorno se define en el genérico\r\n * `TGroup` de la clase al extender `BaseCRUDService`.\r\n * @param invalidateCache Si es true, solicita invalidar caché en backend.\r\n */\r\n listGroup(invalidateCache: boolean = false) {\r\n return this._endpointService.listGroup<TGroup>(\r\n this.endpoint,\r\n invalidateCache,\r\n );\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CACHE_KEYS } from '../../injections/cache.token';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { InferCacheOptions } from '../../models/src/cache.types';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\n/**\r\n * Servicio genérico para el manejo de caché reactivo basado en claves definidas por el consumidor.\r\n *\r\n * Este servicio utiliza señales (`signal`) para almacenar el estado de invalidación de caché\r\n * y permite marcar ciertas entradas como inválidas mediante una llamada a `invalidate`.\r\n *\r\n * ---\r\n * ## Uso básico\r\n * Si no se especifica el tipo genérico `T`, el servicio funcionará con un mapa genérico\r\n * `Record<string, string>` sin autocompletado.\r\n *\r\n * ```ts\r\n * const cacheService = inject(CacheService);\r\n * cacheService.invalidate(['cualquierClave']);\r\n * ```\r\n *\r\n * ---\r\n * ## Uso tipado (recomendado)\r\n * 1. Definir las claves de caché en el proyecto consumidor:\r\n * ```ts\r\n * export const INITIAL_CACHE_KEYS = {\r\n * cliente: 'invalidateCacheCliente',\r\n * empresa: 'invalidateCacheEmpresa'\r\n * } as const;\r\n *\r\n * export type ValueCacheKeys = typeof INITIAL_CACHE_KEYS;\r\n * ```\r\n *\r\n * 2. Proveer estas claves en `AppModule` o un módulo raíz:\r\n * ```ts\r\n * providers: [\r\n * { provide: CACHE_KEYS, useValue: INITIAL_CACHE_KEYS }\r\n * ]\r\n * ```\r\n *\r\n * 3. Inyectar el servicio especificando el tipo:\r\n * ```ts\r\n * const cacheService = inject<CacheService<ValueCacheKeys>>(CacheService);\r\n *\r\n * cacheService.options.invalidateCacheCliente; // ✅ boolean con autocompletado\r\n * cacheService.invalidate(['cliente']); // marca como invalidado\r\n * ```\r\n *\r\n * @typeParam T - Objeto con claves simbólicas (`keyof T`) como `cliente`, `empresa`,\r\n * y valores string literales usados como claves reales de caché.\r\n * Por defecto: `Record<string, string>`.\r\n */\r\nexport class CacheService<\r\n T extends Record<string, string> = Record<string, string>,\r\n> {\r\n /**\r\n * Mapa de claves simbólicas a claves reales de caché.\r\n * Se inyecta desde el proyecto consumidor mediante `CACHE_KEYS`.\r\n */\r\n private keys = inject(CACHE_KEYS) as T;\r\n\r\n /**\r\n * Servicio de alerta utilizado para mostrar notificaciones al usuario.\r\n */\r\n private alert = inject(AlertaService);\r\n\r\n /**\r\n * Configuración global de entorno para controlar comportamiento de mensajes.\r\n */\r\n private readonly environment = inject(ENVIRONMENT, {\r\n optional: true,\r\n }) as EnvironmentConfig | null;\r\n\r\n /**\r\n * Estado reactivo que contiene un objeto donde cada propiedad (clave real de caché)\r\n * tiene un valor booleano que indica si el caché ha sido invalidado (`true`)\r\n * o sigue siendo válido (`false`).\r\n *\r\n * Este estado es tipado automáticamente en función de los valores de `T`.\r\n */\r\n private _options = signal<InferCacheOptions<T>>(\r\n Object.fromEntries(\r\n Object.values(this.keys).map((k) => [k, false]),\r\n ) as InferCacheOptions<T>,\r\n );\r\n\r\n /**\r\n * Obtiene el estado actual del caché.\r\n * Cada propiedad representa una clave real de caché con su valor booleano.\r\n */\r\n get options(): InferCacheOptions<T> {\r\n return this._options();\r\n }\r\n\r\n /**\r\n * Invalida una o más claves simbólicas, marcando su correspondiente\r\n * propiedad de caché como `true` (invalidada).\r\n *\r\n * @param keysToInvalidate - Lista de claves simbólicas (`keyof T`) a invalidar.\r\n * @param showUpdatedCacheMessage - Sobrescribe el comportamiento global de\r\n * visualización del toast para esta llamada puntual. Tiene prioridad sobre\r\n * `environment.showUpdatedCacheMessage`.\r\n *\r\n * @example\r\n * ```ts\r\n * cacheService.invalidate(['cliente', 'empresa']);\r\n * cacheService.invalidate(['cliente'], true); // fuerza mostrar mensaje\r\n * ```\r\n */\r\n invalidate(\r\n keysToInvalidate: (keyof T)[] | null = null,\r\n showUpdatedCacheMessage?: boolean,\r\n ): void {\r\n if (!keysToInvalidate?.length) return;\r\n\r\n const current: InferCacheOptions<T> = { ...this._options() };\r\n\r\n keysToInvalidate.forEach((key) => {\r\n const prop = this.keys[key] as keyof InferCacheOptions<T>;\r\n current[prop] = true as InferCacheOptions<T>[typeof prop];\r\n });\r\n\r\n this._options.set(current);\r\n\r\n const shouldShowMessage =\r\n showUpdatedCacheMessage ??\r\n this.environment?.showUpdatedCacheMessage ??\r\n false;\r\n\r\n if (shouldShowMessage) {\r\n this.alert.toastrAlerts(\r\n 2,\r\n 'Estado',\r\n 'Datos actualizados (cache).',\r\n 2,\r\n 1000,\r\n );\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { CacheService } from './cache.service';\r\n\r\nexport function createTypedCacheProvider<T extends Record<string, string>>(\r\n tokenName: string\r\n): { token: InjectionToken<CacheService<T>>; provider: Provider } {\r\n const token = new InjectionToken<CacheService<T>>(tokenName);\r\n\r\n const provider: Provider = {\r\n provide: token,\r\n useFactory: () => new CacheService<T>(),\r\n deps: [],\r\n };\r\n\r\n return { token, provider };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DteService {\r\n /** Servicio HttpClient para realizar peticiones HTTP */\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Configuración del entorno inyectada mediante el token ENVIRONMENT.\r\n * La validación se realiza automáticamente al usar provideEnvironment().\r\n */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /** URL base de la API JWT construida desde la configuración del entorno */\r\n private SeguridadITApi: string = `${this.environment.SeguridadITApiUrl}api/dte`;\r\n\r\n pdfDTE(UUID: string): Observable<Blob> {\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.get<Blob>(`${this.SeguridadITApi}/pdf-dte/${UUID}`, {\r\n responseType: 'blob' as 'json',\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ArrayHelpersService {\r\n // ==========================================\r\n // 1. SECCIÓN: VALIDACIONES (GUARDS / CHECKS)\r\n // ==========================================\r\n\r\n isArrayOf<T>(data: any, keyOfT: keyof T): data is T[] {\r\n if (!Array.isArray(data)) return false;\r\n if (data.length === 0) return true;\r\n\r\n // Accedemos explícitamente al primer elemento para validar la propiedad\r\n const existePropiedad = keyOfT in data[0];\r\n\r\n if (!existePropiedad) {\r\n // Genera una ventana emergente bloqueante en el navegador\r\n alert(\r\n `[TypeGuard Error]: La propiedad '${String(keyOfT)}' no existe en la clase/objeto recibido.`,\r\n );\r\n\r\n // Opcional: También lanzamos un error en consola para ver el objeto dañado\r\n console.error('Objeto recibido con estructura incorrecta:', data[0]);\r\n }\r\n\r\n return existePropiedad;\r\n }\r\n}\r\n","import {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n HttpResponse,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n BlobRequestOptions,\r\n FileData,\r\n HttpParamValue,\r\n} from '../../../models/src/file-data.model';\r\nimport { catchError, from, Observable, of, switchMap } from 'rxjs';\r\nimport { ServiceResult } from '../../../models';\r\nimport { AlertaService } from '../alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ResultFileService {\r\n private readonly http = inject(HttpClient);\r\n private readonly _alertaService = inject(AlertaService);\r\n\r\n /**\r\n * Contrato esperado del backend para endpoints de descarga:\r\n * 1) Respuesta binaria directa (Content-Type del archivo), opcionalmente con\r\n * Content-Disposition para el nombre y headers x-title/x-message.\r\n * 2) Respuesta JSON serializada dentro de Blob (type application/json)\r\n * con estructura ServiceResult<FileContentResult>, donde data puede incluir:\r\n * FileContents|fileContents, FileDownloadName|fileDownloadName,\r\n * ContentType|contentType, title y message.\r\n *\r\n * Si el backend no cumple alguno de estos formatos, la conversión puede fallar\r\n * y el cliente recibirá data: null con isSuccess: false.\r\n */\r\n\r\n /**\r\n * Procesa un ServiceResult<FileData> para visualizar o descargar.\r\n */\r\n processFileResult(\r\n result: ServiceResult<FileData>,\r\n visualizar: boolean = false,\r\n ): void {\r\n if (!result.isSuccess || !result.data?.blob) {\r\n this._alertaService.alertaHtmlSuccess(result.title, result.message, {\r\n icon: 'question',\r\n icono: '',\r\n showConfirmButton: true,\r\n });\r\n return;\r\n }\r\n\r\n const { blob, fileName } = result.data;\r\n\r\n if (visualizar) {\r\n this.PdfView(blob);\r\n return;\r\n }\r\n\r\n this.descargarBlob(blob, fileName);\r\n }\r\n\r\n /**\r\n * Realiza un GET para descarga y normaliza la respuesta a ServiceResult<FileData>.\r\n *\r\n * Nota de integración backend:\r\n * - Para nombre de archivo en binario directo, enviar Content-Disposition.\r\n * - Para mensajes de éxito, enviar x-title/x-message o title/message en JSON.\r\n * - Si se envía JSON serializado, incluir los campos de FileContentResult.\r\n */\r\n getDownloadableFile(\r\n url: string,\r\n options: BlobRequestOptions = {},\r\n ): Observable<ServiceResult<FileData>> {\r\n return this.http\r\n .get(url, {\r\n responseType: 'blob' as const,\r\n observe: 'response' as const,\r\n params: this.toHttpParams(options.params),\r\n headers: options.headers,\r\n withCredentials: options.withCredentials,\r\n })\r\n .pipe(\r\n switchMap((response: HttpResponse<Blob>) =>\r\n from(this.mapResponseToServiceResult(response)),\r\n ),\r\n catchError((error) =>\r\n of({\r\n data: null,\r\n isSuccess: false,\r\n title: error?.title || 'Error de Servidor',\r\n message:\r\n error?.message ||\r\n 'No se pudo obtener el archivo desde el servidor.',\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n PdfView(blob: Blob): void {\r\n const pdfUrl = URL.createObjectURL(blob);\r\n window.open(pdfUrl, '_blank');\r\n\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(pdfUrl);\r\n }, 100);\r\n }\r\n\r\n descargarBlob(\r\n blob: Blob | null | undefined,\r\n fileName: string | null | undefined,\r\n ): void {\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n const fileUrl = URL.createObjectURL(blob);\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = (fileName || 'archivo_descargado').trim();\r\n downloadLink.click();\r\n\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n private async mapResponseToServiceResult(\r\n response: HttpResponse<Blob>,\r\n ): Promise<ServiceResult<FileData>> {\r\n const fileBlob = response.body;\r\n\r\n if (!fileBlob) {\r\n return {\r\n data: null,\r\n isSuccess: false,\r\n title: 'Error de Servidor',\r\n message: 'La respuesta no contiene un archivo válido.',\r\n };\r\n }\r\n\r\n const serializedResult = await this.tryParseServiceResultBlob(fileBlob);\r\n if (serializedResult) {\r\n return this.mapSerializedResultToFileData(serializedResult, response);\r\n }\r\n\r\n const headerFileName = this.getFileNameFromContentDisposition(\r\n response.headers,\r\n );\r\n const headerTitle = this.getHeaderValue(response.headers, [\r\n 'x-title',\r\n 'x-service-title',\r\n 'title',\r\n ]);\r\n const headerMessage = this.getHeaderValue(response.headers, [\r\n 'x-message',\r\n 'x-service-message',\r\n 'message',\r\n ]);\r\n\r\n return {\r\n data: {\r\n blob: fileBlob,\r\n fileName: headerFileName || 'document',\r\n },\r\n isSuccess: true,\r\n title: headerTitle || '',\r\n message: headerMessage || '',\r\n };\r\n }\r\n\r\n private async tryParseServiceResultBlob(blob: Blob): Promise<any | null> {\r\n // Solo intentamos parsear cuando el servidor marca explícitamente JSON.\r\n if (!blob.type.toLowerCase().includes('json')) {\r\n return null;\r\n }\r\n\r\n try {\r\n const text = await blob.text();\r\n const parsed = JSON.parse(text);\r\n return parsed && typeof parsed === 'object' && 'isSuccess' in parsed\r\n ? parsed\r\n : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private mapSerializedResultToFileData(\r\n serializedResult: any,\r\n response: HttpResponse<Blob>,\r\n ): ServiceResult<FileData> {\r\n // Soporta variantes de nombres en PascalCase/camelCase según backend.\r\n if (!serializedResult.isSuccess) {\r\n return {\r\n data: null,\r\n isSuccess: false,\r\n title: serializedResult.title || 'Error de Servidor',\r\n message:\r\n serializedResult.message ||\r\n 'No se pudo obtener el archivo desde el servidor.',\r\n };\r\n }\r\n\r\n const payload = serializedResult.data || {};\r\n const fileName =\r\n payload.fileDownloadName ||\r\n payload.FileDownloadName ||\r\n payload.fileName ||\r\n payload.FileName ||\r\n this.getFileNameFromContentDisposition(response.headers) ||\r\n 'document';\r\n\r\n const contentType =\r\n payload.contentType || payload.ContentType || 'application/octet-stream';\r\n const content = payload.fileContents || payload.FileContents;\r\n const blob =\r\n this.toBlob(content, contentType) || response.body || new Blob();\r\n\r\n return {\r\n data: {\r\n blob,\r\n fileName,\r\n },\r\n isSuccess: true,\r\n title: serializedResult.title || '',\r\n message: serializedResult.message || '',\r\n };\r\n }\r\n\r\n private toBlob(content: unknown, contentType: string): Blob | null {\r\n if (!content) {\r\n return null;\r\n }\r\n\r\n if (typeof content === 'string') {\r\n const binary = atob(content);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let index = 0; index < binary.length; index++) {\r\n bytes[index] = binary.charCodeAt(index);\r\n }\r\n return new Blob([bytes], { type: contentType });\r\n }\r\n\r\n if (Array.isArray(content)) {\r\n return new Blob([new Uint8Array(content)], { type: contentType });\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // ----------------------------------------------------------\r\n // METODOS PRIVADOS PARA CONVERTIR PARAMETROS A HTTPPARAMS\r\n // ----------------------------------------------------------\r\n private getFileNameFromContentDisposition(\r\n headers: HttpHeaders,\r\n ): string | null {\r\n const contentDisposition = headers.get('content-disposition');\r\n\r\n if (!contentDisposition) return null;\r\n\r\n const matches = /filename\\*?[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i.exec(\r\n contentDisposition,\r\n );\r\n\r\n if (!matches || !matches[1]) return null;\r\n\r\n let fileName = matches[1].replace(/['\"]/g, '').trim();\r\n\r\n if (fileName.toLowerCase().includes(\"utf-8''\")) {\r\n fileName = decodeURIComponent(fileName.split(\"''\")[1] || '');\r\n }\r\n\r\n return fileName;\r\n }\r\n\r\n private getHeaderValue(\r\n headers: HttpHeaders,\r\n headerNames: string[],\r\n ): string | null {\r\n for (const headerName of headerNames) {\r\n const value = headers.get(headerName);\r\n if (value && value.trim()) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private toHttpParams(\r\n params?: BlobRequestOptions['params'],\r\n ): HttpParams | undefined {\r\n if (!params) {\r\n return undefined;\r\n }\r\n\r\n if (params instanceof HttpParams) {\r\n return params;\r\n }\r\n\r\n let httpParams = new HttpParams();\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value === null || value === undefined) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (const item of value) {\r\n if (item === null || item === undefined) {\r\n continue;\r\n }\r\n httpParams = httpParams.append(key, this.normalizeParamValue(item));\r\n }\r\n continue;\r\n }\r\n\r\n httpParams = httpParams.set(key, this.normalizeParamValue(value));\r\n }\r\n\r\n return httpParams;\r\n }\r\n\r\n private normalizeParamValue(\r\n value: Exclude<HttpParamValue, null | undefined>,\r\n ): string {\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport {\r\n ENVIRONMENT,\r\n SWEET_ALERT_THEMES,\r\n} from '../../../injections/environment.token';\r\nimport { ActionMessageConfig } from '../../../models/src/action-message.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n cancelButtonText?: string;\r\n confirmButtonText?: string;\r\n icon?: SweetAlertIcon;\r\n icono?: string;\r\n imageHeight?: number;\r\n imageWidth?: number;\r\n showCancelButton?: boolean;\r\n showCloseButton?: boolean;\r\n showConfirmButton?: boolean;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n timer?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SweetAlert2DialogService {\r\n /**\r\n * Configuración del entorno inyectada (opcional).\r\n * Se usa para obtener el tema global de SweetAlert2 desde el environment.\r\n */\r\n private environment = inject(ENVIRONMENT, { optional: true });\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Se inicializa desde el environment si está configurado, o puede establecerse\r\n * manualmente llamando a setDefaultTheme().\r\n *\r\n * **Prioridad de temas:**\r\n * 1. Tema específico pasado en options de cada alerta\r\n * 2. Tema establecido con setDefaultTheme()\r\n * 3. Tema configurado en environment.sweetAlertTheme\r\n * 4. Tema por defecto de SweetAlert2\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n constructor() {\r\n // Inicializar el tema desde el environment si está disponible\r\n if (this.environment?.sweetAlertTheme) {\r\n const allowed = SWEET_ALERT_THEMES as readonly string[];\r\n const themeValue = this.environment.sweetAlertTheme;\r\n if (typeof themeValue === 'string' && !allowed.includes(themeValue)) {\r\n console.warn(\r\n `[SweetAlert2DialogService] Tema de SweetAlert2 inválido: '${themeValue}'. Se utilizará el tema por defecto.`,\r\n );\r\n } else {\r\n this.defaultTheme = themeValue as SweetAlertTheme;\r\n }\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n /**\r\n * Muestra un diálogo de confirmación con SweetAlert2.\r\n * Puedes usar un icono SweetAlert2 (ico) o una imagen personalizada (icono), pero no ambos.\r\n *\r\n * @param title - Título principal del diálogo.\r\n * @param text - Cuerpo del mensaje; admite HTML (se inyecta como `html`).\r\n * @param ico - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional, exclusivo con icono.\r\n * @param icono - Ruta relativa de la imagen dentro de `assets/dsxResource/`. Opcional, exclusivo con ico.\r\n * @param options - Opciones adicionales de configuración.\r\n * @returns `Promise<boolean>` que resuelve en `true` si el usuario pulsó **Aceptar**,\r\n * o en `false` si pulsó **Cancelar** o cerró el diálogo.\r\n *\r\n * @example\r\n * // Con icono SweetAlert2\r\n * await this.sweetDialogService.SweetDialog('Título', 'Mensaje', 'success', null, { confirmButtonText: 'OK' });\r\n *\r\n * @example\r\n * // Con imagen personalizada\r\n * await this.sweetDialogService.SweetDialog('Título', 'Mensaje', null, 'icon2/mi-imagen.png', { confirmButtonText: 'OK' });\r\n */\r\n // 1. Nueva Sobrecarga: Acepta el objeto de configuración completo directamente\r\n Dialog(config: ActionMessageConfig): Promise<boolean>;\r\n\r\n // 2. Sobrecarga existente: Solo título y texto\r\n Dialog(title: string, text: string): Promise<boolean>;\r\n\r\n // 3. Sobrecarga existente: Con icono nativo\r\n Dialog(\r\n title: string,\r\n text: string,\r\n icoOrIcono: SweetAlertIcon | null | undefined,\r\n options?: AlertOptions,\r\n ): Promise<boolean>;\r\n\r\n // 4. Sobrecarga existente: Con ruta de imagen\r\n Dialog(\r\n title: string,\r\n text: string,\r\n icoOrIcono: string | null | undefined,\r\n options?: AlertOptions,\r\n ): Promise<boolean>;\r\n\r\n // 4. Implementación real del método\r\n // 5. Implementación unificada final\r\n Dialog(\r\n firstParam: string | ActionMessageConfig,\r\n text?: string,\r\n icoOrIcono?: SweetAlertIcon | string | null,\r\n options: AlertOptions = {},\r\n ): Promise<boolean> {\r\n let title = '';\r\n let finalOptions = { ...options };\r\n let finalIcoOrIcono = icoOrIcono;\r\n\r\n // DETECTAR SI EL PRIMER PARÁMETRO ES EL OBJETO COMPLETO\r\n if (typeof firstParam === 'object' && firstParam !== null) {\r\n const {\r\n title: cTitle,\r\n message: cMessage,\r\n icon,\r\n icono,\r\n ...cOptions\r\n } = firstParam;\r\n\r\n title = cTitle;\r\n text = cMessage;\r\n finalIcoOrIcono = icon || icono || '';\r\n finalOptions = { ...cOptions };\r\n } else {\r\n title = firstParam;\r\n }\r\n\r\n // A partir de aquí, tu lógica interna se mantiene exactamente igual usando las variables normalizadas\r\n let ico: SweetAlertIcon | null = null;\r\n let iconoImg: string | null = null;\r\n\r\n if (finalIcoOrIcono) {\r\n const nativeIcons: string[] = [\r\n 'success',\r\n 'error',\r\n 'warning',\r\n 'info',\r\n 'question',\r\n ];\r\n if (nativeIcons.includes(finalIcoOrIcono)) {\r\n ico = finalIcoOrIcono as SweetAlertIcon;\r\n } else {\r\n iconoImg = finalIcoOrIcono;\r\n }\r\n }\r\n\r\n // Configuración por defecto de botones y estilos\r\n const {\r\n confirmButtonText = `Aceptar!`,\r\n cancelButtonText = `Cancelar`,\r\n showCloseButton = true,\r\n showCancelButton = true,\r\n imageWidth = 150,\r\n imageHeight = 150,\r\n theme,\r\n ...rest\r\n } = finalOptions;\r\n\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n const year = new Date().getFullYear();\r\n const baseFooter = this.environment?.sweetAlertFooter ?? 'DEVSOFTXela';\r\n const footer = `${baseFooter} <strong>${year}</strong>`;\r\n const alertConfig: SweetAlertOptions = {\r\n title,\r\n html: text,\r\n footer,\r\n showCloseButton,\r\n showCancelButton,\r\n confirmButtonText,\r\n cancelButtonText,\r\n //reverseButtons: true,\r\n ...(alertTheme !== undefined && { theme: alertTheme as SweetAlertTheme }),\r\n ...rest,\r\n };\r\n\r\n if (iconoImg) {\r\n alertConfig.imageUrl = `/${iconoImg}`;\r\n alertConfig.imageWidth = imageWidth;\r\n alertConfig.imageHeight = imageHeight;\r\n alertConfig.imageAlt = 'icon';\r\n return this.preloadImage(iconoImg).then(() =>\r\n Swal.fire(alertConfig).then((result) => result.isConfirmed),\r\n );\r\n } else if (ico) {\r\n alertConfig.icon = ico;\r\n return Swal.fire(alertConfig).then((result) => result.isConfirmed);\r\n }\r\n\r\n return Swal.fire(alertConfig).then((result) => result.isConfirmed);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { showToast } from 'nextjs-toast-notify';\r\n\r\n// CORRECCIÓN: Importación directa desde la raíz del paquete o su dist\r\nimport type { ToastOptions as NextToastOptions } from 'nextjs-toast-notify';\r\n\r\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\r\n\r\nexport interface ToastOptions extends NextToastOptions {\r\n duration?: number;\r\n progress?: boolean;\r\n sound?: boolean;\r\n position?:\r\n | 'top-right'\r\n | 'top-left'\r\n | 'bottom-right'\r\n | 'bottom-left'\r\n | 'top-center'\r\n | 'bottom-center';\r\n // Corregido: cambiamos 'bounceInUp' por 'slideInUp' para cumplir con la librería\r\n transition?:\r\n | 'fadeIn'\r\n | 'bounceIn'\r\n | 'swingInverted'\r\n | 'popUp'\r\n | 'topBounce'\r\n | 'bounceInDown'\r\n | 'slideInUp';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NextToastNotifyService {\r\n // Configuraciones iniciales por defecto (ambos activados como en tus switches)\r\n private defaultOptions: ToastOptions = {\r\n duration: 1500,\r\n progress: true,\r\n sound: true,\r\n position: 'top-right',\r\n transition: 'bounceIn',\r\n };\r\n\r\n show(type: ToastType, message: string, customOptions?: ToastOptions): void {\r\n const opciones = { ...this.defaultOptions, ...customOptions };\r\n\r\n if (showToast[type]) {\r\n showToast[type](message, opciones);\r\n } else {\r\n showToast.info(message, opciones);\r\n }\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ServiceResult, ServiceResultVoid } from '../../../models';\r\nimport { SweetAlert2DialogService } from '../messages/sweet-alert2-dialog.service';\r\nimport { NextToastNotifyService } from '../helpers/next-toast-notify.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ResultResponseService {\r\n private readonly _nextToastNotifyService = inject(NextToastNotifyService);\r\n private readonly _sweetAlert2DialogService = inject(SweetAlert2DialogService);\r\n\r\n /* Metodo para manejar la respuesta de un servicio y mostrar notificaciones o alertas según el resultado */\r\n public handleResponseService<T>(\r\n response: ServiceResult<T> | ServiceResultVoid,\r\n ): boolean {\r\n try {\r\n // Evaluar el resultado\r\n if (response.isSuccess) {\r\n // Mostrar la notificación de éxito utilizando NextToastNotifyService\r\n this._nextToastNotifyService.show('info', response.message);\r\n return true;\r\n } else {\r\n const guideHtml = this.buildAssociatedGuideHtml(\r\n (response as any)?.data,\r\n );\r\n const mainMessage = this.formatPrimaryAlertMessage(response.message);\r\n\r\n this._sweetAlert2DialogService.Dialog(\r\n response.title,\r\n `${mainMessage}${guideHtml}`, // Se concatena limpiamente sin alterar la lógica\r\n 'icon/sign.png',\r\n {\r\n showCancelButton: false,\r\n showConfirmButton: true,\r\n },\r\n );\r\n return false;\r\n }\r\n } catch (error) {\r\n // Mostrar la notificación de error no controlado\r\n this._nextToastNotifyService.show(\r\n 'error',\r\n error instanceof Error ? error.message : String(error),\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n private buildAssociatedGuideHtml(data: unknown): string {\r\n if (!Array.isArray(data) || data.length === 0) {\r\n return '';\r\n }\r\n\r\n const itemsHtml = data\r\n .map((item: any) => {\r\n const cantidadRegistros = String(item?.cantidadRegistros ?? '0');\r\n const vista = String(item?.vista ?? 'No disponible');\r\n\r\n return (\r\n `<li style=\"display: list-item; margin: 0.35rem 0;\">` +\r\n `<div><strong>Ingrese a:</strong> ${vista}</div>` +\r\n `<div><strong>Registros asociados:</strong> ${cantidadRegistros}</div>` +\r\n `</li>`\r\n );\r\n })\r\n .join('');\r\n\r\n return (\r\n `<div style=\"margin-top: 0.65rem;\">` +\r\n `<div style=\"margin-bottom: 0.55rem;\">Sugerencia(s):</div>` +\r\n `<ol style=\"text-align: left; display: inline-block; margin: 0; padding-left: 1.4rem; font-size: 1rem; line-height: 1.35; list-style-type: decimal !important; list-style-position: outside;\">${itemsHtml}</ol>` +\r\n `</div>`\r\n );\r\n }\r\n\r\n private formatPrimaryAlertMessage(message: string): string {\r\n return `<div style=\"font-family: 'Oswald', sans-serif; font-weight: normal; font-style: italic; margin-bottom: 0.3rem;\">${message}</div>`;\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ArrayHelpersService } from './helpers/array-helpers.service';\r\nimport { ResultFileService } from './helpers/result-file.service';\r\nimport { ResultResponseService } from './response-html/result-response.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HelpersService {\r\n public readonly Array = inject(ArrayHelpersService);\r\n public readonly ServiceResultFile = inject(ResultFileService);\r\n public readonly ServiceResultResponse = inject(ResultResponseService);\r\n}\r\n","export function containsFile(obj: any): boolean {\r\n for (const key in obj) {\r\n const value = obj[key];\r\n\r\n if (value instanceof File || value instanceof Blob) {\r\n return true;\r\n }\r\n\r\n if (value instanceof FileList) {\r\n return true;\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n if (containsFile(value)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Convierte un objeto plano a una instancia de FormData compatible con ASP.NET Core [FromForm].\r\n * Desglosa automáticamente arreglos primitivos, archivos sueltos y FileLists.\r\n */\r\nexport function toFormData(obj: Record<string, unknown>): FormData {\r\n const formData = new FormData();\r\n\r\n Object.keys(obj).forEach((key) => {\r\n const value = obj[key];\r\n\r\n // Ignorar valores nulos o indefinidos\r\n if (value === null || value === undefined) {\r\n return;\r\n }\r\n\r\n // CASO 1: Es un Arreglo (int[], string[], File[])\r\n if (Array.isArray(value)) {\r\n value.forEach((item) => {\r\n if (item instanceof File || item instanceof Blob) {\r\n formData.append(key, item);\r\n } else if (item !== null && item !== undefined) {\r\n // Envía múltiples llaves repetidas con el mismo nombre\r\n formData.append(key, String(item));\r\n }\r\n });\r\n }\r\n // CASO 2: Es un FileList (Múltiples archivos desde un input html)\r\n else if (value instanceof FileList) {\r\n for (let i = 0; i < value.length; i++) {\r\n const file = value.item(i);\r\n if (file) formData.append(key, file);\r\n }\r\n }\r\n // CASO 3: Es un único Archivo o Blob\r\n else if (value instanceof File || value instanceof Blob) {\r\n formData.append(key, value);\r\n }\r\n // CASO 4: Tipos primitivos ordinarios (string, number, boolean)\r\n else {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n\r\n return formData;\r\n}\r\n","import {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n HttpResponse,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { toFormData } from '../../utils/src/form-data.util';\r\n\r\ntype HttpParamValue = string | number | boolean | Date | null | undefined;\r\ntype HttpParamsRecord = Record<string, HttpParamValue | HttpParamValue[]>;\r\n\r\ninterface BlobRequestOptions {\r\n params?: HttpParamsRecord | HttpParams;\r\n headers?: HttpHeaders | Record<string, string | string[]>;\r\n withCredentials?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * HttpHelperService\r\n *\r\n * Servicio diseñado para endpoints que usan [FromForm] en ASP.NET Core.\r\n * Siempre convierte el objeto a FormData, independientemente de si contiene\r\n * un archivo o no. Si el campo de tipo File/Blob/FileList es null o undefined,\r\n * simplemente se omite del FormData.\r\n *\r\n * Ejemplo sin archivo:\r\n *\r\n * this.api.post('puesto/guardar', { puestoId: 1, nombre: 'Admin' });\r\n *\r\n * Ejemplo con archivo (el campo puede ser null si no se seleccionó):\r\n *\r\n * this.api.post('puesto/cargar-funciones', {\r\n * puestoId: 1,\r\n * puestoNombre: 'Administrador',\r\n * file: this.file // puede ser null\r\n * });\r\n */\r\nexport class HttpHelpersService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * POST orientado a endpoints `[FromForm]` en backend (ASP.NET Core u otros).\r\n *\r\n * Convierte automáticamente `data` a `FormData`, por lo que permite enviar\r\n * campos simples y archivos (`File`, `Blob`, `FileList`) en una sola llamada.\r\n *\r\n * Casos de uso comunes:\r\n * - Crear/actualizar recursos con adjuntos.\r\n * - Subir archivos junto con metadata (id, nombre, observaciones, etc.).\r\n * - Mantener un único método de POST para formularios multipart.\r\n *\r\n * @typeParam T Tipo de respuesta esperada del backend.\r\n * @param url Endpoint relativo o absoluto.\r\n * @param data Objeto plano que se transformará a `FormData`.\r\n * @returns `Observable<T>` con la respuesta del backend.\r\n *\r\n * @example\r\n * this.httpHelpers.postForm<{ ok: boolean }>('documentos/subir', {\r\n * documentoId: 15,\r\n * descripcion: 'Contrato firmado',\r\n * archivo: this.archivoSeleccionado // File | null\r\n * });\r\n */\r\n postForm<T>(url: string, data: object): Observable<T> {\r\n return this.http.post<T>(url, toFormData(data as Record<string, unknown>));\r\n }\r\n\r\n /**\r\n * PUT orientado a endpoints `[FromForm]` en backend (ASP.NET Core u otros).\r\n *\r\n * Equivalente a `postForm`, pero usando el verbo HTTP PUT para actualizar recursos existentes.\r\n *\r\n * @typeParam T Tipo de respuesta esperada del backend.\r\n * @param url Endpoint relativo o absoluto.\r\n * @param data Objeto plano que se transformará a `FormData`.\r\n * @returns `Observable<T>` con la respuesta del backend.\r\n *\r\n * @example\r\n * this.httpHelpers.putForm<{ ok: boolean }>('documentos/actualizar/15', {\r\n * documentoId: 15,\r\n * descripcion: 'Contrato actualizado',\r\n * archivo: this.archivoSeleccionado // File | null\r\n * });\r\n */\r\n putForm<T>(url: string, data: object): Observable<T> {\r\n return this.http.put<T>(url, toFormData(data as Record<string, unknown>));\r\n }\r\n\r\n /**\r\n * GET para descarga de archivos en formato Blob.\r\n * Útil cuando solo se necesita el contenido del archivo.\r\n */\r\n getBlob(url: string, options: BlobRequestOptions = {}): Observable<Blob> {\r\n return this.http.get(url, {\r\n responseType: 'blob',\r\n params: this.toHttpParams(options.params),\r\n headers: options.headers,\r\n withCredentials: options.withCredentials,\r\n });\r\n }\r\n\r\n /**\r\n * GET para descarga de archivos devolviendo HttpResponse completo.\r\n * Útil para leer headers como `content-disposition` (nombre de archivo) o status.\r\n *\r\n * Consideraciones de backend:\r\n * - Validar `fileName`/id en route params antes de construir la ruta física.\r\n * - Definir query params opcionales (ej. versión, idioma, tenant) y documentarlos.\r\n * - Si se requiere cookie/sesión, habilitar `withCredentials` en frontend y CORS en backend.\r\n */\r\n getBlobResponse(\r\n url: string,\r\n options: BlobRequestOptions = {},\r\n ): Observable<HttpResponse<Blob>> {\r\n return this.http.get(url, {\r\n responseType: 'blob',\r\n observe: 'response',\r\n params: this.toHttpParams(options.params),\r\n headers: options.headers,\r\n withCredentials: options.withCredentials,\r\n });\r\n }\r\n\r\n private toHttpParams(\r\n params?: BlobRequestOptions['params'],\r\n ): HttpParams | undefined {\r\n if (!params) {\r\n return undefined;\r\n }\r\n\r\n if (params instanceof HttpParams) {\r\n return params;\r\n }\r\n\r\n let httpParams = new HttpParams();\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value === null || value === undefined) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (const item of value) {\r\n if (item === null || item === undefined) {\r\n continue;\r\n }\r\n httpParams = httpParams.append(key, this.normalizeParamValue(item));\r\n }\r\n continue;\r\n }\r\n\r\n httpParams = httpParams.set(key, this.normalizeParamValue(value));\r\n }\r\n\r\n return httpParams;\r\n }\r\n\r\n private normalizeParamValue(\r\n value: Exclude<HttpParamValue, null | undefined>,\r\n ): string {\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nfunction pickByKeys<T extends object, K extends keyof T>(\r\n source: T,\r\n keys: readonly K[],\r\n): Pick<T, K> {\r\n const result = {} as Pick<T, K>;\r\n\r\n for (const key of keys) {\r\n result[key] = source[key];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction tryParseDateValue(value: unknown): number | null {\r\n if (value instanceof Date) {\r\n const time = value.getTime();\r\n\r\n return Number.isNaN(time) ? null : time;\r\n }\r\n\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n const parsed = new Date(value);\r\n const time = parsed.getTime();\r\n\r\n return Number.isNaN(time) ? null : time;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeComparableValue(base: unknown, current: unknown): unknown {\r\n const baseDateValue = tryParseDateValue(base);\r\n\r\n if (baseDateValue !== null) {\r\n const currentDateValue = tryParseDateValue(current);\r\n\r\n return currentDateValue ?? current;\r\n }\r\n\r\n return current;\r\n}\r\n\r\nfunction normalizeBaseEntity<TBase extends object>(\r\n baseValue: TBase,\r\n keys?: ReadonlyArray<keyof TBase>,\r\n): Partial<Record<keyof TBase, unknown>> {\r\n const normalized: Partial<Record<keyof TBase, unknown>> = {};\r\n const selectedKeys = keys ?? (Object.keys(baseValue) as Array<keyof TBase>);\r\n\r\n for (const key of selectedKeys) {\r\n const base = (baseValue as Record<string, unknown>)[key as string];\r\n\r\n normalized[key] = normalizeComparableValue(base, base);\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nfunction normalizeRawEntityAgainstBase<TBase extends object>(\r\n baseValue: TBase,\r\n rawValue: MasterDetailRawEntity<TBase>,\r\n keys?: ReadonlyArray<keyof TBase>,\r\n useBaseValueForNullish = true,\r\n): Partial<Record<keyof TBase, unknown>> {\r\n const coerceByBaseType = (base: unknown, current: unknown): unknown => {\r\n if (typeof base === 'number') {\r\n if (typeof current === 'string' && current.trim() !== '') {\r\n const normalizedText = current.trim();\r\n const direct = Number(normalizedText);\r\n\r\n if (!Number.isNaN(direct)) return direct;\r\n\r\n const commaDecimal = Number(normalizedText.replace(',', '.'));\r\n\r\n if (!Number.isNaN(commaDecimal)) return commaDecimal;\r\n\r\n const noSpaces = normalizedText.replace(/\\s+/g, '');\r\n const noThousandsDots = Number(\r\n noSpaces.replace(/\\./g, '').replace(',', '.'),\r\n );\r\n\r\n if (!Number.isNaN(noThousandsDots)) return noThousandsDots;\r\n\r\n return current;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n if (typeof base === 'boolean') {\r\n if (typeof current === 'string') {\r\n const lowered = current.trim().toLowerCase();\r\n\r\n if (lowered === 'true') return true;\r\n if (lowered === 'false') return false;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n if (base instanceof Date) {\r\n if (current instanceof Date) return current;\r\n\r\n if (typeof current === 'string' || typeof current === 'number') {\r\n const parsed = new Date(current);\r\n\r\n return Number.isNaN(parsed.getTime()) ? current : parsed;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n if (typeof base === 'string') {\r\n if (current === null || current === undefined) return current;\r\n\r\n return typeof current === 'string' ? current : String(current);\r\n }\r\n\r\n return current;\r\n };\r\n\r\n const normalized: Partial<Record<keyof TBase, unknown>> = {};\r\n const selectedKeys = keys ?? (Object.keys(baseValue) as Array<keyof TBase>);\r\n\r\n for (const key of selectedKeys) {\r\n const base = (baseValue as Record<string, unknown>)[key as string];\r\n const current = rawValue[key as string];\r\n const isNullish = current === null || current === undefined;\r\n const isEmptyString = typeof current === 'string' && current.trim() === '';\r\n const treatEmptyAsNullish = isEmptyString && typeof base !== 'string';\r\n const shouldUseBase =\r\n useBaseValueForNullish && (isNullish || treatEmptyAsNullish);\r\n\r\n normalized[key] = shouldUseBase ? base : coerceByBaseType(base, current);\r\n\r\n normalized[key] = normalizeComparableValue(base, normalized[key]);\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\n/**\r\n * Estado maestro-detalle usado por el tracker.\r\n */\r\nexport interface MasterDetailState<TMaster, TDetail> {\r\n /** Entidad principal (cabecera o maestro). */\r\n master: TMaster;\r\n /** Coleccion de entidades detalle asociadas al maestro. */\r\n detail: TDetail[];\r\n}\r\n\r\n/**\r\n * Tipo crudo para valores provenientes de formularios.\r\n */\r\nexport type MasterDetailRawEntity<TBase extends object> = Partial<\r\n Record<keyof TBase, unknown>\r\n> &\r\n Record<string, unknown>;\r\n\r\n/**\r\n * Opciones simplificadas para comparar estado base vs valores crudos de formulario.\r\n */\r\nexport interface MasterDetailSimpleFormOptions<\r\n TBaseMaster extends object,\r\n TBaseDetail extends object,\r\n> {\r\n /** Campos del maestro a seguir. */\r\n masterKeys?: ReadonlyArray<keyof TBaseMaster>;\r\n\r\n /** Campos del detalle a seguir. */\r\n detailKeys?: ReadonlyArray<keyof TBaseDetail>;\r\n\r\n /**\r\n * Si es `true` (default), cuando el valor actual sea `null` o `undefined`\r\n * se usa el valor base para evitar falsos positivos en formularios.\r\n */\r\n useBaseValueForNullish?: boolean;\r\n}\r\n\r\nexport interface MasterDetailDifference {\r\n scope: 'master' | 'detail';\r\n path: string;\r\n baseValue: unknown;\r\n currentValue: unknown;\r\n}\r\n\r\n/**\r\n * Resultado detallado de comparacion entre estado inicial y actual.\r\n */\r\nexport interface MasterDetailChangeResult {\r\n hasChanges: boolean;\r\n masterChanged: boolean;\r\n detailChanged: boolean;\r\n firstDifference: MasterDetailDifference | null;\r\n}\r\n\r\n/**\r\n * Tracker simplificado para comparar estado base vs `getRawValue()`.\r\n */\r\nexport interface MasterDetailSimpleFormTracker<\r\n TBaseMaster extends object,\r\n TBaseDetail extends object,\r\n> {\r\n /**\r\n * Indica si existe cualquier cambio entre el estado inicial y el actual.\r\n */\r\n hasChanges: (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ) => boolean;\r\n\r\n /**\r\n * Retorna un desglose de cambios por seccion (maestro/detalle).\r\n */\r\n getChanges: (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ) => MasterDetailChangeResult;\r\n\r\n /**\r\n * Reemplaza el estado base de comparacion con uno nuevo.\r\n */\r\n reset: (state: MasterDetailState<TBaseMaster, TBaseDetail>) => void;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio utilitario para detectar cambios en formularios o vistas\r\n * maestro-detalle sin acoplarse a una estructura de dominio concreta.\r\n */\r\nexport class MasterDetailChangeService {\r\n private static findFirstDifference(\r\n leftValue: unknown,\r\n rightValue: unknown,\r\n path = 'root',\r\n ): { path: string; leftValue: unknown; rightValue: unknown } | null {\r\n if (leftValue instanceof Date && rightValue instanceof Date) {\r\n return leftValue.getTime() === rightValue.getTime()\r\n ? null\r\n : { path, leftValue, rightValue };\r\n }\r\n\r\n if (Array.isArray(leftValue) && Array.isArray(rightValue)) {\r\n if (leftValue.length !== rightValue.length) {\r\n return {\r\n path: `${path}.length`,\r\n leftValue: leftValue.length,\r\n rightValue: rightValue.length,\r\n };\r\n }\r\n\r\n for (let index = 0; index < leftValue.length; index += 1) {\r\n const difference = MasterDetailChangeService.findFirstDifference(\r\n leftValue[index],\r\n rightValue[index],\r\n `${path}[${index}]`,\r\n );\r\n\r\n if (difference) {\r\n return difference;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (\r\n leftValue != null &&\r\n rightValue != null &&\r\n typeof leftValue === 'object' &&\r\n typeof rightValue === 'object'\r\n ) {\r\n const leftKeys = Object.keys(leftValue);\r\n const rightKeys = Object.keys(rightValue);\r\n\r\n if (leftKeys.length !== rightKeys.length) {\r\n return {\r\n path: `${path}.__keys__`,\r\n leftValue: leftKeys,\r\n rightValue: rightKeys,\r\n };\r\n }\r\n\r\n for (const key of leftKeys) {\r\n const difference = MasterDetailChangeService.findFirstDifference(\r\n (leftValue as Record<string, unknown>)[key],\r\n (rightValue as Record<string, unknown>)[key],\r\n `${path}.${key}`,\r\n );\r\n\r\n if (difference) {\r\n return difference;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return Object.is(leftValue, rightValue)\r\n ? null\r\n : { path, leftValue, rightValue };\r\n }\r\n\r\n /**\r\n * Version simplificada para formularios: recibe `getRawValue()` directamente\r\n * y compara por claves sin requerir mapeo manual en el consumidor.\r\n */\r\n createSimpleFormTracker<\r\n TBaseMaster extends object,\r\n TBaseDetail extends object,\r\n >(\r\n initialState: MasterDetailState<TBaseMaster, TBaseDetail>,\r\n options?: MasterDetailSimpleFormOptions<TBaseMaster, TBaseDetail>,\r\n ): MasterDetailSimpleFormTracker<TBaseMaster, TBaseDetail> {\r\n const defaultMasterKeys = Object.keys(initialState.master) as Array<\r\n keyof TBaseMaster\r\n >;\r\n const defaultDetailKeys =\r\n initialState.detail.length > 0\r\n ? (Object.keys(initialState.detail[0]) as Array<keyof TBaseDetail>)\r\n : ([] as Array<keyof TBaseDetail>);\r\n\r\n const masterKeys = options?.masterKeys ?? defaultMasterKeys;\r\n const detailKeys = options?.detailKeys ?? defaultDetailKeys;\r\n const useBaseValueForNullish = options?.useBaseValueForNullish ?? true;\r\n\r\n let initialMaster = structuredClone(initialState.master);\r\n let initialDetail = structuredClone(initialState.detail);\r\n\r\n const buildComparisonPayload = (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ) => {\r\n const normalizedBaseMaster = normalizeBaseEntity(\r\n initialMaster,\r\n masterKeys,\r\n );\r\n const normalizedCurrentMaster = normalizeRawEntityAgainstBase(\r\n initialMaster,\r\n currentState.master,\r\n masterKeys,\r\n useBaseValueForNullish,\r\n );\r\n\r\n const normalizedBaseDetail = initialDetail.map((item) =>\r\n normalizeBaseEntity(item, detailKeys),\r\n );\r\n\r\n const normalizedCurrentDetail = currentState.detail.map((item, index) =>\r\n normalizeRawEntityAgainstBase(\r\n initialDetail[index] ?? ({} as TBaseDetail),\r\n item,\r\n detailKeys,\r\n useBaseValueForNullish,\r\n ),\r\n );\r\n\r\n return {\r\n normalizedBaseMaster,\r\n normalizedCurrentMaster,\r\n normalizedBaseDetail,\r\n normalizedCurrentDetail,\r\n };\r\n };\r\n\r\n const resolveChanges = (\r\n currentState: MasterDetailState<\r\n MasterDetailRawEntity<TBaseMaster>,\r\n MasterDetailRawEntity<TBaseDetail>\r\n >,\r\n ): MasterDetailChangeResult => {\r\n const {\r\n normalizedBaseMaster,\r\n normalizedCurrentMaster,\r\n normalizedBaseDetail,\r\n normalizedCurrentDetail,\r\n } = buildComparisonPayload(currentState);\r\n\r\n const masterDifference = MasterDetailChangeService.findFirstDifference(\r\n normalizedBaseMaster,\r\n normalizedCurrentMaster,\r\n 'master',\r\n );\r\n\r\n const detailDifference = MasterDetailChangeService.findFirstDifference(\r\n normalizedBaseDetail,\r\n normalizedCurrentDetail,\r\n 'detail',\r\n );\r\n\r\n return {\r\n hasChanges: masterDifference !== null || detailDifference !== null,\r\n masterChanged: masterDifference !== null,\r\n detailChanged: detailDifference !== null,\r\n firstDifference: masterDifference\r\n ? {\r\n scope: 'master',\r\n path: masterDifference.path,\r\n baseValue: masterDifference.leftValue,\r\n currentValue: masterDifference.rightValue,\r\n }\r\n : detailDifference\r\n ? {\r\n scope: 'detail',\r\n path: detailDifference.path,\r\n baseValue: detailDifference.leftValue,\r\n currentValue: detailDifference.rightValue,\r\n }\r\n : null,\r\n };\r\n };\r\n\r\n return {\r\n hasChanges: (currentState) => resolveChanges(currentState).hasChanges,\r\n getChanges: (currentState) => resolveChanges(currentState),\r\n\r\n reset: (state: MasterDetailState<TBaseMaster, TBaseDetail>) => {\r\n initialMaster = structuredClone(state.master);\r\n initialDetail = structuredClone(state.detail);\r\n },\r\n };\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { AlertaService } from './alerta.service';\r\nimport { SweetAlert2DialogService } from './messages/sweet-alert2-dialog.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DsxMessagesService {\r\n public readonly AlertaService = inject(AlertaService);\r\n public readonly SweetDialog = inject(SweetAlert2DialogService);\r\n}\r\n","// form-preview.service.ts\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormPreviewService {\r\n /**\r\n * Genera resumen HTML desde un objeto plano\r\n * @param data - Objeto con los datos (ej: form.value)\r\n * @param fields - Array de campos a mostrar\r\n * @param options - Opciones adicionales\r\n */\r\n buildObjectSummaryHtml(\r\n data: any,\r\n fields: Array<{\r\n key: string;\r\n label: string;\r\n format?: (value: any) => string; // Formateador personalizado opcional\r\n }>,\r\n options?: {\r\n title?: string;\r\n showEmpty?: boolean;\r\n compact?: boolean;\r\n debug?: boolean; // Activar logs de depuración\r\n },\r\n ): string {\r\n const debug = options?.debug ?? false;\r\n\r\n // Modo desarrollo: mostrar información de depuración\r\n if (debug) {\r\n this.debugInputData(data, fields, options);\r\n }\r\n\r\n if (!data) {\r\n if (debug) console.error('❌ FormPreview: data es null o undefined');\r\n return '';\r\n }\r\n\r\n if (!fields || fields.length === 0) {\r\n if (debug) console.error('❌ FormPreview: fields está vacío');\r\n return '';\r\n }\r\n\r\n const showEmpty = options?.showEmpty ?? false;\r\n const compact = options?.compact ?? true;\r\n const title = options?.title || 'Datos del formulario';\r\n\r\n const cells: Array<{ label: string; value: string }> = [];\r\n const propiedadesNoEncontradas: string[] = [];\r\n\r\n for (const field of fields) {\r\n // Obtener valor\r\n const value = this.getNestedValue(data, field.key);\r\n const valueText = field.format\r\n ? field.format(value)\r\n : this.formatValue(value);\r\n\r\n // Registrar si no se encontró la propiedad\r\n if (value === undefined) {\r\n propiedadesNoEncontradas.push(field.key);\r\n }\r\n\r\n // Filtrar vacíos\r\n if (!showEmpty && !valueText) continue;\r\n\r\n cells.push({\r\n label: field.label,\r\n value: valueText || '—',\r\n });\r\n }\r\n\r\n // Modo desarrollo: mostrar advertencias\r\n if (debug) {\r\n if (propiedadesNoEncontradas.length > 0) {\r\n console.warn(\r\n '⚠️ FormPreview: Propiedades no encontradas:',\r\n propiedadesNoEncontradas,\r\n );\r\n console.warn('📋 Propiedades disponibles en data:', Object.keys(data));\r\n console.warn(\r\n '💡 Sugerencia: Verifica que los nombres coincidan exactamente',\r\n );\r\n }\r\n\r\n if (cells.length === 0) {\r\n console.error(\r\n '❌ FormPreview: No se generaron celdas. Verifica tus campos y datos.',\r\n );\r\n console.log('📊 Data:', data);\r\n console.log('📋 Fields:', fields);\r\n } else {\r\n console.log('✅ FormPreview: HTML generado correctamente', { cells });\r\n }\r\n }\r\n\r\n if (!cells.length) return '';\r\n\r\n return this.generateHtml(title, cells, compact);\r\n }\r\n\r\n private getNestedValue(obj: any, path: string): any {\r\n if (!obj || !path) return undefined;\r\n\r\n const parts = path.split('.');\r\n let result = obj;\r\n\r\n for (const part of parts) {\r\n if (result === null || result === undefined) {\r\n return undefined;\r\n }\r\n result = result[part];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private formatValue(value: any): string {\r\n if (value === null || value === undefined) return '';\r\n if (value instanceof Date) return value.toLocaleDateString();\r\n if (typeof value === 'object') {\r\n // Para selects, mostrar propiedades comunes\r\n if (value.label) return String(value.label);\r\n if (value.nombre) return String(value.nombre);\r\n if (value.name) return String(value.name);\r\n if (value.value) return String(value.value);\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n return String(value);\r\n }\r\n\r\n private generateHtml(title: string, cells: any[], compact: boolean): string {\r\n if (compact) {\r\n return `\r\n <div style=\"margin: 8px 0; border: 1px solid #e9ecef; border-radius: 6px; overflow: hidden; background: #ffffff; font-size: 13px;\">\r\n <div style=\"padding: 8px 12px; background: #f8f9fa; border-bottom: 1px solid #e9ecef; font-weight: 600; color: #495057;\">\r\n ${this.escapeHtml(title)}\r\n </div>\r\n <table style=\"width: 100%; border-collapse: collapse;\">\r\n <tbody>\r\n ${cells\r\n .map(\r\n (cell, i) => `\r\n <tr style=\"border-bottom: ${i < cells.length - 1 ? '0.5px solid #f1f3f5' : 'none'}\">\r\n <td style=\"padding: 6px 12px; background: #f8f9fa; width: 130px; color: #6c757d; border-right: 0.5px solid #f1f3f5;\">\r\n ${this.escapeHtml(cell.label)}\r\n </td>\r\n <td style=\"padding: 6px 12px; color: #212529; font-weight: 500;\">\r\n ${this.escapeHtml(cell.value)}\r\n </td>\r\n </tr>\r\n `,\r\n )\r\n .join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n }\r\n\r\n // Versión no compacta (con más padding)\r\n return `\r\n <div style=\"margin: 12px 0; border: 1px solid #dee2e6; border-radius: 8px; overflow: hidden; background: #ffffff;\">\r\n <div style=\"padding: 12px; background: #f8f9fa; border-bottom: 1px solid #dee2e6; font-weight: 600; color: #495057;\">\r\n ${this.escapeHtml(title)}\r\n </div>\r\n <table style=\"width: 100%; border-collapse: collapse;\">\r\n <tbody>\r\n ${cells\r\n .map(\r\n (cell) => `\r\n <tr style=\"border-bottom: 1px solid #f1f3f5;\">\r\n <td style=\"padding: 10px 12px; width: 140px; background: #fafcff; color: #6c757d;\">\r\n ${this.escapeHtml(cell.label)}\r\n </td>\r\n <td style=\"padding: 10px 12px; color: #212529; font-weight: 500;\">\r\n ${this.escapeHtml(cell.value)}\r\n </td>\r\n </tr>\r\n `,\r\n )\r\n .join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n }\r\n\r\n private debugInputData(data: any, fields: any[], options?: any): void {\r\n console.group('🔍 FormPreview Debug');\r\n console.log('📊 Data:', data);\r\n console.log(\r\n '📋 Propiedades disponibles:',\r\n data ? Object.keys(data) : 'data es null',\r\n );\r\n console.log('🎯 Fields solicitados:', fields);\r\n console.log('⚙️ Options:', options);\r\n\r\n // Verificar cada campo\r\n if (data) {\r\n for (const field of fields) {\r\n const value = this.getNestedValue(data, field.key);\r\n const existe = value !== undefined;\r\n\r\n if (!existe) {\r\n console.warn(`❌ Campo \"${field.key}\" NO existe en data`);\r\n // Sugerir propiedades similares\r\n const similares = this.findSimilarProperties(\r\n field.key,\r\n Object.keys(data),\r\n );\r\n if (similares.length > 0) {\r\n console.warn(`💡 Quizás quisiste decir: ${similares.join(', ')}`);\r\n }\r\n } else {\r\n console.log(`✅ Campo \"${field.key}\" existe:`, value);\r\n }\r\n }\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n\r\n private findSimilarProperties(\r\n search: string,\r\n properties: string[],\r\n ): string[] {\r\n const searchLower = search.toLowerCase();\r\n return properties\r\n .filter((prop) => {\r\n const propLower = prop.toLowerCase();\r\n return (\r\n propLower.includes(searchLower) || searchLower.includes(propLower)\r\n );\r\n })\r\n .slice(0, 3);\r\n }\r\n\r\n private escapeHtml(str: string): string {\r\n if (!str) return '';\r\n const htmlEntities: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\r\n };\r\n return str.replace(/[&<>\"']/g, (char) => htmlEntities[char]);\r\n }\r\n}\r\n","// table-preview.service.ts\r\nimport { Injectable, isDevMode } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TablePreviewService {\r\n buildSingleRowSummaryHtml(\r\n row: any,\r\n columns: Array<string | { key: string; label?: string }>,\r\n options?: {\r\n rowId?: string;\r\n headerMap?: Record<string, string>;\r\n includeEmpty?: boolean;\r\n showLabel?: boolean;\r\n debug?: boolean; // Nuevo: activa logs de depuración\r\n },\r\n ): string {\r\n const debug = options?.debug ?? false; // Por defecto false\r\n\r\n // Solo mostrar logs si debug está activado\r\n if (debug) {\r\n this.debugInputData(row, columns, options);\r\n }\r\n\r\n if (!row) {\r\n if (debug) console.error('❌ TablePreview: row es null o undefined');\r\n return '';\r\n }\r\n\r\n if (!columns || columns.length === 0) {\r\n if (debug) console.error('❌ TablePreview: columns está vacío');\r\n return '';\r\n }\r\n\r\n const includeEmpty = options?.includeEmpty ?? false;\r\n const headerMap = options?.headerMap ?? {};\r\n const showLabel = options?.showLabel ?? true;\r\n const rowId = options?.rowId?.trim() || '1';\r\n\r\n const cells: Array<{ label: string; value: string }> = [];\r\n const propiedadesNoEncontradas: string[] = [];\r\n\r\n for (const col of columns) {\r\n // Obtener key\r\n const key = typeof col === 'string' ? col : col.key;\r\n\r\n // Obtener valor con validación\r\n const value = this.getNestedValue(row, key);\r\n const valueText = this.formatValue(value);\r\n\r\n // Registrar si no se encontró la propiedad\r\n if (value === undefined) {\r\n propiedadesNoEncontradas.push(key);\r\n }\r\n\r\n // Filtrar vacíos\r\n if (!includeEmpty && !valueText) continue;\r\n\r\n // Obtener label\r\n let label = headerMap[key];\r\n if (!label && typeof col === 'object' && col.label) label = col.label;\r\n if (!label) label = this.humanizeKey(key);\r\n\r\n cells.push({ label, value: valueText || '—' });\r\n }\r\n\r\n // Solo mostrar logs si debug está activado\r\n if (debug) {\r\n if (propiedadesNoEncontradas.length > 0) {\r\n console.warn(\r\n '⚠️ TablePreview: Propiedades no encontradas:',\r\n propiedadesNoEncontradas,\r\n );\r\n console.warn(\r\n '📋 Propiedades disponibles en rowData:',\r\n Object.keys(row),\r\n );\r\n console.warn(\r\n '💡 Sugerencia: Verifica que los nombres coincidan exactamente',\r\n );\r\n }\r\n\r\n if (cells.length === 0) {\r\n console.error(\r\n '❌ TablePreview: No se generaron celdas. Verifica tus columnas y datos.',\r\n );\r\n console.log('📊 RowData:', row);\r\n console.log('📋 Columns:', columns);\r\n } else {\r\n console.log('✅ TablePreview: HTML generado correctamente', { cells });\r\n }\r\n }\r\n\r\n if (!cells.length) return '';\r\n\r\n return this.generateCompactHtml(rowId, cells, showLabel);\r\n }\r\n\r\n private getNestedValue(obj: any, path: string): any {\r\n if (!obj || !path) return undefined;\r\n\r\n const parts = path.split('.');\r\n let result = obj;\r\n\r\n for (const part of parts) {\r\n if (result === null || result === undefined) {\r\n return undefined;\r\n }\r\n result = result[part];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private formatValue(value: any): string {\r\n if (value === null || value === undefined) return '';\r\n if (value instanceof Date) return value.toLocaleDateString();\r\n if (typeof value === 'object') {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n return String(value);\r\n }\r\n\r\n private humanizeKey(key: string): string {\r\n return key\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/[._-]/g, ' ')\r\n .trim()\r\n .split(' ')\r\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\r\n .join(' ');\r\n }\r\n\r\n private generateCompactHtml(\r\n rowId: string,\r\n cells: any[],\r\n showLabel: boolean,\r\n ): string {\r\n const rowIdWidth = Math.min(Math.max(rowId.length, 1), 3);\r\n\r\n return `\r\n <div style=\"margin: 8px 0; border: 1px solid #e9ecef; border-radius: 6px; overflow: hidden; background: #ffffff; font-size: 13px;\">\r\n <table style=\"width: 100%; border-collapse: collapse; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\">\r\n <tbody>\r\n ${cells\r\n .map(\r\n (cell, i) => `\r\n <tr style=\"border-bottom: ${i < cells.length - 1 ? '0.5px solid #f1f3f5' : 'none'}\">\r\n ${\r\n i === 0\r\n ? `\r\n <td style=\"padding: 6px 8px; background: #f8f9fa; font-weight: 600; color: #6c757d; border-right: 0.5px solid #f1f3f5; vertical-align: top;\">\r\n ${this.escapeHtml(rowId)}\r\n </td>\r\n `\r\n : ''\r\n }\r\n ${\r\n showLabel\r\n ? `\r\n <td style=\"padding: 6px 8px; background: #f8f9fa; width: 130px; color: #6c757d; border-right: 0.5px solid #f1f3f5;\">\r\n ${this.escapeHtml(cell.label)}\r\n </td>\r\n `\r\n : ''\r\n }\r\n <td style=\"padding: 6px 8px; color: #212529; font-weight: 500;\">\r\n ${this.escapeHtml(cell.value)}\r\n </td>\r\n </tr>\r\n `,\r\n )\r\n .join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n }\r\n\r\n private debugInputData(row: any, columns: any[], options?: any): void {\r\n console.group('🔍 TablePreview Debug');\r\n console.log('📊 RowData:', row);\r\n console.log(\r\n '📋 Propiedades disponibles:',\r\n row ? Object.keys(row) : 'row es null',\r\n );\r\n console.log('🎯 Columns solicitadas:', columns);\r\n console.log('⚙️ Options:', options);\r\n\r\n // Verificar cada columna\r\n if (row) {\r\n for (const col of columns) {\r\n const key = typeof col === 'string' ? col : col.key;\r\n const value = this.getNestedValue(row, key);\r\n const existe = value !== undefined;\r\n\r\n if (!existe) {\r\n console.warn(`❌ Propiedad \"${key}\" NO existe en rowData`);\r\n // Sugerir propiedades similares\r\n const similares = this.findSimilarProperties(key, Object.keys(row));\r\n if (similares.length > 0) {\r\n console.warn(`💡 Quizás quisiste decir: ${similares.join(', ')}`);\r\n }\r\n } else {\r\n console.log(`✅ Propiedad \"${key}\" existe:`, value);\r\n }\r\n }\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n\r\n private findSimilarProperties(\r\n search: string,\r\n properties: string[],\r\n ): string[] {\r\n const similares: string[] = [];\r\n const searchLower = search.toLowerCase();\r\n\r\n for (const prop of properties) {\r\n const propLower = prop.toLowerCase();\r\n // Buscar similitudes (contiene o es similar)\r\n if (propLower.includes(searchLower) || searchLower.includes(propLower)) {\r\n similares.push(prop);\r\n }\r\n // Distancia de Levenshtein simple (máximo 3 caracteres de diferencia)\r\n else if (this.levenshteinDistance(searchLower, propLower) <= 3) {\r\n similares.push(prop);\r\n }\r\n }\r\n\r\n return similares.slice(0, 3); // Máximo 3 sugerencias\r\n }\r\n\r\n private levenshteinDistance(a: string, b: string): number {\r\n if (a.length === 0) return b.length;\r\n if (b.length === 0) return a.length;\r\n\r\n const matrix = [];\r\n\r\n for (let i = 0; i <= b.length; i++) {\r\n matrix[i] = [i];\r\n }\r\n\r\n for (let j = 0; j <= a.length; j++) {\r\n matrix[0][j] = j;\r\n }\r\n\r\n for (let i = 1; i <= b.length; i++) {\r\n for (let j = 1; j <= a.length; j++) {\r\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\r\n matrix[i][j] = matrix[i - 1][j - 1];\r\n } else {\r\n matrix[i][j] = Math.min(\r\n matrix[i - 1][j - 1] + 1,\r\n matrix[i][j - 1] + 1,\r\n matrix[i - 1][j] + 1,\r\n );\r\n }\r\n }\r\n }\r\n\r\n return matrix[b.length][a.length];\r\n }\r\n\r\n private escapeHtml(str: string): string {\r\n if (!str) return '';\r\n const htmlEntities: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\r\n };\r\n return str.replace(/[&<>\"']/g, (char) => htmlEntities[char]);\r\n }\r\n}\r\n","/**\r\n * Formateador de moneda por defecto para Guatemala.\r\n *\r\n * Usa la configuración regional `es-GT` y el código de moneda `GTQ`.\r\n * Siempre muestra 2 decimales.\r\n *\r\n * Ejemplo de uso:\r\n * ```ts\r\n * GTQFormatter.format(1234.5); // \"Q 1,234.50\"\r\n * ```\r\n */\r\nexport const GTQFormatter = new Intl.NumberFormat('es-GT', {\r\n style: 'currency',\r\n currency: 'GTQ',\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n});\r\n\r\n/**\r\n * Crea un formateador de moneda personalizado.\r\n *\r\n * Permite definir la configuración regional (`locale`) y el código de moneda (`currency`)\r\n * manteniendo 2 decimales fijos.\r\n *\r\n * Ejemplos de uso:\r\n * ```ts\r\n * const usdFormatter = createCurrencyFormatter('en-US', 'USD');\r\n * usdFormatter.format(1000); // \"$1,000.00\"\r\n *\r\n * const mxnFormatter = createCurrencyFormatter('es-MX', 'MXN');\r\n * mxnFormatter.format(1500.75); // \"$1,500.75\"\r\n * ```\r\n *\r\n * @param locale Código de configuración regional, por ejemplo: `es-GT`, `en-US`.\r\n * @param currency Código de moneda ISO 4217, por ejemplo: `GTQ`, `USD`, `EUR`.\r\n * @returns Instancia de `Intl.NumberFormat` configurada para moneda.\r\n */\r\nexport function createCurrencyFormatter(\r\n locale: string,\r\n currency: string,\r\n): Intl.NumberFormat {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n });\r\n}\r\n","import { isDevMode } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\n\r\nexport function chainControlGroups(form: FormGroup, groups: string[][]): void {\r\n groups.forEach((group) => {\r\n chainControls(form, group);\r\n });\r\n}\r\n\r\nfunction chainControls(form: FormGroup, controls: string[]): void {\r\n for (let i = 1; i < controls.length; i++) {\r\n const previousName = controls[i - 1];\r\n const currentName = controls[i];\r\n\r\n const previous = form.get(previousName);\r\n const current = form.get(currentName);\r\n\r\n // 🔥 Validación visual en desarrollo\r\n if (!previous) {\r\n showDevAlert(\r\n `[chainControls] El control \"${previousName}\" no existe en el FormGroup.`,\r\n );\r\n\r\n continue;\r\n }\r\n\r\n if (!current) {\r\n showDevAlert(\r\n `[chainControls] El control \"${currentName}\" no existe en el FormGroup.`,\r\n );\r\n\r\n continue;\r\n }\r\n\r\n // Estado inicial\r\n if (!hasValue(previous.value)) {\r\n current.disable({ emitEvent: false });\r\n }\r\n\r\n previous.valueChanges.subscribe((value) => {\r\n if (hasValue(value)) {\r\n current.enable({ emitEvent: false });\r\n } else {\r\n current.reset('', { emitEvent: false });\r\n\r\n current.disable({ emitEvent: false });\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction hasValue(value: any): boolean {\r\n return (\r\n value !== null && value !== undefined && value.toString().trim() !== ''\r\n );\r\n}\r\n\r\nfunction showDevAlert(message: string): void {\r\n if (isDevMode()) {\r\n alert(message);\r\n }\r\n}\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport {\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n Observable,\r\n of,\r\n switchMap,\r\n} from 'rxjs';\r\n\r\n/**\r\n * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).\r\n */\r\nexport function dateRangeValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const dates: Date[] = control.value;\r\n\r\n // Verificar si el valor es un array con exactamente dos elementos\r\n if (Array.isArray(dates) && dates.length === 2) {\r\n const [startDate, endDate] = dates;\r\n\r\n // Verificar que las fechas sean válidas y no nulas\r\n if (\r\n startDate &&\r\n endDate &&\r\n !isNaN(new Date(startDate).getTime()) &&\r\n !isNaN(new Date(endDate).getTime())\r\n ) {\r\n return null; // Válido\r\n } else {\r\n return {\r\n invalidDateRange: {\r\n message: 'Ambas fechas deben ser válidas y no nulas.',\r\n requiredLength: 2,\r\n },\r\n }; // Error si alguna fecha es nula o inválida\r\n }\r\n }\r\n return null; // Si el control no contiene un array válido, no hay error\r\n}\r\n\r\n/**\r\n * Validador a nivel de formulario que verifica que la fecha \"hasta\"\r\n * (toKey) sea mayor o igual que la fecha \"desde\" (fromKey),\r\n * comparando ambas como instancias de Date.\r\n *\r\n * Reglas:\r\n * - Si una o ambas fechas están vacías (null/undefined), no se genera error\r\n * y se delega la obligatoriedad a otros validadores como `required`.\r\n * - Si ambas fechas tienen valor, la fecha \"hasta\" debe ser >= fecha \"desde\"\r\n * según su valor numérico (`getTime()`).\r\n * - Si los valores no son fechas válidas, el comportamiento dependerá\r\n * de cómo los controles entreguen el valor (se recomienda usar Date).\r\n *\r\n * @param fromKey Nombre del control que representa la fecha inicial.\r\n * @param toKey Nombre del control que representa la fecha final.\r\n * @returns Un ValidatorFn que devuelve `null` si el rango es válido o está\r\n * incompleto; y un objeto con la clave `invalidDateRange` si el\r\n * rango es inválido.\r\n */\r\nexport function dateRangeValidatorFromTo(\r\n fromKey: string,\r\n toKey: string,\r\n): ValidatorFn {\r\n return (group: AbstractControl): ValidationErrors | null => {\r\n const fromControl = group.get(fromKey);\r\n const toControl = group.get(toKey);\r\n\r\n const from = fromControl?.value as Date | null;\r\n const to = toControl?.value as Date | null;\r\n\r\n if (!from || !to) return null;\r\n\r\n // Rango válido: limpiar error en el control \"hasta\" si existe\r\n if (to.getTime() >= from.getTime()) {\r\n if (toControl && toControl.errors?.['invalidDateRange']) {\r\n const { invalidDateRange, ...rest } = toControl.errors;\r\n toControl.setErrors(Object.keys(rest).length ? rest : null);\r\n }\r\n return null;\r\n }\r\n\r\n // Rango inválido: asignar error tanto al grupo como al control \"hasta\"\r\n const error: ValidationErrors = {\r\n invalidDateRange: {\r\n message: 'La fecha final debe ser mayor o igual que la fecha inicial.',\r\n requiredLength: 2,\r\n },\r\n };\r\n\r\n if (toControl) {\r\n const currentErrors = toControl.errors || {};\r\n toControl.setErrors({ ...currentErrors, ...error });\r\n }\r\n\r\n return error;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que una fecha única esté dentro de un rango mínimo y máximo.\r\n * Las fechas deben utilizar la función de convertirFechaISOString para asegurar el formato correcto y que funcione con el componente primeNg.\r\n * @param minDate Fecha mínima permitida.\r\n * @param maxDate Fecha máxima permitida.\r\n */\r\nexport function dateMinMaxValidator(minDate: Date, maxDate: Date) {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const date: Date = control.value;\r\n\r\n // Verificar si el valor es una fecha válida\r\n if (date && !isNaN(new Date(date).getTime())) {\r\n const currentDate = new Date(date);\r\n\r\n // Validar si la fecha está fuera del rango permitido\r\n if (currentDate < minDate || currentDate > maxDate) {\r\n return {\r\n dateNotRange: {\r\n message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,\r\n minDate: minDate.toISOString(),\r\n maxDate: maxDate.toISOString(),\r\n },\r\n };\r\n }\r\n\r\n return null; // Fecha válida y dentro del rango\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que al menos uno de los campos especificados esté lleno.\r\n * @param fields Los nombres de los campos a validar.\r\n */\r\nexport function atLeastOneFieldRequiredValidator(fields: string[]) {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Obtener el FormGroup para poder acceder a los controles\r\n const form = formGroup as FormGroup;\r\n\r\n // Verificar si al menos uno de los campos tiene un valor\r\n const isAnyFieldFilled = fields.some((field) => {\r\n const control = form.get(field);\r\n return control?.value !== null && control?.value !== '';\r\n });\r\n\r\n // Si al menos un campo tiene un valor, la validación es exitosa\r\n if (isAnyFieldFilled) {\r\n return null; // Validación pasada\r\n } else {\r\n // Construir el mensaje dinámico con los campos no llenados\r\n const emptyFields = fields.filter((field) => {\r\n const control = form.get(field);\r\n return control?.value === null || control?.value === '';\r\n });\r\n\r\n const fieldNames = emptyFields.join(', ');\r\n const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;\r\n\r\n // Si ninguno tiene valor, devolver el mensaje con el error\r\n return {\r\n atLeastOneRequired: {\r\n message: message,\r\n },\r\n };\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un NIT (Número de Identificación Tributaria) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del NIT.\r\n * @returns Un objeto de error si el NIT no es válido, o `null` si el NIT es válido.\r\n */\r\nexport function nitValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const nit = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!nit) {\r\n return null;\r\n }\r\n\r\n // Validar el NIT utilizando la función NITCorrecto\r\n const esValido = NITCorrecto(nit);\r\n\r\n // Si el NIT no es válido, retornar un objeto de error con el formato deseado\r\n if (!esValido) {\r\n return {\r\n invalidNIT: {\r\n message: 'El NIT ingresado no es válido.', // Mensaje de error personalizado\r\n requiredLength: nit.length, // Longitud del NIT ingresado (opcional)\r\n },\r\n };\r\n }\r\n\r\n // Si el NIT es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función auxiliar para validar un NIT según un algoritmo específico.\r\n *\r\n * @param nit - El NIT a validar.\r\n * @returns `true` si el NIT es válido, `false` en caso contrario.\r\n */\r\nfunction NITCorrecto(nit: string): boolean {\r\n try {\r\n const largo = nit.length;\r\n // Invertir el NIT (excepto el último dígito) para facilitar el cálculo\r\n const validar = nit\r\n .substring(0, largo - 1)\r\n .split('')\r\n .reverse()\r\n .join('');\r\n const cadena = validar.split('');\r\n const comparador = nit.substring(largo - 1, largo); // Último dígito del NIT\r\n let posicion = 2; // Factor de ponderación inicial\r\n let sumaValidar = 0; // Acumulador para la suma ponderada\r\n\r\n // Calcular la suma ponderada de los dígitos del NIT\r\n for (const c of cadena) {\r\n sumaValidar += parseInt(c, 10) * posicion;\r\n posicion += 1;\r\n }\r\n\r\n // Calcular el residuo de la operación de validación\r\n const residuo = operacionValidar(11 - operacionValidar(sumaValidar));\r\n\r\n // Validar el NIT según el residuo y el último dígito\r\n if (residuo === 10 && comparador.toUpperCase() === 'K') {\r\n return true; // El NIT es válido si el residuo es 10 y el último dígito es 'K'\r\n } else if (residuo.toString() === comparador) {\r\n return true; // El NIT es válido si el residuo coincide con el último dígito\r\n } else {\r\n return false; // El NIT no es válido\r\n }\r\n } catch (error) {\r\n // Si ocurre un error durante la validación, el NIT no es válido\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Función auxiliar para calcular el residuo de una operación aritmética.\r\n *\r\n * @param valor - El valor sobre el cual se calculará el residuo.\r\n * @returns El residuo de la división del valor entre 11.\r\n */\r\nfunction operacionValidar(valor: number): number {\r\n return valor % 11;\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un CUI (Código Único de Identificación) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del CUI.\r\n * @returns Un objeto de error si el CUI no es válido, o `null` si el CUI es válido.\r\n */\r\nexport function cuiValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const cui = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!cui) {\r\n return null;\r\n }\r\n\r\n // Validar el CUI\r\n const esValido = CUICorrecto(cui);\r\n\r\n // Si el CUI no es válido, retornar un objeto de error\r\n if (!esValido) {\r\n return {\r\n invalidCUI: {\r\n message: 'El CUI ingresado no es válido.',\r\n requiredLength: 13,\r\n actualLength: cui.length,\r\n },\r\n };\r\n }\r\n\r\n // Si el CUI es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función que implementa el algoritmo de validación del CUI\r\n * @param cui Número de CUI a validar (debe tener 13 dígitos)\r\n * @returns boolean indicando si el CUI es válido\r\n */\r\nfunction CUICorrecto(cui: string | number): boolean {\r\n // Convertir a string si es número\r\n const cuiStr = typeof cui === 'number' ? cui.toString() : cui;\r\n\r\n // Validar longitud y que sean solo dígitos\r\n if (cuiStr.length !== 13 || !/^\\d+$/.test(cuiStr)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const primeros8 = cuiStr.substring(0, 8);\r\n const digitoVerificador = parseInt(cuiStr.substring(8, 9), 10);\r\n let suma = 0;\r\n\r\n // Calcular la suma ponderada\r\n for (let i = 0; i < primeros8.length; i++) {\r\n const digito = parseInt(primeros8[i], 10);\r\n suma += digito * (i + 2); // Los pesos son 2, 3, 4, ..., 9\r\n }\r\n\r\n // Calcular residuo y validar\r\n const residuo = suma % 11;\r\n return residuo === digitoVerificador;\r\n } catch (error) {\r\n console.error('Error validando CUI:', error);\r\n return false;\r\n }\r\n}\r\n\r\nexport interface AsyncExistsValidatorOptions {\r\n /**\r\n * Identificador del registro actual.\r\n * Si no se define, se enviará `0` por defecto para mantener contrato value+id.\r\n */\r\n currentId?: string | number | null;\r\n /**\r\n * Nombre del campo para construir un mensaje dinámico.\r\n * Si no se define, se intentará inferir automáticamente desde el FormGroup padre.\r\n */\r\n fieldName?: string;\r\n /** Mensaje personalizado del error; si se define, tiene prioridad */\r\n errorMessage?: string;\r\n}\r\n\r\nfunction resolveControlName(control: AbstractControl): string | null {\r\n const parent = control.parent;\r\n if (!parent) return null;\r\n\r\n if (parent instanceof FormGroup) {\r\n for (const [key, childControl] of Object.entries(parent.controls)) {\r\n if (childControl === control) {\r\n return key;\r\n }\r\n }\r\n }\r\n\r\n const parentControls = (parent as { controls?: AbstractControl[] }).controls;\r\n if (Array.isArray(parentControls)) {\r\n const index = parentControls.indexOf(control);\r\n if (index >= 0) {\r\n return index.toString();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction buildAlreadyExistsMessage(\r\n control: AbstractControl,\r\n options: Pick<AsyncExistsValidatorOptions, 'fieldName' | 'errorMessage'>,\r\n): string {\r\n if (options.errorMessage) {\r\n return options.errorMessage;\r\n }\r\n\r\n const resolvedFieldName = options.fieldName || resolveControlName(control);\r\n return resolvedFieldName\r\n ? `El valor en ${resolvedFieldName} ya existe.`\r\n : 'El valor ingresado ya existe';\r\n}\r\n\r\n/**\r\n * Validador asíncrono que verifica si un valor ya existe mediante una llamada a un servicio.\r\n * Útil para validar unicidad de campos como nombres de usuario, correos electrónicos, etc.\r\n *\r\n * Aplica `debounceTime(400)` y `distinctUntilChanged()` para evitar llamadas innecesarias\r\n * al servicio mientras el usuario escribe.\r\n *\r\n * @template T Tipo del valor del control a validar.\r\n * @param serviceMethod Función que recibe el valor del control y, opcionalmente,\r\n * el identificador del registro actual. Debe retornar un `Observable<boolean>`\r\n * emitiendo `true` si el valor ya existe (en otro registro), `false` en caso contrario.\r\n * @param options Opciones del validador:\r\n * - `currentId`: Id opcional del registro en edición para excluirlo en backend.\r\n * - `fieldName`: Nombre del campo para construir el mensaje dinámico\r\n * (si se omite, se intenta inferir del control).\r\n * - `errorMessage`: Mensaje personalizado (si se omite y se resuelve nombre\r\n * de campo, se usa `El valor {campo} ya existe`).\r\n * @returns Un `AsyncValidatorFn` que emite `null` si el valor no existe o el control está vacío,\r\n * o un objeto `ValidationErrors` con la clave fija `alreadyValueExists` si el valor ya existe.\r\n *\r\n * @example\r\n * ```ts\r\n * // Creación\r\n * email: ['', [], asyncExistsValidator(\r\n * (value, id) => this.userService.emailExists({ value, id: Number(id) })\r\n * )]\r\n *\r\n * // Edición (excluyendo el registro actual por id)\r\n * email: ['', [], asyncExistsValidator(\r\n * (value, id) => this.userService.emailExists(value, id),\r\n * { currentId: this.id, fieldName: 'email' }\r\n * )]\r\n * ```\r\n */\r\nexport function asyncExistsValidator<\r\n T extends string | number = string | number,\r\n>(\r\n serviceMethod: (value: T, currentId: string | number) => Observable<boolean>,\r\n options: AsyncExistsValidatorOptions = {},\r\n): AsyncValidatorFn {\r\n const { currentId = null, fieldName, errorMessage } = options;\r\n const errorKey = 'alreadyValueExists';\r\n\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n if (!control.value) return of(null);\r\n\r\n return of(control.value).pipe(\r\n debounceTime(800),\r\n distinctUntilChanged(),\r\n switchMap((value) => {\r\n const resolvedId = currentId ?? 0;\r\n return serviceMethod(value as T, resolvedId);\r\n }),\r\n map((exists) => {\r\n if (exists) {\r\n return {\r\n [errorKey]: {\r\n message: buildAlreadyExistsMessage(control, {\r\n fieldName,\r\n errorMessage,\r\n }),\r\n value: control.value,\r\n },\r\n };\r\n }\r\n return null;\r\n }),\r\n catchError(() => of(null)),\r\n );\r\n };\r\n}\r\n\r\nexport function templateVariablesValidator(\r\n allowedKeys: readonly string[],\r\n): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value: string = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const errors: string[] = [];\r\n\r\n const regex = /{{(.*?)}}/g;\r\n const matches = value.matchAll(regex);\r\n\r\n for (const match of matches) {\r\n const raw = match[1];\r\n const trimmed = raw.trim();\r\n\r\n // ❌ espacios al inicio/fin\r\n if (raw !== trimmed) {\r\n errors.push(`Espacios inválidos en \"{{${raw}}}\"`);\r\n continue;\r\n }\r\n\r\n // ❌ formato inválido\r\n if (!/^[A-Z0-9_]+$/.test(trimmed)) {\r\n errors.push(`Formato inválido en \"{{${raw}}}\"`);\r\n continue;\r\n }\r\n\r\n // ❌ no existe en catálogo\r\n if (!allowedKeys.includes(trimmed)) {\r\n errors.push(`Variable no definida: \"{{${trimmed}}}\"`);\r\n continue;\r\n }\r\n }\r\n\r\n // ❌ llaves desbalanceadas\r\n const open = (value.match(/{{/g) || []).length;\r\n const close = (value.match(/}}/g) || []).length;\r\n\r\n if (open !== close) {\r\n errors.push('Llaves desbalanceadas {{ }}');\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n invalidTemplateVariables: {\r\n message: 'El template contiene errores.',\r\n details: errors,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\nexport function templateStructureValidator(\r\n control: AbstractControl,\r\n): ValidationErrors | null {\r\n const value: string = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const errors: string[] = [];\r\n\r\n // 1) Validar que todas las etiquetas estén en el catálogo permitido.\r\n const allowedTags = new Set(['<negrita>', '</negrita>', '</salto>']);\r\n const tags = value.match(/<[^>\\n]+>/g) || [];\r\n\r\n for (const tag of tags) {\r\n if (!allowedTags.has(tag)) {\r\n errors.push(\r\n `Etiqueta inválida: \"${tag}\". Etiquetas permitidas: <negrita>, </negrita>, </salto>.`,\r\n );\r\n }\r\n }\r\n\r\n // 2) Validar estructura de apertura/cierre de <negrita>...</negrita>.\r\n const negritaTokens = tags.filter(\r\n (tag) => tag === '<negrita>' || tag === '</negrita>',\r\n );\r\n let negritaDepth = 0;\r\n\r\n for (const token of negritaTokens) {\r\n if (token === '<negrita>') {\r\n negritaDepth += 1;\r\n } else {\r\n negritaDepth -= 1;\r\n if (negritaDepth < 0) {\r\n errors.push(\r\n 'Estructura incorrecta: Se encontró \"</negrita>\" sin una apertura \"<negrita>\" previa.',\r\n );\r\n negritaDepth = 0;\r\n }\r\n }\r\n }\r\n\r\n if (negritaDepth > 0) {\r\n errors.push(\r\n 'Estructura incorrecta: Falta cerrar una o más etiquetas \"</negrita>\".',\r\n );\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n invalidTemplateStructure: {\r\n message: 'El formato del texto contiene errores estructurales.',\r\n details: errors,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function minimumAgeValidator(\r\n minimumAge: number,\r\n referenceDate?: Date,\r\n): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const birthDate = new Date(value);\r\n\r\n if (isNaN(birthDate.getTime())) {\r\n return {\r\n invalidDate: {\r\n message: 'La fecha ingresada no es válida.',\r\n },\r\n };\r\n }\r\n\r\n const today = referenceDate ?? new Date();\r\n\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n\r\n const monthDiff = today.getMonth() - birthDate.getMonth();\r\n\r\n // Ajustar si aún no ha cumplido años\r\n if (\r\n monthDiff < 0 ||\r\n (monthDiff === 0 && today.getDate() < birthDate.getDate())\r\n ) {\r\n age--;\r\n }\r\n\r\n if (age < minimumAge) {\r\n return {\r\n minimumAge: {\r\n requiredAge: minimumAge,\r\n actualAge: age,\r\n message: `Edad mínima requerida ${minimumAge} años.`,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n","// sorensen-dice.validators.ts\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { Observable, isObservable, of } from 'rxjs';\r\nimport { map, take } from 'rxjs/operators';\r\nimport { calcularSimilitud } from '../../models/src/similarity.util';\r\n\r\nexport function sorensenDiceValidator(\r\n dataSource: any[] | Observable<any[]>,\r\n key?: string,\r\n umbral: number = 0.7,\r\n): AsyncValidatorFn {\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n // Si no hay valor, el control es válido de inmediato\r\n if (!control.value || String(control.value).trim() === '') {\r\n return of(null);\r\n }\r\n\r\n const textoIngresado = String(control.value).trim();\r\n const data$: Observable<any[]> = isObservable(dataSource)\r\n ? dataSource\r\n : of(dataSource);\r\n\r\n // 🎯 IMPORTANTE: Retornamos el flujo mapeado que Angular resolverá internamente\r\n return data$.pipe(\r\n take(1),\r\n map((items) => {\r\n // Maneja arrays directos o respuestas paginadas del API\r\n const coleccion = Array.isArray(items)\r\n ? items\r\n : (items && (items as any).data) || [];\r\n\r\n const coincidencia = coleccion.find((item) => {\r\n const textoAComparar =\r\n key && item && typeof item === 'object' ? item[key] : item;\r\n if (typeof textoAComparar !== 'string') return false;\r\n\r\n return calcularSimilitud(textoIngresado, textoAComparar) >= umbral;\r\n });\r\n\r\n if (coincidencia) {\r\n const nombreSugerido = key ? coincidencia[key] : coincidencia;\r\n\r\n // 🎯 RETORNAMOS UN OBJETO DE ERROR SÍNCRONO FINAL (NO UN OBSERVABLE)\r\n return {\r\n similitudDetectada: {\r\n sugerencia: nombreSugerido,\r\n umbralUsado: umbral,\r\n message: `Ya existe un registro muy similar en el sistema: \"${nombreSugerido}\".`,\r\n },\r\n };\r\n }\r\n\r\n return null; // Si no hay similitud, el campo es válido\r\n }),\r\n );\r\n };\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/components';\r\nexport * from './lib/components/src/app-message-error/app-message-error.component';\r\nexport * from './lib/components/src/app-message-help/app-message-help.component';\r\nexport * from './lib/components/src/button/dsx-button/dsx-button';\r\nexport * from './lib/components/src/icon-dsx/icon-dsx.component';\r\nexport * from './lib/components/src/inputs/file/file.component';\r\nexport * from './lib/components/src/json/json-values-debuj/json-values-debuj.component';\r\nexport * from './lib/components/src/label/ico-label/ico-label';\r\nexport * from './lib/components/src/loading-lottie/loading-lottie.component';\r\nexport * from './lib/components/src/loading/css-v2/css-v2.component';\r\nexport * from './lib/components/src/loading/loading.component';\r\nexport * from './lib/components/src/logo/logo-dsx/logo-dsx.component';\r\nexport * from './lib/components/src/navbar-dsx/navbar-dsx.component';\r\nexport * from './lib/components/src/qr/qr-generator/qr-generator';\r\nexport * from './lib/components/src/security/token-purpose-login/token-purpose-login';\r\nexport * from './lib/components/src/status/network-status/network-status.component';\r\nexport * from './lib/components/src/view/screen-inspector/screen-inspector';\r\nexport * from './lib/directives/src/arrow-navigation.directive';\r\nexport * from './lib/directives/src/auto-scroll-height.directive';\r\nexport * from './lib/directives/src/only-rango-pattern.directive';\r\nexport * from './lib/directives/src/select-all-on-focus.directive';\r\nexport * from './lib/guards/src/guard-token-purpose.guard';\r\nexport * from './lib/injections/cache.token';\r\nexport {\r\n ENVIRONMENT,\r\n provideEnvironment,\r\n SWEET_ALERT_THEMES,\r\n validateEnvironmentConfig,\r\n type EnvironmentConfig,\r\n type SweetAlertThemeType,\r\n} from './lib/injections/environment.token';\r\nexport * from './lib/injections/parameterSecurity';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/models';\r\nexport * from './lib/models/src/action-message.model';\r\nexport * from './lib/models/src/environment-base';\r\nexport * from './lib/models/src/field-config.model';\r\nexport * from './lib/models/src/file-data.model';\r\nexport * from './lib/models/src/parameterSecurity.model';\r\nexport * from './lib/models/src/token.model';\r\nexport * from './lib/modules/src/dsx-add-tools.module';\r\nexport * from './lib/modules/src/prime-ng.module';\r\nexport * from './lib/pipe';\r\nexport * from './lib/primengdsx';\r\nexport * from './lib/services';\r\nexport * from './lib/services/src/alerta.service';\r\nexport * from './lib/services/src/authorize.service';\r\nexport * from './lib/services/src/base-crud.service';\r\nexport * from './lib/services/src/cache.provider';\r\nexport * from './lib/services/src/cache.service';\r\nexport * from './lib/services/src/dte.service';\r\nexport * from './lib/services/src/endpoint.service';\r\nexport * from './lib/services/src/error-handler.service';\r\nexport * from './lib/services/src/helpers.service';\r\nexport * from './lib/services/src/helpers/result-file.service';\r\nexport * from './lib/services/src/http-helpers.service';\r\nexport * from './lib/services/src/master-detail-change.service';\r\nexport * from './lib/services/src/messages.service';\r\nexport * from './lib/services/src/messages/sweet-alert2-dialog.service';\r\nexport * from './lib/services/src/parameter-values.service';\r\nexport * from './lib/services/src/response-html/form-preview.service';\r\nexport * from './lib/services/src/response-html/table-preview.service';\r\nexport * from './lib/services/src/security.service';\r\nexport * from './lib/services/src/spinner-loading.service';\r\nexport * from './lib/services/src/utility-add.service';\r\nexport * from './lib/utils';\r\nexport * from './lib/utils/src/form-chain.helper';\r\nexport * from './lib/validations/addons.validators';\r\nexport * from './lib/validations/src/sorensen-dice.validators';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i1.IconDsxService","shareReplay","map","distinctUntilChanged","debounceTime","i3","i4","i5","switchMap","take"],"mappings":"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"}