valtech-components 4.0.957 → 4.0.958

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,7 +1,9 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
3
- import { IonSelect, IonSelectOption } from '@ionic/angular/standalone';
2
+ import { Component, Input, Output, EventEmitter, computed, inject, signal, } from '@angular/core';
3
+ import { FormControl } from '@angular/forms';
4
4
  import { GroupsService } from '../../../services/groups/groups.service';
5
+ import { ComponentStates, InputType } from '../../types';
6
+ import { SearchSelectorComponent } from '../select-input/select-input.component';
5
7
  import * as i0 from "@angular/core";
6
8
  /**
7
9
  * val-group-picker — elegir el grupo dueño de un recurso (ADR-083).
@@ -11,6 +13,10 @@ import * as i0 from "@angular/core";
11
13
  * no como un `<select>` armado a mano en cada app — "una línea, una etiqueta
12
14
  * i18n" (ver ADR-083 §"Qué se construye una sola vez").
13
15
  *
16
+ * Renderiza vía `val-select-input` (el selector estándar de `val-form`) en vez
17
+ * de un `ion-select` propio — mismo look/comportamiento que cualquier otro
18
+ * campo SELECT del factory, sin reimplementar popover/i18n de cancel-ok.
19
+ *
14
20
  * Sin texto hardcodeado: los labels llegan por `@Input` (lib i18n-agnostic).
15
21
  * Cada app pone su palabra ("Equipo", "Sucursal", "Refugio").
16
22
  */
@@ -23,62 +29,71 @@ export class GroupPickerComponent {
23
29
  this.disabled = false;
24
30
  this.valueChange = new EventEmitter();
25
31
  this.groupsSvc = inject(GroupsService);
26
- this.groups = [];
32
+ this.groups = signal([]);
33
+ this.inputType = InputType.SELECT;
34
+ this.enabledState = ComponentStates.ENABLED;
35
+ this.disabledState = ComponentStates.DISABLED;
36
+ // Opción vacía SIEMPRE disponible: un recurso sin grupo es visible para
37
+ // toda la organización (ADR-083, decisión 3), no un estado inválido.
38
+ this.selectOptions = computed(() => [
39
+ { id: '', name: this.noGroupLabel, order: 0 },
40
+ ...this.groups().map((g, i) => ({ id: g.id, name: g.name, order: i + 1 })),
41
+ ]);
42
+ this.control = new FormControl('');
27
43
  }
28
44
  ngOnInit() {
45
+ this.control.setValue(this.value ?? '', { emitEvent: false });
46
+ this.valueSub = this.control.valueChanges.subscribe(v => {
47
+ this.value = v || null;
48
+ this.valueChange.emit(this.value);
49
+ });
29
50
  this.groupsSvc.listGroups().subscribe({
30
- next: (g) => (this.groups = g),
51
+ next: g => this.groups.set(g),
31
52
  // Best-effort: si la lectura falla, el picker queda con la opción "sin
32
53
  // grupo" únicamente. No es un error bloqueante — crear el recurso sin
33
54
  // asignar sigue siendo válido.
34
- error: () => (this.groups = []),
55
+ error: () => this.groups.set([]),
35
56
  });
36
57
  }
