@solcre-org/core-ui 2.15.31 → 2.15.33

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.
@@ -142,7 +142,7 @@
142
142
  },
143
143
  "scheduler": {
144
144
  "rooms": "Meeting room booking",
145
- "people": "personas",
145
+ "people": "empleados",
146
146
  "january": "Enero",
147
147
  "february": "Febrero",
148
148
  "march": "Marzo",
@@ -798,8 +798,8 @@
798
798
  }
799
799
  },
800
800
  "peoples": {
801
- "title": "Personas",
802
- "list": "Lista de personas",
801
+ "title": "Empleados",
802
+ "list": "Lista de empleados",
803
803
  "name": "Name",
804
804
  "id": "ID",
805
805
  "full_name": "Name completo",
@@ -879,7 +879,7 @@
879
879
  "company_azf_procedure": "Planilla de procedimiento AZF",
880
880
  "company_legals": "Planilla de legales",
881
881
  "file_template": "Plantilla",
882
- "company_employees_bulk": "Planilla de carga masiva de personas"
882
+ "company_employees_bulk": "Planilla de carga masiva de empleados"
883
883
  },
884
884
  "name_placeholder": "Ingrese el nombre de la plantilla",
885
885
  "details_placeholder": "Ingrese los detalles de la plantilla",
@@ -906,13 +906,13 @@
906
906
  "title": "Onboarding",
907
907
  "subnav": {
908
908
  "company_data": "Datos de la empresa",
909
- "people": "Personas",
909
+ "people": "Empleados",
910
910
  "status_process": "Status proceso ingreso",
911
911
  "documentation": "Documentación",
912
912
  "templates": "Plantillas"
913
913
  },
914
914
  "company_data_hint": "Por favor complete los datos de la empresa para poder iniciar el proceso de Onboarding.",
915
- "people_hint": "Puede empezar a cargar individualmente personas a su empresa a través del formulario, o masivamente usando la planilla"
915
+ "people_hint": "Puede empezar a cargar individualmente empleados a su empresa a través del formulario, o masivamente usando la planilla"
916
916
  },
917
917
  "company-data": {
918
918
  "general": {
@@ -960,9 +960,9 @@
960
960
  }
961
961
  },
962
962
  "peoples": {
963
- "charge_people": "Carga de personas",
964
- "masive_charge": "Carga masiva de personas",
965
- "charged_peoples": "Personas cargadas",
963
+ "charge_people": "Carga de empleados",
964
+ "masive_charge": "Carga masiva de empleados",
965
+ "charged_peoples": "Empleados cargadas",
966
966
  "first_name": "Name",
967
967
  "last_name": "Apellido",
968
968
  "document": "Documento",
@@ -993,7 +993,7 @@
993
993
  "is_emergency_contact": "Es contacto de emergencia",
994
994
  "mailbox_access": "Acceso a buzonera",
995
995
  "uses_garage": "Utiliza cochera",
996
- "file": "Personas a subir",
996
+ "file": "Empleados a subir",
997
997
  "file_placeholder": "Seleccione el archivo",
998
998
  "file_required": "El archivo es requerido",
999
999
  "massive_charge_description": "Utilice el siguiente documento como base para cargar masivamente:",
@@ -144,7 +144,7 @@
144
144
  },
145
145
  "scheduler": {
146
146
  "rooms": "Reserva de salas",
147
- "people": "personas",
147
+ "people": "empleados",
148
148
  "january": "Enero",
149
149
  "february": "Febrero",
150
150
  "march": "Marzo",
@@ -410,7 +410,8 @@
410
410
  "waste_collection_type_options": {
411
411
  "none": "Ninguno",
412
412
  "morning": "Matutino",
413
- "evening": "Vespertino"
413
+ "evening": "Vespertino",
414
+ "both": "Ambos"
414
415
  },
415
416
  "waste_collection_days": {
416
417
  "monday": "Lunes",
@@ -801,8 +802,8 @@
801
802
  }
802
803
  },
