bit-ng-library 16.0.2 → 16.0.3

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/README.md CHANGED
@@ -26,6 +26,15 @@ To get more help on the Angular CLI use `ng help` or go check out the [Angular C
26
26
 
27
27
  ## changelog
28
28
 
29
+ ## [16.0.3] - 2023-10-19
30
+
31
+ Se amplía el funcionamiento de bit-autocomplete para aceptar listas de objetos con id y descripcion. El campo id del objeto si no es id se puede especificar
32
+ mediante el nuevo input id de bit-autocomplete aunque es opcional. El campo descripcion del objeto se sigue especificando mediante el input suggestionField.
33
+ Además, para que se pinte un valor que pueda venir del servidor cuando se está representando una ficha en modo edición tenemos el input displayValue. Este
34
+ nuevo input solo es necesario si estamos trabajando con listas de objetos pues se asume que en el formControl asociado al bit-autocomplete metemos un identificador (numero)
35
+ pero queremos pintar un valor (string). En el caso de que en el formControl estemos metiendo un string y las listas del autocomplete sean strings, no es necesario
36
+ indicar ningún displayValue.
37
+
29
38
  ## [16.0.2] - 2023-10-10
30
39
 
31
40
  se importan 4 módulos de prime: ChipModule, ToogleButtonModule, FileUploadModule que se redefine como FileUploadModulePrimeNg por conflictos con el FileUploadModule de la librería ng2 y BadgeModule
@@ -12,10 +12,21 @@ export class BitAutoCompleteComponent extends BitCustomComponent {
12
12
  super(ayudaService);
13
13
  this.ayudaService = ayudaService;
14
14
  this.multiple = false;
15
+ this.id = "id";
15
16
  this.completeMethod = new EventEmitter();
16
17
  this.onSelect = new EventEmitter();
17
18
  this.onClear = new EventEmitter();
18
19
  }
20
+ ngOnChanges(changes) {
21
+ for (let propName in changes) {
22
+ if (propName === "suggestions") {
23
+ let changedProp = changes[propName];
24
+ let newList = changedProp.currentValue;
25
+ this.suggestions_mapped = newList && newList.map((obj) => (obj instanceof Object) ? obj[this.suggestionField] : obj);
26
+ //console.log("newList", this.suggestions_mapped);
27
+ }
28
+ }
29
+ }
19
30
  search(event) {
20
31
  this.completeMethod.emit(event);
21
32
  }
@@ -32,25 +43,56 @@ export class BitAutoCompleteComponent extends BitCustomComponent {
32
43
  this.value = "";
33
44
  }
34
45
  else {
35
- this.value = v;
46
+ if (typeof (v) == 'string') {
47
+ this.value = v.toString();
48
+ }
49
+ else {
50
+ this.value = this.displayValue;
51
+ }
52
+ }
53
+ }
54
+ changeComponentValue(value) {
55
+ let valueConverted;
56
+ if (this.suggestionField) { // si estamos especificando que lo que el autocomplete hace es operar sobre una lista de objetos
57
+ // recuperamos el objeto dentro de la lista con el valor del campo suggestionField igual al seleccionado
58
+ let selectedObject = this._findObject(value);
59
+ // el valor reconvertido será el id del objeto que es lo que vamos a meter en el FormControl
60
+ valueConverted = selectedObject && selectedObject[this.id];
61
+ // emitimos que ha cambiado el objeto
62
+ this.onChange.emit(selectedObject);
63
+ }
64
+ else {
65
+ // si no es una lista de objetos el comportamiento es el de siempre
66
+ valueConverted = value;
67
+ this.onChange.emit(valueConverted);
36
68
  }
69
+ this._onChange(valueConverted);
37
70
  }
38
71
  _onSelect(selectedValue) {
39
72
  this.value = selectedValue;
40
73
  this.changeComponentValue(this.value);
41
- this.onSelect.emit(this.value);
74
+ if (this.suggestionField) {
75
+ let selectedObject = this._findObject(selectedValue);
76
+ this.onSelect.emit(selectedObject);
77
+ }
78
+ else {
79
+ this.onSelect.emit(this.value);
80
+ }
42
81
  }
43
82
  _onClear() {
44
83
  this.value = "";
45
84
  this.changeComponentValue(this.value);
46
85
  this.onClear.emit();
47
86
  }