37
- onChange(v) {
38
- this.value = v || null;
39
- this.valueChange.emit(this.value);
58
+ ngOnChanges(changes) {
59
+ if (changes['value'] && !changes['value'].firstChange) {
60
+ this.control.setValue(this.value ?? '', { emitEvent: false });
61
+ }
62
+ }
63
+ ngOnDestroy() {
64
+ this.valueSub?.unsubscribe();
40
65
  }
41
66
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GroupPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GroupPickerComponent, isStandalone: true, selector: "val-group-picker", inputs: { label: "label", placeholder: "placeholder", noGroupLabel: "noGroupLabel", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
43
- <ion-select
44
- [label]="label"
45
- [placeholder]="placeholder"
46
- [value]="value ?? ''"
47
- [disabled]="disabled"
48
- interface="popover"
49
- (ionChange)="onChange($event.detail.value)"
50
- >
51
- <!-- Opción vacía SIEMPRE disponible: un recurso sin grupo es visible para
52
- toda la organización (ADR-083, decisión 3), no un estado inválido. -->
53
- <ion-select-option value="">{{ noGroupLabel }}</ion-select-option>
54
- @for (g of groups; track g.id) {
55
- <ion-select-option [value]="g.id">{{ g.name }}</ion-select-option>
56
- }
57
- </ion-select>
58
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
67
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: GroupPickerComponent, isStandalone: true, selector: "val-group-picker", inputs: { label: "label", placeholder: "placeholder", noGroupLabel: "noGroupLabel", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: `
68
+ <val-select-input
69
+ [props]="{
70
+ control: control,
71
+ label: label,
72
+ placeholder: placeholder,
73
+ type: inputType,
74
+ state: disabled ? disabledState : enabledState,
75
+ options: selectOptions(),
76
+ }"
77
+ />
78
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }] }); }
59
79
  }
60
80
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GroupPickerComponent, decorators: [{
61
81
  type: Component,
62
82
  args: [{
63
83
  selector: 'val-group-picker',
64
84
  standalone: true,
65
- imports: [CommonModule, IonSelect, IonSelectOption],
85
+ imports: [CommonModule, SearchSelectorComponent],
66
86
  template: `
67
- <ion-select
68
- [label]="label"
69
- [placeholder]="placeholder"
70
- [value]="value ?? ''"
71
- [disabled]="disabled"
72
- interface="popover"
73
- (ionChange)="onChange($event.detail.value)"
74
- >
75
- <!-- Opción vacía SIEMPRE disponible: un recurso sin grupo es visible para
76
- toda la organización (ADR-083, decisión 3), no un estado inválido. -->
77
- <ion-select-option value="">{{ noGroupLabel }}</ion-select-option>
78
- @for (g of groups; track g.id) {
79
- <ion-select-option [value]="g.id">{{ g.name }}</ion-select-option>
80
- }
81
- </ion-select>
87
+ <val-select-input
88
+ [props]="{
89
+ control: control,
90
+ label: label,
91
+ placeholder: placeholder,
92
+ type: inputType,
93
+ state: disabled ? disabledState : enabledState,
94
+ options: selectOptions(),
95
+ }"
96
+ />
82
97
  `,
83
98
  }]
84
99
  }], propDecorators: { label: [{
@@ -94,4 +109,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
94
109
  }], valueChange: [{
95
110
  type: Output
96
111
  }] } });
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvZ3JvdXAtcGlja2VyL2dyb3VwLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQUd4RTs7Ozs7Ozs7OztHQVVHO0FBdUJILE1BQU0sT0FBTyxvQkFBb0I7SUF0QmpDO1FBdUJXLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFekMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRCxXQUFNLEdBQWUsRUFBRSxDQUFDO0tBZ0J6QjtJQWRDLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDOUIsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSwrQkFBK0I7WUFDL0IsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDaEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxDQUFTO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQzsrR0F4QlUsb0JBQW9CO21HQUFwQixvQkFBb0IsaVBBbEJyQjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCVCwyREFqQlMsWUFBWSwrQkFBRSxTQUFTLGtWQUFFLGVBQWU7OzRGQW1CdkMsb0JBQW9CO2tCQXRCaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUM7b0JBQ25ELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25TZWxlY3QsIElvblNlbGVjdE9wdGlvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy9ncm91cHMuc2VydmljZSc7XG5pbXBvcnQgeyBWYWxHcm91cCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy90eXBlcyc7XG5cbi8qKlxuICogdmFsLWdyb3VwLXBpY2tlciDigJQgZWxlZ2lyIGVsIGdydXBvIGR1ZcOxbyBkZSB1biByZWN1cnNvIChBRFItMDgzKS5cbiAqXG4gKiBTZSBhdXRvLWNhcmdhOiBwaWRlIHN1cyBwcm9waW9zIGdydXBvcyBhIGBHcm91cHNTZXJ2aWNlYCBlbiB2ZXogZGUgZXNwZXJhclxuICogcXVlIGVsIGNvbnN1bWVyIHNlIGxvcyBwYXNlLiBFcyBsYSByYXrDs24gcG9yIGxhIHF1ZSBleGlzdGUgY29tbyBjb21wb25lbnRlIHlcbiAqIG5vIGNvbW8gdW4gYDxzZWxlY3Q+YCBhcm1hZG8gYSBtYW5vIGVuIGNhZGEgYXBwIOKAlCBcInVuYSBsw61uZWEsIHVuYSBldGlxdWV0YVxuICogaTE4blwiICh2ZXIgQURSLTA4MyDCp1wiUXXDqSBzZSBjb25zdHJ1eWUgdW5hIHNvbGEgdmV6XCIpLlxuICpcbiAqIFNpbiB0ZXh0byBoYXJkY29kZWFkbzogbG9zIGxhYmVscyBsbGVnYW4gcG9yIGBASW5wdXRgIChsaWIgaTE4bi1hZ25vc3RpYykuXG4gKiBDYWRhIGFwcCBwb25lIHN1IHBhbGFicmEgKFwiRXF1aXBvXCIsIFwiU3VjdXJzYWxcIiwgXCJSZWZ1Z2lvXCIpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtZ3JvdXAtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uU2VsZWN0LCBJb25TZWxlY3RPcHRpb25dLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24tc2VsZWN0XG4gICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZSA/PyAnJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgaW50ZXJmYWNlPVwicG9wb3ZlclwiXG4gICAgICAoaW9uQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudC5kZXRhaWwudmFsdWUpXCJcbiAgICA+XG4gICAgICA8IS0tIE9wY2nDs24gdmFjw61hIFNJRU1QUkUgZGlzcG9uaWJsZTogdW4gcmVjdXJzbyBzaW4gZ3J1cG8gZXMgdmlzaWJsZSBwYXJhXG4gICAgICAgICAgIHRvZGEgbGEgb3JnYW5pemFjacOzbiAoQURSLTA4MywgZGVjaXNpw7NuIDMpLCBubyB1biBlc3RhZG8gaW52w6FsaWRvLiAtLT5cbiAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIlwiPnt7IG5vR3JvdXBMYWJlbCB9fTwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICBAZm9yIChnIG9mIGdyb3VwczsgdHJhY2sgZy5pZCkge1xuICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cImcuaWRcIj57eyBnLm5hbWUgfX08L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvaW9uLXNlbGVjdD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgR3JvdXBQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBub0dyb3VwTGFiZWwgPSAnJztcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBncm91cHNTdmMgPSBpbmplY3QoR3JvdXBzU2VydmljZSk7XG4gIGdyb3VwczogVmFsR3JvdXBbXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBzU3ZjLmxpc3RHcm91cHMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGcpID0+ICh0aGlzLmdyb3VwcyA9IGcpLFxuICAgICAgLy8gQmVzdC1lZmZvcnQ6IHNpIGxhIGxlY3R1cmEgZmFsbGEsIGVsIHBpY2tlciBxdWVkYSBjb24gbGEgb3BjacOzbiBcInNpblxuICAgICAgLy8gZ3J1cG9cIiDDum5pY2FtZW50ZS4gTm8gZXMgdW4gZXJyb3IgYmxvcXVlYW50ZSDigJQgY3JlYXIgZWwgcmVjdXJzbyBzaW5cbiAgICAgIC8vIGFzaWduYXIgc2lndWUgc2llbmRvIHbDoWxpZG8uXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuZ3JvdXBzID0gW10pLFxuICAgIH0pO1xuICB9XG5cbiAgb25DaGFuZ2Uodjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHYgfHwgbnVsbDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cbn1cbiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvZ3JvdXAtcGlja2VyL2dyb3VwLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUlMLE1BQU0sRUFDTixZQUFZLEVBRVosUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRWpGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBa0JILE1BQU0sT0FBTyxvQkFBb0I7SUFqQmpDO1FBa0JXLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFekMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQyxXQUFNLEdBQUcsTUFBTSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRy9CLGNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzdCLGlCQUFZLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUN2QyxrQkFBYSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFFbEQsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUM1RCxrQkFBYSxHQUFHLFFBQVEsQ0FBMkIsR0FBRyxFQUFFLENBQUM7WUFDaEUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDN0MsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzRSxDQUFDLENBQUM7UUFFTSxZQUFPLEdBQUcsSUFBSSxXQUFXLENBQVMsRUFBRSxDQUFDLENBQUM7S0EyQmhEO0lBekJDLFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSwrQkFBK0I7WUFDL0IsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQWpEVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixzUUFickI7Ozs7Ozs7Ozs7O0dBV1QsMkRBWlMsWUFBWSwrQkFBRSx1QkFBdUI7OzRGQWNwQyxvQkFBb0I7a0JBakJoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUM7b0JBQ2hELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7R0FXVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy9ncm91cHMuc2VydmljZSc7XG5pbXBvcnQgeyBWYWxHcm91cCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy90eXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZXMsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFNlYXJjaFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0LWlucHV0L3NlbGVjdC1pbnB1dC5jb21wb25lbnQnO1xuXG4vKipcbiAqIHZhbC1ncm91cC1waWNrZXIg4oCUIGVsZWdpciBlbCBncnVwbyBkdWXDsW8gZGUgdW4gcmVjdXJzbyAoQURSLTA4MykuXG4gKlxuICogU2UgYXV0by1jYXJnYTogcGlkZSBzdXMgcHJvcGlvcyBncnVwb3MgYSBgR3JvdXBzU2VydmljZWAgZW4gdmV6IGRlIGVzcGVyYXJcbiAqIHF1ZSBlbCBjb25zdW1lciBzZSBsb3MgcGFzZS4gRXMgbGEgcmF6w7NuIHBvciBsYSBxdWUgZXhpc3RlIGNvbW8gY29tcG9uZW50ZSB5XG4gKiBubyBjb21vIHVuIGA8c2VsZWN0PmAgYXJtYWRvIGEgbWFubyBlbiBjYWRhIGFwcCDigJQgXCJ1bmEgbMOtbmVhLCB1bmEgZXRpcXVldGFcbiAqIGkxOG5cIiAodmVyIEFEUi0wODMgwqdcIlF1w6kgc2UgY29uc3RydXllIHVuYSBzb2xhIHZlelwiKS5cbiAqXG4gKiBSZW5kZXJpemEgdsOtYSBgdmFsLXNlbGVjdC1pbnB1dGAgKGVsIHNlbGVjdG9yIGVzdMOhbmRhciBkZSBgdmFsLWZvcm1gKSBlbiB2ZXpcbiAqIGRlIHVuIGBpb24tc2VsZWN0YCBwcm9waW8g4oCUIG1pc21vIGxvb2svY29tcG9ydGFtaWVudG8gcXVlIGN1YWxxdWllciBvdHJvXG4gKiBjYW1wbyBTRUxFQ1QgZGVsIGZhY3RvcnksIHNpbiByZWltcGxlbWVudGFyIHBvcG92ZXIvaTE4biBkZSBjYW5jZWwtb2suXG4gKlxuICogU2luIHRleHRvIGhhcmRjb2RlYWRvOiBsb3MgbGFiZWxzIGxsZWdhbiBwb3IgYEBJbnB1dGAgKGxpYiBpMThuLWFnbm9zdGljKS5cbiAqIENhZGEgYXBwIHBvbmUgc3UgcGFsYWJyYSAoXCJFcXVpcG9cIiwgXCJTdWN1cnNhbFwiLCBcIlJlZnVnaW9cIikuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1ncm91cC1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTZWFyY2hTZWxlY3RvckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHZhbC1zZWxlY3QtaW5wdXRcbiAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgIGNvbnRyb2w6IGNvbnRyb2wsXG4gICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxuICAgICAgICB0eXBlOiBpbnB1dFR5cGUsXG4gICAgICAgIHN0YXRlOiBkaXNhYmxlZCA/IGRpc2FibGVkU3RhdGUgOiBlbmFibGVkU3RhdGUsXG4gICAgICAgIG9wdGlvbnM6IHNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIH1cIlxuICAgIC8+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEdyb3VwUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIG5vR3JvdXBMYWJlbCA9ICcnO1xuICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3Vwc1N2YyA9IGluamVjdChHcm91cHNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBncm91cHMgPSBzaWduYWw8VmFsR3JvdXBbXT4oW10pO1xuICBwcml2YXRlIHZhbHVlU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHJlYWRvbmx5IGlucHV0VHlwZSA9IElucHV0VHlwZS5TRUxFQ1Q7XG4gIHJlYWRvbmx5IGVuYWJsZWRTdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICByZWFkb25seSBkaXNhYmxlZFN0YXRlID0gQ29tcG9uZW50U3RhdGVzLkRJU0FCTEVEO1xuXG4gIC8vIE9wY2nDs24gdmFjw61hIFNJRU1QUkUgZGlzcG9uaWJsZTogdW4gcmVjdXJzbyBzaW4gZ3J1cG8gZXMgdmlzaWJsZSBwYXJhXG4gIC8vIHRvZGEgbGEgb3JnYW5pemFjacOzbiAoQURSLTA4MywgZGVjaXNpw7NuIDMpLCBubyB1biBlc3RhZG8gaW52w6FsaWRvLlxuICByZWFkb25seSBzZWxlY3RPcHRpb25zID0gY29tcHV0ZWQ8SW5wdXRNZXRhZGF0YVsnb3B0aW9ucyddPigoKSA9PiBbXG4gICAgeyBpZDogJycsIG5hbWU6IHRoaXMubm9Hcm91cExhYmVsLCBvcmRlcjogMCB9LFxuICAgIC4uLnRoaXMuZ3JvdXBzKCkubWFwKChnLCBpKSA9PiAoeyBpZDogZy5pZCwgbmFtZTogZy5uYW1lLCBvcmRlcjogaSArIDEgfSkpLFxuICBdKTtcblxuICByZWFkb25seSBjb250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLnZhbHVlID8/ICcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy52YWx1ZVN1YiA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IHYgfHwgbnVsbDtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZ3JvdXBzU3ZjLmxpc3RHcm91cHMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogZyA9PiB0aGlzLmdyb3Vwcy5zZXQoZyksXG4gICAgICAvLyBCZXN0LWVmZm9ydDogc2kgbGEgbGVjdHVyYSBmYWxsYSwgZWwgcGlja2VyIHF1ZWRhIGNvbiBsYSBvcGNpw7NuIFwic2luXG4gICAgICAvLyBncnVwb1wiIMO6bmljYW1lbnRlLiBObyBlcyB1biBlcnJvciBibG9xdWVhbnRlIOKAlCBjcmVhciBlbCByZWN1cnNvIHNpblxuICAgICAgLy8gYXNpZ25hciBzaWd1ZSBzaWVuZG8gdsOhbGlkby5cbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmdyb3Vwcy5zZXQoW10pLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddICYmICFjaGFuZ2VzWyd2YWx1ZSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZSA/PyAnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.957';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC45NTcnO1xuIl19
5
+ export const VERSION = '4.0.958';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC45NTgnO1xuIl19
@@ -67,7 +67,7 @@ import fixWebmDuration from 'fix-webm-duration';
67
67
  * Current version of valtech-components.
68
68
  * This is automatically updated during the publish process.
69
69
  */
70
- const VERSION = '4.0.957';
70
+ const VERSION = '4.0.958';
71
71
 
72
72
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
73
73
  if (rule == null)
@@ -75785,6 +75785,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
75785
75785
  * no como un `<select>` armado a mano en cada app — "una línea, una etiqueta
75786
75786
  * i18n" (ver ADR-083 §"Qué se construye una sola vez").
75787
75787
  *
75788
+ * Renderiza vía `val-select-input` (el selector estándar de `val-form`) en vez
75789
+ * de un `ion-select` propio — mismo look/comportamiento que cualquier otro
75790
+ * campo SELECT del factory, sin reimplementar popover/i18n de cancel-ok.
75791
+ *
75788
75792
  * Sin texto hardcodeado: los labels llegan por `@Input` (lib i18n-agnostic).
75789
75793
  * Cada app pone su palabra ("Equipo", "Sucursal", "Refugio").
75790
75794
  */
@@ -75797,62 +75801,71 @@ class GroupPickerComponent {
75797
75801
  this.disabled = false;
75798
75802
  this.valueChange = new EventEmitter();
75799
75803
  this.groupsSvc = inject(GroupsService);
75800
- this.groups = [];
75804
+ this.groups = signal([]);
75805
+ this.inputType = InputType.SELECT;
75806
+ this.enabledState = ComponentStates.ENABLED;
75807
+ this.disabledState = ComponentStates.DISABLED;
75808
+ // Opción vacía SIEMPRE disponible: un recurso sin grupo es visible para
75809
+ // toda la organización (ADR-083, decisión 3), no un estado inválido.
75810
+ this.selectOptions = computed(() => [
75811
+ { id: '', name: this.noGroupLabel, order: 0 },
75812
+ ...this.groups().map((g, i) => ({ id: g.id, name: g.name, order: i + 1 })),
75813
+ ]);
75814
+ this.control = new FormControl('');
75801
75815
  }
75802
75816
  ngOnInit() {
75817
+ this.control.setValue(this.value ?? '', { emitEvent: false });
75818
+ this.valueSub = this.control.valueChanges.subscribe(v => {
75819
+ this.value = v || null;
75820
+ this.valueChange.emit(this.value);
75821
+ });
75803
75822
  this.groupsSvc.listGroups().subscribe({
75804
- next: (g) => (this.groups = g),
75823
+ next: g => this.groups.set(g),
75805
75824
  // Best-effort: si la lectura falla, el picker queda con la opción "sin
75806
75825
  // grupo" únicamente. No es un error bloqueante — crear el recurso sin
75807
75826
  // asignar sigue siendo válido.
75808
- error: () => (this.groups = []),
75827
+ error: () => this.groups.set([]),
75809
75828
  });
75810
75829
  }
75811
- onChange(v) {
75812
- this.value = v || null;
75813
- this.valueChange.emit(this.value);
75830
+ ngOnChanges(changes) {
75831
+ if (changes['value'] && !changes['value'].firstChange) {
75832
+ this.control.setValue(this.value ?? '', { emitEvent: false });
75833
+ }
75834
+ }
75835
+ ngOnDestroy() {
75836
+ this.valueSub?.unsubscribe();
75814
75837
  }
75815
75838
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GroupPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
75816
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GroupPickerComponent, isStandalone: true, selector: "val-group-picker", inputs: { label: "label", placeholder: "placeholder", noGroupLabel: "noGroupLabel", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
75817
- <ion-select
75818
- [label]="label"
75819
- [placeholder]="placeholder"
75820
- [value]="value ?? ''"
75821
- [disabled]="disabled"
75822
- interface="popover"
75823
- (ionChange)="onChange($event.detail.value)"
75824
- >
75825
- <!-- Opción vacía SIEMPRE disponible: un recurso sin grupo es visible para
75826
- toda la organización (ADR-083, decisión 3), no un estado inválido. -->
75827
- <ion-select-option value="">{{ noGroupLabel }}</ion-select-option>
75828
- @for (g of groups; track g.id) {
75829
- <ion-select-option [value]="g.id">{{ g.name }}</ion-select-option>
75830
- }
75831
- </ion-select>
75832
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
75839
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: GroupPickerComponent, isStandalone: true, selector: "val-group-picker", inputs: { label: "label", placeholder: "placeholder", noGroupLabel: "noGroupLabel", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: `
75840
+ <val-select-input
75841
+ [props]="{
75842
+ control: control,
75843
+ label: label,
75844
+ placeholder: placeholder,
75845
+ type: inputType,
75846
+ state: disabled ? disabledState : enabledState,
75847
+ options: selectOptions(),
75848
+ }"
75849
+ />
75850
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }] }); }
75833
75851
  }
