@solcre-org/core-ui 2.20.21 → 2.20.23

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.
@@ -68,8 +68,9 @@
68
68
  }
69
69
 
70
70
  .c-header__filter-item{
71
- flex: 0 1 auto;
71
+ flex: 1 1 200px;
72
72
  min-width: 200px;
73
+ max-width: 400px;
73
74
  }
74
75
 
75
76
  .c-header__filter-actions{
@@ -0,0 +1,229 @@
1
+ /* ******************************************** */
2
+ /** COMPONENT: NATIVE SELECT (custom dropdown) */
3
+ /* ******************************************** */
4
+
5
+
6
+ /* ---- Wrapper: positioning context ---- */
7
+
8
+ .c-entry-input--native-select{
9
+ position: relative;
10
+ }
11
+
12
+
13
+ /* ---- Wrapper state: open ---- */
14
+
15
+ .c-entry-input--native-select.is-open{
16
+ z-index: 10;
17
+ }
18
+
19
+
20
+ /* ---- Wrapper state: disabled ---- */
21
+
22
+ .c-entry-input--native-select.is-disabled{
23
+ opacity: 0.6;
24
+ pointer-events: none;
25
+ cursor: not-allowed;
26
+ }
27
+
28
+
29
+ /* ---- Control area (clickable trigger) ---- */
30
+
31
+ .c-native-select__control{
32
+ display: flex;
33
+ flex-wrap: wrap;
34
+ align-items: center;
35
+ gap: 0.25em;
36
+ flex: 1;
37
+ min-height: 1.4em;
38
+ max-height: 5em;
39
+ overflow-y: auto;
40
+ cursor: pointer;
41
+ min-width: 0;
42
+ }
43
+
44
+
45
+ /* ---- Single value ---- */
46
+
47
+ .c-native-select__single-value{
48
+ white-space: nowrap;
49
+ overflow: hidden;
50
+ text-overflow: ellipsis;
51
+ pointer-events: none;
52
+ }
53
+
54
+
55
+ /* ---- Placeholder ---- */
56
+
57
+ .c-native-select__placeholder{
58
+ color: var(--_entry-input-placeholder-color);
59
+ white-space: nowrap;
60
+ overflow: hidden;
61
+ text-overflow: ellipsis;
62
+ pointer-events: none;
63
+ }
64
+
65
+
66
+ /* ---- Multi-select chips container ---- */
67
+
68
+ .c-native-select__values{
69
+ display: flex;
70
+ flex-wrap: wrap;
71
+ gap: 0.2em;
72
+ align-items: center;
73
+ flex: 1;
74
+ min-width: 0;
75
+ }
76
+
77
+
78
+ /* ---- Chip ---- */
79
+
80
+ .c-native-select__chip{
81
+ display: inline-flex;
82
+ align-items: center;
83
+ gap: 0.3em;
84
+ background-color: var(--form-highlighted-color, var(--color-neutral-300));
85
+ color: #3F4E6A;
86
+ border-radius: 4px;
87
+ padding: 0.2em 0.8em;
88
+ font-size: 0.9em;
89
+ line-height: 1.3;
90
+ white-space: nowrap;
91
+ }
92
+
93
+
94
+ /* ---- Chip remove ---- */
95
+
96
+ .c-native-select__chip-remove{
97
+ display: inline-flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ border: none;
101
+ background: none;
102
+ padding: 0;
103
+ margin: 0;
104
+ cursor: pointer;
105
+ font-size: 1.1em;
106
+ line-height: 1;
107
+ color: #3F4E6A;
108
+ opacity: 0.7;
109
+ transition: opacity 100ms ease-out;
110
+ -webkit-tap-highlight-color: transparent;
111
+ }
112
+ .c-native-select__chip-remove:hover{
113
+ opacity: 1;
114
+ }
115
+ .c-native-select__chip-remove-icon::before{
116
+ content: '\00d7';
117
+ }
118
+
119
+
120
+ /* ---- Search input ---- */
121
+
122
+ .c-native-select__search{
123
+ border: none;
124
+ outline: none;
125
+ background: transparent;
126
+ font: inherit;
127
+ color: inherit;
128
+ padding: 0;
129
+ min-width: 4em;
130
+ flex: 1;
131
+ width: 100%;
132
+ }
133
+
134
+
135
+ /* ---- Clear button ---- */
136
+
137
+ .c-native-select__clear{
138
+ display: inline-flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ border: none;
142
+ background: none;
143
+ padding: 0 0.2em;
144
+ cursor: pointer;
145
+ font-size: 1.1em;
146
+ color: hsl(var(--_entry-input-addon-color-hsl));
147
+ opacity: 0.7;
148
+ transition: opacity 100ms ease-out, color 100ms ease-out;
149
+ -webkit-tap-highlight-color: transparent;
150
+ flex-shrink: 0;
151
+ }
152
+ .c-native-select__clear:hover{
153
+ opacity: 1;
154
+ color: var(--color-hover, var(--color-primary-400));
155
+ }
156
+ .c-native-select__clear-icon::before{
157
+ content: '\00d7';
158
+ }
159
+
160
+
161
+ /* ---- Arrow ---- */
162
+
163
+ .c-entry-input--native-select .c-entry-input__addon{
164
+ cursor: pointer;
165
+ }
166
+ .c-entry-input--native-select .c-entry-input__addon.is-flipped{
167
+ transform: rotate(180deg);
168
+ }
169
+
170
+
171
+ /* ---- Dropdown panel ---- */
172
+
173
+ .c-native-select__dropdown{
174
+ position: absolute;
175
+ top: 100%;
176
+ left: 0;
177
+ right: 0;
178
+ margin-top: 0.3em;
179
+ z-index: 10;
180
+ }
181
+
182
+ .c-native-select__options{
183
+ background: #f2f5fa;
184
+ border-radius: var(--_entry-input-br, 8px);
185
+ padding: 0.6em;
186
+ box-shadow: 1em 2.4em 3.4em -2em hsl(var(--color-neutral-900-hsl) / 25%);
187
+ max-height: 16em;
188
+ overflow-y: auto;
189
+ }
190
+
191
+
192
+ /* ---- Option items ---- */
193
+
194
+ .c-native-select__option{
195
+ padding: 0.6em 0.8em;
196
+ color: #6A788C;
197
+ cursor: pointer;
198
+ border-radius: calc(var(--_entry-input-br, 8px) * 0.6);
199
+ transition: background-color 100ms ease-out, color 100ms ease-out;
200
+ white-space: nowrap;
201
+ overflow: hidden;
202
+ text-overflow: ellipsis;
203
+ }
204
+ .c-native-select__option.is-highlighted{
205
+ background-color: hsl(var(--color-primary-400-hsl) / 8%);
206
+ color: var(--color-primary-400);
207
+ }
208
+ .c-native-select__option.is-selected{
209
+ color: var(--color-primary-400);
210
+ font-weight: 500;
211
+ }
212
+
213
+ @media (hover: hover){
214
+ .c-native-select__option:hover{
215
+ background-color: hsl(var(--color-primary-400-hsl) / 8%);
216
+ color: var(--color-primary-400);
217
+ }
218
+ }
219
+
220
+
221
+ /* ---- No results ---- */
222
+
223
+ .c-native-select__no-results{
224
+ padding: 0.8em;
225
+ text-align: center;
226
+ color: hsl(from hsl(var(--color-context-error-hsl)) h s 60%);
227
+ background-color: hsl(from hsl(var(--color-context-error-hsl)) h s 94%);
228
+ border-radius: var(--_entry-input-br, 8px);
229
+ }
@@ -208,5 +208,9 @@ app-server-select-field .ng-select:not(.ng-select-filtered):not(.ng-select-opene
208
208
  }
209
209
 
210
210
  .ng-select.ng-select-opened {
211
- z-index: 1;
211
+ z-index: 999;
212
+ }
213
+
214
+ .ng-dropdown-panel {
215
+ z-index: 998;
212
216
  }
@@ -81,6 +81,7 @@
81
81
  @import url(inc/components/mobile-nav.css);
82
82
  @import url(inc/components/calendar.css);
83
83
  @import url(inc/components/ng-select.css);
84
+ @import url(inc/components/native-select.css);
84
85
 
85
86
  /* Utilities */
86
87
  @import url(inc/utilities/headings.css);
@@ -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
@@ -6572,13 +6729,13 @@ class GenericTabsComponent {
6572
6729
  return !!(this.customTabTemplate && this.config().allowCustomTemplate);
6573
6730
  }
6574
6731
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GenericTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6575
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: GenericTabsComponent, isStandalone: true, selector: "nav[core-generic-tabs]", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, activeTabId: { classPropertyName: "activeTabId", publicName: "activeTabId", isSignal: true, isRequired: false, transformFunction: null }, hasTabErrors: { classPropertyName: "hasTabErrors", publicName: "hasTabErrors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tabClick: "tabClick", tabChange: "tabChange" }, host: { properties: { "class": "config().containerClass" } }, queries: [{ propertyName: "customTabTemplate", first: true, predicate: ["customTabTemplate"], descendants: true }], ngImport: i0, template: "<ul [class]=\"config().listClass\">\n @for (tab of config().tabs; track tab.id; let i = $index) {\n <li [class]=\"config().itemClass\">\n @if (hasCustomTemplate()) {\n <ng-container \n [ngTemplateOutlet]=\"customTabTemplate || null\" \n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n index: i,\n isActive: isTabActive(tab),\n onClick: onTabClick.bind(this, tab, i)\n }\">\n </ng-container>\n } @else {\n <!-- DEV: Aplicar componente button generico -->\n <button\n type=\"button\"\n [class]=\"getTabClasses(tab)\"\n [disabled]=\"tab.disabled\"\n (click)=\"onTabClick(tab, i, $event)\"\n >\n @if (tab.translationKey) {\n {{ tab.translationKey | translate }}\n } @else {\n {{ getTabLabel(tab) }}\n }\n @if (hasTabErrors()(tab.id)) {\n <span class=\"icon-alert-circle\"></span>\n }\n </button>\n }\n </li>\n }\n</ul> ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6732
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: GenericTabsComponent, isStandalone: true, selector: "nav[core-generic-tabs]", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, activeTabId: { classPropertyName: "activeTabId", publicName: "activeTabId", isSignal: true, isRequired: false, transformFunction: null }, hasTabErrors: { classPropertyName: "hasTabErrors", publicName: "hasTabErrors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tabClick: "tabClick", tabChange: "tabChange" }, host: { properties: { "class": "config().containerClass" } }, queries: [{ propertyName: "customTabTemplate", first: true, predicate: ["customTabTemplate"], descendants: true }], ngImport: i0, template: "<ul [class]=\"config().listClass\">\n @for (tab of config().tabs; track tab.id; let i = $index) {\n <li [class]=\"config().itemClass\">\n @if (hasCustomTemplate()) {\n <ng-container \n [ngTemplateOutlet]=\"customTabTemplate || null\" \n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n index: i,\n isActive: isTabActive(tab),\n onClick: onTabClick.bind(this, tab, i)\n }\">\n </ng-container>\n } @else {\n <!-- DEV: Aplicar componente button generico -->\n <button\n type=\"button\"\n [class]=\"getTabClasses(tab)\"\n [disabled]=\"tab.disabled\"\n (click)=\"onTabClick(tab, i, $event)\"\n >\n @if (tab.translationKey) {\n {{ tab.translationKey | translate }}\n } @else {\n {{ getTabLabel(tab) }}\n }\n @if (hasTabErrors()(tab.id)) {\n <span class=\"icon-alert-circle\"></span>\n }\n </button>\n }\n </li>\n }\n</ul> ", styles: [".disabled{opacity:.5;pointer-events:none;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6576
6733
  }
6577
6734
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GenericTabsComponent, decorators: [{
6578
6735
  type: Component,
6579
6736
  args: [{ selector: 'nav[core-generic-tabs]', standalone: true, imports: [CommonModule, TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, host: {
6580
6737
  '[class]': 'config().containerClass'
6581
- }, template: "<ul [class]=\"config().listClass\">\n @for (tab of config().tabs; track tab.id; let i = $index) {\n <li [class]=\"config().itemClass\">\n @if (hasCustomTemplate()) {\n <ng-container \n [ngTemplateOutlet]=\"customTabTemplate || null\" \n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n index: i,\n isActive: isTabActive(tab),\n onClick: onTabClick.bind(this, tab, i)\n }\">\n </ng-container>\n } @else {\n <!-- DEV: Aplicar componente button generico -->\n <button\n type=\"button\"\n [class]=\"getTabClasses(tab)\"\n [disabled]=\"tab.disabled\"\n (click)=\"onTabClick(tab, i, $event)\"\n >\n @if (tab.translationKey) {\n {{ tab.translationKey | translate }}\n } @else {\n {{ getTabLabel(tab) }}\n }\n @if (hasTabErrors()(tab.id)) {\n <span class=\"icon-alert-circle\"></span>\n }\n </button>\n }\n </li>\n }\n</ul> " }]
6738
+ }, template: "<ul [class]=\"config().listClass\">\n @for (tab of config().tabs; track tab.id; let i = $index) {\n <li [class]=\"config().itemClass\">\n @if (hasCustomTemplate()) {\n <ng-container \n [ngTemplateOutlet]=\"customTabTemplate || null\" \n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n index: i,\n isActive: isTabActive(tab),\n onClick: onTabClick.bind(this, tab, i)\n }\">\n </ng-container>\n } @else {\n <!-- DEV: Aplicar componente button generico -->\n <button\n type=\"button\"\n [class]=\"getTabClasses(tab)\"\n [disabled]=\"tab.disabled\"\n (click)=\"onTabClick(tab, i, $event)\"\n >\n @if (tab.translationKey) {\n {{ tab.translationKey | translate }}\n } @else {\n {{ getTabLabel(tab) }}\n }\n @if (hasTabErrors()(tab.id)) {\n <span class=\"icon-alert-circle\"></span>\n }\n </button>\n }\n </li>\n }\n</ul> ", styles: [".disabled{opacity:.5;pointer-events:none;cursor:not-allowed}\n"] }]
6582
6739
  }], propDecorators: { customTabTemplate: [{
6583
6740
  type: ContentChild,
6584
6741
  args: ['customTabTemplate']
@@ -7410,7 +7567,8 @@ class GenericModalComponent {
7410
7567
  genericTabsConfig = computed(() => ({
7411
7568
  tabs: this.visibleTabs().map(tab => ({
7412
7569
  id: tab.tabId,
7413
- translationKey: tab.tabLabel
7570
+ translationKey: tab.tabLabel,
7571
+ disabled: typeof tab.disabled === 'function' ? tab.disabled(this.editedData()) : tab.disabled
7414
7572
  })),
7415
7573
  containerClass: 'c-tabs',
7416
7574
  listClass: 'c-tabs__list',
@@ -17516,12 +17674,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17516
17674
  // Este archivo es generado automáticamente por scripts/update-version.js
17517
17675
  // No edites manualmente este archivo
17518
17676
  const VERSION = {
17519
- full: '2.20.21',
17677
+ full: '2.20.23',
17520
17678
  major: 2,
17521
17679
  minor: 20,
17522
- patch: 21,
17523
- timestamp: '2026-02-11T17:39:26.581Z',
17524
- buildDate: '11/2/2026'
17680
+ patch: 23,
17681
+ timestamp: '2026-02-13T16:34:08.285Z',
17682
+ buildDate: '13/2/2026'
17525
17683
  };
17526
17684
 
17527
17685
  class MainNavComponent {