87
+ _findObject(value) {
88
+ return value && this.suggestions.find((obj) => obj[this.suggestionField] === value);
89
+ }
48
90
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: BitAutoCompleteComponent, deps: [{ token: i1.AyudaService }], target: i0.ɵɵFactoryTarget.Component }); }
49
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", type: BitAutoCompleteComponent, selector: "bit-autocomplete", inputs: { suggestions: "suggestions", suggestionField: "suggestionField", multiple: "multiple" }, outputs: { completeMethod: "completeMethod", onSelect: "onSelect", onClear: "onClear" }, providers: [{
91
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", type: BitAutoCompleteComponent, selector: "bit-autocomplete", inputs: { suggestions: "suggestions", suggestionField: "suggestionField", multiple: "multiple", id: "id", displayValue: "displayValue" }, outputs: { completeMethod: "completeMethod", onSelect: "onSelect", onClear: "onClear" }, providers: [{
50
92
  provide: NG_VALUE_ACCESSOR,
51
93
  useExisting: forwardRef(() => BitAutoCompleteComponent),
52
94
  multi: true
53
- }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions\"\n [field]=\"suggestionField\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i5.BitControlMessages, selector: "control-messages", inputs: ["control", "field"] }] }); }
95
+ }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions_mapped\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i5.BitControlMessages, selector: "control-messages", inputs: ["control", "field"] }] }); }
54
96
  }
