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.
- package/esm2022/lib/components/molecules/group-picker/group-picker.component.mjs +57 -42
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +53 -40
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/group-picker/group-picker.component.d.ts +17 -5
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component,
|
|
3
|
-
import {
|
|
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:
|
|
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: () =>
|
|
55
|
+
error: () => this.groups.set([]),
|
|
35
56
|
});
|
|
36
57
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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: "
|
|
43
|
-
<
|
|
44
|
-
[
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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,
|
|
85
|
+
imports: [CommonModule, SearchSelectorComponent],
|
|
66
86
|
template: `
|
|
67
|
-
<
|
|
68
|
-
[
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvZ3JvdXAtcGlja2VyL2dyb3VwLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUlMLE1BQU0sRUFDTixZQUFZLEVBRVosUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRWpGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBa0JILE1BQU0sT0FBTyxvQkFBb0I7SUFqQmpDO1FBa0JXLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFekMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQyxXQUFNLEdBQUcsTUFBTSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRy9CLGNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzdCLGlCQUFZLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUN2QyxrQkFBYSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFFbEQsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUM1RCxrQkFBYSxHQUFHLFFBQVEsQ0FBMkIsR0FBRyxFQUFFLENBQUM7WUFDaEUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDN0MsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzRSxDQUFDLENBQUM7UUFFTSxZQUFPLEdBQUcsSUFBSSxXQUFXLENBQVMsRUFBRSxDQUFDLENBQUM7S0EyQmhEO0lBekJDLFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSwrQkFBK0I7WUFDL0IsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQWpEVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixzUUFickI7Ozs7Ozs7Ozs7O0dBV1QsMkRBWlMsWUFBWSwrQkFBRSx1QkFBdUI7OzRGQWNwQyxvQkFBb0I7a0JBakJoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUM7b0JBQ2hELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7R0FXVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy9ncm91cHMuc2VydmljZSc7XG5pbXBvcnQgeyBWYWxHcm91cCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy90eXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZXMsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFNlYXJjaFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0LWlucHV0L3NlbGVjdC1pbnB1dC5jb21wb25lbnQnO1xuXG4vKipcbiAqIHZhbC1ncm91cC1waWNrZXIg4oCUIGVsZWdpciBlbCBncnVwbyBkdWXDsW8gZGUgdW4gcmVjdXJzbyAoQURSLTA4MykuXG4gKlxuICogU2UgYXV0by1jYXJnYTogcGlkZSBzdXMgcHJvcGlvcyBncnVwb3MgYSBgR3JvdXBzU2VydmljZWAgZW4gdmV6IGRlIGVzcGVyYXJcbiAqIHF1ZSBlbCBjb25zdW1lciBzZSBsb3MgcGFzZS4gRXMgbGEgcmF6w7NuIHBvciBsYSBxdWUgZXhpc3RlIGNvbW8gY29tcG9uZW50ZSB5XG4gKiBubyBjb21vIHVuIGA8c2VsZWN0PmAgYXJtYWRvIGEgbWFubyBlbiBjYWRhIGFwcCDigJQgXCJ1bmEgbMOtbmVhLCB1bmEgZXRpcXVldGFcbiAqIGkxOG5cIiAodmVyIEFEUi0wODMgwqdcIlF1w6kgc2UgY29uc3RydXllIHVuYSBzb2xhIHZlelwiKS5cbiAqXG4gKiBSZW5kZXJpemEgdsOtYSBgdmFsLXNlbGVjdC1pbnB1dGAgKGVsIHNlbGVjdG9yIGVzdMOhbmRhciBkZSBgdmFsLWZvcm1gKSBlbiB2ZXpcbiAqIGRlIHVuIGBpb24tc2VsZWN0YCBwcm9waW8g4oCUIG1pc21vIGxvb2svY29tcG9ydGFtaWVudG8gcXVlIGN1YWxxdWllciBvdHJvXG4gKiBjYW1wbyBTRUxFQ1QgZGVsIGZhY3RvcnksIHNpbiByZWltcGxlbWVudGFyIHBvcG92ZXIvaTE4biBkZSBjYW5jZWwtb2suXG4gKlxuICogU2luIHRleHRvIGhhcmRjb2RlYWRvOiBsb3MgbGFiZWxzIGxsZWdhbiBwb3IgYEBJbnB1dGAgKGxpYiBpMThuLWFnbm9zdGljKS5cbiAqIENhZGEgYXBwIHBvbmUgc3UgcGFsYWJyYSAoXCJFcXVpcG9cIiwgXCJTdWN1cnNhbFwiLCBcIlJlZnVnaW9cIikuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1ncm91cC1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTZWFyY2hTZWxlY3RvckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHZhbC1zZWxlY3QtaW5wdXRcbiAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgIGNvbnRyb2w6IGNvbnRyb2wsXG4gICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxuICAgICAgICB0eXBlOiBpbnB1dFR5cGUsXG4gICAgICAgIHN0YXRlOiBkaXNhYmxlZCA/IGRpc2FibGVkU3RhdGUgOiBlbmFibGVkU3RhdGUsXG4gICAgICAgIG9wdGlvbnM6IHNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIH1cIlxuICAgIC8+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEdyb3VwUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIG5vR3JvdXBMYWJlbCA9ICcnO1xuICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3Vwc1N2YyA9IGluamVjdChHcm91cHNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBncm91cHMgPSBzaWduYWw8VmFsR3JvdXBbXT4oW10pO1xuICBwcml2YXRlIHZhbHVlU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHJlYWRvbmx5IGlucHV0VHlwZSA9IElucHV0VHlwZS5TRUxFQ1Q7XG4gIHJlYWRvbmx5IGVuYWJsZWRTdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICByZWFkb25seSBkaXNhYmxlZFN0YXRlID0gQ29tcG9uZW50U3RhdGVzLkRJU0FCTEVEO1xuXG4gIC8vIE9wY2nDs24gdmFjw61hIFNJRU1QUkUgZGlzcG9uaWJsZTogdW4gcmVjdXJzbyBzaW4gZ3J1cG8gZXMgdmlzaWJsZSBwYXJhXG4gIC8vIHRvZGEgbGEgb3JnYW5pemFjacOzbiAoQURSLTA4MywgZGVjaXNpw7NuIDMpLCBubyB1biBlc3RhZG8gaW52w6FsaWRvLlxuICByZWFkb25seSBzZWxlY3RPcHRpb25zID0gY29tcHV0ZWQ8SW5wdXRNZXRhZGF0YVsnb3B0aW9ucyddPigoKSA9PiBbXG4gICAgeyBpZDogJycsIG5hbWU6IHRoaXMubm9Hcm91cExhYmVsLCBvcmRlcjogMCB9LFxuICAgIC4uLnRoaXMuZ3JvdXBzKCkubWFwKChnLCBpKSA9PiAoeyBpZDogZy5pZCwgbmFtZTogZy5uYW1lLCBvcmRlcjogaSArIDEgfSkpLFxuICBdKTtcblxuICByZWFkb25seSBjb250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLnZhbHVlID8/ICcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy52YWx1ZVN1YiA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IHYgfHwgbnVsbDtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZ3JvdXBzU3ZjLmxpc3RHcm91cHMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogZyA9PiB0aGlzLmdyb3Vwcy5zZXQoZyksXG4gICAgICAvLyBCZXN0LWVmZm9ydDogc2kgbGEgbGVjdHVyYSBmYWxsYSwgZWwgcGlja2VyIHF1ZWRhIGNvbiBsYSBvcGNpw7NuIFwic2luXG4gICAgICAvLyBncnVwb1wiIMO6bmljYW1lbnRlLiBObyBlcyB1biBlcnJvciBibG9xdWVhbnRlIOKAlCBjcmVhciBlbCByZWN1cnNvIHNpblxuICAgICAgLy8gYXNpZ25hciBzaWd1ZSBzaWVuZG8gdsOhbGlkby5cbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmdyb3Vwcy5zZXQoW10pLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddICYmICFjaGFuZ2VzWyd2YWx1ZSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZSA/PyAnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -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.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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.
|
|
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:
|
|
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: () =>
|
|
75827
|
+
error: () => this.groups.set([]),
|
|
75809
75828
|
});
|
|
75810
75829
|
}
|
|
75811
|
-
|
|
75812
|
-
|
|
75813
|
-
|
|
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: "
|
|
75817
|
-
<
|
|
75818
|
-
[
|
|
75819
|
-
|
|
75820
|
-
|
|
75821
|
-
|
|
75822
|
-
|
|
75823
|
-
|
|
75824
|
-
|
|
75825
|
-
|
|
75826
|
-
|
|
75827
|
-
|
|
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,
|
|
75857
|
+
imports: [CommonModule, SearchSelectorComponent],
|
|
75840
75858
|
template: `
|
|
75841
|
-
<
|
|
75842
|
-
[
|
|
75843
|
-
|
|
75844
|
-
|
|
75845
|
-
|
|
75846
|
-
|
|
75847
|
-
|
|
75848
|
-
|
|
75849
|
-
|
|
75850
|
-
|
|
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: [{
|