@solcre-org/core-ui 2.20.22 → 2.20.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { HostBinding, Directive, input, Component, inject, output, computed, signal, effect, ViewChild, Pipe, Injectable, ElementRef, untracked, HostListener, ViewContainerRef, TemplateRef, InjectionToken, ContentChild, ChangeDetectionStrategy, viewChild, ChangeDetectorRef, afterNextRender, makeEnvironmentProviders, importProvidersFrom } 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';
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';
@@ -7,7 +7,7 @@ import { TranslateModule, TranslateService, TranslateLoader } from '@ngx-transla
7
7
  import * as i3$1 from '@angular/forms';
8
8
  import { FormControl, Validators, FormsModule, ReactiveFormsModule, FormBuilder } from '@angular/forms';
9
9
  import * as i5 from '@ng-select/ng-select';
10
- import { NgSelectModule, NgSelectComponent } from '@ng-select/ng-select';
10
+ import { NgSelectModule } from '@ng-select/ng-select';
11
11
  import { AuthService, ApiService } from '@solcre-org/core';
12
12
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
13
  import { distinctUntilChanged, debounceTime, tap as tap$1, map as map$1, filter, catchError as catchError$1 } from 'rxjs/operators';
@@ -1345,13 +1345,17 @@ var DocumentPayloadMode;
1345
1345
  })(DocumentPayloadMode || (DocumentPayloadMode = {}));
1346
1346
 