55
97
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: BitAutoCompleteComponent, decorators: [{
56
98
  type: Component,
@@ -58,13 +100,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImpor
58
100
  provide: NG_VALUE_ACCESSOR,
59
101
  useExisting: forwardRef(() => BitAutoCompleteComponent),
60
102
  multi: true
61
- }], template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions\"\n [field]=\"suggestionField\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n" }]
103
+ }], template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions_mapped\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n" }]
62
104
  }], ctorParameters: function () { return [{ type: i1.AyudaService }]; }, propDecorators: { suggestions: [{
63
105
  type: Input
64
106
  }], suggestionField: [{
65
107
  type: Input
66
108
  }], multiple: [{
67
109
  type: Input
110
+ }], id: [{
111
+ type: Input
112
+ }], displayValue: [{
113
+ type: Input
68
114
  }], completeMethod: [{
69
115
  type: Output
70
116
  }], onSelect: [{
@@ -72,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImpor
72
118
  }], onClear: [{
73
119
  type: Output
74
120
  }] } });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iaXQtbmctbGlicmFyeS9zcmMvbGliL3NoYXJlZGxpYnJhcnkvY29tcG9uZW50cy9mb3JtL2F1dG9jb21wbGV0ZS9iaXQtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JpdC1uZy1saWJyYXJ5L3NyYy9saWIvc2hhcmVkbGlicmFyeS9jb21wb25lbnRzL2Zvcm0vYXV0b2NvbXBsZXRlL2JpdC1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7O0FBVzdELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxrQkFBa0I7SUFnQjlELFlBQXNCLFlBQTBCO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQURBLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBVmhELGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTVDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXRDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBTWxDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVTtRQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQyx3REFBd0Q7YUFDckQ7WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsYUFBa0I7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7UUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQzs4R0FuRFUsd0JBQXdCO2tHQUF4Qix3QkFBd0Isc09BTnhCLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztnQkFDdkQsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLGlEQ2JKLDQ3QkF5QkE7OzJGRFZhLHdCQUF3QjtrQkFUcEMsU0FBUzsrQkFDRSxrQkFBa0IsYUFFakIsQ0FBQzs0QkFDVixPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1osQ0FBQzttR0FJRixXQUFXO3NCQURWLEtBQUs7Z0JBR04sZUFBZTtzQkFEZCxLQUFLO2dCQUdOLFFBQVE7c0JBRFAsS0FBSztnQkFHTixjQUFjO3NCQURiLE1BQU07Z0JBR1AsUUFBUTtzQkFEUCxNQUFNO2dCQUdQLE9BQU87c0JBRE4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5pbXBvcnQgeyBBeXVkYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvYXl1ZGEuc2VydmljZVwiO1xuaW1wb3J0IHsgQml0Q3VzdG9tQ29tcG9uZW50IH0gZnJvbSBcIi4uL2JpdC1jdXN0b20uY29tcG9uZW50XCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJiaXQtYXV0b2NvbXBsZXRlXCIsXG4gIHRlbXBsYXRlVXJsOiBcImJpdC1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWxcIixcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJpdEF1dG9Db21wbGV0ZUNvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbiAgfV1cbn0pXG5leHBvcnQgY2xhc3MgQml0QXV0b0NvbXBsZXRlQ29tcG9uZW50IGV4dGVuZHMgQml0Q3VzdG9tQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKVxuICBzdWdnZXN0aW9uczogYW55W107XG4gIEBJbnB1dCgpXG4gIHN1Z2dlc3Rpb25GaWVsZDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgY29tcGxldGVNZXRob2QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpXG4gIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgdmFsdWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXl1ZGFTZXJ2aWNlOiBBeXVkYVNlcnZpY2UpIHtcbiAgICBzdXBlcihheXVkYVNlcnZpY2UpO1xuICB9XG5cbiAgc2VhcmNoKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNvbXBsZXRlTWV0aG9kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgZ2V0IHZhbHVlX2xlY3R1cmEoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9IC8vIHNpIGVzIG51bGwgbyB1bmRlZmluZWQgKGVzIGxvIHF1ZSBldmFsw7phIGVsIFwiPT1udWxsXCIpXG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHY6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdikge1xuICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2O1xuICAgIH1cbiAgfVxuXG4gIF9vblNlbGVjdChzZWxlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWRWYWx1ZTtcbiAgICB0aGlzLmNoYW5nZUNvbXBvbmVudFZhbHVlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25TZWxlY3QuZW1pdCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIF9vbkNsZWFyKCkge1xuICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgIHRoaXMuY2hhbmdlQ29tcG9uZW50VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5vbkNsZWFyLmVtaXQoKTtcbiAgfVxuXG59XG4iLCI8bGFiZWwgKm5nSWY9XCIhaGlkZUxhYmVsXCI+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD4mbmJzcDs8c3BhbiAqbmdJZj1cIm9ibGlnYXRvcmlvXCIgY2xhc3M9XCJvYmxpZ2F0b3JpbyBmYSBmYS1hc3Rlcmlza1wiPjwvc3Bhbj4mbmJzcDsmbmJzcDtcbiAgPGkgKm5nSWY9XCJheXVkYVwiIGNsYXNzPVwiYnRuLWF5dWRhIGZhIGZhLXF1ZXN0aW9uXCIgKGNsaWNrKT1cInNob3dBeXVkYSgpXCI+PC9pPlxuPC9sYWJlbD5cbjxwICpuZ0lmPVwicmVhZE9ubHlcIiBjbGFzcz1cImxlY3R1cmFcIiBbaWRdPVwibm9tYnJlXCI+e3sgdmFsdWVfbGVjdHVyYSB9fTwvcD5cbjxwLWF1dG9Db21wbGV0ZVxuICAqbmdJZj1cIiFyZWFkT25seVwiXG4gIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICBpZD1cInt7IG5vbWJyZSB9fVwiXG4gIG5hbWU9XCJ7eyBub21icmUgfX1cIlxuICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gIGRlbGF5PVwiNDAwXCJcbiAgW3N1Z2dlc3Rpb25zXT1cInN1Z2dlc3Rpb25zXCJcbiAgW2ZpZWxkXT1cInN1Z2dlc3Rpb25GaWVsZFwiXG4gIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gIGFwcGVuZFRvPVwiYm9keVwiXG4gIChjb21wbGV0ZU1ldGhvZCk9XCJzZWFyY2goJGV2ZW50KVwiXG4gIChvblNlbGVjdCk9XCJfb25TZWxlY3QoJGV2ZW50KVwiXG4gIChvbkNsZWFyKT1cIl9vbkNsZWFyKClcIlxuICAob25CbHVyKT1cIl9vbkJsdXIoKVwiXG4gIChvbkZvY3VzKT1cIl9vbkZvY3VzKClcIlxuICBhdHRyLmRhdGEtdGVzdGlkPVwie3sgZGF0YVRlc3RJZCB9fVwiXG4+PC9wLWF1dG9Db21wbGV0ZT5cbjxjb250cm9sLW1lc3NhZ2VzICpuZ0lmPVwiY29udHJvbCAhPSBudWxsXCIgW2NvbnRyb2xdPVwiY29udHJvbFwiIFtmaWVsZF09XCJub21icmVcIj48L2NvbnRyb2wtbWVzc2FnZXM+XG4iXX0=
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iaXQtbmctbGlicmFyeS9zcmMvbGliL3NoYXJlZGxpYnJhcnkvY29tcG9uZW50cy9mb3JtL2F1dG9jb21wbGV0ZS9iaXQtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JpdC1uZy1saWJyYXJ5L3NyYy9saWIvc2hhcmVkbGlicmFyeS9jb21wb25lbnRzL2Zvcm0vYXV0b2NvbXBsZXRlL2JpdC1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7OztBQVc3RCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsa0JBQWtCO0lBc0I5RCxZQUFzQixZQUEwQjtRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFEQSxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQWhCaEQsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixPQUFFLEdBQVcsSUFBSSxDQUFDO1FBSWxCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUU1QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV0QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQVFsQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQTRDO1FBQ3RELEtBQUssSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQzVCLElBQUksUUFB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Q0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ3RGLENBQUM7OEdBbEdVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLDhRQU54QixDQUFDO2dCQUNWLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3ZELEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxzRUNiSixvNkJBd0JBOzsyRkRUYSx3QkFBd0I7a0JBVHBDLFNBQVM7K0JBQ0Usa0JBQWtCLGFBRWpCLENBQUM7NEJBQ1YsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUseUJBQXlCLENBQUM7NEJBQ3ZELEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUM7bUdBSUYsV0FBVztzQkFEVixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUs7Z0JBR04sRUFBRTtzQkFERCxLQUFLO2dCQUdOLFlBQVk7c0JBRFgsS0FBSztnQkFHTixjQUFjO3NCQURiLE1BQU07Z0JBR1AsUUFBUTtzQkFEUCxNQUFNO2dCQUdQLE9BQU87c0JBRE4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbmltcG9ydCB7IEF5dWRhU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9heXVkYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBCaXRDdXN0b21Db21wb25lbnQgfSBmcm9tIFwiLi4vYml0LWN1c3RvbS5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImJpdC1hdXRvY29tcGxldGVcIixcbiAgdGVtcGxhdGVVcmw6IFwiYml0LWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbFwiLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQml0QXV0b0NvbXBsZXRlQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBCaXRBdXRvQ29tcGxldGVDb21wb25lbnQgZXh0ZW5kcyBCaXRDdXN0b21Db21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpXG4gIHN1Z2dlc3Rpb25zOiBhbnlbXTtcbiAgQElucHV0KClcbiAgc3VnZ2VzdGlvbkZpZWxkO1xuICBASW5wdXQoKVxuICBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBpZDogc3RyaW5nID0gXCJpZFwiO1xuICBASW5wdXQoKVxuICBkaXNwbGF5VmFsdWU6IHN0cmluZztcbiAgQE91dHB1dCgpXG4gIGNvbXBsZXRlTWV0aG9kID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKVxuICBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KClcbiAgb25DbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHN1Z2dlc3Rpb25zX21hcHBlZDogc3RyaW5nW107XG5cbiAgdmFsdWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXl1ZGFTZXJ2aWNlOiBBeXVkYVNlcnZpY2UpIHtcbiAgICBzdXBlcihheXVkYVNlcnZpY2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBbcHJvcEtleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pIHtcbiAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBjaGFuZ2VzKSB7XG4gICAgICBpZiAocHJvcE5hbWUgPT09IFwic3VnZ2VzdGlvbnNcIikge1xuICAgICAgICBsZXQgY2hhbmdlZFByb3AgPSBjaGFuZ2VzW3Byb3BOYW1lXTtcbiAgICAgICAgbGV0IG5ld0xpc3QgPSBjaGFuZ2VkUHJvcC5jdXJyZW50VmFsdWU7XG4gICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNfbWFwcGVkID0gbmV3TGlzdCAmJiBuZXdMaXN0Lm1hcCgob2JqKSA9PiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KSA/IG9ialt0aGlzLnN1Z2dlc3Rpb25GaWVsZF0gOiBvYmopO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwibmV3TGlzdFwiLCB0aGlzLnN1Z2dlc3Rpb25zX21hcHBlZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNvbXBsZXRlTWV0aG9kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgZ2V0IHZhbHVlX2xlY3R1cmEoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9IC8vIHNpIGVzIG51bGwgbyB1bmRlZmluZWQgKGVzIGxvIHF1ZSBldmFsw7phIGVsIFwiPT1udWxsXCIpXG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHY6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdikge1xuICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgKHYpID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2LnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5kaXNwbGF5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlQ29tcG9uZW50VmFsdWUodmFsdWU6IGFueSkge1xuICAgIGxldCB2YWx1ZUNvbnZlcnRlZDtcbiAgICBpZiAodGhpcy5zdWdnZXN0aW9uRmllbGQpIHsgLy8gc2kgZXN0YW1vcyBlc3BlY2lmaWNhbmRvIHF1ZSBsbyBxdWUgZWwgYXV0b2NvbXBsZXRlIGhhY2UgZXMgb3BlcmFyIHNvYnJlIHVuYSBsaXN0YSBkZSBvYmpldG9zXG4gICAgICAvLyByZWN1cGVyYW1vcyBlbCBvYmpldG8gZGVudHJvIGRlIGxhIGxpc3RhIGNvbiBlbCB2YWxvciBkZWwgY2FtcG8gc3VnZ2VzdGlvbkZpZWxkIGlndWFsIGFsIHNlbGVjY2lvbmFkb1xuICAgICAgbGV0IHNlbGVjdGVkT2JqZWN0ID0gdGhpcy5fZmluZE9iamVjdCh2YWx1ZSk7XG4gICAgICAvLyBlbCB2YWxvciByZWNvbnZlcnRpZG8gc2Vyw6EgZWwgaWQgZGVsIG9iamV0byBxdWUgZXMgbG8gcXVlIHZhbW9zIGEgbWV0ZXIgZW4gZWwgRm9ybUNvbnRyb2xcbiAgICAgIHZhbHVlQ29udmVydGVkID0gc2VsZWN0ZWRPYmplY3QgJiYgc2VsZWN0ZWRPYmplY3RbdGhpcy5pZF07XG4gICAgICAvLyBlbWl0aW1vcyBxdWUgaGEgY2FtYmlhZG8gZWwgb2JqZXRvXG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoc2VsZWN0ZWRPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzaSBubyBlcyB1bmEgbGlzdGEgZGUgb2JqZXRvcyBlbCBjb21wb3J0YW1pZW50byBlcyBlbCBkZSBzaWVtcHJlXG4gICAgICB2YWx1ZUNvbnZlcnRlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQ29udmVydGVkKTtcbiAgICB9XG4gICAgdGhpcy5fb25DaGFuZ2UodmFsdWVDb252ZXJ0ZWQpO1xuICB9XG5cbiAgX29uU2VsZWN0KHNlbGVjdGVkVmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZFZhbHVlO1xuICAgIHRoaXMuY2hhbmdlQ29tcG9uZW50VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3VnZ2VzdGlvbkZpZWxkKSB7XG4gICAgICBsZXQgc2VsZWN0ZWRPYmplY3QgPSB0aGlzLl9maW5kT2JqZWN0KHNlbGVjdGVkVmFsdWUpO1xuICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHNlbGVjdGVkT2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNsZWFyKCkge1xuICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgIHRoaXMuY2hhbmdlQ29tcG9uZW50VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5vbkNsZWFyLmVtaXQoKTtcbiAgfVxuXG4gIF9maW5kT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHRoaXMuc3VnZ2VzdGlvbnMuZmluZCgob2JqKSA9PiBvYmpbdGhpcy5zdWdnZXN0aW9uRmllbGRdID09PSB2YWx1ZSk7XG4gIH1cbn0iLCI8bGFiZWwgKm5nSWY9XCIhaGlkZUxhYmVsXCI+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD4mbmJzcDs8c3BhbiAqbmdJZj1cIm9ibGlnYXRvcmlvXCIgY2xhc3M9XCJvYmxpZ2F0b3JpbyBmYSBmYS1hc3Rlcmlza1wiPjwvc3Bhbj4mbmJzcDsmbmJzcDtcbiAgPGkgKm5nSWY9XCJheXVkYVwiIGNsYXNzPVwiYnRuLWF5dWRhIGZhIGZhLXF1ZXN0aW9uXCIgKGNsaWNrKT1cInNob3dBeXVkYSgpXCI+PC9pPlxuPC9sYWJlbD5cbjxwICpuZ0lmPVwicmVhZE9ubHlcIiBjbGFzcz1cImxlY3R1cmFcIiBbaWRdPVwibm9tYnJlXCI+e3sgdmFsdWVfbGVjdHVyYSB9fTwvcD5cbjxwLWF1dG9Db21wbGV0ZVxuICAqbmdJZj1cIiFyZWFkT25seVwiXG4gIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICBpZD1cInt7IG5vbWJyZSB9fVwiXG4gIG5hbWU9XCJ7eyBub21icmUgfX1cIlxuICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gIGRlbGF5PVwiNDAwXCJcbiAgW3N1Z2dlc3Rpb25zXT1cInN1Z2dlc3Rpb25zX21hcHBlZFwiXG4gIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gIGFwcGVuZFRvPVwiYm9keVwiXG4gIChjb21wbGV0ZU1ldGhvZCk9XCJzZWFyY2goJGV2ZW50KVwiXG4gIChvblNlbGVjdCk9XCJfb25TZWxlY3QoJGV2ZW50KVwiXG4gIChvbkNsZWFyKT1cIl9vbkNsZWFyKClcIlxuICAob25CbHVyKT1cIl9vbkJsdXIoKVwiXG4gIChvbkZvY3VzKT1cIl9vbkZvY3VzKClcIlxuICBhdHRyLmRhdGEtdGVzdGlkPVwie3sgZGF0YVRlc3RJZCB9fVwiXG4+PC9wLWF1dG9Db21wbGV0ZT5cbjxjb250cm9sLW1lc3NhZ2VzICpuZ0lmPVwiY29udHJvbCAhPSBudWxsXCIgW2NvbnRyb2xdPVwiY29udHJvbFwiIFtmaWVsZF09XCJub21icmVcIj48L2NvbnRyb2wtbWVzc2FnZXM+XG4iXX0=
@@ -4305,10 +4305,21 @@ class BitAutoCompleteComponent extends BitCustomComponent {
4305
4305
  super(ayudaService);
4306
4306
  this.ayudaService = ayudaService;
4307
4307
  this.multiple = false;
4308
+ this.id = "id";
4308
4309
  this.completeMethod = new EventEmitter();
4309
4310
  this.onSelect = new EventEmitter();
4310
4311
  this.onClear = new EventEmitter();
4311
4312
  }