803
804
  "peoples": {
804
- "title": "Personas",
805
- "list": "Lista de personas",
805
+ "title": "Empleados",
806
+ "list": "Lista de empleados",
806
807
  "name": "Nombre",
807
808
  "id": "ID",
808
809
  "full_name": "Nombre completo",
@@ -883,7 +884,7 @@
883
884
  "company_azf_procedure": "Planilla de procedimiento AZF",
884
885
  "company_legals": "Planilla de legales",
885
886
  "file_template": "Plantilla",
886
- "company_employees_bulk": "Planilla de carga masiva de personas"
887
+ "company_employees_bulk": "Planilla de carga masiva de empleados"
887
888
  },
888
889
  "name_placeholder": "Ingrese el nombre de la plantilla",
889
890
  "details_placeholder": "Ingrese los detalles de la plantilla",
@@ -910,13 +911,13 @@
910
911
  "title": "Onboarding",
911
912
  "subnav": {
912
913
  "company_data": "Datos de la empresa",
913
- "people": "Personas",
914
+ "people": "Empleados",
914
915
  "status_process": "Status proceso ingreso",
915
916
  "documentation": "Documentación",
916
917
  "templates": "Plantillas"
917
918
  },
918
919
  "company_data_hint": "Por favor complete los datos de la empresa para poder iniciar el proceso de Onboarding.",
919
- "people_hint": "Puede empezar a cargar individualmente personas a su empresa a través del formulario, o masivamente usando la planilla"
920
+ "people_hint": "Puede empezar a cargar individualmente empleados a su empresa a través del formulario, o masivamente usando la planilla"
920
921
  },
921
922
  "company-data": {
922
923
  "general": {
@@ -964,9 +965,9 @@
964
965
  }
965
966
  },