75834
75852
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GroupPickerComponent, decorators: [{
75835
75853
  type: Component,
75836
75854
  args: [{
75837
75855
  selector: 'val-group-picker',
75838
75856
  standalone: true,
75839
- imports: [CommonModule, IonSelect, IonSelectOption],
75857
+ imports: [CommonModule, SearchSelectorComponent],
75840
75858
  template: `
75841
- <ion-select
75842
- [label]="label"
75843
- [placeholder]="placeholder"
75844
- [value]="value ?? ''"
75845
- [disabled]="disabled"
75846
- interface="popover"
75847
- (ionChange)="onChange($event.detail.value)"
75848
- >
75849
- <!-- Opción vacía SIEMPRE disponible: un recurso sin grupo es visible para
75850
- toda la organización (ADR-083, decisión 3), no un estado inválido. -->
75851
- <ion-select-option value="">{{ noGroupLabel }}</ion-select-option>
75852
- @for (g of groups; track g.id) {
75853
- <ion-select-option [value]="g.id">{{ g.name }}</ion-select-option>
75854
- }
75855
- </ion-select>
75859
+ <val-select-input
75860
+ [props]="{
75861
+ control: control,
75862
+ label: label,
75863
+ placeholder: placeholder,
75864
+ type: inputType,
75865
+ state: disabled ? disabledState : enabledState,
75866
+ options: selectOptions(),
75867
+ }"
75868
+ />
75856
75869
  `,
75857
75870
  }]
75858
75871
  }], propDecorators: { label: [{