4313
+ ngOnChanges(changes) {
4314
+ for (let propName in changes) {
4315
+ if (propName === "suggestions") {
4316
+ let changedProp = changes[propName];
4317
+ let newList = changedProp.currentValue;
4318
+ this.suggestions_mapped = newList && newList.map((obj) => (obj instanceof Object) ? obj[this.suggestionField] : obj);
4319
+ //console.log("newList", this.suggestions_mapped);
4320
+ }
4321
+ }
4322
+ }
4312
4323
  search(event) {
4313
4324
  this.completeMethod.emit(event);
4314
4325
  }
@@ -4325,25 +4336,56 @@ class BitAutoCompleteComponent extends BitCustomComponent {
4325
4336
  this.value = "";
4326
4337
  }
4327
4338
  else {
4328
- this.value = v;
4339
+ if (typeof (v) == 'string') {
4340
+ this.value = v.toString();
4341
+ }
4342
+ else {
4343
+ this.value = this.displayValue;
4344
+ }
4329
4345
  }
4330
4346
  }
4347
+ changeComponentValue(value) {
4348
+ let valueConverted;
4349
+ if (this.suggestionField) { // si estamos especificando que lo que el autocomplete hace es operar sobre una lista de objetos
4350
+ // recuperamos el objeto dentro de la lista con el valor del campo suggestionField igual al seleccionado
4351
+ let selectedObject = this._findObject(value);
4352
+ // el valor reconvertido será el id del objeto que es lo que vamos a meter en el FormControl
4353
+ valueConverted = selectedObject && selectedObject[this.id];
4354
+ // emitimos que ha cambiado el objeto
4355
+ this.onChange.emit(selectedObject);
4356
+ }
4357
+ else {
4358
+ // si no es una lista de objetos el comportamiento es el de siempre
4359
+ valueConverted = value;
4360
+ this.onChange.emit(valueConverted);
4361
+ }
4362
+ this._onChange(valueConverted);
4363
+ }
4331
4364
  _onSelect(selectedValue) {
4332
4365
  this.value = selectedValue;
4333
4366
  this.changeComponentValue(this.value);
4334
- this.onSelect.emit(this.value);
4367
+ if (this.suggestionField) {
4368
+ let selectedObject = this._findObject(selectedValue);
4369
+ this.onSelect.emit(selectedObject);
4370
+ }
4371
+ else {
4372
+ this.onSelect.emit(this.value);
4373
+ }
4335
4374
  }
