@solcre-org/core-ui 2.20.27 → 2.20.29

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.
@@ -13,7 +13,7 @@
13
13
  "errorMessage": "Login error. Check your credentials."
14
14
  },
15
15
  "commons": {
16
- "clientsZone": "The Clients Zone",
16
+ "clientsZone": "ClientsZone",
17
17
  "loading": "Loading...",
18
18
  "notifications": {
19
19
  "SUCCESS": "Success",
@@ -13,7 +13,7 @@
13
13
  "errorMessage": "Error al iniciar sesión. Verifica tus credenciales."
14
14
  },
15
15
  "commons": {
16
- "clientsZone": "The Clients Zone",
16
+ "clientsZone": "ClientsZone",
17
17
  "loading": "Cargando...",
18
18
  "notifications": {
19
19
  "SUCCESS": "Éxito",
@@ -1,17 +1,17 @@
1
1
  import * as i0 from '@angular/core';
2
- import { HostBinding, Directive, input, Component, inject, output, computed, signal, effect, HostListener, ViewChild, ViewEncapsulation, Pipe, Injectable, ElementRef, untracked, ViewContainerRef, TemplateRef, InjectionToken, ContentChild, ChangeDetectionStrategy, viewChild, ChangeDetectorRef, afterNextRender, makeEnvironmentProviders, importProvidersFrom } from '@angular/core';
2
+ import { HostBinding, Directive, input, Component, inject, output, computed, signal, effect, ElementRef, HostListener, ViewChild, ViewEncapsulation, Pipe, Injectable, untracked, ViewContainerRef, TemplateRef, InjectionToken, ContentChild, ChangeDetectionStrategy, viewChild, ChangeDetectorRef, afterNextRender, makeEnvironmentProviders, importProvidersFrom } from '@angular/core';
3
3
  import * as i2 from '@angular/common';
4
4
  import { CommonModule, DatePipe } from '@angular/common';
5
5
  import * as i3 from '@ngx-translate/core';
6
6
  import { TranslateModule, TranslateService, TranslateLoader } from '@ngx-translate/core';
7
7
  import * as i3$1 from '@angular/forms';
8
8
  import { FormControl, Validators, FormsModule, ReactiveFormsModule, FormBuilder } from '@angular/forms';
9
- import * as i5 from '@ng-select/ng-select';
10
- import { NgSelectModule } from '@ng-select/ng-select';
11
9
  import { AuthService, ApiService } from '@solcre-org/core';
12
10
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
11
  import { distinctUntilChanged, debounceTime, tap as tap$1, map as map$1, filter, catchError as catchError$1 } from 'rxjs/operators';
14
12
  import { map, BehaviorSubject, Subject, throttleTime, takeUntil, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, tap, switchMap, of, catchError, finalize, throwError, Observable, forkJoin, zip, timeout, Subscription, from } from 'rxjs';
13
+ import * as i5 from '@ng-select/ng-select';
14
+ import { NgSelectModule } from '@ng-select/ng-select';
15
15
  import * as i4 from '@angular/router';
16
16
  import { RouterModule, Router, NavigationEnd, NavigationStart } from '@angular/router';
17
17
  import { DomSanitizer } from '@angular/platform-browser';
@@ -1062,6 +1062,7 @@ var TimeInterval;
1062
1062
  })(TimeInterval || (TimeInterval = {}));
1063
1063
 
1064
1064
  class DatetimeFieldComponent {
1065
+ el = inject(ElementRef);
1065
1066
  field = input.required();
1066
1067
  value = input(null);
1067
1068
  mode = input.required();
@@ -1076,9 +1077,22 @@ class DatetimeFieldComponent {
1076
1077
  selectedDate = signal(null);
1077
1078
  selectedHour = signal(null);
1078
1079
  selectedMinute = signal(null);
1080
+ inputDateValue = signal('');
1081
+ isDateInputFocused = signal(false);
1082
+ isHourOpen = signal(false);
1083
+ isMinuteOpen = signal(false);
1084
+ highlightedHourIndex = signal(-1);
1085
+ highlightedMinuteIndex = signal(-1);
1079
1086
  hasHourValue = signal(false);
1080
1087
  hasMinuteValue = signal(false);
1081
1088
  hours = Array.from({ length: 24 }, (_, i) => i);
1089
+ onDocumentClick(event) {
1090
+ if (!this.el.nativeElement.contains(event.target)) {
1091
+ this.isHourOpen.set(false);
1092
+ this.isMinuteOpen.set(false);
1093
+ this.onBlur();
1094
+ }
1095
+ }
1082
1096
  isHourPlaceholderVisible = computed(() => {
1083
1097
  const hasVal = this.hasHourValue();
1084
1098
  return !hasVal;
@@ -1148,6 +1162,9 @@ class DatetimeFieldComponent {
1148
1162
  return true;
1149
1163
  return this.evaluateReadonly();
1150
1164
  });
1165
+ isTimeDisabled = computed(() => {
1166
+ return this.isDisabled() || !this.selectedDate();
1167
+ });
1151
1168
  hasError = computed(() => {
1152
1169
  return this.errors().length > 0;
1153
1170
  });
@@ -1166,14 +1183,19 @@ class DatetimeFieldComponent {
1166
1183
  constructor() {
1167
1184
  effect(() => {
1168
1185
  const newValue = this.value();
1186
+ if (this.isDateInputFocused())
1187
+ return;
1169
1188
  if (newValue && !isNaN(newValue.getTime())) {
1170
1189
  const newDate = new Date(newValue);
1171
1190
  this.selectedDate.set(newDate);
1172
1191
  this.selectedHour.set(newDate.getHours());
1173
1192
  this.selectedMinute.set(this.roundToNearestInterval(newDate).getMinutes());
1193
+ this.inputDateValue.set(this.buildDateString(newDate));
1194
+ }
1195
+ else {
1196
+ this.inputDateValue.set('');
1174
1197
  }
1175
1198
  });
1176
- // Update hasValue signals when selected values change
1177
1199
  effect(() => {
1178
1200
  const hour = this.selectedHour();
1179
1201
  this.hasHourValue.set(hour !== null && hour !== undefined);
@@ -1205,6 +1227,7 @@ class DatetimeFieldComponent {
1205
1227
  this.selectedHour.set(dateValue.getHours());
1206
1228
  const roundedMinute = this.roundToNearestInterval(dateValue).getMinutes();
1207
1229
  this.selectedMinute.set(roundedMinute);
1230
+ this.inputDateValue.set(this.buildDateString(dateValue));
1208
1231
  }
1209
1232
  this.valueChange.emit(newValue);
1210
1233
  }, 0);
@@ -1221,6 +1244,8 @@ class DatetimeFieldComponent {
1221
1244
  }
1222
1245
  }
1223
1246
  initializeValues() {
1247
+ if (this.isDateInputFocused())
1248
+ return;
1224
1249
  const date = this.value();
1225
1250
  if (date && !isNaN(date.getTime())) {
1226
1251
  const newDate = new Date(date);
@@ -1228,33 +1253,35 @@ class DatetimeFieldComponent {
1228
1253
  this.selectedHour.set(newDate.getHours());
1229
1254
  const roundedMinute = this.roundToNearestInterval(newDate).getMinutes();
1230
1255
  this.selectedMinute.set(roundedMinute);
1256
+ this.inputDateValue.set(this.buildDateString(newDate));
1231
1257
  }
1232
1258
  else {
1233
1259
  this.selectedDate.set(null);
1234
1260
  this.selectedHour.set(null);
1235
1261
  this.selectedMinute.set(null);
1262
+ this.inputDateValue.set('');
1236
1263
  }
1237
1264
  }
1238
1265
  onDateChange(event) {
1239
1266
  const input = event.target;
1240
- const newDate = input.value ? new Date(input.value + 'T00:00:00') : null;
1241
- if (newDate && !isNaN(newDate.getTime())) {
1242
- // If hour/minute not set, default to 0
1267
+ if (!input.value) {
1268
+ return;
1269
+ }
1270
+ const newDate = new Date(input.value + 'T00:00:00');
1271
+ if (!isNaN(newDate.getTime())) {
1243
1272
  const currentHour = this.selectedHour() ?? 0;
1244
1273
  const currentMinute = this.selectedMinute() ?? 0;
1245
- this.selectedHour.set(currentHour);
1246
- this.selectedMinute.set(currentMinute);
1247
1274
  newDate.setHours(currentHour);
1248
1275
  newDate.setMinutes(currentMinute);
1249
1276
  newDate.setSeconds(0);
1250
1277
  newDate.setMilliseconds(0);
1251
1278
  this.selectedDate.set(newDate);
1279
+ this.inputDateValue.set(input.value);
1252
1280
  this.emitValue();
1253
1281
  }
1254
1282
  else {
1255
- //If date is cleared, clear everything? Or just date?
1256
- //Usually if date input is cleared, value is null.
1257
1283
  this.selectedDate.set(null);
1284
+ this.inputDateValue.set('');
1258
1285
  this.emitValue();
1259
1286
  }
1260
1287
  }
@@ -1266,21 +1293,59 @@ class DatetimeFieldComponent {
1266
1293
  this.selectedMinute.set(value);
1267
1294
  this.emitValue();
1268
1295
  }
1296
+ toggleHourDropdown(event) {
1297
+ if (this.isTimeDisabled())
1298
+ return;
1299
+ event.stopPropagation();
1300
+ const opening = !this.isHourOpen();
1301
+ this.isHourOpen.set(opening);
1302
+ this.isMinuteOpen.set(false);
1303
+ if (opening) {
1304
+ const idx = this.hoursOptions().findIndex(o => o.value === this.selectedHour());
1305
+ this.highlightedHourIndex.set(idx >= 0 ? idx : -1);
1306
+ }
1307
+ }
1308
+ toggleMinuteDropdown(event) {
1309
+ if (this.isTimeDisabled())
1310
+ return;
1311
+ event.stopPropagation();
1312
+ const opening = !this.isMinuteOpen();
1313
+ this.isMinuteOpen.set(opening);
1314
+ this.isHourOpen.set(false);
1315
+ if (opening) {
1316
+ const idx = this.minutesOptions().findIndex(o => o.value === this.selectedMinute());
1317
+ this.highlightedMinuteIndex.set(idx >= 0 ? idx : -1);
1318
+ }
1319
+ }
1320
+ selectHourOption(value, event) {
1321
+ event.stopPropagation();
1322
+ this.onHourChange(value);
1323
+ this.isHourOpen.set(false);
1324
+ }
1325
+ selectMinuteOption(value, event) {
1326
+ event.stopPropagation();
1327
+ this.onMinuteChange(value);
1328
+ this.isMinuteOpen.set(false);
1329
+ }
1269
1330
  emitValue() {
1270
1331
  const date = this.selectedDate();
1271
- // If no date selected, value is null regardless of time
1272
1332
  if (!date || isNaN(date.getTime())) {
1273
1333
  this.valueChange.emit(null);
1274
1334
  return;
1275
1335
  }
1276
1336
  const newDate = new Date(date.getTime());
1277
- // Use 0 if time not selected yet but date is present
1278
1337
  newDate.setHours(this.selectedHour() ?? 0);
1279
1338
  newDate.setMinutes(this.selectedMinute() ?? 0);
1280
1339
  newDate.setSeconds(0);
1281
1340
  newDate.setMilliseconds(0);
1282
1341
  this.valueChange.emit(newDate);
1283
1342
  }
1343
+ buildDateString(date) {
1344
+ const year = date.getFullYear().toString().padStart(4, '0');
1345
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
1346
+ const day = date.getDate().toString().padStart(2, '0');
1347
+ return `${year}-${month}-${day}`;
1348
+ }
1284
1349
  roundToNearestInterval(date) {
1285
1350
  const interval = this.field()?.timeInterval;
1286
1351
  if (!interval)
@@ -1313,6 +1378,14 @@ class DatetimeFieldComponent {
1313
1378
  onBlur() {
1314
1379
  this.onBlurEvent.emit(this.field().key);
1315
1380
  }
1381
+ onDateInputBlur() {
1382
+ this.isDateInputFocused.set(false);
1383
+ setTimeout(() => {
1384
+ if (!this.el.nativeElement.contains(document.activeElement)) {
1385
+ this.onBlur();
1386
+ }
1387
+ }, 200);
1388
+ }
1316
1389
  onEnter(event) {
1317
1390
  this.onEnterEvent.emit(this.field().key);
1318
1391
  const target = event.target;
@@ -1331,12 +1404,15 @@ class DatetimeFieldComponent {
1331
1404
  }
1332
1405
  }
1333
1406
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DatetimeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1334
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: DatetimeFieldComponent, isStandalone: true, selector: "core-datetime-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" }, usesOnChanges: true, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <label class=\"c-entry-text\" *ngIf=\"field().label\" [for]=\"field().key.toString()\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </label>\n <div class=\"c-entry-datetime\">\n <span class=\"c-entry-input\" [class.is-invalid]=\"hasError()\">\n <input\n type=\"date\"\n [id]=\"field().key.toString()\"\n [name]=\"field().key.toString()\"\n [value]=\"formattedDate()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onDateChange($event)\"\n (blur)=\"onBlur()\"\n (keydown.enter)=\"onEnter($any($event))\"\n />\n <button class=\"c-entry-input__addon icon-calendar-thin\" \n tabindex=\"-1\"\n type=\"button\"\n (click)=\"onCalendarClick($event)\"></button>\n </span>\n <span class=\"c-entry-input c-entry-input--ng-select\" [class.is-invalid]=\"hasError()\">\n <ng-select\n [items]=\"hoursOptions()\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [ngModel]=\"selectedHour()\"\n (ngModelChange)=\"onHourChange($event)\"\n [disabled]=\"isDisabled()\"\n [clearable]=\"false\"\n [searchable]=\"false\"\n (blur)=\"onBlur()\"\n [placeholder]=\"isHourPlaceholderVisible() ? 'HH' : ''\"\n >\n <ng-template ng-option-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n </ng-select>\n <span class=\"c-entry-input__addon icon-select-arrow\"></span>\n </span>\n <span class=\"c-entry-datetime__separator\">:</span>\n <span class=\"c-entry-input c-entry-input--ng-select\" [class.is-invalid]=\"hasError()\">\n <ng-select\n [items]=\"minutesOptions()\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [ngModel]=\"selectedMinute()\"\n (ngModelChange)=\"onMinuteChange($event)\"\n [disabled]=\"isDisabled()\"\n [clearable]=\"false\"\n [searchable]=\"false\"\n (blur)=\"onBlur()\"\n [placeholder]=\"isMinutePlaceholderVisible() ? 'MM' : ''\"\n >\n <ng-template ng-option-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n </ng-select>\n <span class=\"c-entry-input__addon icon-select-arrow\"></span>\n </span>\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n\n\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i5.NgSelectComponent, selector: "ng-select", inputs: ["ariaLabelDropdown", "bindLabel", "bindValue", "ariaLabel", "markFirst", "placeholder", "fixedPlaceholder", "notFoundText", "typeToSearchText", "preventToggleOnRightClick", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "tabFocusOnClearButton", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "ngClass", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick", "keyDownFn"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i5.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i5.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "component", type: FieldErrorsComponent, selector: "core-field-errors", inputs: ["errors"] }] });
1407
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: DatetimeFieldComponent, isStandalone: true, selector: "core-datetime-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" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, usesOnChanges: true, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <label class=\"c-entry-text\" *ngIf=\"field().label\" [for]=\"field().key.toString()\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </label>\n <div class=\"c-entry-datetime\">\n <span class=\"c-entry-input\" [class.is-invalid]=\"hasError()\">\n <input\n type=\"date\"\n [id]=\"field().key.toString()\"\n [name]=\"field().key.toString()\"\n [value]=\"inputDateValue()\"\n [disabled]=\"isDisabled()\"\n (focus)=\"isDateInputFocused.set(true)\"\n (change)=\"onDateChange($event)\"\n (blur)=\"onDateInputBlur()\"\n (keydown.enter)=\"onEnter($any($event))\"\n />\n <button class=\"c-entry-input__addon icon-calendar-thin\" \n tabindex=\"-1\"\n type=\"button\"\n (click)=\"onCalendarClick($event)\"></button>\n </span>\n <span class=\"c-entry-input c-entry-input--native-select\"\n [class.is-placeholder]=\"isHourPlaceholderVisible()\"\n [class.is-open]=\"isHourOpen()\"\n [class.has-value]=\"!isHourPlaceholderVisible()\"\n [class.is-disabled]=\"isTimeDisabled()\"\n >\n <div class=\"c-native-select__control\" (click)=\"toggleHourDropdown($event)\">\n @if (selectedHour() !== null && selectedHour() !== undefined) {\n <span class=\"c-native-select__single-value\">{{ selectedHour()!.toString().padStart(2, '0') }}</span>\n } @else {\n <span class=\"c-native-select__placeholder\">HH</span>\n }\n </div>\n <span\n class=\"c-entry-input__addon icon-select-arrow\"\n [class.is-flipped]=\"isHourOpen()\"\n (click)=\"toggleHourDropdown($event)\"\n ></span>\n @if (isHourOpen()) {\n <div class=\"c-native-select__dropdown\">\n <div class=\"c-native-select__options\">\n @for (option of hoursOptions(); track option.value; let i = $index) {\n <div\n class=\"c-native-select__option\"\n [class.is-selected]=\"selectedHour() === option.value\"\n [class.is-highlighted]=\"highlightedHourIndex() === i\"\n (click)=\"selectHourOption(option.value, $event)\"\n (mouseenter)=\"highlightedHourIndex.set(i)\"\n >\n {{ option.label }}\n </div>\n }\n </div>\n </div>\n }\n </span>\n <span class=\"c-entry-datetime__separator\">:</span>\n <span class=\"c-entry-input c-entry-input--native-select\"\n [class.is-placeholder]=\"isMinutePlaceholderVisible()\"\n [class.is-open]=\"isMinuteOpen()\"\n [class.has-value]=\"!isMinutePlaceholderVisible()\"\n [class.is-disabled]=\"isTimeDisabled()\"\n >\n <div class=\"c-native-select__control\" (click)=\"toggleMinuteDropdown($event)\">\n @if (selectedMinute() !== null && selectedMinute() !== undefined) {\n <span class=\"c-native-select__single-value\">{{ selectedMinute()!.toString().padStart(2, '0') }}</span>\n } @else {\n <span class=\"c-native-select__placeholder\">MM</span>\n }\n </div>\n <span\n class=\"c-entry-input__addon icon-select-arrow\"\n [class.is-flipped]=\"isMinuteOpen()\"\n (click)=\"toggleMinuteDropdown($event)\"\n ></span>\n @if (isMinuteOpen()) {\n <div class=\"c-native-select__dropdown\">\n <div class=\"c-native-select__options\">\n @for (option of minutesOptions(); track option.value; let i = $index) {\n <div\n class=\"c-native-select__option\"\n [class.is-selected]=\"selectedMinute() === option.value\"\n [class.is-highlighted]=\"highlightedMinuteIndex() === i\"\n (click)=\"selectMinuteOption(option.value, $event)\"\n (mouseenter)=\"highlightedMinuteIndex.set(i)\"\n >\n {{ option.label }}\n </div>\n }\n </div>\n </div>\n }\n </span>\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n\n\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: FieldErrorsComponent, selector: "core-field-errors", inputs: ["errors"] }] });
1335
1408
  }
1336
1409
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DatetimeFieldComponent, decorators: [{
1337
1410
  type: Component,
1338
- args: [{ selector: 'core-datetime-field', standalone: true, imports: [CommonModule, FormsModule, TranslateModule, ReactiveFormsModule, NgSelectModule, FieldErrorsComponent], hostDirectives: [CoreHostDirective], template: "<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <label class=\"c-entry-text\" *ngIf=\"field().label\" [for]=\"field().key.toString()\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </label>\n <div class=\"c-entry-datetime\">\n <span class=\"c-entry-input\" [class.is-invalid]=\"hasError()\">\n <input\n type=\"date\"\n [id]=\"field().key.toString()\"\n [name]=\"field().key.toString()\"\n [value]=\"formattedDate()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onDateChange($event)\"\n (blur)=\"onBlur()\"\n (keydown.enter)=\"onEnter($any($event))\"\n />\n <button class=\"c-entry-input__addon icon-calendar-thin\" \n tabindex=\"-1\"\n type=\"button\"\n (click)=\"onCalendarClick($event)\"></button>\n </span>\n <span class=\"c-entry-input c-entry-input--ng-select\" [class.is-invalid]=\"hasError()\">\n <ng-select\n [items]=\"hoursOptions()\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [ngModel]=\"selectedHour()\"\n (ngModelChange)=\"onHourChange($event)\"\n [disabled]=\"isDisabled()\"\n [clearable]=\"false\"\n [searchable]=\"false\"\n (blur)=\"onBlur()\"\n [placeholder]=\"isHourPlaceholderVisible() ? 'HH' : ''\"\n >\n <ng-template ng-option-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n </ng-select>\n <span class=\"c-entry-input__addon icon-select-arrow\"></span>\n </span>\n <span class=\"c-entry-datetime__separator\">:</span>\n <span class=\"c-entry-input c-entry-input--ng-select\" [class.is-invalid]=\"hasError()\">\n <ng-select\n [items]=\"minutesOptions()\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [ngModel]=\"selectedMinute()\"\n (ngModelChange)=\"onMinuteChange($event)\"\n [disabled]=\"isDisabled()\"\n [clearable]=\"false\"\n [searchable]=\"false\"\n (blur)=\"onBlur()\"\n [placeholder]=\"isMinutePlaceholderVisible() ? 'MM' : ''\"\n >\n <ng-template ng-option-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\">\n {{ item.label }}\n </ng-template>\n </ng-select>\n <span class=\"c-entry-input__addon icon-select-arrow\"></span>\n </span>\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n\n\n" }]
1339
- }], ctorParameters: () => [] });
1411
+ args: [{ selector: 'core-datetime-field', standalone: true, imports: [CommonModule, FormsModule, TranslateModule, ReactiveFormsModule, FieldErrorsComponent], hostDirectives: [CoreHostDirective], template: "<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <label class=\"c-entry-text\" *ngIf=\"field().label\" [for]=\"field().key.toString()\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </label>\n <div class=\"c-entry-datetime\">\n <span class=\"c-entry-input\" [class.is-invalid]=\"hasError()\">\n <input\n type=\"date\"\n [id]=\"field().key.toString()\"\n [name]=\"field().key.toString()\"\n [value]=\"inputDateValue()\"\n [disabled]=\"isDisabled()\"\n (focus)=\"isDateInputFocused.set(true)\"\n (change)=\"onDateChange($event)\"\n (blur)=\"onDateInputBlur()\"\n (keydown.enter)=\"onEnter($any($event))\"\n />\n <button class=\"c-entry-input__addon icon-calendar-thin\" \n tabindex=\"-1\"\n type=\"button\"\n (click)=\"onCalendarClick($event)\"></button>\n </span>\n <span class=\"c-entry-input c-entry-input--native-select\"\n [class.is-placeholder]=\"isHourPlaceholderVisible()\"\n [class.is-open]=\"isHourOpen()\"\n [class.has-value]=\"!isHourPlaceholderVisible()\"\n [class.is-disabled]=\"isTimeDisabled()\"\n >\n <div class=\"c-native-select__control\" (click)=\"toggleHourDropdown($event)\">\n @if (selectedHour() !== null && selectedHour() !== undefined) {\n <span class=\"c-native-select__single-value\">{{ selectedHour()!.toString().padStart(2, '0') }}</span>\n } @else {\n <span class=\"c-native-select__placeholder\">HH</span>\n }\n </div>\n <span\n class=\"c-entry-input__addon icon-select-arrow\"\n [class.is-flipped]=\"isHourOpen()\"\n (click)=\"toggleHourDropdown($event)\"\n ></span>\n @if (isHourOpen()) {\n <div class=\"c-native-select__dropdown\">\n <div class=\"c-native-select__options\">\n @for (option of hoursOptions(); track option.value; let i = $index) {\n <div\n class=\"c-native-select__option\"\n [class.is-selected]=\"selectedHour() === option.value\"\n [class.is-highlighted]=\"highlightedHourIndex() === i\"\n (click)=\"selectHourOption(option.value, $event)\"\n (mouseenter)=\"highlightedHourIndex.set(i)\"\n >\n {{ option.label }}\n </div>\n }\n </div>\n </div>\n }\n </span>\n <span class=\"c-entry-datetime__separator\">:</span>\n <span class=\"c-entry-input c-entry-input--native-select\"\n [class.is-placeholder]=\"isMinutePlaceholderVisible()\"\n [class.is-open]=\"isMinuteOpen()\"\n [class.has-value]=\"!isMinutePlaceholderVisible()\"\n [class.is-disabled]=\"isTimeDisabled()\"\n >\n <div class=\"c-native-select__control\" (click)=\"toggleMinuteDropdown($event)\">\n @if (selectedMinute() !== null && selectedMinute() !== undefined) {\n <span class=\"c-native-select__single-value\">{{ selectedMinute()!.toString().padStart(2, '0') }}</span>\n } @else {\n <span class=\"c-native-select__placeholder\">MM</span>\n }\n </div>\n <span\n class=\"c-entry-input__addon icon-select-arrow\"\n [class.is-flipped]=\"isMinuteOpen()\"\n (click)=\"toggleMinuteDropdown($event)\"\n ></span>\n @if (isMinuteOpen()) {\n <div class=\"c-native-select__dropdown\">\n <div class=\"c-native-select__options\">\n @for (option of minutesOptions(); track option.value; let i = $index) {\n <div\n class=\"c-native-select__option\"\n [class.is-selected]=\"selectedMinute() === option.value\"\n [class.is-highlighted]=\"highlightedMinuteIndex() === i\"\n (click)=\"selectMinuteOption(option.value, $event)\"\n (mouseenter)=\"highlightedMinuteIndex.set(i)\"\n >\n {{ option.label }}\n </div>\n }\n </div>\n </div>\n }\n </span>\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n\n\n" }]
1412
+ }], ctorParameters: () => [], propDecorators: { onDocumentClick: [{
1413
+ type: HostListener,
1414
+ args: ['document:click', ['$event']]
1415
+ }] } });
1340
1416
 
1341
1417
  var DocumentPayloadMode;
1342
1418
  (function (DocumentPayloadMode) {
@@ -17674,12 +17750,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17674
17750
  // Este archivo es generado automáticamente por scripts/update-version.js
17675
17751
  // No edites manualmente este archivo
17676
17752
  const VERSION = {
17677
- full: '2.20.27',
17753
+ full: '2.20.29',
17678
17754
  major: 2,
17679
17755
  minor: 20,
17680
- patch: 27,
17681
- timestamp: '2026-02-26T17:19:42.630Z',
17682
- buildDate: '26/2/2026'
17756
+ patch: 29,
17757
+ timestamp: '2026-02-27T15:55:43.722Z',
17758
+ buildDate: '27/2/2026'
17683
17759
  };
17684
17760
 
17685
17761
  class MainNavComponent {