1347
1347
  class SelectFieldComponent extends BaseFieldComponent {
1348
- ngSelect;
1348
+ elRef;
1349
+ searchInputRef;
1349
1350
  field = input.required();
1350
1351
  selectionChange = output();
1351
1352
  isInitialized = signal(false);
1352
1353
  hasValue = signal(false);
1353
1354
  userHasInteracted = signal(false);
1354
1355
  lastDynamicValue = undefined;
1356
+ isOpen = signal(false);
1357
+ searchTerm = signal('');
1358
+ highlightedIndex = signal(-1);
1355
1359
  computedValue = computed(() => {
1356
1360
  const value = this.value();
1357
1361
  if (this.field().multiple && !Array.isArray(value)) {
@@ -1359,9 +1363,26 @@ class SelectFieldComponent extends BaseFieldComponent {
1359
1363
  }
1360
1364
  return value;
1361
1365
  });
1366
+ filteredOptions = computed(() => {
1367
+ const options = this.field().options ?? [];
1368
+ const term = this.searchTerm().toLowerCase().trim();
1369
+ if (!term)
1370
+ return options;
1371
+ return options.filter(opt => opt.label.toLowerCase().includes(term));
1372
+ });
1373
+ selectedItems = computed(() => {
1374
+ const value = this.computedValue();
1375
+ const options = this.field().options ?? [];
1376
+ if (value === null || value === undefined || value === '')
1377
+ return [];
1378
+ if (this.field().multiple && Array.isArray(value)) {
1379
+ return options.filter(opt => value.some((v) => String(opt.value) === String(v)));
1380
+ }
1381
+ const found = options.find(opt => String(opt.value) === String(value));
1382
+ return found ? [found] : [];
1383
+ });
1362
1384
  isPlaceholderVisible = computed(() => {
1363
- const hasVal = this.hasValue();
1364
- return !hasVal;
1385
+ return !this.hasValue();
1365
1386
  });
1366
1387
  isSearchable = computed(() => {
1367
1388
  return this.field().searchable ?? false;
@@ -1369,8 +1390,17 @@ class SelectFieldComponent extends BaseFieldComponent {
1369
1390
  isDisabled = computed(() => {
1370
1391
  return this.mode() === ModalMode.VIEW || this.evaluateReadonly() || this.evaluateDisabled();
1371
1392
  });
1372
- constructor() {
1393
+ onDocumentClick(event) {
1394
+ if (this.isOpen() && this.elRef) {
1395
+ const target = event.target;
1396
+ if (!this.elRef.nativeElement.contains(target)) {
1397
+ this.closeDropdown();
1398
+ }
1399
+ }
1400
+ }
1401
+ constructor(elRef) {
1373
1402
  super();
1403
+ this.elRef = elRef;
1374
1404
  effect(() => {
1375
1405
  const signalValue = this.value();
1376
1406
  if (signalValue && signalValue !== '' && signalValue !== null && signalValue !== undefined) {
@@ -1400,7 +1430,7 @@ class SelectFieldComponent extends BaseFieldComponent {
1400
1430
  if (newOpts.length === 0 && this.field().multiple && Array.isArray(this.formControl().value)) {
1401
1431
  setTimeout(() => {
1402
1432
  this.formControl().setValue([], { emitEvent: false });
1403
- this.ngSelect?.clearModel();
1433
+ this.hasValue.set(false);
1404
1434
  }, 0);
1405
1435
  }
1406
1436
  }
@@ -1548,9 +1578,9 @@ class SelectFieldComponent extends BaseFieldComponent {
1548
1578
  isOptionSelected(optionValue) {
1549
1579
  const currentValue = this.computedValue();
1550
1580
  if (this.field().multiple && Array.isArray(currentValue)) {
1551
- return currentValue.includes(optionValue);
1581
+ return currentValue.some((v) => String(v) === String(optionValue));
1552
1582
  }
1553
- return currentValue === optionValue;
1583
+ return String(currentValue) === String(optionValue);
1554
1584
  }
1555
1585
  onBlurInput() {
1556
1586
  this.onBlur();
@@ -1631,15 +1661,142 @@ class SelectFieldComponent extends BaseFieldComponent {
1631
1661
  onSelectClear() {
1632
1662
  this.hasValue.set(false);
1633
1663
  }
1634
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1635
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SelectFieldComponent, isStandalone: true, selector: "core-select-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "ngSelect", first: true, predicate: NgSelectComponent, descendants: true }], usesInheritance: true, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<!-- Todo: Ng select + c-entry-select -->\n\n<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n\n <div\n class=\"c-entry-input c-entry-input--ng-select c-entry-input--ng-select-alt\"\n [class.is-placeholder]=\"isPlaceholderVisible()\"\n [class.is-invalid]=\"hasError()\"\n [class.disabled]=\"isDisabled()\"\n >\n <ng-select\n [items]=\"field().options ?? []\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [multiple]=\"field().multiple\"\n [formControl]=\"formControl()\"\n [compareWith]=\"compareWith\"\n [class.has-error]=\"hasError()\"\n [class.disabled]=\"isDisabled()\"\n [readonly]=\"isReadonly()\"\n [clearable]=\"field().clearable\"\n [searchable]=\"isSearchable()\"\n (blur)=\"onBlurInput()\"\n (change)=\"onSelectChange($event)\"\n (clear)=\"onSelectClear()\"\n [placeholder]=\"\n isPlaceholderVisible() ? (field().placeholder ?? '' | translate) : ''\n \"\n >\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\">\n {{ item.label | translate }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\">\n <!-- Estilos que aparecen en la etiqueta del item seleccionado -->\n {{ item.label | translate }}\n </ng-template>\n <ng-template ng-notfound-tmp>\n <span class=\"ng-select-notfound\">{{\n \"modal.field.serverSelect.noResults\" | translate\n }}</span>\n </ng-template>\n </ng-select>\n <span class=\"c-entry-input__addon icon-select-arrow\"></span>\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\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: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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: "directive", type: i5.NgNotFoundTemplateDirective, selector: "[ng-notfound-tmp]" }, { kind: "component", type: FieldErrorsComponent, selector: "core-field-errors", inputs: ["errors"] }] });
1664
+ toggleDropdown(event) {
1665
+ event.preventDefault();
1666
+ event.stopPropagation();
1667
+ if (this.isDisabled() || this.isReadonly())
1668
+ return;
1669
+ if (this.isOpen()) {
1670
+ this.closeDropdown();
1671
+ }
1672
+ else {
1673
+ this.openDropdown();
1674
+ }
1675
+ }
1676
+ openDropdown() {
1677
+ this.isOpen.set(true);
1678
+ this.searchTerm.set('');
1679
+ this.highlightedIndex.set(-1);
1680
+ if (this.isSearchable()) {
1681
+ setTimeout(() => this.searchInputRef?.nativeElement?.focus(), 0);
1682
+ }
1683
+ }
1684
+ closeDropdown() {
1685
+ this.isOpen.set(false);
1686
+ this.searchTerm.set('');
1687
+ this.highlightedIndex.set(-1);
1688
+ }
1689
+ onSearchInput(event) {
1690
+ const value = event.target.value;
1691
+ this.searchTerm.set(value);
1692
+ this.highlightedIndex.set(0);
1693
+ }
1694
+ selectOption(option, event) {
1695
+ event?.preventDefault();
1696
+ event?.stopPropagation();
1697
+ if (this.field().multiple) {
1698
+ const current = Array.isArray(this.computedValue()) ? [...this.computedValue()] : [];
1699
+ const idx = current.findIndex((v) => String(v) === String(option.value));
1700
+ if (idx >= 0) {
1701
+ current.splice(idx, 1);
1702
+ }
1703
+ else {
1704
+ current.push(option.value);
1705
+ }
1706
+ this.formControl().setValue(current);
1707
+ this.formControl().markAsDirty();
1708
+ this.onValueChange(current);
1709
+ this.searchTerm.set('');
1710
+ }
1711
+ else {
1712
+ this.formControl().setValue(option.value);
1713
+ this.formControl().markAsDirty();
1714
+ this.onValueChange(option.value);
1715
+ this.closeDropdown();
1716
+ }
1717
+ }
1718
+ removeItem(item, event) {
1719
+ event.preventDefault();
1720
+ event.stopPropagation();
1721
+ if (this.field().multiple) {
1722
+ const current = Array.isArray(this.computedValue()) ? [...this.computedValue()] : [];
1723
+ const filtered = current.filter((v) => String(v) !== String(item.value));
1724
+ this.formControl().setValue(filtered);
1725
+ this.formControl().markAsDirty();
1726
+ this.onValueChange(filtered);
1727
+ }
1728
+ }
1729
+ onClear(event) {
1730
+ event.preventDefault();
1731
+ event.stopPropagation();
1732
+ const emptyValue = this.field().multiple ? [] : null;
1733
+ this.formControl().setValue(emptyValue);
1734
+ this.formControl().markAsDirty();
1735
+ this.hasValue.set(false);
1736
+ this.onValueChange(emptyValue);
1737
+ this.closeDropdown();
1738
+ }
1739
+ onKeydown(event) {
1740
+ const options = this.filteredOptions();
1741
+ switch (event.key) {
1742
+ case 'ArrowDown':
1743
+ event.preventDefault();
1744
+ if (!this.isOpen()) {
1745
+ this.openDropdown();
1746
+ }
1747
+ else {
1748
+ this.highlightedIndex.set(Math.min(this.highlightedIndex() + 1, options.length - 1));
1749
+ }
1750
+ break;
1751
+ case 'ArrowUp':
1752
+ event.preventDefault();
1753
+ if (this.isOpen()) {
1754
+ this.highlightedIndex.set(Math.max(this.highlightedIndex() - 1, 0));
1755
+ }
1756
+ break;
1757
+ case 'Enter':
1758
+ event.preventDefault();
1759
+ if (this.isOpen() && this.highlightedIndex() >= 0 && this.highlightedIndex() < options.length) {
1760
+ this.selectOption(options[this.highlightedIndex()]);
1761
+ }
1762
+ else if (!this.isOpen()) {
1763
+ this.openDropdown();
1764
+ }
1765
+ break;
1766
+ case 'Escape':
1767
+ event.preventDefault();
1768
+ this.closeDropdown();
1769
+ break;
1770
+ case 'Tab':
1771
+ this.closeDropdown();
1772
+ break;
1773
+ case 'Backspace':
1774
+ case 'Delete':
1775
+ if (this.field().multiple && this.searchTerm() === '') {
1776
+ const current = Array.isArray(this.computedValue()) ? [...this.computedValue()] : [];
1777
+ if (current.length > 0) {
1778
+ event.preventDefault();
1779
+ current.pop();
1780
+ this.formControl().setValue(current);
1781
+ this.formControl().markAsDirty();
1782
+ this.onValueChange(current);
1783
+ }
1784
+ }
1785
+ break;
1786
+ }
1787
+ }
1788
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SelectFieldComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1789
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SelectFieldComponent, isStandalone: true, selector: "core-select-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "searchInputRef", first: true, predicate: ["searchInput"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n\n <div\n class=\"c-entry-input c-entry-input--native-select\"\n [class.is-placeholder]=\"isPlaceholderVisible()\"\n [class.is-invalid]=\"hasError()\"\n [class.is-disabled]=\"isDisabled()\"\n [class.is-open]=\"isOpen()\"\n [class.has-value]=\"!isPlaceholderVisible()\"\n (keydown)=\"onKeydown($event)\"\n >\n <!-- Selected values / search input area -->\n <div class=\"c-native-select__control\" (click)=\"toggleDropdown($event)\">\n @if (field().multiple) {\n @if (selectedItems().length > 0 || (isSearchable() && isOpen())) {\n <!-- Multi-select: chips + inline search -->\n <div class=\"c-native-select__values\">\n @for (item of selectedItems(); track item.value) {\n <span class=\"c-native-select__chip\">\n {{ item.label | translate }}\n @if (!isDisabled() && !isReadonly()) {\n <span\n class=\"c-native-select__chip-remove\"\n (click)=\"removeItem(item, $event)\"\n role=\"button\"\n aria-label=\"Remove\"\n ><span class=\"c-native-select__chip-remove-icon\"></span></span>\n }\n </span>\n }\n @if (isSearchable() && isOpen()) {\n <input\n #searchInput\n type=\"text\"\n class=\"c-native-select__search\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (blur)=\"onBlurInput()\"\n autocomplete=\"off\"\n />\n }\n </div>\n } @else {\n <span class=\"c-native-select__placeholder\">{{ (field().placeholder ?? '') | translate }}</span>\n }\n } @else {\n <!-- Single select -->\n @if (isSearchable() && isOpen()) {\n <input\n #searchInput\n type=\"text\"\n class=\"c-native-select__search\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (blur)=\"onBlurInput()\"\n autocomplete=\"off\"\n />\n } @else if (selectedItems().length > 0) {\n <span class=\"c-native-select__single-value\">{{ selectedItems()[0].label | translate }}</span>\n } @else {\n <span class=\"c-native-select__placeholder\">{{ (field().placeholder ?? '') | translate }}</span>\n }\n }\n </div>\n\n <!-- Clear button -->\n @if (field().clearable !== false && !isPlaceholderVisible() && !isDisabled() && !isReadonly()) {\n <span\n class=\"c-native-select__clear\"\n (click)=\"onClear($event)\"\n role=\"button\"\n aria-label=\"Clear\"\n ><span class=\"c-native-select__clear-icon\"></span></span>\n }\n\n <!-- Arrow icon -->\n <span\n class=\"c-entry-input__addon icon-select-arrow\"\n [class.is-flipped]=\"isOpen()\"\n (click)=\"toggleDropdown($event)\"\n ></span>\n\n <!-- Dropdown panel -->\n @if (isOpen()) {\n <div class=\"c-native-select__dropdown\">\n <div class=\"c-native-select__options\">\n @if (filteredOptions().length === 0) {\n <div class=\"c-native-select__no-results\">\n {{ 'modal.field.serverSelect.noResults' | translate }}\n </div>\n } @else {\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <div\n class=\"c-native-select__option\"\n [class.is-selected]=\"isOptionSelected(option.value)\"\n [class.is-highlighted]=\"highlightedIndex() === i\"\n (click)=\"selectOption(option, $event)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n {{ option.label | translate }}\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n", styles: [":host{display:block}\n"], 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"] }], encapsulation: i0.ViewEncapsulation.None });
1636
1790
  }
1637
1791
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SelectFieldComponent, decorators: [{
1638
1792
  type: Component,
1639
- args: [{ selector: 'core-select-field', standalone: true, imports: [CommonModule, FormsModule, TranslateModule, ReactiveFormsModule, NgSelectModule, FieldErrorsComponent], hostDirectives: [CoreHostDirective], template: "<!-- Todo: Ng select + c-entry-select -->\n\n<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n\n <div\n class=\"c-entry-input c-entry-input--ng-select c-entry-input--ng-select-alt\"\n [class.is-placeholder]=\"isPlaceholderVisible()\"\n [class.is-invalid]=\"hasError()\"\n [class.disabled]=\"isDisabled()\"\n >\n <ng-select\n [items]=\"field().options ?? []\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [multiple]=\"field().multiple\"\n [formControl]=\"formControl()\"\n [compareWith]=\"compareWith\"\n [class.has-error]=\"hasError()\"\n [class.disabled]=\"isDisabled()\"\n [readonly]=\"isReadonly()\"\n [clearable]=\"field().clearable\"\n [searchable]=\"isSearchable()\"\n (blur)=\"onBlurInput()\"\n (change)=\"onSelectChange($event)\"\n (clear)=\"onSelectClear()\"\n [placeholder]=\"\n isPlaceholderVisible() ? (field().placeholder ?? '' | translate) : ''\n \"\n >\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\">\n {{ item.label | translate }}\n </ng-template>\n <ng-template ng-label-tmp let-item=\"item\">\n <!-- Estilos que aparecen en la etiqueta del item seleccionado -->\n {{ item.label | translate }}\n </ng-template>\n <ng-template ng-notfound-tmp>\n <span class=\"ng-select-notfound\">{{\n \"modal.field.serverSelect.noResults\" | translate\n }}</span>\n </ng-template>\n </ng-select>\n <span class=\"c-entry-input__addon icon-select-arrow\"></span>\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n" }]
1640
- }], ctorParameters: () => [], propDecorators: { ngSelect: [{
1793
+ args: [{ selector: 'core-select-field', standalone: true, imports: [CommonModule, FormsModule, TranslateModule, ReactiveFormsModule, FieldErrorsComponent], hostDirectives: [CoreHostDirective], encapsulation: ViewEncapsulation.None, template: "<div class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n\n <div\n class=\"c-entry-input c-entry-input--native-select\"\n [class.is-placeholder]=\"isPlaceholderVisible()\"\n [class.is-invalid]=\"hasError()\"\n [class.is-disabled]=\"isDisabled()\"\n [class.is-open]=\"isOpen()\"\n [class.has-value]=\"!isPlaceholderVisible()\"\n (keydown)=\"onKeydown($event)\"\n >\n <!-- Selected values / search input area -->\n <div class=\"c-native-select__control\" (click)=\"toggleDropdown($event)\">\n @if (field().multiple) {\n @if (selectedItems().length > 0 || (isSearchable() && isOpen())) {\n <!-- Multi-select: chips + inline search -->\n <div class=\"c-native-select__values\">\n @for (item of selectedItems(); track item.value) {\n <span class=\"c-native-select__chip\">\n {{ item.label | translate }}\n @if (!isDisabled() && !isReadonly()) {\n <span\n class=\"c-native-select__chip-remove\"\n (click)=\"removeItem(item, $event)\"\n role=\"button\"\n aria-label=\"Remove\"\n ><span class=\"c-native-select__chip-remove-icon\"></span></span>\n }\n </span>\n }\n @if (isSearchable() && isOpen()) {\n <input\n #searchInput\n type=\"text\"\n class=\"c-native-select__search\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (blur)=\"onBlurInput()\"\n autocomplete=\"off\"\n />\n }\n </div>\n } @else {\n <span class=\"c-native-select__placeholder\">{{ (field().placeholder ?? '') | translate }}</span>\n }\n } @else {\n <!-- Single select -->\n @if (isSearchable() && isOpen()) {\n <input\n #searchInput\n type=\"text\"\n class=\"c-native-select__search\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (blur)=\"onBlurInput()\"\n autocomplete=\"off\"\n />\n } @else if (selectedItems().length > 0) {\n <span class=\"c-native-select__single-value\">{{ selectedItems()[0].label | translate }}</span>\n } @else {\n <span class=\"c-native-select__placeholder\">{{ (field().placeholder ?? '') | translate }}</span>\n }\n }\n </div>\n\n <!-- Clear button -->\n @if (field().clearable !== false && !isPlaceholderVisible() && !isDisabled() && !isReadonly()) {\n <span\n class=\"c-native-select__clear\"\n (click)=\"onClear($event)\"\n role=\"button\"\n aria-label=\"Clear\"\n ><span class=\"c-native-select__clear-icon\"></span></span>\n }\n\n <!-- Arrow icon -->\n <span\n class=\"c-entry-input__addon icon-select-arrow\"\n [class.is-flipped]=\"isOpen()\"\n (click)=\"toggleDropdown($event)\"\n ></span>\n\n <!-- Dropdown panel -->\n @if (isOpen()) {\n <div class=\"c-native-select__dropdown\">\n <div class=\"c-native-select__options\">\n @if (filteredOptions().length === 0) {\n <div class=\"c-native-select__no-results\">\n {{ 'modal.field.serverSelect.noResults' | translate }}\n </div>\n } @else {\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <div\n class=\"c-native-select__option\"\n [class.is-selected]=\"isOptionSelected(option.value)\"\n [class.is-highlighted]=\"highlightedIndex() === i\"\n (click)=\"selectOption(option, $event)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n {{ option.label | translate }}\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n <core-field-errors [errors]=\"errors()\" />\n</div>\n", styles: [":host{display:block}\n"] }]
1794
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { searchInputRef: [{
1641
1795
  type: ViewChild,
1642
- args: [NgSelectComponent]
1796
+ args: ['searchInput']
1797
+ }], onDocumentClick: [{
1798
+ type: HostListener,
1799
+ args: ['document:click', ['$event']]
1643
1800
  }] } });
1644
1801
 
1645
1802
  var AlertType;
@@ -2223,11 +2380,11 @@ class DocumentFieldComponent extends BaseFieldComponent {
2223
2380
  this.documentTypeControl.setValue('');
2224
2381
  }
2225
2382
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DocumentFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2226
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: DocumentFieldComponent, isStandalone: true, selector: "core-document-field", usesInheritance: true, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-group\">\n <label class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n <div class=\"c-entry-grid\">\n <core-select-field\n [field]=\"documentFieldConfig()\"\n [value]=\"currentDocumentType()\"\n [mode]=\"mode()\"\n (valueChange)=\"onDocumentTypeChangeFromSelect($event)\"\n ></core-select-field>\n <span class=\"c-entry-input\" [style.--chars]=\"documentNumberChars()\">\n <input\n type=\"text\"\n [value]=\"documentNumberControl.value\"\n [placeholder]=\"getDocumentNumberPlaceholder() | translate\"\n [disabled]=\"isDisabled()\"\n (focus)=\"onDocumentNumberFocus()\"\n (input)=\"onDocumentNumberChange($event)\"\n (blur)=\"onDocumentNumberBlur()\"\n />\n </span>\n </div>\n @if (hasError()) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n </label>\n</div>\n", 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"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: SelectFieldComponent, selector: "core-select-field", inputs: ["field"], outputs: ["selectionChange"] }] });
2383
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: DocumentFieldComponent, isStandalone: true, selector: "core-document-field", usesInheritance: true, hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-entry-group\">\n <label class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n <div class=\"c-entry-grid\">\n <core-select-field\n [field]=\"documentFieldConfig()\"\n [value]=\"currentDocumentType()\"\n [mode]=\"mode()\"\n (valueChange)=\"onDocumentTypeChangeFromSelect($event)\"\n ></core-select-field>\n <span class=\"c-entry-input\" [style.--chars]=\"documentNumberChars()\">\n <input\n type=\"text\"\n [value]=\"documentNumberControl.value\"\n [placeholder]=\"getDocumentNumberPlaceholder() | translate\"\n [disabled]=\"isDisabled()\"\n (focus)=\"onDocumentNumberFocus()\"\n (input)=\"onDocumentNumberChange($event)\"\n (blur)=\"onDocumentNumberBlur()\"\n />\n </span>\n </div>\n @if (hasError()) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n </label>\n</div>\n", 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"] }, { kind: "component", type: SelectFieldComponent, selector: "core-select-field", inputs: ["field"], outputs: ["selectionChange"] }] });
2227
2384
  }
2228
2385
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DocumentFieldComponent, decorators: [{
2229
2386
  type: Component,
2230
- args: [{ selector: 'core-document-field', standalone: true, imports: [CommonModule, FormsModule, TranslateModule, ReactiveFormsModule, FieldErrorsComponent, NgSelectModule, SelectFieldComponent], hostDirectives: [CoreHostDirective], template: "<div class=\"c-entry-group\">\n <label class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n <div class=\"c-entry-grid\">\n <core-select-field\n [field]=\"documentFieldConfig()\"\n [value]=\"currentDocumentType()\"\n [mode]=\"mode()\"\n (valueChange)=\"onDocumentTypeChangeFromSelect($event)\"\n ></core-select-field>\n <span class=\"c-entry-input\" [style.--chars]=\"documentNumberChars()\">\n <input\n type=\"text\"\n [value]=\"documentNumberControl.value\"\n [placeholder]=\"getDocumentNumberPlaceholder() | translate\"\n [disabled]=\"isDisabled()\"\n (focus)=\"onDocumentNumberFocus()\"\n (input)=\"onDocumentNumberChange($event)\"\n (blur)=\"onDocumentNumberBlur()\"\n />\n </span>\n </div>\n @if (hasError()) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n </label>\n</div>\n" }]
2387
+ args: [{ selector: 'core-document-field', standalone: true, imports: [CommonModule, FormsModule, TranslateModule, ReactiveFormsModule, FieldErrorsComponent, SelectFieldComponent], hostDirectives: [CoreHostDirective], template: "<div class=\"c-entry-group\">\n <label class=\"c-entry-item\" [class.c-entry-item--inline]=\"field().inline\">\n <span class=\"c-entry-text\" *ngIf=\"field().label\">\n {{ field().label | translate }}\n @if (hasRequiredValidators()) {\n <span class=\"c-required\">*</span>\n }\n </span>\n <div class=\"c-entry-grid\">\n <core-select-field\n [field]=\"documentFieldConfig()\"\n [value]=\"currentDocumentType()\"\n [mode]=\"mode()\"\n (valueChange)=\"onDocumentTypeChangeFromSelect($event)\"\n ></core-select-field>\n <span class=\"c-entry-input\" [style.--chars]=\"documentNumberChars()\">\n <input\n type=\"text\"\n [value]=\"documentNumberControl.value\"\n [placeholder]=\"getDocumentNumberPlaceholder() | translate\"\n [disabled]=\"isDisabled()\"\n (focus)=\"onDocumentNumberFocus()\"\n (input)=\"onDocumentNumberChange($event)\"\n (blur)=\"onDocumentNumberBlur()\"\n />\n </span>\n </div>\n @if (hasError()) {\n <core-field-errors [errors]=\"errors()\"></core-field-errors>\n }\n </label>\n</div>\n" }]
2231
2388
  }], ctorParameters: () => [] });
2232
2389
 
2233
2390
  // icon-compat.pipe.ts
@@ -17517,12 +17674,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17517
17674
  // Este archivo es generado automáticamente por scripts/update-version.js
17518
17675
  // No edites manualmente este archivo
17519
17676
  const VERSION = {
17520
- full: '2.20.22',
17677
+ full: '2.20.24',
17521
17678
  major: 2,
17522
17679
  minor: 20,
17523
- patch: 22,
17524
- timestamp: '2026-02-12T15:32:19.681Z',
17525
- buildDate: '12/2/2026'
17680
+ patch: 24,
17681
+ timestamp: '2026-02-24T16:07:06.271Z',
17682
+ buildDate: '24/2/2026'
17526
17683
  };
17527
17684
 
17528
17685
  class MainNavComponent {
@@ -22637,6 +22794,415 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
22637
22794
  }, template: "@if (showHeader()) {\n<div class=\"c-bookings-header\">\n <button class=\"c-bookings-header__today\" (click)=\"onTodayClick()\">\n {{ todayLabel() }}\n </button>\n\n <div class=\"c-bookings-header__date\">\n <button class=\"c-bookings-header__date-arrow icon-arrow-left\"\n [title]=\"viewMode() === 'week' ? 'Semana anterior' : 'D\u00EDa anterior'\" (click)=\"onPrevious()\"></button>\n <span>{{ formattedDate() }}</span>\n <button class=\"c-bookings-header__date-arrow icon-arrow-right\"\n [title]=\"viewMode() === 'week' ? 'Semana siguiente' : 'D\u00EDa siguiente'\" (click)=\"onNext()\"></button>\n </div>\n\n <div class=\"c-bookings-header__view-toggle\">\n <button class=\"c-bookings-header__view-btn\" [class.is-active]=\"viewMode() === 'day'\" (click)=\"setViewMode('day')\">\n {{ dayLabel() }}\n </button>\n <button class=\"c-bookings-header__view-btn\" [class.is-active]=\"viewMode() === 'week'\" (click)=\"setViewMode('week')\">\n {{ weekLabel() }}\n </button>\n <button class=\"c-bookings-header__view-btn\" [class.is-active]=\"viewMode() === 'month'\"\n (click)=\"setViewMode('month')\">\n {{ monthLabel() }}\n </button>\n </div>\n</div>\n} @if (viewMode() === 'day') {\n<!-- DAILY VIEW -->\n<div class=\"c-bookings-grid__wrapper\" [style.--cols]=\"columns().length\"\n [style.--row-height-rem]=\"mergedConfig().rowHeightRem\" style=\"position: relative\">\n @if (isToday() && currentTimePosition() !== null) {\n <div class=\"c-bookings-grid__current-time-line\" [style.--time-position-rem]=\"currentTimePosition()\"></div>\n } @if (showTimeColumn()) {\n <div class=\"c-bookings-grid__times\">\n <div class=\"c-bookings-grid__top\">\n <div class=\"c-bookings-grid__title\">{{ timeColumnLabel() }}</div>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (slot.displayTime) {\n <span class=\"c-bookings-grid__time\">{{ slot.time }}</span>\n }\n </div>\n }\n </div>\n } @for (column of columns(); track column.id) {\n <div class=\"c-bookings-grid__col\">\n <div class=\"c-bookings-grid__top\">\n <p class=\"c-bookings-grid__title\">{{ column.name }}</p>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (!isSlotOccupied(column.id, slot) && !mergedConfig().emptySlotEventsDisabled) {\n @if (isSlotDisabled(column.id, slot)) {\n <button class=\"c-bookings-grid__slot c-bookings-grid__slot--disabled\" disabled [title]=\"disabledSlotLabel()\">\n {{ disabledSlotLabel() }}\n </button>\n } @else {\n <button class=\"c-bookings-grid__slot\" [title]=\"emptySlotLabel()\" (click)=\"onSlotClick(column.id, slot)\">\n {{ emptySlotLabel() }}\n </button>\n }\n } @if (shouldShowEvent(column.id, slot)) { @let event =\n getEventForSlot(column.id, slot); @if (event) {\n <div [class]=\"getEventClasses(event)\" [attr.data-type]=\"event.type\" [attr.data-status]=\"event.status\"\n [style.--rows]=\"getEventRowSpan(event)\" (mouseenter)=\"onEventHover($event, event)\" (mouseleave)=\"onEventLeave()\"\n (click)=\"onEventClick(event, column)\">\n <p class=\"c-bookings-grid__title\">\n {{ event.title }}\n </p>\n <p class=\"c-bookings-grid__text\">\n {{ event.startTime }} - {{ event.endTime }}\n </p>\n @if (event.subtitle) {\n <p class=\"c-bookings-grid__text\">\n {{ event.subtitle }}\n </p>\n }\n\n @if (event.canCancel) {\n <button class=\"c-bookings-grid__link c-link--underlined\"\n (click)=\"$event.stopPropagation(); onCancelClick(event, column)\">\n <span class=\"icon-cross-thin\"></span>\n Cancelar\n </button>\n } @if (event.canApprove || event.canReject) {\n <div class=\"c-bookings-grid__quick-actions\">\n @if (event.canApprove) {\n <button class=\"c-icon-btn--fill context:success icon-check\" title=\"Aprobar\"\n [style.width.rem]=\"event.canApproveHeightRem\" [style.height.rem]=\"event.canApproveHeightRem\"\n (click)=\"$event.stopPropagation(); onApproveClick(event, column)\"></button>\n } @if (event.canReject) {\n <button class=\"c-icon-btn--fill context:error icon-cross\" title=\"Rechazar\"\n [style.width.rem]=\"event.canRejectHeightRem\" [style.height.rem]=\"event.canRejectHeightRem\"\n (click)=\"$event.stopPropagation(); onRejectClick(event, column)\"></button>\n }\n </div>\n }\n </div>\n } }\n </div>\n }\n </div>\n }\n</div>\n} @else if (viewMode() === 'week') {\n<!-- WEEKLY VIEW -->\n<div class=\"c-bookings-grid__wrapper c-bookings-grid__wrapper--weekly\" [style.--cols]=\"7\"\n [style.--row-height-rem]=\"mergedConfig().rowHeightRem\" style=\"position: relative\">\n @if (currentTimePosition() !== null && currentTimeDayIndex() >= 0) {\n <div class=\"c-bookings-grid__current-time-line c-bookings-grid__current-time-line--weekly\"\n [style.--time-position-rem]=\"currentTimePosition()\" [style.--day-index]=\"currentTimeDayIndex()\"></div>\n } @if (showTimeColumn()) {\n <div class=\"c-bookings-grid__times\">\n <div class=\"c-bookings-grid__top c-bookings-grid__top--weekly\">\n <div class=\"c-bookings-grid__title\">{{ timeColumnLabel() }}</div>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (slot.displayTime) {\n <span class=\"c-bookings-grid__time\">{{ slot.time }}</span>\n }\n </div>\n }\n </div>\n } @for (day of weekDays(); track day.date.getTime()) {\n <div class=\"c-bookings-grid__col\" [class.c-bookings-grid__col--weekend]=\"day.isWeekend\">\n <div class=\"c-bookings-grid__top c-bookings-grid__top--weekly\">\n <div class=\"c-bookings-grid__day-header\" [class.is-today]=\"day.isToday\">\n <span class=\"c-bookings-grid__day-name\">{{ day.dayName }}</span>\n <span class=\"c-bookings-grid__day-number\" [class.is-today]=\"day.isToday\">{{ day.dayNumber }}</span>\n </div>\n </div>\n\n @for (slot of timeSlots(); track slot.time) {\n <div class=\"c-bookings-grid__row\">\n @if (!isSlotOccupiedForDay(day.date, slot)) { @if\n (isSlotDisabledForDay(day.date, slot)) {\n <button class=\"c-bookings-grid__slot c-bookings-grid__slot--disabled\" disabled\n [title]=\"disabledSlotLabel()\"></button>\n } @else {\n <button class=\"c-bookings-grid__slot\" [title]=\"emptySlotLabel()\"\n (click)=\"onWeekSlotClick(day.date, slot)\"></button>\n } } @if (shouldShowEventForDay(day.date, slot)) { @let event =\n getEventForDaySlot(day.date, slot); @if (event) {\n <div [class]=\"getEventClasses(event)\" [attr.data-type]=\"event.type\" [attr.data-status]=\"event.status\"\n [style.--rows]=\"getEventRowSpan(event)\" (mouseenter)=\"onEventHover($event, event)\" (mouseleave)=\"onEventLeave()\"\n (click)=\"onWeekEventClick(event, day.date)\">\n <p class=\"c-bookings-grid__title\">\n {{ event.subtitle || event.title }}\n </p>\n <p class=\"c-bookings-grid__text\">\n {{ event.startTime }} - {{ event.endTime }}\n </p>\n </div>\n } }\n </div>\n }\n </div>\n }\n</div>\n} @else if (viewMode() === 'month') {\n<!-- MONTHLY VIEW -->\n<div class=\"c-bookings-grid__wrapper c-bookings-grid__wrapper--monthly\">\n <!-- Header Row -->\n <div class=\"c-bookings-grid__header-row\">\n @for (day of monthDays().slice(0, 7); track day.dayName) {\n <div class=\"c-bookings-grid__header-cell\">\n {{ day.dayName }}\n </div>\n }\n </div>\n\n <!-- Days Grid -->\n <div class=\"c-bookings-grid__month-grid\">\n @for (day of monthDays(); track day.date.getTime()) {\n <div class=\"c-bookings-grid__month-cell\" [class.is-today]=\"day.isToday\" [class.is-weekend]=\"day.isWeekend\"\n [class.is-other-month]=\"\n day.date.getUTCMonth() !== selectedDate().getUTCMonth()\n \" [class.is-disabled]=\"isDayDisabled(day.date)\" (click)=\"!isDayDisabled(day.date) && onMonthDayClick(day.date)\">\n <div class=\"c-bookings-grid__month-day-number\">\n {{ day.dayNumber }}\n </div>\n\n <div class=\"c-bookings-grid__month-events\">\n @let dayEvents = getEventsForDay(day.date); @for (event of\n dayEvents.slice(0, 3); track event.id) {\n <div class=\"c-bookings-grid__month-event\" [attr.data-type]=\"event.type\" [attr.data-status]=\"event.status\"\n [style.background-color]=\"event.metadata?.['color']\"\n [style.border-left]=\"event.metadata?.['color'] ? '3px solid ' + event.metadata?.['color'] : ''\"\n (click)=\"$event.stopPropagation(); onMonthEventClick(event, day.date)\">\n <span class=\"c-bookings-grid__month-event-title\">{{\n event.title\n }}</span>\n </div>\n } @if (dayEvents.length > 3) {\n <div class=\"c-bookings-grid__more-events\" (click)=\"openDayPopover(day.date, $event)\">\n {{ dayEvents.length - 3 }} m\u00E1s\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n @if (expandedDay()) {\n <div class=\"c-bookings-grid__popover-overlay\" (click)=\"closeDayPopover()\">\n <div class=\"c-bookings-grid__popover\" (click)=\"$event.stopPropagation()\">\n <div class=\"c-bookings-grid__popover-header\">\n <div class=\"c-bookings-grid__popover-date\">\n <span class=\"c-bookings-grid__popover-weekday\">{{\n expandedDay() | date : \"EEE\" : \"UTC\" : locale() | uppercase\n }}</span>\n <span class=\"c-bookings-grid__popover-daynum\">{{\n expandedDay() | date : \"d\" : \"UTC\"\n }}</span>\n </div>\n <button class=\"c-bookings-grid__popover-close\" (click)=\"closeDayPopover()\">\n <span class=\"icon-cross\"></span>\n </button>\n </div>\n <div class=\"c-bookings-grid__popover-content\">\n @for (event of getExpandedDayEvents(); track event.id) {\n <div class=\"c-bookings-grid__month-event c-bookings-grid__month-event--popover\" [attr.data-type]=\"event.type\"\n [attr.data-status]=\"event.status\" [style.background-color]=\"event.metadata?.['color']\"\n [style.border-left]=\"event.metadata?.['color'] ? '3px solid ' + event.metadata?.['color'] : ''\"\n (click)=\"onMonthEventClick(event, expandedDay()!)\">\n <span class=\"c-bookings-grid__month-event-title\">{{\n event.title\n }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n}", styles: [":host{display:block;width:100%;overflow:visible}.c-bookings-grid__month-cell.is-disabled{background-color:#f3f4f6;cursor:not-allowed;opacity:.7}.c-bookings-grid__month-cell.is-disabled:hover{background-color:#f3f4f6}.c-bookings-grid__month-cell.is-disabled .c-bookings-grid__month-day-number{color:#9ca3af}.c-bookings-grid__slot--disabled{background-color:#f3f4f6;cursor:not-allowed}.c-bookings-grid__slot--disabled:hover{background-color:#f3f4f6}.c-bookings-grid__row{height:calc(var(--row-height-rem, 4) * 1rem)}\n"] }]
22638
22795
  }] });
22639
22796
 
22797
+ class TreeService {
22798
+ setExpandedState(nodes, expanded) {
22799
+ for (const node of nodes) {
22800
+ if (node.children && node.children.length > 0) {
22801
+ node.isExpanded = expanded;
22802
+ this.setExpandedState(node.children, expanded);
22803
+ }
22804
+ }
22805
+ }
22806
+ findNodeById(nodes, id) {
22807
+ for (const node of nodes) {
22808
+ if (node.id === id)
22809
+ return node;
22810
+ if (node.children) {
22811
+ const found = this.findNodeById(node.children, id);
22812
+ if (found)
22813
+ return found;
22814
+ }
22815
+ }
22816
+ return null;
22817
+ }
22818
+ findParent(nodes, childId) {
22819
+ for (const node of nodes) {
22820
+ if (node.children?.some(c => c.id === childId)) {
22821
+ return node;
22822
+ }
22823
+ if (node.children) {
22824
+ const found = this.findParent(node.children, childId);
22825
+ if (found)
22826
+ return found;
22827
+ }
22828
+ }
22829
+ return null;
22830
+ }
22831
+ removeNode(nodes, nodeId) {
22832
+ return nodes
22833
+ .filter(n => n.id !== nodeId)
22834
+ .map(n => ({
22835
+ ...n,
22836
+ children: n.children ? this.removeNode(n.children, nodeId) : undefined
22837
+ }));
22838
+ }
22839
+ insertNode(nodes, nodeToInsert, targetId, position) {
22840
+ if (position === 'inside') {
22841
+ return nodes.map(n => {
22842
+ if (n.id === targetId) {
22843
+ return {
22844
+ ...n,
22845
+ children: [...(n.children || []), nodeToInsert],
22846
+ isExpanded: true
22847
+ };
22848
+ }
22849
+ return {
22850
+ ...n,
22851
+ children: n.children ? this.insertNode(n.children, nodeToInsert, targetId, position) : undefined
22852
+ };
22853
+ });
22854
+ }
22855
+ const result = [];
22856
+ for (const n of nodes) {
22857
+ if (n.id === targetId) {
22858
+ if (position === 'before') {
22859
+ result.push(nodeToInsert, n);
22860
+ }
22861
+ else {
22862
+ result.push(n, nodeToInsert);
22863
+ }
22864
+ }
22865
+ else {
22866
+ result.push({
22867
+ ...n,
22868
+ children: n.children ? this.insertNode(n.children, nodeToInsert, targetId, position) : undefined
22869
+ });
22870
+ }
22871
+ }
22872
+ return result;
22873
+ }
22874
+ getNodeDepth(nodes, nodeId, currentDepth = 0) {
22875
+ for (const node of nodes) {
22876
+ if (node.id === nodeId)
22877
+ return currentDepth;
22878
+ if (node.children) {
22879
+ const depth = this.getNodeDepth(node.children, nodeId, currentDepth + 1);
22880
+ if (depth >= 0)
22881
+ return depth;
22882
+ }
22883
+ }
22884
+ return -1;
22885
+ }
22886
+ getTotalNodeCount(nodes) {
22887
+ let count = 0;
22888
+ for (const node of nodes) {
22889
+ count++;
22890
+ if (node.children) {
22891
+ count += this.getTotalNodeCount(node.children);
22892
+ }
22893
+ }
22894
+ return count;
22895
+ }
22896
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
22897
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeService, providedIn: 'root' });
22898
+ }
22899
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeService, decorators: [{
22900
+ type: Injectable,
22901
+ args: [{
22902
+ providedIn: 'root'
22903
+ }]
22904
+ }] });
22905
+
22906
+ class TreeNodeComponent {
22907
+ node = input.required();
22908
+ level = input(0);
22909
+ config = input({});
22910
+ nodeTemplate = input(undefined);
22911
+ isDragOver = false;
22912
+ dropPosition = null;
22913
+ expanded = signal(false);
22914
+ constructor() {
22915
+ effect(() => {
22916
+ this.expanded.set(this.node().isExpanded ?? false);
22917
+ });
22918
+ }
22919
+ nodeToggled = output();
22920
+ nodeClicked = output();
22921
+ actionTriggered = output();
22922
+ nodeDragStart = output();
22923
+ nodeDragOver = output();
22924
+ nodeDrop = output();
22925
+ nodeDragEnd = output();
22926
+ hasChildren = computed(() => {
22927
+ return (this.node().children?.length ?? 0) > 0;
22928
+ });
22929
+ resolvedIcon = computed(() => {
22930
+ const n = this.node();
22931
+ const isExpanded = this.expanded();
22932
+ if (n.icon)
22933
+ return n.icon;
22934
+ const resolver = this.config().iconResolver;
22935
+ if (resolver)
22936
+ return resolver({ ...n, isExpanded }, this.level());
22937
+ if (this.hasChildren()) {
22938
+ return isExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder';
22939
+ }
22940
+ return 'fa-solid fa-file';
22941
+ });
22942
+ isAnimationsEnabled = computed(() => {
22943
+ return this.config().enableAnimations !== false;
22944
+ });
22945
+ isDragDropEnabled = computed(() => {
22946
+ return this.config().enableDragDrop === true;
22947
+ });
22948
+ visibleActions = computed(() => {
22949
+ const configActions = this.config().actions || [];
22950
+ const nodeActions = this.node().actions || [];
22951
+ const merged = [...configActions];
22952
+ for (const nodeAction of nodeActions) {
22953
+ const existingIndex = merged.findIndex(a => a.key === nodeAction.key);
22954
+ if (existingIndex >= 0) {
22955
+ merged[existingIndex] = nodeAction;
22956
+ }
22957
+ else {
22958
+ merged.push(nodeAction);
22959
+ }
22960
+ }
22961
+ const n = this.node();
22962
+ return merged.filter(action => {
22963
+ if (action.shouldShow) {
22964
+ return action.shouldShow(n);
22965
+ }
22966
+ return true;
22967
+ });
22968
+ });
22969
+ nodeClasses = computed(() => {
22970
+ const classes = ['c-tree-node'];
22971
+ if (this.node().customClass) {
22972
+ classes.push(this.node().customClass);
22973
+ }
22974
+ return classes.join(' ');
22975
+ });
22976
+ getActionButtonConfig(action) {
22977
+ const disabled = this.isActionDisabled(action);
22978
+ if (action.buttonConfig) {
22979
+ return {
22980
+ type: action.buttonConfig.type || ButtonType.ICON,
22981
+ icon: action.buttonConfig.icon || action.icon || '',
22982
+ ariaLabel: action.tooltip || action.label || action.key,
22983
+ customClass: action.class || '',
22984
+ disabled,
22985
+ ...action.buttonConfig
22986
+ };
22987
+ }
22988
+ return {
22989
+ type: ButtonType.ICON,
22990
+ icon: action.icon || '',
22991
+ ariaLabel: action.tooltip || action.label || action.key,
22992
+ customClass: action.class || '',
22993
+ disabled
22994
+ };
22995
+ }
22996
+ isActionDisabled(action) {
22997
+ if (action.shouldDisable) {
22998
+ return action.shouldDisable(this.node());
22999
+ }
23000
+ return false;
23001
+ }
23002
+ toggle() {
23003
+ const currentNode = this.node();
23004
+ if (this.hasChildren()) {
23005
+ const newValue = !this.expanded();
23006
+ currentNode.isExpanded = newValue;
23007
+ this.expanded.set(newValue);
23008
+ this.nodeToggled.emit(currentNode);
23009
+ }
23010
+ }
23011
+ onNodeClick() {
23012
+ if (this.config().expandOnClick && this.hasChildren()) {
23013
+ this.toggle();
23014
+ }
23015
+ this.nodeClicked.emit(this.node());
23016
+ }
23017
+ onActionClick(action, event) {
23018
+ event.originalEvent.stopPropagation();
23019
+ if (!this.isActionDisabled(action)) {
23020
+ action.callback(this.node());
23021
+ this.actionTriggered.emit({ action, node: this.node() });
23022
+ }
23023
+ }
23024
+ onDragStart(event) {
23025
+ if (!this.isDragDropEnabled())
23026
+ return;
23027
+ const n = this.node();
23028
+ if (n.draggable === false) {
23029
+ event.preventDefault();
23030
+ return;
23031
+ }
23032
+ event.dataTransfer?.setData('text/plain', String(n.id));
23033
+ event.stopPropagation();
23034
+ this.nodeDragStart.emit({ event, node: n });
23035
+ }
23036
+ onDragOver(event) {
23037
+ if (!this.isDragDropEnabled())
23038
+ return;
23039
+ const n = this.node();
23040
+ if (n.droppable === false)
23041
+ return;
23042
+ event.preventDefault();
23043
+ event.stopPropagation();
23044
+ const rect = event.currentTarget.getBoundingClientRect();
23045
+ const y = event.clientY - rect.top;
23046
+ const height = rect.height;
23047
+ let position;
23048
+ if (y < height * 0.25) {
23049
+ position = 'before';
23050
+ }
23051
+ else if (y > height * 0.75) {
23052
+ position = 'after';
23053
+ }
23054
+ else {
23055
+ position = 'inside';
23056
+ }
23057
+ this.isDragOver = true;
23058
+ this.dropPosition = position;
23059
+ this.nodeDragOver.emit({ event, node: n, position });
23060
+ }
23061
+ onDragLeave(event) {
23062
+ this.isDragOver = false;
23063
+ this.dropPosition = null;
23064
+ }
23065
+ onDrop(event) {
23066
+ if (!this.isDragDropEnabled())
23067
+ return;
23068
+ event.preventDefault();
23069
+ event.stopPropagation();
23070
+ const position = this.dropPosition || 'inside';
23071
+ this.isDragOver = false;
23072
+ this.dropPosition = null;
23073
+ this.nodeDrop.emit({ event, node: this.node(), position });
23074
+ }
23075
+ onDragEnd(event) {
23076
+ this.isDragOver = false;
23077
+ this.dropPosition = null;
23078
+ this.nodeDragEnd.emit({ event });
23079
+ }
23080
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23081
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: TreeNodeComponent, isStandalone: true, selector: "core-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeToggled: "nodeToggled", nodeClicked: "nodeClicked", actionTriggered: "actionTriggered", nodeDragStart: "nodeDragStart", nodeDragOver: "nodeDragOver", nodeDrop: "nodeDrop", nodeDragEnd: "nodeDragEnd" }, ngImport: i0, template: "<li\n [class]=\"nodeClasses()\"\n [attr.data-level]=\"level()\"\n [attr.data-node-id]=\"node().id\"\n [attr.draggable]=\"isDragDropEnabled() && node().draggable !== false\"\n (dragstart)=\"onDragStart($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (dragend)=\"onDragEnd($event)\"\n [class.is-drag-over]=\"isDragOver\"\n [class.drop-before]=\"dropPosition === 'before'\"\n [class.drop-after]=\"dropPosition === 'after'\"\n [class.drop-inside]=\"dropPosition === 'inside'\"\n>\n <div class=\"c-tree-node__row\">\n <!-- Expand/Collapse toggle -->\n <button\n type=\"button\"\n class=\"c-tree-node__toggle\"\n [class.is-expanded]=\"expanded()\"\n [class.is-leaf]=\"!hasChildren()\"\n [disabled]=\"!hasChildren()\"\n (click)=\"toggle()\"\n >\n @if (hasChildren()) {\n <span class=\"c-tree-node__toggle-icon fa-solid fa-chevron-right\"></span>\n }\n </button>\n\n <!-- Node icon (dynamic) -->\n <span class=\"c-tree-node__icon\" [ngClass]=\"resolvedIcon()\"></span>\n\n <!-- Node content -->\n @if (nodeTemplate()) {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate()!;\n context: { $implicit: node(), level: level() }\n \"\n >\n </ng-container>\n </div>\n } @else {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <span class=\"c-tree-node__label\">{{ node().label }}</span>\n </div>\n }\n\n <!-- Node actions (custom actions like generic-table) -->\n @if (visibleActions().length > 0) {\n <div class=\"c-tree-node__actions\">\n @for (action of visibleActions(); track action.key) {\n <core-generic-button\n [config]=\"getActionButtonConfig(action)\"\n (buttonClick)=\"onActionClick(action, $event)\"\n >\n </core-generic-button>\n }\n </div>\n }\n </div>\n\n <!-- Children (recursive) -->\n @if (hasChildren()) {\n <ul\n class=\"c-tree-node__children\"\n [class.is-expanded]=\"expanded()\"\n [class.is-animated]=\"isAnimationsEnabled()\"\n >\n @for (child of node().children; track child.id) {\n <core-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [config]=\"config()\"\n [nodeTemplate]=\"nodeTemplate()\"\n (nodeToggled)=\"nodeToggled.emit($event)\"\n (nodeClicked)=\"nodeClicked.emit($event)\"\n (actionTriggered)=\"actionTriggered.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (nodeDragOver)=\"nodeDragOver.emit($event)\"\n (nodeDrop)=\"nodeDrop.emit($event)\"\n (nodeDragEnd)=\"nodeDragEnd.emit($event)\"\n />\n }\n </ul>\n }\n</li>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-node{list-style:none;position:relative;margin:0}.c-tree-node__row{display:flex;align-items:center;gap:.875rem;padding:1rem 1.5rem;padding-left:calc(1.5rem + var(--tree-level, 0) * 2rem);border-bottom:1px solid var(--color-neutral-200, #e5e7eb);transition:background-color .15s ease;min-height:3.75rem;background:var(--color-white, #fff);cursor:default}.c-tree-node__row:hover{background-color:var(--color-neutral-50, #f9fafb)}.c-tree-node__row:hover .c-tree-node__actions{opacity:1;pointer-events:auto}.c-tree-node[data-level=\"0\"]>.c-tree-node__row{--tree-level: 0}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{--tree-level: 1}.c-tree-node[data-level=\"2\"]>.c-tree-node__row{--tree-level: 2}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{--tree-level: 3}.c-tree-node[data-level=\"4\"]>.c-tree-node__row{--tree-level: 4}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{--tree-level: 5}.c-tree-node[data-level=\"6\"]>.c-tree-node__row{--tree-level: 6}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node__toggle{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;background:transparent;border:none;cursor:pointer;color:var(--color-neutral-500, #6b7280);flex-shrink:0;border-radius:.25rem;transition:background-color .15s ease,color .15s ease}.c-tree-node__toggle:hover:not(:disabled){background-color:var(--color-neutral-100, #f3f4f6);color:var(--color-neutral-700, #374151)}.c-tree-node__toggle:disabled{cursor:default;opacity:0}.c-tree-node__toggle-icon{font-size:.7em;transition:transform .25s cubic-bezier(.4,0,.2,1)}.c-tree-node__toggle.is-expanded .c-tree-node__toggle-icon{transform:rotate(90deg)}.c-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;font-size:var(--fz-100);color:var(--color-primary, #3b82f6);flex-shrink:0;transition:color .15s ease,transform .15s ease}.c-tree-node__row:hover .c-tree-node__icon{color:var(--color-primary-dark, #2563eb)}.c-tree-node__content{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0;cursor:pointer;-webkit-user-select:none;user-select:none}.c-tree-node__label{font-weight:600;color:var(--color-neutral-800, #1f2937);font-size:var(--fz-100);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-tree-node[data-level=\"1\"] .c-tree-node__label,.c-tree-node[data-level=\"2\"] .c-tree-node__label,.c-tree-node[data-level=\"3\"] .c-tree-node__label,.c-tree-node[data-level=\"4\"] .c-tree-node__label,.c-tree-node[data-level=\"5\"] .c-tree-node__label,.c-tree-node[data-level=\"6\"] .c-tree-node__label{font-weight:500;font-size:var(--fz-100);color:var(--color-neutral-700, #374151)}.c-tree-node__actions{display:flex;align-items:center;gap:.375rem;margin-left:auto;flex-shrink:0;opacity:0;pointer-events:none;transition:opacity .2s ease;padding-left:.5rem}.c-tree-node__children{list-style:none;padding:0;margin:0;overflow:hidden;max-height:0;opacity:0}.c-tree-node__children.is-expanded{max-height:none;opacity:1}.c-tree-node__children.is-animated{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease .05s}.c-tree-node__children.is-animated.is-expanded{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease}.c-tree-node[draggable=true]{cursor:grab}.c-tree-node[draggable=true]:active{cursor:grabbing}.c-tree-node.is-drag-over .c-tree-node__row{background-color:var(--color-primary-50, #eff6ff)}.c-tree-node.drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-inside>.c-tree-node__row{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px;border-radius:.25rem}@keyframes dropIndicatorFadeIn{0%{opacity:0;transform:scaleX(.8)}to{opacity:1;transform:scaleX(1)}}:host-context(.c-tree--connectors) .c-tree-node:not([data-level=\"0\"]):before{content:\"\";position:absolute;left:calc(1.25rem + (var(--tree-level, 0) - 1) * 2rem + .75rem);top:0;bottom:0;width:1px;background:linear-gradient(to bottom,transparent 0%,var(--color-neutral-300, #d1d5db) 15%,var(--color-neutral-300, #d1d5db) 85%,transparent 100%);opacity:.5}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "core-tree-node", inputs: ["node", "level", "config", "nodeTemplate"], outputs: ["nodeToggled", "nodeClicked", "actionTriggered", "nodeDragStart", "nodeDragOver", "nodeDrop", "nodeDragEnd"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: GenericButtonComponent, selector: "core-generic-button", inputs: ["config", "data"], outputs: ["buttonClick"] }] });
23082
+ }
23083
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: TreeNodeComponent, decorators: [{
23084
+ type: Component,
23085
+ args: [{ selector: 'core-tree-node', standalone: true, imports: [CommonModule, TranslateModule, GenericButtonComponent], template: "<li\n [class]=\"nodeClasses()\"\n [attr.data-level]=\"level()\"\n [attr.data-node-id]=\"node().id\"\n [attr.draggable]=\"isDragDropEnabled() && node().draggable !== false\"\n (dragstart)=\"onDragStart($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (dragend)=\"onDragEnd($event)\"\n [class.is-drag-over]=\"isDragOver\"\n [class.drop-before]=\"dropPosition === 'before'\"\n [class.drop-after]=\"dropPosition === 'after'\"\n [class.drop-inside]=\"dropPosition === 'inside'\"\n>\n <div class=\"c-tree-node__row\">\n <!-- Expand/Collapse toggle -->\n <button\n type=\"button\"\n class=\"c-tree-node__toggle\"\n [class.is-expanded]=\"expanded()\"\n [class.is-leaf]=\"!hasChildren()\"\n [disabled]=\"!hasChildren()\"\n (click)=\"toggle()\"\n >\n @if (hasChildren()) {\n <span class=\"c-tree-node__toggle-icon fa-solid fa-chevron-right\"></span>\n }\n </button>\n\n <!-- Node icon (dynamic) -->\n <span class=\"c-tree-node__icon\" [ngClass]=\"resolvedIcon()\"></span>\n\n <!-- Node content -->\n @if (nodeTemplate()) {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate()!;\n context: { $implicit: node(), level: level() }\n \"\n >\n </ng-container>\n </div>\n } @else {\n <div class=\"c-tree-node__content\" (click)=\"onNodeClick()\">\n <span class=\"c-tree-node__label\">{{ node().label }}</span>\n </div>\n }\n\n <!-- Node actions (custom actions like generic-table) -->\n @if (visibleActions().length > 0) {\n <div class=\"c-tree-node__actions\">\n @for (action of visibleActions(); track action.key) {\n <core-generic-button\n [config]=\"getActionButtonConfig(action)\"\n (buttonClick)=\"onActionClick(action, $event)\"\n >\n </core-generic-button>\n }\n </div>\n }\n </div>\n\n <!-- Children (recursive) -->\n @if (hasChildren()) {\n <ul\n class=\"c-tree-node__children\"\n [class.is-expanded]=\"expanded()\"\n [class.is-animated]=\"isAnimationsEnabled()\"\n >\n @for (child of node().children; track child.id) {\n <core-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [config]=\"config()\"\n [nodeTemplate]=\"nodeTemplate()\"\n (nodeToggled)=\"nodeToggled.emit($event)\"\n (nodeClicked)=\"nodeClicked.emit($event)\"\n (actionTriggered)=\"actionTriggered.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (nodeDragOver)=\"nodeDragOver.emit($event)\"\n (nodeDrop)=\"nodeDrop.emit($event)\"\n (nodeDragEnd)=\"nodeDragEnd.emit($event)\"\n />\n }\n </ul>\n }\n</li>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-node{list-style:none;position:relative;margin:0}.c-tree-node__row{display:flex;align-items:center;gap:.875rem;padding:1rem 1.5rem;padding-left:calc(1.5rem + var(--tree-level, 0) * 2rem);border-bottom:1px solid var(--color-neutral-200, #e5e7eb);transition:background-color .15s ease;min-height:3.75rem;background:var(--color-white, #fff);cursor:default}.c-tree-node__row:hover{background-color:var(--color-neutral-50, #f9fafb)}.c-tree-node__row:hover .c-tree-node__actions{opacity:1;pointer-events:auto}.c-tree-node[data-level=\"0\"]>.c-tree-node__row{--tree-level: 0}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{--tree-level: 1}.c-tree-node[data-level=\"2\"]>.c-tree-node__row{--tree-level: 2}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{--tree-level: 3}.c-tree-node[data-level=\"4\"]>.c-tree-node__row{--tree-level: 4}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{--tree-level: 5}.c-tree-node[data-level=\"6\"]>.c-tree-node__row{--tree-level: 6}.c-tree-node[data-level=\"1\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"3\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node[data-level=\"5\"]>.c-tree-node__row{background:var(--color-neutral-50, #fafbfc)}.c-tree-node__toggle{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;background:transparent;border:none;cursor:pointer;color:var(--color-neutral-500, #6b7280);flex-shrink:0;border-radius:.25rem;transition:background-color .15s ease,color .15s ease}.c-tree-node__toggle:hover:not(:disabled){background-color:var(--color-neutral-100, #f3f4f6);color:var(--color-neutral-700, #374151)}.c-tree-node__toggle:disabled{cursor:default;opacity:0}.c-tree-node__toggle-icon{font-size:.7em;transition:transform .25s cubic-bezier(.4,0,.2,1)}.c-tree-node__toggle.is-expanded .c-tree-node__toggle-icon{transform:rotate(90deg)}.c-tree-node__icon{display:inline-flex;align-items:center;justify-content:center;width:1em;height:1em;font-size:var(--fz-100);color:var(--color-primary, #3b82f6);flex-shrink:0;transition:color .15s ease,transform .15s ease}.c-tree-node__row:hover .c-tree-node__icon{color:var(--color-primary-dark, #2563eb)}.c-tree-node__content{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0;cursor:pointer;-webkit-user-select:none;user-select:none}.c-tree-node__label{font-weight:600;color:var(--color-neutral-800, #1f2937);font-size:var(--fz-100);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-tree-node[data-level=\"1\"] .c-tree-node__label,.c-tree-node[data-level=\"2\"] .c-tree-node__label,.c-tree-node[data-level=\"3\"] .c-tree-node__label,.c-tree-node[data-level=\"4\"] .c-tree-node__label,.c-tree-node[data-level=\"5\"] .c-tree-node__label,.c-tree-node[data-level=\"6\"] .c-tree-node__label{font-weight:500;font-size:var(--fz-100);color:var(--color-neutral-700, #374151)}.c-tree-node__actions{display:flex;align-items:center;gap:.375rem;margin-left:auto;flex-shrink:0;opacity:0;pointer-events:none;transition:opacity .2s ease;padding-left:.5rem}.c-tree-node__children{list-style:none;padding:0;margin:0;overflow:hidden;max-height:0;opacity:0}.c-tree-node__children.is-expanded{max-height:none;opacity:1}.c-tree-node__children.is-animated{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease .05s}.c-tree-node__children.is-animated.is-expanded{transition:max-height .3s cubic-bezier(.4,0,.2,1),opacity .2s ease}.c-tree-node[draggable=true]{cursor:grab}.c-tree-node[draggable=true]:active{cursor:grabbing}.c-tree-node.is-drag-over .c-tree-node__row{background-color:var(--color-primary-50, #eff6ff)}.c-tree-node.drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--color-primary, #3b82f6);z-index:1;animation:dropIndicatorFadeIn .15s ease forwards}.c-tree-node.drop-inside>.c-tree-node__row{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px;border-radius:.25rem}@keyframes dropIndicatorFadeIn{0%{opacity:0;transform:scaleX(.8)}to{opacity:1;transform:scaleX(1)}}:host-context(.c-tree--connectors) .c-tree-node:not([data-level=\"0\"]):before{content:\"\";position:absolute;left:calc(1.25rem + (var(--tree-level, 0) - 1) * 2rem + .75rem);top:0;bottom:0;width:1px;background:linear-gradient(to bottom,transparent 0%,var(--color-neutral-300, #d1d5db) 15%,var(--color-neutral-300, #d1d5db) 85%,transparent 100%);opacity:.5}\n"] }]
23086
+ }], ctorParameters: () => [] });
23087
+
23088
+ class GenericTreeComponent {
23089
+ treeService = inject(TreeService);
23090
+ customNodeTemplate;
23091
+ nodes = input.required();
23092
+ config = input({});
23093
+ customClass = input('');
23094
+ emptyMessage = input('common.no_results');
23095
+ emptyIcon = input('fa-solid fa-folder-open');
23096
+ nodeToggled = output();
23097
+ nodeClicked = output();
23098
+ actionTriggered = output();
23099
+ nodeDrop = output();
23100
+ nodesChanged = output();
23101
+ isAllExpanded = signal(false);
23102
+ draggedNodeId = signal(null);
23103
+ mergedConfig = computed(() => {
23104
+ const defaults = {
23105
+ enableDragDrop: false,
23106
+ enableAnimations: true,
23107
+ showExpandToggle: true,
23108
+ showConnectors: false,
23109
+ emptyMessage: this.emptyMessage(),
23110
+ emptyIcon: this.emptyIcon(),
23111
+ expandAllByDefault: false,
23112
+ maxDropDepth: 0,
23113
+ actions: []
23114
+ };
23115
+ return { ...defaults, ...this.config() };
23116
+ });
23117
+ hasNodes = computed(() => this.nodes().length > 0);
23118
+ treeClasses = computed(() => {
23119
+ const classes = ['c-tree'];
23120
+ if (this.mergedConfig().showConnectors) {
23121
+ classes.push('c-tree--connectors');
23122
+ }
23123
+ if (this.mergedConfig().enableDragDrop) {
23124
+ classes.push('c-tree--draggable');
23125
+ }
23126
+ const custom = this.customClass();
23127
+ if (custom) {
23128
+ classes.push(custom);
23129
+ }
23130
+ return classes.join(' ');
23131
+ });
23132
+ effectiveNodeTemplate = computed(() => {
23133
+ return this.mergedConfig().nodeTemplate || this.customNodeTemplate || undefined;
23134
+ });
23135
+ toggleExpandAll() {
23136
+ const newState = !this.isAllExpanded();
23137
+ this.treeService.setExpandedState(this.nodes(), newState);
23138
+ this.isAllExpanded.set(newState);
23139
+ }
23140
+ expandAll() {
23141
+ this.treeService.setExpandedState(this.nodes(), true);
23142
+ this.isAllExpanded.set(true);
23143
+ }
23144
+ collapseAll() {
23145
+ this.treeService.setExpandedState(this.nodes(), false);
23146
+ this.isAllExpanded.set(false);
23147
+ }
23148
+ onNodeToggled(node) {
23149
+ this.nodeToggled.emit(node);
23150
+ }
23151
+ onNodeClicked(node) {
23152
+ this.nodeClicked.emit(node);
23153
+ }
23154
+ onActionTriggered(event) {
23155
+ this.actionTriggered.emit(event);
23156
+ }
23157
+ onDragStart(event) {
23158
+ this.draggedNodeId.set(event.node.id);
23159
+ }
23160
+ onDragEnd() {
23161
+ this.draggedNodeId.set(null);
23162
+ }
23163
+ onNodeDrop(event) {
23164
+ const draggedId = this.draggedNodeId();
23165
+ if (draggedId === null || draggedId === event.node.id)
23166
+ return;
23167
+ const draggedNode = this.treeService.findNodeById(this.nodes(), draggedId);
23168
+ if (!draggedNode)
23169
+ return;
23170
+ const maxDepth = this.mergedConfig().maxDropDepth;
23171
+ if (maxDepth && maxDepth > 0 && event.position === 'inside') {
23172
+ const targetDepth = this.treeService.getNodeDepth(this.nodes(), event.node.id);
23173
+ if (targetDepth >= maxDepth)
23174
+ return;
23175
+ }
23176
+ let updatedNodes = this.treeService.removeNode(this.nodes(), draggedId);
23177
+ updatedNodes = this.treeService.insertNode(updatedNodes, draggedNode, event.node.id, event.position);
23178
+ const dropEvent = {
23179
+ draggedNode,
23180
+ targetNode: event.node,
23181
+ position: event.position,
23182
+ updatedNodes
23183
+ };
23184
+ this.nodeDrop.emit(dropEvent);
23185
+ this.nodesChanged.emit(updatedNodes);
23186
+ this.draggedNodeId.set(null);
23187
+ }
23188
+ trackByNodeId(index, node) {
23189
+ return node.id;
23190
+ }
23191
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GenericTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23192
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: GenericTreeComponent, isStandalone: true, selector: "core-generic-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, customClass: { classPropertyName: "customClass", publicName: "customClass", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyIcon: { classPropertyName: "emptyIcon", publicName: "emptyIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeToggled: "nodeToggled", nodeClicked: "nodeClicked", actionTriggered: "actionTriggered", nodeDrop: "nodeDrop", nodesChanged: "nodesChanged" }, queries: [{ propertyName: "customNodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true }], hostDirectives: [{ directive: CoreHostDirective }], ngImport: i0, template: "<div class=\"c-tree-container\" [class]=\"customClass()\">\n @if (hasNodes()) {\n <ul [class]=\"treeClasses()\">\n @for (node of nodes(); track trackByNodeId($index, node)) {\n <core-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [config]=\"mergedConfig()\"\n [nodeTemplate]=\"effectiveNodeTemplate()\"\n (nodeToggled)=\"onNodeToggled($event)\"\n (nodeClicked)=\"onNodeClicked($event)\"\n (actionTriggered)=\"onActionTriggered($event)\"\n (nodeDragStart)=\"onDragStart($event)\"\n (nodeDragOver)=\"($event)\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (nodeDragEnd)=\"onDragEnd()\"\n />\n }\n </ul>\n } @else {\n <div class=\"c-tree-empty\">\n <span class=\"{{ mergedConfig().emptyIcon }} c-tree-empty__icon\"></span>\n <p class=\"c-tree-empty__text\">\n {{ mergedConfig().emptyMessage! | translate }}\n </p>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-container{background:var(--color-white, #fff);border-radius:var(--app-br, .5rem);border:1px solid var(--color-neutral-200, #e5e7eb);overflow:hidden}.c-tree{list-style:none;padding:0;margin:0}.c-tree-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem;text-align:center}.c-tree-empty__icon{font-size:3rem;color:var(--color-neutral-400, #9ca3af);margin-bottom:1rem;opacity:.6}.c-tree-empty__text{margin:0;font-size:.875rem;color:var(--color-neutral-500, #6b7280)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: TreeNodeComponent, selector: "core-tree-node", inputs: ["node", "level", "config", "nodeTemplate"], outputs: ["nodeToggled", "nodeClicked", "actionTriggered", "nodeDragStart", "nodeDragOver", "nodeDrop", "nodeDragEnd"] }] });
23193
+ }
23194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GenericTreeComponent, decorators: [{
23195
+ type: Component,
23196
+ args: [{ selector: 'core-generic-tree', standalone: true, imports: [
23197
+ CommonModule,
23198
+ TranslateModule,
23199
+ TreeNodeComponent
23200
+ ], hostDirectives: [CoreHostDirective], template: "<div class=\"c-tree-container\" [class]=\"customClass()\">\n @if (hasNodes()) {\n <ul [class]=\"treeClasses()\">\n @for (node of nodes(); track trackByNodeId($index, node)) {\n <core-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [config]=\"mergedConfig()\"\n [nodeTemplate]=\"effectiveNodeTemplate()\"\n (nodeToggled)=\"onNodeToggled($event)\"\n (nodeClicked)=\"onNodeClicked($event)\"\n (actionTriggered)=\"onActionTriggered($event)\"\n (nodeDragStart)=\"onDragStart($event)\"\n (nodeDragOver)=\"($event)\"\n (nodeDrop)=\"onNodeDrop($event)\"\n (nodeDragEnd)=\"onDragEnd()\"\n />\n }\n </ul>\n } @else {\n <div class=\"c-tree-empty\">\n <span class=\"{{ mergedConfig().emptyIcon }} c-tree-empty__icon\"></span>\n <p class=\"c-tree-empty__text\">\n {{ mergedConfig().emptyMessage! | translate }}\n </p>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.c-tree-container{background:var(--color-white, #fff);border-radius:var(--app-br, .5rem);border:1px solid var(--color-neutral-200, #e5e7eb);overflow:hidden}.c-tree{list-style:none;padding:0;margin:0}.c-tree-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem;text-align:center}.c-tree-empty__icon{font-size:3rem;color:var(--color-neutral-400, #9ca3af);margin-bottom:1rem;opacity:.6}.c-tree-empty__text{margin:0;font-size:.875rem;color:var(--color-neutral-500, #6b7280)}\n"] }]
23201
+ }], propDecorators: { customNodeTemplate: [{
23202
+ type: ContentChild,
23203
+ args: ['nodeTemplate']
23204
+ }] } });
23205
+
22640
23206
  class CacheBustingInterceptor {
22641
23207
  intercept(req, next) {
22642
23208
  if (req.url.includes('/assets/i18n/') && req.url.endsWith('.json')) {
@@ -22918,5 +23484,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
22918
23484
  * Generated bundle index. Do not edit.
22919
23485
  */
22920
23486
 
22921
- export { AD_AUTH_CONFIG, AD_AUTH_INTERCEPTOR_CONFIG, ALL_COUNTRY_CODES, ActiveFiltersComponent, AdAuthService, AdInteractionType, AdLoginButtonComponent, AgeValidationHelper, AlertComponent, AlertContainerComponent, AlertService, AlertType, ApiConfigurationProvider, BaseFieldComponent, ButtonContext, ButtonSize, ButtonType, COMMON_COUNTRIES, CacheBustingInterceptor, CalendarEventType, CardComponent, CarouselComponent, ChatMessagePosition, ChatMessageType, CheckboxFieldComponent, ColorPickerFieldComponent, ConfigurationModel, ConfirmationDialogComponent, ConfirmationDialogService, CoreHostDirective, CoreManualRefreshComponent, CoreUiHttpLoaderFactory, CoreUiTranslateLoader, CoreUiTranslateService, CountryCode, CustomClassService, DEFAULT_AD_AUTH_INTERCEPTOR_CONFIG, DEFAULT_COUNTRIES, DEFAULT_SCHEDULER_CONFIG, DataListComponent, DataListItemComponent, DataStoreService, DateFieldComponent, DateRangeFieldComponent, DateUtility, DatetimeFieldComponent, DayState, DayType, DialogActions, DocumentAction, DocumentDisplayMode, DocumentFieldComponent, DocumentFieldValidators, DocumentPayloadMode, DropdownComponent, DropdownDirection, DropdownService, DynamicFieldDirective, DynamicFieldsHelper, FieldErrorsComponent, FieldType, FileFieldComponent, FileModel, FilePreviewActionType, FileTemplateModel, FileTemplateType, FileType, FileTypeModel, FileUploadService, FilterModalComponent, FilterService, FilterType, FixedActionPosition, FixedActionsMobileModalComponent, FixedActionsMobileModalService, GalleryAnimationType, GalleryLayoutType, GalleryModalComponent, GalleryModalGlobalService, GenericButtonComponent, GenericCalendarComponent, GenericChatComponent, GenericChatService, GenericDocumentationComponent, GenericFixedActionsComponent, GenericGalleryComponent, GenericModalComponent, GenericPaginationComponent, GenericRatingComponent, GenericSchedulerComponent, GenericSidebarComponent, GenericSkeletonComponent, GenericStepsComponent, GenericSwitchComponent, GenericTableComponent, GenericTabsComponent, GenericTimelineComponent, GlobalApiConfigService, HeaderComponent, HeaderConfigurationService, HeaderElementType, HeaderService, HttpLoaderFactory, ImageModalComponent, ImageModalService, ImagePreviewComponent, LATIN_AMERICA_COUNTRIES, LayoutAuth, LayoutBreakpoint, LayoutComponent, LayoutService, LayoutStateService, LayoutType, LoaderComponent, LoaderService, MODEL_REFERENCE_SORT_KEY, MainNavComponent, MainNavService, ManualRefreshService, MobileHeaderComponent, MobileResolutionService, ModalMode, ModelApiService, MultiEntryFieldComponent, MultiEntryOutputFormat, NumberFieldComponent, NumberFieldConfigType, NumberFieldType, NumberRange, PERMISSION_ACTIONS_PROVIDER, PERMISSION_PROVIDER, PERMISSION_RESOURCES_PROVIDER, PaginationService, PasswordFieldComponent, PermissionEnumsService, PermissionModel, PermissionService, PermissionWrapperService, PermissionsActions, PermissionsCustomActions, PermissionsInterceptor, PermissionsResources, PhoneFieldComponent, ProgressBarComponent, ProgressBarSize, RatingService, RatingSize, RatingType, RedirectUrlService, ResetPasswordModel, RoleModel, SOUTH_AMERICA_COUNTRIES, SelectFieldComponent, ServerSelectFieldComponent, ServerSelectService, SidebarCustomModalComponent, SidebarCustomModalService, SidebarHeight, SidebarMobileModalService, SidebarMobileType, SidebarPosition, SidebarService, SidebarState, SidebarTemplateRegistryService, SidebarVisibility, SidebarWidth, SkeletonAnimation, SkeletonService, SkeletonSize, SkeletonType, SmartFieldComponent, SortDirection, SortMode, StepSize, StepStatus, StepType, StepsService, SwitchFieldComponent, TableAction, TableActionService, TableDataService, TableFixedActionsService, TableSortService, TextAreaFieldComponent, TextFieldComponent, TimeFieldComponent, TimeInterval, TimelineService, TimelineStatus, TimelineType, TranslationMergeService, UruguayanDocumentValidationHelper, UsersModel, VERSION, WeekDay, adAuthGuard, adAuthInterceptor, adGuestGuard, adRoleGuard, ageValidator, calculateAge, equalToValidator, generateRandomUruguayanDocument, getCountryCodeStrings, getLatestBirthDateForAge, getRandomCi, getUruguayanDocumentValidationDigit, getValidationDigit, isSameDate, isValidCountryCode, provideAdAuth, provideAdAuthInterceptor, provideAdAuthWithInterceptor, provideCoreUiTranslateLoader, providePermissionActions, providePermissionEnums, providePermissionResources, providePermissionService, providePermissionServiceFactory, provideTranslateLoader, random, transform, transformUruguayanDocument, uruguayanDocumentValidator, validate, validateAge, validateCi, validateUruguayanDocument, validationDigit };
23487
+ export { AD_AUTH_CONFIG, AD_AUTH_INTERCEPTOR_CONFIG, ALL_COUNTRY_CODES, ActiveFiltersComponent, AdAuthService, AdInteractionType, AdLoginButtonComponent, AgeValidationHelper, AlertComponent, AlertContainerComponent, AlertService, AlertType, ApiConfigurationProvider, BaseFieldComponent, ButtonContext, ButtonSize, ButtonType, COMMON_COUNTRIES, CacheBustingInterceptor, CalendarEventType, CardComponent, CarouselComponent, ChatMessagePosition, ChatMessageType, CheckboxFieldComponent, ColorPickerFieldComponent, ConfigurationModel, ConfirmationDialogComponent, ConfirmationDialogService, CoreHostDirective, CoreManualRefreshComponent, CoreUiHttpLoaderFactory, CoreUiTranslateLoader, CoreUiTranslateService, CountryCode, CustomClassService, DEFAULT_AD_AUTH_INTERCEPTOR_CONFIG, DEFAULT_COUNTRIES, DEFAULT_SCHEDULER_CONFIG, DataListComponent, DataListItemComponent, DataStoreService, DateFieldComponent, DateRangeFieldComponent, DateUtility, DatetimeFieldComponent, DayState, DayType, DialogActions, DocumentAction, DocumentDisplayMode, DocumentFieldComponent, DocumentFieldValidators, DocumentPayloadMode, DropdownComponent, DropdownDirection, DropdownService, DynamicFieldDirective, DynamicFieldsHelper, FieldErrorsComponent, FieldType, FileFieldComponent, FileModel, FilePreviewActionType, FileTemplateModel, FileTemplateType, FileType, FileTypeModel, FileUploadService, FilterModalComponent, FilterService, FilterType, FixedActionPosition, FixedActionsMobileModalComponent, FixedActionsMobileModalService, GalleryAnimationType, GalleryLayoutType, GalleryModalComponent, GalleryModalGlobalService, GenericButtonComponent, GenericCalendarComponent, GenericChatComponent, GenericChatService, GenericDocumentationComponent, GenericFixedActionsComponent, GenericGalleryComponent, GenericModalComponent, GenericPaginationComponent, GenericRatingComponent, GenericSchedulerComponent, GenericSidebarComponent, GenericSkeletonComponent, GenericStepsComponent, GenericSwitchComponent, GenericTableComponent, GenericTabsComponent, GenericTimelineComponent, GenericTreeComponent, GlobalApiConfigService, HeaderComponent, HeaderConfigurationService, HeaderElementType, HeaderService, HttpLoaderFactory, ImageModalComponent, ImageModalService, ImagePreviewComponent, LATIN_AMERICA_COUNTRIES, LayoutAuth, LayoutBreakpoint, LayoutComponent, LayoutService, LayoutStateService, LayoutType, LoaderComponent, LoaderService, MODEL_REFERENCE_SORT_KEY, MainNavComponent, MainNavService, ManualRefreshService, MobileHeaderComponent, MobileResolutionService, ModalMode, ModelApiService, MultiEntryFieldComponent, MultiEntryOutputFormat, NumberFieldComponent, NumberFieldConfigType, NumberFieldType, NumberRange, PERMISSION_ACTIONS_PROVIDER, PERMISSION_PROVIDER, PERMISSION_RESOURCES_PROVIDER, PaginationService, PasswordFieldComponent, PermissionEnumsService, PermissionModel, PermissionService, PermissionWrapperService, PermissionsActions, PermissionsCustomActions, PermissionsInterceptor, PermissionsResources, PhoneFieldComponent, ProgressBarComponent, ProgressBarSize, RatingService, RatingSize, RatingType, RedirectUrlService, ResetPasswordModel, RoleModel, SOUTH_AMERICA_COUNTRIES, SelectFieldComponent, ServerSelectFieldComponent, ServerSelectService, SidebarCustomModalComponent, SidebarCustomModalService, SidebarHeight, SidebarMobileModalService, SidebarMobileType, SidebarPosition, SidebarService, SidebarState, SidebarTemplateRegistryService, SidebarVisibility, SidebarWidth, SkeletonAnimation, SkeletonService, SkeletonSize, SkeletonType, SmartFieldComponent, SortDirection, SortMode, StepSize, StepStatus, StepType, StepsService, SwitchFieldComponent, TableAction, TableActionService, TableDataService, TableFixedActionsService, TableSortService, TextAreaFieldComponent, TextFieldComponent, TimeFieldComponent, TimeInterval, TimelineService, TimelineStatus, TimelineType, TranslationMergeService, TreeNodeComponent, TreeService, UruguayanDocumentValidationHelper, UsersModel, VERSION, WeekDay, adAuthGuard, adAuthInterceptor, adGuestGuard, adRoleGuard, ageValidator, calculateAge, equalToValidator, generateRandomUruguayanDocument, getCountryCodeStrings, getLatestBirthDateForAge, getRandomCi, getUruguayanDocumentValidationDigit, getValidationDigit, isSameDate, isValidCountryCode, provideAdAuth, provideAdAuthInterceptor, provideAdAuthWithInterceptor, provideCoreUiTranslateLoader, providePermissionActions, providePermissionEnums, providePermissionResources, providePermissionService, providePermissionServiceFactory, provideTranslateLoader, random, transform, transformUruguayanDocument, uruguayanDocumentValidator, validate, validateAge, validateCi, validateUruguayanDocument, validationDigit };
22922
23488
  //# sourceMappingURL=solcre-org-core-ui.mjs.map