4336
4375
  _onClear() {
4337
4376
  this.value = "";
4338
4377
  this.changeComponentValue(this.value);
4339
4378
  this.onClear.emit();
4340
4379
  }
4380
+ _findObject(value) {
4381
+ return value && this.suggestions.find((obj) => obj[this.suggestionField] === value);
4382
+ }
4341
4383
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: BitAutoCompleteComponent, deps: [{ token: AyudaService }], target: i0.ɵɵFactoryTarget.Component }); }
4342
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", type: BitAutoCompleteComponent, selector: "bit-autocomplete", inputs: { suggestions: "suggestions", suggestionField: "suggestionField", multiple: "multiple" }, outputs: { completeMethod: "completeMethod", onSelect: "onSelect", onClear: "onClear" }, providers: [{
4384
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", type: BitAutoCompleteComponent, selector: "bit-autocomplete", inputs: { suggestions: "suggestions", suggestionField: "suggestionField", multiple: "multiple", id: "id", displayValue: "displayValue" }, outputs: { completeMethod: "completeMethod", onSelect: "onSelect", onClear: "onClear" }, providers: [{
4343
4385
  provide: NG_VALUE_ACCESSOR,
4344
4386
  useExisting: forwardRef(() => BitAutoCompleteComponent),
4345
4387
  multi: true
