ngx-dsxlibrary 2.21.64 → 2.21.66

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.
@@ -32,6 +32,9 @@ import { Button, ButtonModule } from 'primeng/button';
32
32
  import moment from 'moment-timezone';
33
33
  import { ToastrService } from 'ngx-toastr';
34
34
  import Swal from 'sweetalert2';
35
+ import { AutoComplete, AutoCompleteModule } from 'primeng/autocomplete';
36
+ import * as i6 from 'primeng/floatlabel';
37
+ import { FloatLabel, FloatLabelModule } from 'primeng/floatlabel';
35
38
  import { FileUpload, FileUploadModule } from 'primeng/fileupload';
36
39
  import { LottieComponent } from 'ngx-lottie';
37
40
  import { createTimeline } from 'animejs';
@@ -41,12 +44,9 @@ import * as i4 from 'primeng/menubar';
41
44
  import { MenubarModule } from 'primeng/menubar';
42
45
  import { JwtHelperService } from '@auth0/angular-jwt';
43
46
  import { CookieService } from 'ngx-cookie-service';
44
- import * as i6 from 'primeng/floatlabel';
45
- import { FloatLabelModule } from 'primeng/floatlabel';
46
47
  import * as i7 from 'primeng/password';
47
48
  import { PasswordModule } from 'primeng/password';
48
49
  import { AccordionModule } from 'primeng/accordion';
49
- import { AutoCompleteModule } from 'primeng/autocomplete';
50
50
  import { AutoFocusModule } from 'primeng/autofocus';
51
51
  import { AvatarGroupModule } from 'primeng/avatargroup';
52
52
  import { BadgeModule } from 'primeng/badge';