966
967
  "peoples": {
967
- "charge_people": "Carga de personas",
968
- "masive_charge": "Carga masiva de personas",
969
- "charged_peoples": "Personas cargadas",
968
+ "charge_people": "Carga de empleados",
969
+ "masive_charge": "Carga masiva de empleados",
970
+ "charged_peoples": "Empleados cargadas",
970
971
  "first_name": "Nombre",
971
972
  "last_name": "Apellido",
972
973
  "document": "Documento",
@@ -997,7 +998,7 @@
997
998
  "is_emergency_contact": "Es contacto de emergencia",
998
999
  "mailbox_access": "Acceso a buzonera",
999
1000
  "uses_garage": "Utiliza cochera",
1000
- "file": "Personas a subir",
1001
+ "file": "Empleados a subir",
1001
1002
  "file_placeholder": "Seleccione el archivo",
1002
1003
  "file_required": "El archivo es requerido",
1003
1004
  "massive_charge_description": "Utilice el siguiente documento como base para cargar masivamente:",
@@ -570,6 +570,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
570
570
 
571
571
  class DateFieldComponent extends BaseFieldComponent {
572
572
  elementRef;
573
+ isPickerOpen = false;
573
574
  minDate = computed(() => {
574
575
  const fieldCfg = this.field();
575
576
  const dateConfig = fieldCfg.dateConfig;
@@ -665,8 +666,12 @@ class DateFieldComponent extends BaseFieldComponent {
665
666
  initializeDateInput() {
666
667
  const input = this.elementRef.nativeElement.querySelector('input[type="date"]');
667
668
  if (input) {
668
- input.addEventListener('click', this.showDatePicker.bind(this));
669
- input.addEventListener('focus', this.showDatePicker.bind(this));
669
+ input.addEventListener('blur', () => {
670
+ this.isPickerOpen = false;
671
+ });
672
+ input.addEventListener('change', () => {
673
+ this.isPickerOpen = false;
674
+ });
670
675
  input.addEventListener('input', this.updateHasValue.bind(this));
671
676
  this.updateHasValue({ target: input });
672
677
  }
@@ -674,19 +679,27 @@ class DateFieldComponent extends BaseFieldComponent {
674
679
  removeDateInputListeners() {
675
680
  const input = this.elementRef.nativeElement.querySelector('input[type="date"]');
676
681
  if (input) {
677
- input.removeEventListener('click', this.showDatePicker.bind(this));
678
- input.removeEventListener('focus', this.showDatePicker.bind(this));
682
+ input.removeEventListener('blur', () => {
683
+ this.isPickerOpen = false;
684
+ });
685
+ input.removeEventListener('change', () => {
686
+ this.isPickerOpen = false;
687
+ });
679
688
  input.removeEventListener('input', this.updateHasValue.bind(this));
680
689
  }
681
690
  }
682
- showDatePicker(event) {
683
- const input = event.target;
684
- try {
685
- if (input.showPicker && typeof input.showPicker === 'function') {
686
- input.showPicker();
691
+ showDatePicker(input) {
692
+ if (!this.isPickerOpen) {
693
+ try {
694
+ if (input.showPicker && typeof input.showPicker === 'function') {
695
+ input.showPicker();
696
+ this.isPickerOpen = true;
697
+ }
698
+ }
699
+ catch (error) {
700
+ this.isPickerOpen = false;
687
701
  }
688
702
  }
689
- catch (error) { }
690
703
  }
691
704
  updateHasValue(event) {
692
705
  if (event.target.value) {
@@ -700,13 +713,19 @@ class DateFieldComponent extends BaseFieldComponent {
700
713
  this.onBlur();
701
714
  }
702
715
  onCalendarClick(event) {
716
+ event.preventDefault();
717
+ event.stopPropagation();
703
718
  const button = event.target;
704
719
  const input = button?.closest('.c-entry-input')?.querySelector('input[type="date"]');
705
- if (input && input.showPicker && typeof input.showPicker === 'function') {
706
- try {
707
- input.showPicker();
720
+ if (input) {
721
+ if (this.isPickerOpen) {
722
+ input.blur();
723
+ this.isPickerOpen = false;
724
+ }
725
+ else {
726
+ input.focus();
727
+ this.showDatePicker(input);
708
728
  }
709
- catch (error) { }
710
729
  }
711
730
  }
712
731
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DateFieldComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
@@ -4984,9 +5003,11 @@ class MultiEntryFieldComponent {
4984
5003
  valueChange = output();
4985
5004
  onBlurEvent = output();
4986
5005
  onEnterEvent = output();
5006
+ hasErrors = output();
4987
5007
  ModalMode = ModalMode;
4988
5008
  entries = signal([]);
4989
5009
  fieldValues = signal([]);
5010
+ entryErrors = signal(new Map());
4990
5011
  isSyncingFromInput = signal(false);
4991
5012
  lastInputSignature = null;
4992
5013
  lastEmittedSignature = null;
@@ -5087,6 +5108,11 @@ class MultiEntryFieldComponent {
5087
5108
  if (matchesLastEmitted) {
5088
5109
  this.lastEmittedSignature = signature;
5089
5110
  }
5111
+ newEntries.forEach((entry, index) => {
5112
+ if (entry.value !== null && entry.value !== undefined && entry.value !== '') {
5113
+ this.validateEntry(entry.value, index);
5114
+ }
5115
+ });
5090
5116
  }
5091
5117
  finally {
5092
5118
  this.isSyncingFromInput.set(false);
@@ -5116,6 +5142,18 @@ class MultiEntryFieldComponent {
5116
5142
  const newValues = currentValues.filter((_, i) => i !== index);
5117
5143
  this.entries.set(newEntries);
5118
5144
  this.fieldValues.set(newValues);
5145
+ const currentErrors = new Map(this.entryErrors());
5146
+ const newErrors = new Map();
5147
+ currentErrors.forEach((errors, idx) => {
5148
+ if (idx < index) {
5149
+ newErrors.set(idx, errors);
5150
+ }
5151
+ else if (idx > index) {
5152
+ newErrors.set(idx - 1, errors);
5153
+ }
5154
+ });
5155
+ this.entryErrors.set(newErrors);
5156
+ this.hasErrors.emit(newErrors.size > 0);
5119
5157
  }
5120
5158
  }
5121
5159
  onFieldValueChange(value, index) {
@@ -5125,6 +5163,43 @@ class MultiEntryFieldComponent {
5125
5163
  const currentEntries = [...this.entries()];
5126
5164
  currentEntries[index].value = value;
5127
5165
  this.entries.set(currentEntries);
5166
+ this.validateEntry(value, index);
5167
+ }
5168
+ validateEntry(value, index) {
5169
+ const validators = this.getCurrentValidators();
5170
+ const errors = [];
5171
+ for (const validator of validators) {
5172
+ const control = { value };
5173
+ const validationResult = validator(control);
5174
+ if (validationResult) {
5175
+ const errorKeys = Object.keys(validationResult);
5176
+ const baseField = this.field();
5177
+ for (const errorKey of errorKeys) {
5178
+ const errorMessage = baseField.errorMessages?.[errorKey];
5179
+ if (errorMessage) {
5180
+ errors.push(errorMessage);
5181
+ }
5182
+ else {
5183
+ errors.push(`Validation error: ${errorKey}`);
5184
+ }
5185
+ }
5186
+ }
5187
+ }
5188
+ const currentErrors = new Map(this.entryErrors());
5189
+ if (errors.length > 0) {
5190
+ currentErrors.set(index, errors);
5191
+ }
5192
+ else {
5193
+ currentErrors.delete(index);
5194
+ }
5195
+ this.entryErrors.set(currentErrors);
5196
+ this.hasErrors.emit(currentErrors.size > 0);
5197
+ }
5198
+ getEntryErrors(index) {
5199
+ return this.entryErrors().get(index) || [];
5200
+ }
5201
+ hasAnyErrors() {
5202
+ return this.entryErrors().size > 0;
5128
5203
  }
5129
5204
  onFieldBlur(fieldKey) {
5130
5205
  this.onBlurEvent.emit(fieldKey);
@@ -5217,7 +5292,7 @@ class MultiEntryFieldComponent {
5217
5292
  }
5218
5293
  }
5219
5294
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MultiEntryFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5220
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: MultiEntryFieldComponent, isStandalone: true, selector: "core-multi-entry-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: false, transformFunction: null }, formValue: { classPropertyName: "formValue", publicName: "formValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", onBlurEvent: "onBlurEvent", onEnterEvent: "onEnterEvent" }, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-group\">\n @for (entry of entries(); track entry.id; let index = $index) {\n <div class=\"c-entry-item\">\n <!-- Campo din\u00E1mico para cada entrada -->\n <div\n coreDynamicField\n [field]=\"createFieldConfigForEntry(index)\"\n [value]=\"entry.value\"\n [mode]=\"mode()\"\n [errors]=\"errors()\"\n [rowData]=\"rowData()\"\n [formValue]=\"formValue()\"\n (valueChange)=\"onFieldValueChange($event, index)\"\n (onBlurEvent)=\"onFieldBlur($event)\"\n (onEnterEvent)=\"onFieldEnter($event)\">\n </div>\n\n <!-- Botones de acci\u00F3n (agregar/eliminar) -->\n @if (shouldShowActions(index)) {\n <div class=\"c-entry-actions\">\n @if (shouldShowAddButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--add\"\n (click)=\"addEntry()\"\n [disabled]=\"isDisabled()\"\n [title]=\"addLabel() | translate\"\n [attr.aria-label]=\"addLabel() | translate\">\n <span class=\"icon-counter-up\"></span>\n {{ addLabel() | translate }}\n </button>\n }\n \n @if (shouldShowRemoveButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--remove\"\n (click)=\"removeEntry(index)\"\n [disabled]=\"isDisabled()\"\n [title]=\"removeLabel() | translate\"\n [attr.aria-label]=\"removeLabel() | translate\">\n <span class=\"icon-counter-down\"></span>\n {{ removeLabel() | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Errores del campo principal -->\n @if (errors().length > 0) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "directive", type: DynamicFieldDirective, selector: "[coreDynamicField]", inputs: ["field", "value", "mode", "errors", "rowData", "formValue"], outputs: ["valueChange", "onBlurEvent", "onEnterEvent", "selectionChange"] }, { kind: "component", type: FieldErrorsComponent, selector: "core-field-errors", inputs: ["errors"] }] });
5295
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: MultiEntryFieldComponent, isStandalone: true, selector: "core-multi-entry-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: false, transformFunction: null }, formValue: { classPropertyName: "formValue", publicName: "formValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", onBlurEvent: "onBlurEvent", onEnterEvent: "onEnterEvent", hasErrors: "hasErrors" }, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-group\">\n @for (entry of entries(); track entry.id; let index = $index) {\n <div class=\"c-entry-item\">\n <!-- Campo din\u00E1mico para cada entrada -->\n <div\n coreDynamicField\n [field]=\"createFieldConfigForEntry(index)\"\n [value]=\"entry.value\"\n [mode]=\"mode()\"\n [errors]=\"getEntryErrors(index)\"\n [rowData]=\"rowData()\"\n [formValue]=\"formValue()\"\n (valueChange)=\"onFieldValueChange($event, index)\"\n (onBlurEvent)=\"onFieldBlur($event)\"\n (onEnterEvent)=\"onFieldEnter($event)\">\n </div>\n\n <!-- Botones de acci\u00F3n (agregar/eliminar) -->\n @if (shouldShowActions(index)) {\n <div class=\"c-entry-actions\">\n @if (shouldShowAddButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--add\"\n (click)=\"addEntry()\"\n [disabled]=\"isDisabled()\"\n [title]=\"addLabel() | translate\"\n [attr.aria-label]=\"addLabel() | translate\">\n <span class=\"icon-counter-up\"></span>\n {{ addLabel() | translate }}\n </button>\n }\n \n @if (shouldShowRemoveButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--remove\"\n (click)=\"removeEntry(index)\"\n [disabled]=\"isDisabled()\"\n [title]=\"removeLabel() | translate\"\n [attr.aria-label]=\"removeLabel() | translate\">\n <span class=\"icon-counter-down\"></span>\n {{ removeLabel() | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Errores del campo principal (solo si hay errores globales) -->\n @if (errors().length > 0) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "directive", type: DynamicFieldDirective, selector: "[coreDynamicField]", inputs: ["field", "value", "mode", "errors", "rowData", "formValue"], outputs: ["valueChange", "onBlurEvent", "onEnterEvent", "selectionChange"] }, { kind: "component", type: FieldErrorsComponent, selector: "core-field-errors", inputs: ["errors"] }] });
5221
5296
  }
5222
5297
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MultiEntryFieldComponent, decorators: [{
5223
5298
  type: Component,
@@ -5228,7 +5303,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
5228
5303
  TranslateModule,
5229
5304
  DynamicFieldDirective,
5230
5305
  FieldErrorsComponent
5231
- ], hostDirectives: [CoreHostDirective], template: "<div class=\"c-entry-group\">\n @for (entry of entries(); track entry.id; let index = $index) {\n <div class=\"c-entry-item\">\n <!-- Campo din\u00E1mico para cada entrada -->\n <div\n coreDynamicField\n [field]=\"createFieldConfigForEntry(index)\"\n [value]=\"entry.value\"\n [mode]=\"mode()\"\n [errors]=\"errors()\"\n [rowData]=\"rowData()\"\n [formValue]=\"formValue()\"\n (valueChange)=\"onFieldValueChange($event, index)\"\n (onBlurEvent)=\"onFieldBlur($event)\"\n (onEnterEvent)=\"onFieldEnter($event)\">\n </div>\n\n <!-- Botones de acci\u00F3n (agregar/eliminar) -->\n @if (shouldShowActions(index)) {\n <div class=\"c-entry-actions\">\n @if (shouldShowAddButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--add\"\n (click)=\"addEntry()\"\n [disabled]=\"isDisabled()\"\n [title]=\"addLabel() | translate\"\n [attr.aria-label]=\"addLabel() | translate\">\n <span class=\"icon-counter-up\"></span>\n {{ addLabel() | translate }}\n </button>\n }\n \n @if (shouldShowRemoveButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--remove\"\n (click)=\"removeEntry(index)\"\n [disabled]=\"isDisabled()\"\n [title]=\"removeLabel() | translate\"\n [attr.aria-label]=\"removeLabel() | translate\">\n <span class=\"icon-counter-down\"></span>\n {{ removeLabel() | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Errores del campo principal -->\n @if (errors().length > 0) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n</div>\n" }]
5306
+ ], hostDirectives: [CoreHostDirective], template: "<div class=\"c-entry-group\">\n @for (entry of entries(); track entry.id; let index = $index) {\n <div class=\"c-entry-item\">\n <!-- Campo din\u00E1mico para cada entrada -->\n <div\n coreDynamicField\n [field]=\"createFieldConfigForEntry(index)\"\n [value]=\"entry.value\"\n [mode]=\"mode()\"\n [errors]=\"getEntryErrors(index)\"\n [rowData]=\"rowData()\"\n [formValue]=\"formValue()\"\n (valueChange)=\"onFieldValueChange($event, index)\"\n (onBlurEvent)=\"onFieldBlur($event)\"\n (onEnterEvent)=\"onFieldEnter($event)\">\n </div>\n\n <!-- Botones de acci\u00F3n (agregar/eliminar) -->\n @if (shouldShowActions(index)) {\n <div class=\"c-entry-actions\">\n @if (shouldShowAddButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--add\"\n (click)=\"addEntry()\"\n [disabled]=\"isDisabled()\"\n [title]=\"addLabel() | translate\"\n [attr.aria-label]=\"addLabel() | translate\">\n <span class=\"icon-counter-up\"></span>\n {{ addLabel() | translate }}\n </button>\n }\n \n @if (shouldShowRemoveButton(index)) {\n <button \n type=\"button\"\n class=\"c-entry-action c-entry-action--remove\"\n (click)=\"removeEntry(index)\"\n [disabled]=\"isDisabled()\"\n [title]=\"removeLabel() | translate\"\n [attr.aria-label]=\"removeLabel() | translate\">\n <span class=\"icon-counter-down\"></span>\n {{ removeLabel() | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Errores del campo principal (solo si hay errores globales) -->\n @if (errors().length > 0) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n</div>\n" }]
5232
5307
  }], ctorParameters: () => [] });
5233
5308
 
5234
5309
  class SmartFieldComponent {
@@ -5276,7 +5351,7 @@ class SmartFieldComponent {
5276
5351
  (selectionChange)="selectionChange.emit($event)">
5277
5352
  </div>
5278
5353
  }
5279
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: DynamicFieldDirective, selector: "[coreDynamicField]", inputs: ["field", "value", "mode", "errors", "rowData", "formValue"], outputs: ["valueChange", "onBlurEvent", "onEnterEvent", "selectionChange"] }, { kind: "component", type: MultiEntryFieldComponent, selector: "core-multi-entry-field", inputs: ["field", "value", "mode", "errors", "rowData", "formValue"], outputs: ["valueChange", "onBlurEvent", "onEnterEvent"] }] });
5354
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: DynamicFieldDirective, selector: "[coreDynamicField]", inputs: ["field", "value", "mode", "errors", "rowData", "formValue"], outputs: ["valueChange", "onBlurEvent", "onEnterEvent", "selectionChange"] }, { kind: "component", type: MultiEntryFieldComponent, selector: "core-multi-entry-field", inputs: ["field", "value", "mode", "errors", "rowData", "formValue"], outputs: ["valueChange", "onBlurEvent", "onEnterEvent", "hasErrors"] }] });
5280
5355
  }
5281
5356
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SmartFieldComponent, decorators: [{
5282
5357
  type: Component,
@@ -16141,12 +16216,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
16141
16216
  // Este archivo es generado automáticamente por scripts/update-version.js
16142
16217
  // No edites manualmente este archivo
16143
16218
  const VERSION = {
16144
- full: '2.15.31',
16219
+ full: '2.15.33',
16145
16220
  major: 2,
16146
16221
  minor: 15,
16147
- patch: 31,
16148
- timestamp: '2025-11-07T14:57:10.870Z',
16149
- buildDate: '7/11/2025'
16222
+ patch: 33,
16223
+ timestamp: '2025-11-12T13:53:53.157Z',
16224
+ buildDate: '12/11/2025'
16150
16225
  };
16151
16226
 
16152
16227
  class MainNavComponent {