4346
- }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions\"\n [field]=\"suggestionField\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$6.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: BitControlMessages, selector: "control-messages", inputs: ["control", "field"] }] }); }
4388
+ }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions_mapped\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$6.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: BitControlMessages, selector: "control-messages", inputs: ["control", "field"] }] }); }
4347
4389
  }
4348
4390
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: BitAutoCompleteComponent, decorators: [{
4349
4391
  type: Component,
@@ -4351,13 +4393,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImpor
4351
4393
  provide: NG_VALUE_ACCESSOR,
4352
4394
  useExisting: forwardRef(() => BitAutoCompleteComponent),
4353
4395
  multi: true
4354
- }], template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions\"\n [field]=\"suggestionField\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n" }]
4396
+ }], template: "<label *ngIf=\"!hideLabel\">\n <ng-content></ng-content>&nbsp;<span *ngIf=\"obligatorio\" class=\"obligatorio fa fa-asterisk\"></span>&nbsp;&nbsp;\n <i *ngIf=\"ayuda\" class=\"btn-ayuda fa fa-question\" (click)=\"showAyuda()\"></i>\n</label>\n<p *ngIf=\"readOnly\" class=\"lectura\" [id]=\"nombre\">{{ value_lectura }}</p>\n<p-autoComplete\n *ngIf=\"!readOnly\"\n [(ngModel)]=\"value\"\n id=\"{{ nombre }}\"\n name=\"{{ nombre }}\"\n [disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n delay=\"400\"\n [suggestions]=\"suggestions_mapped\"\n [multiple]=\"multiple\"\n appendTo=\"body\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"_onSelect($event)\"\n (onClear)=\"_onClear()\"\n (onBlur)=\"_onBlur()\"\n (onFocus)=\"_onFocus()\"\n attr.data-testid=\"{{ dataTestId }}\"\n></p-autoComplete>\n<control-messages *ngIf=\"control != null\" [control]=\"control\" [field]=\"nombre\"></control-messages>\n" }]
4355
4397
  }], ctorParameters: function () { return [{ type: AyudaService }]; }, propDecorators: { suggestions: [{
4356
4398
  type: Input
4357
4399
  }], suggestionField: [{
4358
4400
  type: Input
4359
4401
  }], multiple: [{
4360
4402
  type: Input
4403
+ }], id: [{
4404
+ type: Input
4405
+ }], displayValue: [{
4406
+ type: Input
4361
4407
  }], completeMethod: [{
4362
4408
  type: Output
4363
4409
  }], onSelect: [{