@@ -4059,11 +4059,11 @@ function getActionMessageConfig(action, secondArg, thirdArg) {
4059
4059
  if (isActive) {
4060
4060
  return {
4061
4061
  ...defaults,
4062
- title: '¿Archivar registro?',
4063
- message: 'El registro dejará de estar visible en las listas principales, pero podrás recuperarlo más tarde.' +
4062
+ title: '¿Borrar registro?',
4063
+ message: 'El registro dejará de estar disponible en las listas principales.' +
4064
4064
  (dataPreview ? `<br>${dataPreview}` : ''),
4065
- icono: 'icon/folder01.png',
4066
- confirmButtonText: 'Archivar',
4065
+ icono: 'icon/trash-bin.png',
4066
+ confirmButtonText: 'Eliminar',
4067
4067
  cancelButtonText: 'Cancelar',
4068
4068
  showConfirmButton: true,
4069
4069
  showCancelButton: true,
@@ -4637,16 +4637,16 @@ const ACTION_CONFIG = {
4637
4637
  hardDelete: {
4638
4638
  label: 'Eliminar',
4639
4639
  icon: 'delete_forever',
4640
- primeIcon: 'pi pi-trash',
4640
+ primeIcon: 'fa-regular fa-trash-can',
4641
4641
  colorToken: 'danger',
4642
4642
  tooltip: 'Eliminar registro',
4643
4643
  },
4644
4644
  softDelete: {
4645
4645
  label: 'Archivar',
4646
- icon: 'archive',
4647
- primeIcon: 'pi pi-thumbs-down',
4646
+ icon: 'delete',
4647
+ primeIcon: 'fa-regular fa-trash-can',
4648
4648
  colorToken: 'warning',
4649
- tooltip: 'Archivar registro',
4649
+ tooltip: 'Borrar registro',
4650
4650
  },
4651
4651
  return: {
4652
4652
  label: 'Restaurar',
@@ -4683,7 +4683,7 @@ const ACTION_CONFIG = {
4683
4683
  edit: {
4684
4684
  label: 'Editar',
4685
4685
  icon: 'edit',
4686
- primeIcon: 'pi pi-file-edit',
4686
+ primeIcon: 'fa-regular fa-pen-to-square',
4687
4687
  colorToken: 'primary',
4688
4688
  tooltip: 'Editar registro',
4689
4689
  },
@@ -4753,8 +4753,131 @@ const ACTION_CONFIG = {
4753
4753
  },
4754
4754
  };
4755
4755
 
4756
+ class DsxAutocomplete {
4757
+ // Inputs usando Señales
4758
+ datasource = input.required(...(ngDevMode ? [{ debugName: "datasource" }] : /* istanbul ignore next */ []));
4759
+ optionLabel = input.required(...(ngDevMode ? [{ debugName: "optionLabel" }] : /* istanbul ignore next */ []));
4760
+ // Label del input (ej: 'Requisitos')
4761
+ label = input('Seleccionar', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
4762
+ //Delay por defecto
4763
+ delay = input(100, ...(ngDevMode ? [{ debugName: "delay" }] : /* istanbul ignore next */ []));
4764
+ // OBLIGATORIO para la creación automática: nombre de la propiedad ID (ej: 'requisitoId')
4765
+ idKey = input.required(...(ngDevMode ? [{ debugName: "idKey" }] : /* istanbul ignore next */ []));
4766
+ // Opcional para PrimeNG (por defecto toma el valor de idKey para identificar duplicados)
4767
+ dataKey = input('', ...(ngDevMode ? [{ debugName: "dataKey" }] : /* istanbul ignore next */ []));
4768
+ permitirCrear = input(false, ...(ngDevMode ? [{ debugName: "permitirCrear" }] : /* istanbul ignore next */ []));
4769
+ debug = input(false, ...(ngDevMode ? [{ debugName: "debug" }] : /* istanbul ignore next */ []));
4770
+ factoryNuevoRegistro = input(...(ngDevMode ? [undefined, { debugName: "factoryNuevoRegistro" }] : /* istanbul ignore next */ []));
4771
+ // Estado Interno
4772
+ dataFiltrada = signal([], ...(ngDevMode ? [{ debugName: "dataFiltrada" }] : /* istanbul ignore next */ []));
4773
+ value = [];
4774
+ onChange = () => { };
4775
+ onTouched = () => { };
4776
+ disabled = false;
4777
+ searchRequisitos(event) {
4778
+ const inicio = performance.now();
4779
+ const label = this.optionLabel();
4780
+ // FLUJO A: El usuario hizo clic en el botón dropdown (Texto vacío)
4781
+ if (!event.query || event.query.trim() === '') {
4782
+ // Cargamos TODO el universo de datos para que el usuario pueda navegar libremente
4783
+ const todoElUniverso = this.datasource();
4784
+ this.dataFiltrada.set(todoElUniverso);
4785
+ if (this.debug()) {
4786
+ console.log('[DsxAutocomplete] Modo dropdown activo: Mostrando lista completa de registros:', todoElUniverso.length);
4787
+ }
4788
+ return;
4789
+ }
4790
+ // FLUJO B: El usuario está escribiendo (Búsqueda inteligente con límite de 10)
4791
+ const palabrasBuscadas = event.query
4792
+ .toLowerCase()
4793
+ .trim()
4794
+ .split(/\s+/)
4795
+ .filter((palabra) => palabra.length > 0);
4796
+ const filtrados = this.datasource()
4797
+ .filter((item) => {
4798
+ const textoRegistro = String(item[label] || '').toLowerCase();
4799
+ return palabrasBuscadas.every((palabra) => textoRegistro.includes(palabra));
4800
+ })
4801
+ .slice(0, 10); // <-- El límite se aplica estrictamente al escribir
4802
+ this.dataFiltrada.set(filtrados);
4803
+ if (this.debug()) {
4804
+ console.log(`[DsxAutocomplete] Búsqueda inteligente para "${event.query}" tardó ${(performance.now() - inicio).toFixed(2)}ms. Encontrados:`, filtrados.length);
4805
+ }
4806
+ }
4807
+ evaluarYAgregar(event) {
4808
+ const valorInput = event.target.value?.trim();
4809
+ if (!valorInput)
4810
+ return;
4811
+ const sugerencias = this.dataFiltrada();
4812
+ const actuales = this.value || [];
4813
+ const campoId = this.idKey(); // Obtenemos de forma segura el nombre del ID stringificado
4814
+ if (sugerencias.length > 0) {
4815
+ const primeraMatch = sugerencias[0];
4816
+ // Comparamos identidades usando el campoId dinámico
4817
+ const yaExiste = actuales.some((item) => item[campoId] === primeraMatch[campoId]);
4818
+ if (!yaExiste)
4819
+ this.actualizarFormulario([...actuales, primeraMatch]);
4820
+ }
4821
+ else if (this.permitirCrear()) {
4822
+ let nuevo;
4823
+ if (this.factoryNuevoRegistro()) {
4824
+ nuevo = this.factoryNuevoRegistro()(valorInput);
4825
+ }
4826
+ else {
4827
+ // Al estructurar el objeto usando [campoId], garantizamos que viaje con el nombre correcto de tu entidad
4828
+ nuevo = {
4829
+ [campoId]: 0,
4830
+ [this.optionLabel()]: valorInput.toUpperCase(),
4831
+ activo: true,
4832
+ };
4833
+ }
4834
+ this.actualizarFormulario([...actuales, nuevo]);
4835
+ }
4836
+ event.target.value = '';
4837
+ this.dataFiltrada.set([]);
4838
+ }
4839
+ actualizarFormulario(nuevaLista) {
4840
+ this.value = nuevaLista;
4841
+ this.onChange(this.value);
4842
+ if (this.debug())
4843
+ console.log('[DsxAutocomplete] Estado del Formulario Actualizado con Objetos:', this.value);
4844
+ }
4845
+ // --- ControlValueAccessor ---
4846
+ writeValue(value) {
4847
+ this.value = value || [];
4848
+ }
4849
+ registerOnChange(fn) {
4850
+ this.onChange = fn;
4851
+ }
4852
+ registerOnTouched(fn) {
4853
+ this.onTouched = fn;
4854
+ }
4855
+ setDisabledState(isDisabled) {
4856
+ this.disabled = isDisabled;
4857
+ }
4858
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: DsxAutocomplete, deps: [], target: i0.ɵɵFactoryTarget.Component });
4859
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: DsxAutocomplete, isStandalone: true, selector: "dsx-autocomplete", inputs: { datasource: { classPropertyName: "datasource", publicName: "datasource", isSignal: true, isRequired: true, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, idKey: { classPropertyName: "idKey", publicName: "idKey", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, permitirCrear: { classPropertyName: "permitirCrear", publicName: "permitirCrear", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, factoryNuevoRegistro: { classPropertyName: "factoryNuevoRegistro", publicName: "factoryNuevoRegistro", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
4860
+ {
4861
+ provide: NG_VALUE_ACCESSOR,
4862
+ useExisting: forwardRef(() => DsxAutocomplete),
4863
+ multi: true,
4864
+ },
4865
+ ], ngImport: i0, template: "<p-floatlabel variant=\"on\">\r\n <p-autoComplete\r\n fluid\r\n multiple\r\n [dropdown]=\"true\"\r\n [suggestions]=\"dataFiltrada()\"\r\n (completeMethod)=\"searchRequisitos($event)\"\r\n [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange(value)\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled\"\r\n [optionLabel]=\"optionLabel()\"\r\n [dataKey]=\"dataKey() || idKey()\"\r\n (keyup.enter)=\"evaluarYAgregar($event)\"\r\n [delay]=\"delay()\"\r\n >\r\n </p-autoComplete>\r\n <label>{{ label() }}</label>\r\n</p-floatlabel>\r\n", styles: [""], dependencies: [{ kind: "component", type: AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo", "motionOptions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }] });
4866
+ }
4867
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: DsxAutocomplete, decorators: [{
4868
+ type: Component,
4869
+ args: [{ selector: 'dsx-autocomplete', imports: [AutoComplete, FormsModule, FloatLabel], providers: [
4870
+ {
4871
+ provide: NG_VALUE_ACCESSOR,
4872
+ useExisting: forwardRef(() => DsxAutocomplete),
4873
+ multi: true,
4874
+ },
4875
+ ], template: "<p-floatlabel variant=\"on\">\r\n <p-autoComplete\r\n fluid\r\n multiple\r\n [dropdown]=\"true\"\r\n [suggestions]=\"dataFiltrada()\"\r\n (completeMethod)=\"searchRequisitos($event)\"\r\n [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange(value)\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled\"\r\n [optionLabel]=\"optionLabel()\"\r\n [dataKey]=\"dataKey() || idKey()\"\r\n (keyup.enter)=\"evaluarYAgregar($event)\"\r\n [delay]=\"delay()\"\r\n >\r\n </p-autoComplete>\r\n <label>{{ label() }}</label>\r\n</p-floatlabel>\r\n" }]
4876
+ }], propDecorators: { datasource: [{ type: i0.Input, args: [{ isSignal: true, alias: "datasource", required: true }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], idKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "idKey", required: true }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], permitirCrear: [{ type: i0.Input, args: [{ isSignal: true, alias: "permitirCrear", required: false }] }], debug: [{ type: i0.Input, args: [{ isSignal: true, alias: "debug", required: false }] }], factoryNuevoRegistro: [{ type: i0.Input, args: [{ isSignal: true, alias: "factoryNuevoRegistro", required: false }] }] } });
4877
+
4756
4878
  class FileComponent {
4757
4879
  // Inputs
4880
+ existingFile = input(null, ...(ngDevMode ? [{ debugName: "existingFile" }] : /* istanbul ignore next */ []));
4758
4881
  existingFileName = input(null, ...(ngDevMode ? [{ debugName: "existingFileName" }] : /* istanbul ignore next */ []));
4759
4882
  debug = input(false, ...(ngDevMode ? [{ debugName: "debug" }] : /* istanbul ignore next */ []));
4760
4883
  required = input(true, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
@@ -4780,7 +4903,7 @@ class FileComponent {
4780
4903
  hasExistingFile = computed(() => {
4781
4904
  if (!this.isViewActive())
4782
4905
  return false;
4783
- const hasFile = !!this.existingFileName() && !this.isReplacing();
4906
+ const hasFile = !!this.existingFileName() && !this.isReplacing() && !this.existingFile();
4784
4907
  if (this.debug() && this.isViewActive())
4785
4908
  this.log('hasExistingFile', { hasFile });
4786
4909
  return hasFile;
@@ -4964,7 +5087,7 @@ class FileComponent {
4964
5087
  console.log(`[FileComponent] ${method}`, data || '');
4965
5088
  }
4966
5089
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4967
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FileComponent, isStandalone: true, selector: "dsx-file-upload", inputs: { existingFileName: { classPropertyName: "existingFileName", publicName: "existingFileName", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, pTooltipOverride: { classPropertyName: "pTooltipOverride", publicName: "pTooltipOverride", isSignal: true, isRequired: false, transformFunction: null }, tooltipPositionOverride: { classPropertyName: "tooltipPositionOverride", publicName: "tooltipPositionOverride", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, invalidSummary: { classPropertyName: "invalidSummary", publicName: "invalidSummary", isSignal: true, isRequired: false, transformFunction: null }, invalidDetail: { classPropertyName: "invalidDetail", publicName: "invalidDetail", isSignal: true, isRequired: false, transformFunction: null }, invalidSizeSummary: { classPropertyName: "invalidSizeSummary", publicName: "invalidSizeSummary", isSignal: true, isRequired: false, transformFunction: null }, invalidSizeDetail: { classPropertyName: "invalidSizeDetail", publicName: "invalidSizeDetail", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
5090
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FileComponent, isStandalone: true, selector: "dsx-file-upload", inputs: { existingFile: { classPropertyName: "existingFile", publicName: "existingFile", isSignal: true, isRequired: false, transformFunction: null }, existingFileName: { classPropertyName: "existingFileName", publicName: "existingFileName", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, pTooltipOverride: { classPropertyName: "pTooltipOverride", publicName: "pTooltipOverride", isSignal: true, isRequired: false, transformFunction: null }, tooltipPositionOverride: { classPropertyName: "tooltipPositionOverride", publicName: "tooltipPositionOverride", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, invalidSummary: { classPropertyName: "invalidSummary", publicName: "invalidSummary", isSignal: true, isRequired: false, transformFunction: null }, invalidDetail: { classPropertyName: "invalidDetail", publicName: "invalidDetail", isSignal: true, isRequired: false, transformFunction: null }, invalidSizeSummary: { classPropertyName: "invalidSizeSummary", publicName: "invalidSizeSummary", isSignal: true, isRequired: false, transformFunction: null }, invalidSizeDetail: { classPropertyName: "invalidSizeDetail", publicName: "invalidSizeDetail", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
4968
5091
  {
4969
5092
  provide: NG_VALUE_ACCESSOR,
4970
5093
  useExisting: forwardRef(() => FileComponent),
@@ -4975,7 +5098,7 @@ class FileComponent {
4975
5098
  useExisting: forwardRef(() => FileComponent),
4976
5099
  multi: true,
4977
5100
  },
4978
- ], viewQueries: [{ propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (showExistingFile()) {\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"file-name\"> \uD83D\uDCC4 {{ 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", styles: [".file-name{display:inline-block;font-size:clamp(.85rem,1vw + .5rem,1.4rem);font-weight:500;color:#2c3e50;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}\n"], dependencies: [{ kind: "component", type: FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }] });
5101
+ ], viewQueries: [{ propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (showExistingFile() && !existingFile()) {\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"file-name\"> \uD83D\uDCC4 {{ 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() || existingFile()) {\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", styles: [".file-name{display:inline-block;font-size:clamp(.85rem,1vw + .5rem,1.4rem);font-weight:500;color:#2c3e50;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}\n"], dependencies: [{ kind: "component", type: FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }] });
4979
5102
  }
4980
5103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FileComponent, decorators: [{
4981
5104
  type: Component,
@@ -4990,8 +5113,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4990
5113
  useExisting: forwardRef(() => FileComponent),
4991
5114
  multi: true,
4992
5115
  },
4993
- ], template: "@if (showExistingFile()) {\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"file-name\"> \uD83D\uDCC4 {{ 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", styles: [".file-name{display:inline-block;font-size:clamp(.85rem,1vw + .5rem,1.4rem);font-weight:500;color:#2c3e50;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}\n"] }]
4994
- }], ctorParameters: () => [], propDecorators: { existingFileName: [{ type: i0.Input, args: [{ isSignal: true, alias: "existingFileName", required: false }] }], debug: [{ type: i0.Input, args: [{ isSignal: true, alias: "debug", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], pTooltipOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "pTooltipOverride", required: false }] }], tooltipPositionOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipPositionOverride", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], invalidSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidSummary", required: false }] }], invalidDetail: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidDetail", required: false }] }], invalidSizeSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidSizeSummary", required: false }] }], invalidSizeDetail: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidSizeDetail", required: false }] }], fileUpload: [{ type: i0.ViewChild, args: ['fileUpload', { isSignal: true }] }] } });
5116
+ ], template: "@if (showExistingFile() && !existingFile()) {\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"file-name\"> \uD83D\uDCC4 {{ 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() || existingFile()) {\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", styles: [".file-name{display:inline-block;font-size:clamp(.85rem,1vw + .5rem,1.4rem);font-weight:500;color:#2c3e50;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}\n"] }]
5117
+ }], ctorParameters: () => [], propDecorators: { existingFile: [{ type: i0.Input, args: [{ isSignal: true, alias: "existingFile", required: false }] }], existingFileName: [{ type: i0.Input, args: [{ isSignal: true, alias: "existingFileName", required: false }] }], debug: [{ type: i0.Input, args: [{ isSignal: true, alias: "debug", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], pTooltipOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "pTooltipOverride", required: false }] }], tooltipPositionOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipPositionOverride", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], invalidSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidSummary", required: false }] }], invalidDetail: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidDetail", required: false }] }], invalidSizeSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidSizeSummary", required: false }] }], invalidSizeDetail: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidSizeDetail", required: false }] }], fileUpload: [{ type: i0.ViewChild, args: ['fileUpload', { isSignal: true }] }] } });
4995
5118
 
4996
5119
  class JsonHighlightPipe {
4997
5120
  /**
@@ -5114,13 +5237,25 @@ class JsonValuesDebujComponent {
5114
5237
  id = uid();
5115
5238
  subscription;
5116
5239
  changesCount = 0;
5240
+ // Indica si debemos mostrar el componente visualmente
5241
+ get shouldShowVisual() {
5242
+ // Solo mostrar visualmente en modo desarrollo
5243
+ return isDevMode();
5244
+ }
5245
+ // Indica si debemos mostrar logs en consola
5246
+ get shouldShowLogs() {
5247
+ // Solo logs en desarrollo Y cuando debug está explícitamente true
5248
+ return isDevMode() && this.debug() === true;
5249
+ }
5117
5250
  constructor() {
5118
- console.log('CONSTRUCTOR', this.id);
5251
+ if (this.shouldShowLogs) {
5252
+ console.log('[JsonDebug] CONSTRUCTOR', this.id);
5253
+ }
5119
5254
  effect((onCleanup) => {
5120
5255
  const form = this.form();
5121
5256
  if (!form)
5122
- return; // 👈 CLAVE
5123
- if (this.debug()) {
5257
+ return;
5258
+ if (this.shouldShowLogs) {
5124
5259
  console.log(`[json-debug:${this.id}] EFFECT INIT`, {
5125
5260
  controls: Object.keys(form.controls).length,
5126
5261
  });
@@ -5129,6 +5264,12 @@ class JsonValuesDebujComponent {
5129
5264
  this.debugValue.set(form.getRawValue());
5130
5265
  this.subscription = form.valueChanges.subscribe(() => {
5131
5266
  this.debugValue.set(form.getRawValue());
5267
+ if (this.shouldShowLogs) {
5268
+ this.changesCount++;
5269
+ console.log(`[json-debug:${this.id}] CHANGE #${this.changesCount}`, {
5270
+ formValue: form.getRawValue(),
5271
+ });
5272
+ }
5132
5273
  });
5133
5274
  onCleanup(() => {
5134
5275
  this.subscription?.unsubscribe();
@@ -5136,20 +5277,22 @@ class JsonValuesDebujComponent {
5136
5277
  });
5137
5278
  }
5138
5279
  ngOnDestroy() {
5139
- console.log('DESTROY', this.id);
5280
+ if (this.shouldShowLogs) {
5281
+ console.log('[JsonDebug] DESTROY', this.id);
5282
+ }
5140
5283
  this.subscription?.unsubscribe();
5141
- if (this.debug()) {
5142
- console.log(`[json-debug:${this.id}] DESTROY`, {
5284
+ if (this.shouldShowLogs) {
5285
+ console.log(`[json-debug:${this.id}] DESTROY SUMMARY`, {
5143
5286
  totalChanges: this.changesCount,
5144
5287
  });
5145
5288
  }
5146
5289
  }
5147
5290
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: JsonValuesDebujComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: JsonValuesDebujComponent, isStandalone: true, selector: "app-json-values-debuj", inputs: { form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@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", styles: [".custom-container{width:100%;overflow:auto;max-height:700px;background:#1e1e1e;border:1px solid #333;border-radius:8px;padding:1rem;margin-bottom:1rem}.custom-pre{margin:0;white-space:pre-wrap;word-break:break-word;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.55;color:#d4d4d4}.json-key{color:#9cdcfe;font-weight:600}.json-string{color:#ce9178}.json-number{color:#b5cea8;font-weight:600}.json-boolean{color:#569cd6;font-weight:700}.json-null{color:gray;font-style:italic}.json-bracket{color:gold;font-weight:700}.json-colon{color:#d4d4d4}.json-comma{color:gray}.json-date-part{color:#4fc1ff;font-weight:600}.json-date-sep{color:gray}.json-date-time{color:#c586c0}.custom-container::-webkit-scrollbar{width:10px;height:10px}.custom-container::-webkit-scrollbar-track{background:#252526}.custom-container::-webkit-scrollbar-thumb{background:#555;border-radius:6px}.custom-container::-webkit-scrollbar-thumb:hover{background:#777}\n"], dependencies: [{ kind: "pipe", type: JsonHighlightPipe, name: "jsonHighlight" }], encapsulation: i0.ViewEncapsulation.None });
5291
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: JsonValuesDebujComponent, isStandalone: true, selector: "app-json-values-debuj", inputs: { form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (form() && shouldShowVisual) {\r\n <div class=\"custom-container\">\r\n <pre class=\"custom-pre\" [innerHTML]=\"debugValue() | jsonHighlight\"></pre>\r\n </div>\r\n}\r\n", styles: [".custom-container{width:100%;overflow:auto;max-height:700px;background:#1e1e1e;border:1px solid #333;border-radius:8px;box-shadow:0 4px 12px #0000004d;padding:1.25rem;margin-bottom:1.25rem}.custom-pre{margin:0;white-space:pre-wrap;word-break:break-word;word-wrap:break-word;font-family:Segoe UI,Fira Code,JetBrains Mono,Consolas,Monaco,Courier New,monospace;font-size:15px;line-height:1.65;color:#d4d4d4;font-weight:400}.json-key{color:#9cdcfe;font-weight:600;font-size:15px}.json-string{color:#ce9178;font-size:15px}.json-number{color:#b5cea8;font-weight:600;font-size:15px}.json-boolean{color:#569cd6;font-weight:700;font-size:15px}.json-null{color:gray;font-style:italic;font-size:15px}.json-bracket{color:gold;font-weight:700;font-size:16px}.json-colon{color:#d4d4d4;font-weight:500}.json-comma{color:gray;font-size:14px}.json-date-part{color:#4fc1ff;font-weight:600;font-size:15px}.json-date-sep{color:gray}.json-date-time{color:#c586c0;font-size:15px}.custom-container::-webkit-scrollbar{width:12px;height:12px}.custom-container::-webkit-scrollbar-track{background:#252526;border-radius:6px}.custom-container::-webkit-scrollbar-thumb{background:#555;border-radius:6px;transition:background .2s ease}.custom-container::-webkit-scrollbar-thumb:hover{background:#777}.custom-container::-webkit-scrollbar-corner{background:#1e1e1e}.custom-container{font-smooth:antialiased;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-pre:hover{background:#252526;transition:background .2s ease;cursor:text}.json-null,.json-undefined{color:#f48771;font-style:italic;opacity:.8}.json-empty{color:gray;font-style:italic}.json-comma+br{margin-bottom:2px}\n"], dependencies: [{ kind: "pipe", type: JsonHighlightPipe, name: "jsonHighlight" }], encapsulation: i0.ViewEncapsulation.None });
5149
5292
  }
5150
5293
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: JsonValuesDebujComponent, decorators: [{
5151
5294
  type: Component,
5152
- args: [{ selector: 'app-json-values-debuj', standalone: true, imports: [JsonHighlightPipe], encapsulation: ViewEncapsulation.None, template: "@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", styles: [".custom-container{width:100%;overflow:auto;max-height:700px;background:#1e1e1e;border:1px solid #333;border-radius:8px;padding:1rem;margin-bottom:1rem}.custom-pre{margin:0;white-space:pre-wrap;word-break:break-word;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.55;color:#d4d4d4}.json-key{color:#9cdcfe;font-weight:600}.json-string{color:#ce9178}.json-number{color:#b5cea8;font-weight:600}.json-boolean{color:#569cd6;font-weight:700}.json-null{color:gray;font-style:italic}.json-bracket{color:gold;font-weight:700}.json-colon{color:#d4d4d4}.json-comma{color:gray}.json-date-part{color:#4fc1ff;font-weight:600}.json-date-sep{color:gray}.json-date-time{color:#c586c0}.custom-container::-webkit-scrollbar{width:10px;height:10px}.custom-container::-webkit-scrollbar-track{background:#252526}.custom-container::-webkit-scrollbar-thumb{background:#555;border-radius:6px}.custom-container::-webkit-scrollbar-thumb:hover{background:#777}\n"] }]
5295
+ args: [{ selector: 'app-json-values-debuj', standalone: true, imports: [JsonHighlightPipe], encapsulation: ViewEncapsulation.None, template: "@if (form() && shouldShowVisual) {\r\n <div class=\"custom-container\">\r\n <pre class=\"custom-pre\" [innerHTML]=\"debugValue() | jsonHighlight\"></pre>\r\n </div>\r\n}\r\n", styles: [".custom-container{width:100%;overflow:auto;max-height:700px;background:#1e1e1e;border:1px solid #333;border-radius:8px;box-shadow:0 4px 12px #0000004d;padding:1.25rem;margin-bottom:1.25rem}.custom-pre{margin:0;white-space:pre-wrap;word-break:break-word;word-wrap:break-word;font-family:Segoe UI,Fira Code,JetBrains Mono,Consolas,Monaco,Courier New,monospace;font-size:15px;line-height:1.65;color:#d4d4d4;font-weight:400}.json-key{color:#9cdcfe;font-weight:600;font-size:15px}.json-string{color:#ce9178;font-size:15px}.json-number{color:#b5cea8;font-weight:600;font-size:15px}.json-boolean{color:#569cd6;font-weight:700;font-size:15px}.json-null{color:gray;font-style:italic;font-size:15px}.json-bracket{color:gold;font-weight:700;font-size:16px}.json-colon{color:#d4d4d4;font-weight:500}.json-comma{color:gray;font-size:14px}.json-date-part{color:#4fc1ff;font-weight:600;font-size:15px}.json-date-sep{color:gray}.json-date-time{color:#c586c0;font-size:15px}.custom-container::-webkit-scrollbar{width:12px;height:12px}.custom-container::-webkit-scrollbar-track{background:#252526;border-radius:6px}.custom-container::-webkit-scrollbar-thumb{background:#555;border-radius:6px;transition:background .2s ease}.custom-container::-webkit-scrollbar-thumb:hover{background:#777}.custom-container::-webkit-scrollbar-corner{background:#1e1e1e}.custom-container{font-smooth:antialiased;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-pre:hover{background:#252526;transition:background .2s ease;cursor:text}.json-null,.json-undefined{color:#f48771;font-style:italic;opacity:.8}.json-empty{color:gray;font-style:italic}.json-comma+br{margin-bottom:2px}\n"] }]
5153
5296
  }], ctorParameters: () => [], propDecorators: { form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: false }] }], debug: [{ type: i0.Input, args: [{ isSignal: true, alias: "debug", required: false }] }] } });
5154
5297
 
5155
5298
  class IcoLabel {
@@ -7469,6 +7612,7 @@ const httpAuthorizeInterceptor = (req, next) => {
7469
7612
  return next(authReq).pipe(
7470
7613
  // Manejo de errores en la respuesta
7471
7614
  catchError((error) => {
7615
+ //console.log('Interceptor - Error HTTP detectado:', error);
7472
7616
  // Si el error es 401 (no autorizado), intenta refrescar el token
7473
7617
  if (error.status === HttpStatusCode.Unauthorized) {
7474
7618
  const refreshToken = _authorizeService.getTokenRefresh();
@@ -7522,6 +7666,21 @@ const httpAuthorizeInterceptor = (req, next) => {
7522
7666
  }))));
7523
7667
  }
7524
7668
  }
7669
+ if (error.status === 0) {
7670
+ //console.error('❌ Servidor de seguridad no disponible', error);
7671
+ const refreshError = new HttpErrorResponse({
7672
+ status: HttpStatusCode.Unauthorized,
7673
+ statusText: 'El servicio de seguridad no está disponible',
7674
+ error: 'No se pudo conectar al servicio de seguridad para refrescar el token. Por favor, inténtalo de nuevo más tarde.',
7675
+ url: req.url,
7676
+ });
7677
+ // Enviamos el error al manejador centralizado para mostrar el mensaje al usuario
7678
+ return _handleErrorService.handleErrorResponse(refreshError);
7679
+ }
7680
+ // console.log(
7681
+ // 'Interceptor - Error HTTP no relacionado con autorización:',
7682
+ // error,
7683
+ // );
7525
7684
  // Para otros errores, delega al servicio de manejo de errores
7526
7685
  return _handleErrorService.handleErrorResponse(error);
7527
7686
  }),
@@ -8668,6 +8827,7 @@ class ResultResponseService {
8668
8827
  if (!Array.isArray(data) || data.length === 0) {
8669
8828
  return '';
8670
8829
  }
8830
+ //console.log('Data recibida para construir la guía asociada:', data); // Depuración: Verificar el formato de los datos
8671
8831
  const itemsHtml = data
8672
8832
  .map((item) => {
8673
8833
  const cantidadRegistros = String(item?.cantidadRegistros ?? '0');
@@ -8731,6 +8891,10 @@ function containsFile(obj) {
8731
8891
  * Convierte un objeto plano a una instancia de FormData compatible con ASP.NET Core [FromForm].
8732
8892
  * Desglosa automáticamente arreglos primitivos, archivos sueltos y FileLists.
8733
8893
  */
8894
+ /**
8895
+ * Convierte un objeto a FormData compatible con ASP.NET Core
8896
+ * Maneja: primitivos, archivos, arreglos primitivos, arreglos de objetos complejos
8897
+ */
8734
8898
  function toFormData(obj) {
8735
8899
  const formData = new FormData();
8736
8900
  Object.keys(obj).forEach((key) => {
@@ -8739,19 +8903,41 @@ function toFormData(obj) {
8739
8903
  if (value === null || value === undefined) {
8740
8904
  return;
8741
8905
  }
8742
- // CASO 1: Es un Arreglo (int[], string[], File[])
8906
+ // CASO 1: Es un Arreglo
8743
8907
  if (Array.isArray(value)) {
8744
- value.forEach((item) => {
8745
- if (item instanceof File || item instanceof Blob) {
8746
- formData.append(key, item);
8747
- }
8748
- else if (item !== null && item !== undefined) {
8749
- // Envía múltiples llaves repetidas con el mismo nombre
8750
- formData.append(key, String(item));
8751
- }
8752
- });
8908
+ // Si el arreglo está vacío, lo ignoramos
8909
+ if (value.length === 0)
8910
+ return;
8911
+ // Verificar si es un arreglo de objetos complejos (no primitivos ni archivos)
8912
+ const isComplexArray = value.every((item) => item !== null &&
8913
+ item !== undefined &&
8914
+ typeof item === 'object' &&
8915
+ !(item instanceof File) &&
8916
+ !(item instanceof Blob));
8917
+ if (isComplexArray) {
8918
+ // CASO 1A: Arreglo de objetos complejos → formato clave[índice].propiedad
8919
+ value.forEach((item, index) => {
8920
+ Object.keys(item).forEach((subKey) => {
8921
+ const subValue = item[subKey];
8922
+ if (subValue !== null && subValue !== undefined) {
8923
+ formData.append(`${key}[${index}].${subKey}`, subValue instanceof File ? subValue : String(subValue));
8924
+ }
8925
+ });
8926
+ });
8927
+ }
8928
+ else {
8929
+ // CASO 1B: Arreglo de primitivos o archivos
8930
+ value.forEach((item) => {
8931
+ if (item instanceof File || item instanceof Blob) {
8932
+ formData.append(key, item);
8933
+ }
8934
+ else if (item !== null && item !== undefined) {
8935
+ formData.append(key, String(item));
8936
+ }
8937
+ });
8938
+ }
8753
8939
  }
8754
- // CASO 2: Es un FileList (Múltiples archivos desde un input html)
8940
+ // CASO 2: FileList
8755
8941
  else if (value instanceof FileList) {
8756
8942
  for (let i = 0; i < value.length; i++) {
8757
8943
  const file = value.item(i);
@@ -8759,11 +8945,15 @@ function toFormData(obj) {
8759
8945
  formData.append(key, file);
8760
8946
  }
8761
8947
  }
8762
- // CASO 3: Es un único Archivo o Blob
8948
+ // CASO 3: Archivo único
8763
8949
  else if (value instanceof File || value instanceof Blob) {
8764
8950
  formData.append(key, value);
8765
8951
  }
8766
- // CASO 4: Tipos primitivos ordinarios (string, number, boolean)
8952
+ // CASO 4: Objeto complejo (no arreglo, no archivo)
8953
+ else if (typeof value === 'object') {
8954
+ formData.append(key, JSON.stringify(value));
8955
+ }
8956
+ // CASO 5: Tipos primitivos
8767
8957
  else {
8768
8958
  formData.append(key, String(value));
8769
8959
  }
@@ -9256,7 +9446,7 @@ class FormPreviewService {
9256
9446
  ${cells
9257
9447
  .map((cell, i) => `
9258
9448
  <tr style="border-bottom: ${i < cells.length - 1 ? '0.5px solid #f1f3f5' : 'none'}">
9259
- <td style="padding: 6px 12px; background: #f8f9fa; width: 130px; color: #6c757d; border-right: 0.5px solid #f1f3f5;">
9449
+ <td style="padding: 6px 12px; background: #f8f9fa; text-transform: uppercase; width: auto; color: #6c757d; border-right: 0.5px solid #f1f3f5;">
9260
9450
  ${this.escapeHtml(cell.label)}
9261
9451
  </td>
9262
9452
  <td style="padding: 6px 12px; color: #212529; font-weight: 500;">
@@ -9470,7 +9660,7 @@ class TablePreviewService {
9470
9660
  : ''}
9471
9661
  ${showLabel
9472
9662
  ? `
9473
- <td style="padding: 6px 8px; background: #f8f9fa; width: 130px; color: #6c757d; border-right: 0.5px solid #f1f3f5;">
9663
+ <td style="padding: 6px 8px; background: #f8f9fa; text-transform: uppercase; width: auto; color: #6c757d; border-right: 0.5px solid #f1f3f5;">
9474
9664
  ${this.escapeHtml(cell.label)}
9475
9665
  </td>
9476
9666
  `
@@ -10190,5 +10380,5 @@ function sorensenDiceValidator(dataSource, key, umbral = 0.7) {
10190
10380
  * Generated bundle index. Do not edit.
10191
10381
  */
10192
10382
 
10193
- export { ACTION_TYPES, AlertaService, AppMessageErrorComponent, AppMessageHelpComponent, ArrowNavigationDirective, AuthorizeService, AutoScrollHeightDirective, BaseCRUDService, CACHE_KEYS, CacheService, CssV2Component, DSX_PALETTE, DateIndicator, DocxPreviewComponent, DsxAddToolsModule, DsxButtonComponent, DsxEnableDisable, DsxMessagesService, DsxStatusToggle, DteService, ENVIRONMENT, EndpointService, ErrorHandlerService, FileComponent, FormPreviewService, GTQFormatter, HeaderDsx, HelpersService, HttpHelpersService, INITIAL_PARAMETERS, IcoLabel, IconDsxComponent, JoinByPipe, JsonHighlightPipe, JsonValuesDebujComponent, JsonViewerComponent, KpicardComponent, LoadingComponent, LoadingLottieComponent, LogoDsxComponent, MasterDetailChangeService, NavbarDsxComponent, NetworkStatusComponent, OnlyRangoPatternDirective, ParameterValuesService, PdfPreviewComponent, PrimeNgModule, QrGenerator, ResultFileService, SWEET_ALERT_THEMES, ScreenInspector, SecurityService, SelectAllOnFocusDirective, SpinnerLoadingService, SweetAlert2DialogService, TablePreviewService, TemplateHighlight, TokenPurposeLogin, TruncatePipe, UtilityAddService, asyncExistsValidator, atLeastOneFieldRequiredValidator, chainControlGroups, createCurrencyFormatter, createInitialCache, createTypedCacheProvider, cuiValidator, dateMinMaxValidator, dateRangeValidator, dateRangeValidatorFromTo, developmentEnvironment, getActionMessageConfig, getZeroBasedRolIndex, guardTokenPurposeGuard, httpAuthorizeInterceptor, minimumAgeValidator, nitValidator, productionEnvironment, provideEnvironment, sorensenDiceValidator, templateStructureValidator, templateVariablesValidator, validateEnvironmentConfig };
10383
+ export { ACTION_TYPES, AlertaService, AppMessageErrorComponent, AppMessageHelpComponent, ArrowNavigationDirective, AuthorizeService, AutoScrollHeightDirective, BaseCRUDService, CACHE_KEYS, CacheService, CssV2Component, DSX_PALETTE, DateIndicator, DocxPreviewComponent, DsxAddToolsModule, DsxAutocomplete, DsxButtonComponent, DsxEnableDisable, DsxMessagesService, DsxStatusToggle, DteService, ENVIRONMENT, EndpointService, ErrorHandlerService, FileComponent, FormPreviewService, GTQFormatter, HeaderDsx, HelpersService, HttpHelpersService, INITIAL_PARAMETERS, IcoLabel, IconDsxComponent, JoinByPipe, JsonHighlightPipe, JsonValuesDebujComponent, JsonViewerComponent, KpicardComponent, LoadingComponent, LoadingLottieComponent, LogoDsxComponent, MasterDetailChangeService, NavbarDsxComponent, NetworkStatusComponent, OnlyRangoPatternDirective, ParameterValuesService, PdfPreviewComponent, PrimeNgModule, QrGenerator, ResultFileService, SWEET_ALERT_THEMES, ScreenInspector, SecurityService, SelectAllOnFocusDirective, SpinnerLoadingService, SweetAlert2DialogService, TablePreviewService, TemplateHighlight, TokenPurposeLogin, TruncatePipe, UtilityAddService, asyncExistsValidator, atLeastOneFieldRequiredValidator, chainControlGroups, createCurrencyFormatter, createInitialCache, createTypedCacheProvider, cuiValidator, dateMinMaxValidator, dateRangeValidator, dateRangeValidatorFromTo, developmentEnvironment, getActionMessageConfig, getZeroBasedRolIndex, guardTokenPurposeGuard, httpAuthorizeInterceptor, minimumAgeValidator, nitValidator, productionEnvironment, provideEnvironment, sorensenDiceValidator, templateStructureValidator, templateVariablesValidator, validateEnvironmentConfig };
10194
10384
  //# sourceMappingURL=ngx-dsxlibrary.mjs.map