@agorapulse/ui-components 17.3.3 → 17.3.4

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,16 +1,18 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-function */
2
- import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { Component, DestroyRef, EventEmitter, forwardRef, inject, Input, Output, ViewEncapsulation } from '@angular/core';
3
3
  import { FormControl, FormGroup, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ReactiveFormsModule, Validators, } from '@angular/forms';
4
4
  import { CommonModule, NgOptimizedImage } from '@angular/common';
5
5
  import { NgSelectModule } from '@ng-select/ng-select';
6
6
  import { InputGroupComponent, InputPrefixComponent } from "@agorapulse/ui-components/input-group";
7
- import { DropdownItemSingleOneLineComponent, SelectBaseDirective } from "@agorapulse/ui-components/select";
7
+ import { DropdownItemSingleOneLineComponent, DropdownSearchFormComponent, SelectBaseDirective } from "@agorapulse/ui-components/select";
8
8
  import { InputDirective } from "@agorapulse/ui-components/input";
9
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "@angular/forms";
11
12
  import * as i2 from "@ng-select/ng-select";
12
13
  const NUMBER_ONLY_PATTERN = /[0-9]/;
13
14
  export class PhoneNumberInputComponent {
15
+ destroyRef = inject(DestroyRef);
14
16
  set errorsDisplayForced(errorsDisplayForced) {
15
17
  if (errorsDisplayForced) {
16
18
  this.formGroup.markAllAsTouched();
@@ -28,9 +30,16 @@ export class PhoneNumberInputComponent {
28
30
  this.phoneNumberCode = defaultValue;
29
31
  }
30
32
  }
33
+ set initialCountryCode(initialCountryCode) {
34
+ const firstValue = this.codeNumberInfos.find((codeInfo) => codeInfo.countryCode === initialCountryCode)?.phoneNumberCode;
35
+ if (firstValue) {
36
+ this.formGroup.patchValue({ phoneNumberCode: firstValue });
37
+ }
38
+ }
31
39
  codeNumberInfos = [];
32
40
  name;
33
41
  placeholder;
42
+ searchPlaceholder;
34
43
  set phoneNumber(phoneNumber) {
35
44
  this.formGroup.controls.phoneNumber.setValue(phoneNumber);
36
45
  }
@@ -43,8 +52,22 @@ export class PhoneNumberInputComponent {
43
52
  phoneNumberCode: new FormControl('', [Validators.required]),
44
53
  phoneNumber: new FormControl('', [Validators.required]),
45
54
  });
46
- onTouched;
47
- onChange;
55
+ onTouched = () => { };
56
+ onChange = () => { };
57
+ ngOnInit() {
58
+ // Subscribe to form changes to propagate them to the parent component
59
+ this.formGroup.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
60
+ if (this.onChange) {
61
+ this.onChange(value);
62
+ }
63
+ if (value.phoneNumber !== this.phoneNumber) {
64
+ this.changePhoneNumber.emit(value.phoneNumber ?? '');
65
+ }
66
+ if (value.phoneNumberCode !== this.phoneNumberCode) {
67
+ this.changePhoneNumberCode.emit(value.phoneNumberCode ?? '');
68
+ }
69
+ });
70
+ }
48
71
  registerOnChange(fn) {
49
72
  this.onChange = fn;
50
73
  }
@@ -55,14 +78,17 @@ export class PhoneNumberInputComponent {
55
78
  return this.formGroup.valid ? null : { phoneNumber: 'invalid', ...this.formGroup.errors };
56
79
  }
57
80
  writeValue(phone) {
58
- this.formGroup.setValue(phone === null ? {
59
- phoneNumber: '',
60
- phoneNumberCode: this.codeNumberInfos[0]?.phoneNumberCode ?? '',
61
- } : phone);
81
+ // Avoid setting an empty value for the phone number code, it should always have a value
82
+ if (phone === null || !phone.phoneNumberCode) {
83
+ this.formGroup.patchValue({ phoneNumber: phone?.phoneNumberCode ?? '' });
84
+ }
85
+ else {
86
+ this.formGroup.patchValue(phone);
87
+ }
62
88
  }
63
89
  phoneNumberCodeSearchFn(term, item) {
64
90
  const termCased = term.toLocaleLowerCase();
65
- return item.countryName.toLocaleLowerCase().indexOf(termCased) > -1 || item.phoneNumberCode.toLocaleLowerCase().indexOf(termCased) > -1;
91
+ return item.countryName.toLocaleLowerCase().indexOf(termCased) > -1 || item.countryCode.toLocaleLowerCase().indexOf(termCased) > -1;
66
92
  }
67
93
  markAsTouched() {
68
94
  this.formGroup.markAllAsTouched();
@@ -80,7 +106,7 @@ export class PhoneNumberInputComponent {
80
106
  }
81
107
  }
82
108
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: PhoneNumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
83
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: PhoneNumberInputComponent, isStandalone: true, selector: "ap-phone-number-input", inputs: { errorsDisplayForced: "errorsDisplayForced", flagsBucketUrl: "flagsBucketUrl", phoneNumberInfos: "phoneNumberInfos", name: "name", placeholder: "placeholder", phoneNumber: "phoneNumber", phoneNumberCode: "phoneNumberCode" }, outputs: { changePhoneNumber: "changePhoneNumber", changePhoneNumberCode: "changePhoneNumberCode" }, providers: [
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: PhoneNumberInputComponent, isStandalone: true, selector: "ap-phone-number-input", inputs: { errorsDisplayForced: "errorsDisplayForced", flagsBucketUrl: "flagsBucketUrl", phoneNumberInfos: "phoneNumberInfos", initialCountryCode: "initialCountryCode", name: "name", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", phoneNumber: "phoneNumber", phoneNumberCode: "phoneNumberCode" }, outputs: { changePhoneNumber: "changePhoneNumber", changePhoneNumberCode: "changePhoneNumberCode" }, providers: [
84
110
  {
85
111
  provide: NG_VALUE_ACCESSOR,
86
112
  useExisting: forwardRef(() => PhoneNumberInputComponent),
@@ -91,7 +117,7 @@ export class PhoneNumberInputComponent {
91
117
  useExisting: forwardRef(() => PhoneNumberInputComponent),
92
118
  multi: true,
93
119
  },
94
- ], ngImport: i0, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n apSelect\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n [items]=\"codeNumberInfos\"\n [clearable]=\"false\"\n [searchable]=\"true\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [selected]=\"item$.selected\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i2.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i2.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "component", type: InputGroupComponent, selector: "ap-input-group", inputs: ["symbolPosition"] }, { kind: "directive", type: SelectBaseDirective, selector: "ng-select[apSelect]", inputs: ["inlineLabel", "symbolId"] }, { kind: "directive", type: InputDirective, selector: "[apInput]" }, { kind: "component", type: InputPrefixComponent, selector: "ap-input-prefix" }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked"], outputs: ["lockedFeatureClicked"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], encapsulation: i0.ViewEncapsulation.None });
120
+ ], ngImport: i0, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n #select\n apSelectSingle\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n appendTo=\"body\"\n [clearable]=\"false\"\n [items]=\"codeNumberInfos\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [avatarUrl]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\"\n [selected]=\"item$.selected\"\n [roundedAvatar]=\"false\"\n />\n </ng-template>\n <ng-template\n let-searchTerm=\"searchTerm\"\n ng-header-tmp>\n <ap-dropdown-search-form\n [searchPlaceholder]=\"searchPlaceholder\"\n [select]=\"select\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ng-dropdown-panel.ap-phone-number-code-select ap-dropdown-item-single-one-line ap-avatar{border:0;max-height:16px;min-height:16px;height:initial;box-shadow:0;overflow:hidden;background:none}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .ap-phone-number-code-select .ng-input input{display:none}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i2.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i2.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i2.NgHeaderTemplateDirective, selector: "[ng-header-tmp]" }, { kind: "component", type: InputGroupComponent, selector: "ap-input-group", inputs: ["symbolPosition"] }, { kind: "directive", type: InputDirective, selector: "[apInput]" }, { kind: "component", type: InputPrefixComponent, selector: "ap-input-prefix" }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked"], outputs: ["lockedFeatureClicked"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: DropdownSearchFormComponent, selector: "ap-dropdown-search-form", inputs: ["searchPlaceholder", "createNewEnabled", "createText", "select"], outputs: ["createNew"] }], encapsulation: i0.ViewEncapsulation.None });
95
121
  }
96
122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: PhoneNumberInputComponent, decorators: [{
97
123
  type: Component,
@@ -106,6 +132,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
106
132
  DropdownItemSingleOneLineComponent,
107
133
  ReactiveFormsModule,
108
134
  NgOptimizedImage,
135
+ DropdownSearchFormComponent
109
136
  ], providers: [
110
137
  {
111
138
  provide: NG_VALUE_ACCESSOR,
@@ -117,7 +144,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
117
144
  useExisting: forwardRef(() => PhoneNumberInputComponent),
118
145
  multi: true,
119
146
  },
120
- ], encapsulation: ViewEncapsulation.None, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n apSelect\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n [items]=\"codeNumberInfos\"\n [clearable]=\"false\"\n [searchable]=\"true\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [selected]=\"item$.selected\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"] }]
147
+ ], encapsulation: ViewEncapsulation.None, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n #select\n apSelectSingle\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n appendTo=\"body\"\n [clearable]=\"false\"\n [items]=\"codeNumberInfos\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [avatarUrl]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\"\n [selected]=\"item$.selected\"\n [roundedAvatar]=\"false\"\n />\n </ng-template>\n <ng-template\n let-searchTerm=\"searchTerm\"\n ng-header-tmp>\n <ap-dropdown-search-form\n [searchPlaceholder]=\"searchPlaceholder\"\n [select]=\"select\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ng-dropdown-panel.ap-phone-number-code-select ap-dropdown-item-single-one-line ap-avatar{border:0;max-height:16px;min-height:16px;height:initial;box-shadow:0;overflow:hidden;background:none}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .ap-phone-number-code-select .ng-input input{display:none}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"] }]
121
148
  }], propDecorators: { errorsDisplayForced: [{
122
149
  type: Input
123
150
  }], flagsBucketUrl: [{
@@ -126,12 +153,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
126
153
  }], phoneNumberInfos: [{
127
154
  type: Input,
128
155
  args: [{ required: true }]
156
+ }], initialCountryCode: [{
157
+ type: Input
129
158
  }], name: [{
130
159
  type: Input,
131
160
  args: [{ required: true }]
132
161
  }], placeholder: [{
133
162
  type: Input,
134
163
  args: [{ required: true }]
164
+ }], searchPlaceholder: [{
165
+ type: Input,
166
+ args: [{ required: true }]
135
167
  }], phoneNumber: [{
136
168
  type: Input
137
169
  }], phoneNumberCode: [{
@@ -141,4 +173,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
141
173
  }], changePhoneNumberCode: [{
142
174
  type: Output
143
175
  }] } });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9waG9uZS1udW1iZXItaW5wdXQvc3JjL3Bob25lLW51bWJlci1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9saWJzL3VpLWNvbXBvbmVudHMvcGhvbmUtbnVtYmVyLWlucHV0L3NyYy9waG9uZS1udW1iZXItaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFFSCxXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUduQixVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxrQ0FBa0MsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7OztBQWEvRCxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztBQWlDcEMsTUFBTSxPQUFPLHlCQUF5QjtJQUNsQyxJQUFhLG1CQUFtQixDQUFDLG1CQUE0QjtRQUN6RCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFB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d0JBQ2QsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsb0JBQW9CO3dCQUNwQixrQ0FBa0M7d0JBQ2xDLG1CQUFtQjt3QkFDbkIsZ0JBQWdCO3FCQUNuQixhQUNVO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDOzRCQUN4RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUM7NEJBQ3hELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKLGlCQUNjLGlCQUFpQixDQUFDLElBQUk7OEJBR3hCLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFPcUIsY0FBYztzQkFBeEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ00sZ0JBQWdCO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFVRSxJQUFJO3NCQUE5QixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxXQUFXO3NCQUFyQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDWixXQUFXO3NCQUF2QixLQUFLO2dCQUdPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvbiAqL1xuaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3JtQ29udHJvbCxcbiAgICBGb3JtR3JvdXAsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxuICAgIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlLCBOZ09wdGltaXplZEltYWdlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtOZ1NlbGVjdE1vZHVsZX0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xuaW1wb3J0IHtJbnB1dEdyb3VwQ29tcG9uZW50LCBJbnB1dFByZWZpeENvbXBvbmVudH0gZnJvbSBcIkBhZ29yYXB1bHNlL3VpLWNvbXBvbmVudHMvaW5wdXQtZ3JvdXBcIjtcbmltcG9ydCB7RHJvcGRvd25JdGVtU2luZ2xlT25lTGluZUNvbXBvbmVudCwgU2VsZWN0QmFzZURpcmVjdGl2ZX0gZnJvbSBcIkBhZ29yYXB1bHNlL3VpLWNvbXBvbmVudHMvc2VsZWN0XCI7XG5pbXBvcnQge0lucHV0RGlyZWN0aXZlfSBmcm9tIFwiQGFnb3JhcHVsc2UvdWktY29tcG9uZW50cy9pbnB1dFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVySW5mbyB7XG4gICAgY291bnRyeUNvZGU6IHN0cmluZztcbiAgICBjb3VudHJ5TmFtZTogc3RyaW5nO1xuICAgIHBob25lTnVtYmVyQ29kZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBob25lIHtcbiAgICBwaG9uZU51bWJlcjogc3RyaW5nO1xuICAgIHBob25lTnVtYmVyQ29kZTogc3RyaW5nO1xufVxuXG5jb25zdCBOVU1CRVJfT05MWV9QQVRURVJOID0gL1swLTldLztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcC1waG9uZS1udW1iZXItaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAncGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsncGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE5nU2VsZWN0TW9kdWxlLFxuICAgICAgICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgICAgICBTZWxlY3RCYXNlRGlyZWN0aXZlLFxuICAgICAgICBJbnB1dERpcmVjdGl2ZSxcbiAgICAgICAgSW5wdXRQcmVmaXhDb21wb25lbnQsXG4gICAgICAgIERyb3Bkb3duSXRlbVNpbmdsZU9uZUxpbmVDb21wb25lbnQsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE5nT3B0aW1pemVkSW1hZ2UsXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQaG9uZU51bWJlcklucHV0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGhvbmVOdW1iZXJJbnB1dENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFBob25lTnVtYmVySW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgICBASW5wdXQoKSBzZXQgZXJyb3JzRGlzcGxheUZvcmNlZChlcnJvcnNEaXNwbGF5Rm9yY2VkOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChlcnJvcnNEaXNwbGF5Rm9yY2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sKSA9PiBjb250cm9sLm1hcmtBc0RpcnR5KCkpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGZsYWdzQnVja2V0VXJsITogc3RyaW5nO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNldCBwaG9uZU51bWJlckluZm9zKHBob25lTnVtYmVySW5mb3M6IFBob25lTnVtYmVySW5mb1tdKSB7XG4gICAgICAgIHRoaXMuY29kZU51bWJlckluZm9zID0gcGhvbmVOdW1iZXJJbmZvcyA/PyBbXTtcbiAgICAgICAgaWYgKHBob25lTnVtYmVySW5mb3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gRFMgQmVoYXZpb3I6IHNlbGVjdCBieSBkZWZhdWx0IHRoZSBmaXJzdCBwaG9uZSBudW1iZXIgY29kZVxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gcGhvbmVOdW1iZXJJbmZvc1swXS5waG9uZU51bWJlckNvZGU7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5waG9uZU51bWJlckNvZGUuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMucGhvbmVOdW1iZXJDb2RlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvZGVOdW1iZXJJbmZvczogUGhvbmVOdW1iZXJJbmZvW10gPSBbXTtcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBuYW1lITogc3RyaW5nO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHBsYWNlaG9sZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNldCBwaG9uZU51bWJlcihwaG9uZU51bWJlcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnBob25lTnVtYmVyLnNldFZhbHVlKHBob25lTnVtYmVyKTtcbiAgICB9XG4gICAgQElucHV0KCkgc2V0IHBob25lTnVtYmVyQ29kZShwaG9uZU51bWJlckNvZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5waG9uZU51bWJlckNvZGUuc2V0VmFsdWUocGhvbmVOdW1iZXJDb2RlKTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgY2hhbmdlUGhvbmVOdW1iZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgQE91dHB1dCgpIGNoYW5nZVBob25lTnVtYmVyQ29kZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICBwaG9uZU51bWJlckNvZGU6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgICBwaG9uZU51bWJlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgb25Ub3VjaGVkOiBhbnk7XG4gICAgcHVibGljIG9uQ2hhbmdlOiBhbnk7XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWxpZCA/IG51bGwgOiB7IHBob25lTnVtYmVyOiAnaW52YWxpZCcsIC4uLnRoaXMuZm9ybUdyb3VwLmVycm9ycyB9O1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUocGhvbmU6IFBob25lIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5zZXRWYWx1ZShwaG9uZSA9PT0gbnVsbCA/IHtcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyQ29kZTogdGhpcy5jb2RlTnVtYmVySW5mb3NbMF0/LnBob25lTnVtYmVyQ29kZSA/PyAnJyxcbiAgICAgICAgfSA6IHBob25lKTtcbiAgICB9XG5cbiAgICBwaG9uZU51bWJlckNvZGVTZWFyY2hGbih0ZXJtOiBzdHJpbmcsIGl0ZW06IFBob25lTnVtYmVySW5mbyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZXJtQ2FzZWQgPSB0ZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBpdGVtLmNvdW50cnlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtQ2FzZWQpID4gLTEgfHwgaXRlbS5waG9uZU51bWJlckNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKHRlcm1DYXNlZCkgPiAtMTtcbiAgICB9XG5cbiAgICBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBwaG9uZSBudW1iZXIgaW5wdXQgdG8gb25seSBhbGxvdyBudW1iZXJzXG4gICAgICovXG4gICAgZmlsdGVyQ2hhcnMoZXZlbnQ6IElucHV0RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmlucHV0VHlwZSAhPT0gJ2luc2VydFRleHQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRDaGFyOiBzdHJpbmcgfCBudWxsID0gZXZlbnQuZGF0YTtcbiAgICAgICAgaWYgKGlucHV0Q2hhciAmJiAhTlVNQkVSX09OTFlfUEFUVEVSTi50ZXN0KGlucHV0Q2hhcikpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XG4gICAgPG5nLXNlbGVjdFxuICAgICAgICAgICAgYXBTZWxlY3RcbiAgICAgICAgICAgIGRhdGEtdGVzdD1cInN1YnNjcmlwdGlvbi1iaWxsaW5nLWluZm9zLXBob25lTnVtYmVyQ29kZVwiXG4gICAgICAgICAgICBjbGFzcz1cImFwLXBob25lLW51bWJlci1jb2RlLXNlbGVjdFwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJjb3VudHJ5TmFtZVwiXG4gICAgICAgICAgICBiaW5kVmFsdWU9XCJwaG9uZU51bWJlckNvZGVcIlxuICAgICAgICAgICAgbm90Rm91bmRUZXh0PVwiXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBob25lTnVtYmVyQ29kZVwiXG4gICAgICAgICAgICBbaXRlbXNdPVwiY29kZU51bWJlckluZm9zXCJcbiAgICAgICAgICAgIFtjbGVhcmFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc2VhcmNoRm5dPVwicGhvbmVOdW1iZXJDb2RlU2VhcmNoRm5cIlxuICAgICAgICAgICAgKGJsdXIpPVwib25Ub3VjaGVkKClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIGxldC1pdGVtPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgbmctbGFiZWwtdG1wPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbSAmJiBpdGVtLmNvdW50cnlDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGFnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCEhZmxhZ3NCdWNrZXRVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImZsYWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTcmNdPVwiZmxhZ3NCdWNrZXRVcmwgKyAnLycgKyBpdGVtLmNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkgKyAnLnBuZydcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5jb3VudHJ5Q29kZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIGxldC1pdGVtPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgbGV0LWl0ZW0kPVwiaXRlbSRcIlxuICAgICAgICAgICAgICAgIG5nLW9wdGlvbi10bXA+XG4gICAgICAgICAgICAgICAgPGFwLWRyb3Bkb3duLWl0ZW0tc2luZ2xlLW9uZS1saW5lXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIml0ZW0uY291bnRyeU5hbWUgKyAnIC0gJyArIGl0ZW0ucGhvbmVOdW1iZXJDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIml0ZW0kLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXNlbGVjdD5cbiAgICA8YXAtaW5wdXQtZ3JvdXAgY2xhc3M9XCJwaG9uZS1udW1iZXItaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPGFwLWlucHV0LXByZWZpeD57e2Zvcm1Hcm91cC5jb250cm9scy5waG9uZU51bWJlckNvZGUudmFsdWV9fTwvYXAtaW5wdXQtcHJlZml4PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBhcElucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwaG9uZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0PVwic3Vic2NyaXB0aW9uLWJpbGxpbmctaW5mb3MtcGhvbmVOdW1iZXJJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGRhdGEtcmVjdXJseT1cInBob25lXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaG9uZU51bWJlclwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIChiZWZvcmVpbnB1dCk9XCJmaWx0ZXJDaGFycygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJvblRvdWNoZWQoKVwiXG4gICAgICAgIC8+XG4gICAgPC9hcC1pbnB1dC1ncm91cD5cbjwvbmctY29udGFpbmVyPlxuIl19
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9waG9uZS1udW1iZXItaW5wdXQvc3JjL3Bob25lLW51bWJlci1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9saWJzL3VpLWNvbXBvbmVudHMvcGhvbmUtbnVtYmVyLWlucHV0L3NyYy9waG9uZS1udW1iZXItaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEksT0FBTyxFQUVILFdBQVcsRUFDWCxTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsbUJBQW1CLEVBR25CLFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFDLG1CQUFtQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDaEcsT0FBTyxFQUFDLGtDQUFrQyxFQUFFLDJCQUEyQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDdEksT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7O0FBYWhFLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBa0NwQyxNQUFNLE9BQU8seUJBQXlCO0lBQ2pCLFVBQVUs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c0JBQTFCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5pbXBvcnQge0NvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3JtQ29udHJvbCxcbiAgICBGb3JtR3JvdXAsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxuICAgIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlLCBOZ09wdGltaXplZEltYWdlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtOZ1NlbGVjdE1vZHVsZX0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xuaW1wb3J0IHtJbnB1dEdyb3VwQ29tcG9uZW50LCBJbnB1dFByZWZpeENvbXBvbmVudH0gZnJvbSBcIkBhZ29yYXB1bHNlL3VpLWNvbXBvbmVudHMvaW5wdXQtZ3JvdXBcIjtcbmltcG9ydCB7RHJvcGRvd25JdGVtU2luZ2xlT25lTGluZUNvbXBvbmVudCwgRHJvcGRvd25TZWFyY2hGb3JtQ29tcG9uZW50LCBTZWxlY3RCYXNlRGlyZWN0aXZlfSBmcm9tIFwiQGFnb3JhcHVsc2UvdWktY29tcG9uZW50cy9zZWxlY3RcIjtcbmltcG9ydCB7SW5wdXREaXJlY3RpdmV9IGZyb20gXCJAYWdvcmFwdWxzZS91aS1jb21wb25lbnRzL2lucHV0XCI7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXJJbmZvIHtcbiAgICBjb3VudHJ5Q29kZTogc3RyaW5nO1xuICAgIGNvdW50cnlOYW1lOiBzdHJpbmc7XG4gICAgcGhvbmVOdW1iZXJDb2RlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmUge1xuICAgIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gICAgcGhvbmVOdW1iZXJDb2RlOiBzdHJpbmc7XG59XG5cbmNvbnN0IE5VTUJFUl9PTkxZX1BBVFRFUk4gPSAvWzAtOV0vO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwLXBob25lLW51bWJlci1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICdwaG9uZS1udW1iZXItaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydwaG9uZS1udW1iZXItaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgTmdTZWxlY3RNb2R1bGUsXG4gICAgICAgIElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgICAgIFNlbGVjdEJhc2VEaXJlY3RpdmUsXG4gICAgICAgIElucHV0RGlyZWN0aXZlLFxuICAgICAgICBJbnB1dFByZWZpeENvbXBvbmVudCxcbiAgICAgICAgRHJvcGRvd25JdGVtU2luZ2xlT25lTGluZUNvbXBvbmVudCxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgTmdPcHRpbWl6ZWRJbWFnZSxcbiAgICAgICAgRHJvcGRvd25TZWFyY2hGb3JtQ29tcG9uZW50XG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQaG9uZU51bWJlcklucHV0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGhvbmVOdW1iZXJJbnB1dENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFBob25lTnVtYmVySW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkluaXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIEBJbnB1dCgpIHNldCBlcnJvcnNEaXNwbGF5Rm9yY2VkKGVycm9yc0Rpc3BsYXlGb3JjZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGVycm9yc0Rpc3BsYXlGb3JjZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wubWFya0FzRGlydHkoKSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZmxhZ3NCdWNrZXRVcmwhOiBzdHJpbmc7XG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IHBob25lTnVtYmVySW5mb3MocGhvbmVOdW1iZXJJbmZvczogUGhvbmVOdW1iZXJJbmZvW10pIHtcbiAgICAgICAgdGhpcy5jb2RlTnVtYmVySW5mb3MgPSBwaG9uZU51bWJlckluZm9zID8/IFtdO1xuICAgICAgICBpZiAocGhvbmVOdW1iZXJJbmZvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBEUyBCZWhhdmlvcjogc2VsZWN0IGJ5IGRlZmF1bHQgdGhlIGZpcnN0IHBob25lIG51bWJlciBjb2RlXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBwaG9uZU51bWJlckluZm9zWzBdLnBob25lTnVtYmVyQ29kZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnBob25lTnVtYmVyQ29kZS5zZXRWYWx1ZShkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5waG9uZU51bWJlckNvZGUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQElucHV0KCkgc2V0IGluaXRpYWxDb3VudHJ5Q29kZShpbml0aWFsQ291bnRyeUNvZGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5jb2RlTnVtYmVySW5mb3MuZmluZCgoY29kZUluZm8pID0+IGNvZGVJbmZvLmNvdW50cnlDb2RlID09PSBpbml0aWFsQ291bnRyeUNvZGUpPy5waG9uZU51bWJlckNvZGU7XG4gICAgICAgIGlmIChmaXJzdFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgcGhvbmVOdW1iZXJDb2RlOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvZGVOdW1iZXJJbmZvczogUGhvbmVOdW1iZXJJbmZvW10gPSBbXTtcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBuYW1lITogc3RyaW5nO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHBsYWNlaG9sZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNlYXJjaFBsYWNlaG9sZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNldCBwaG9uZU51bWJlcihwaG9uZU51bWJlcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnBob25lTnVtYmVyLnNldFZhbHVlKHBob25lTnVtYmVyKTtcbiAgICB9XG4gICAgQElucHV0KCkgc2V0IHBob25lTnVtYmVyQ29kZShwaG9uZU51bWJlckNvZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5waG9uZU51bWJlckNvZGUuc2V0VmFsdWUocGhvbmVOdW1iZXJDb2RlKTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgY2hhbmdlUGhvbmVOdW1iZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgQE91dHB1dCgpIGNoYW5nZVBob25lTnVtYmVyQ29kZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICBwaG9uZU51bWJlckNvZGU6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgICBwaG9uZU51bWJlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcbiAgICBwdWJsaWMgb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBmb3JtIGNoYW5nZXMgdG8gcHJvcGFnYXRlIHRoZW0gdG8gdGhlIHBhcmVudCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUucGhvbmVOdW1iZXIgIT09IHRoaXMucGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBob25lTnVtYmVyLmVtaXQodmFsdWUucGhvbmVOdW1iZXIgPz8gJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLnBob25lTnVtYmVyQ29kZSAhPT0gdGhpcy5waG9uZU51bWJlckNvZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVBob25lTnVtYmVyQ29kZS5lbWl0KHZhbHVlLnBob25lTnVtYmVyQ29kZSA/PyAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnZhbGlkID8gbnVsbCA6IHsgcGhvbmVOdW1iZXI6ICdpbnZhbGlkJywgLi4udGhpcy5mb3JtR3JvdXAuZXJyb3JzIH07XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZShwaG9uZTogUGhvbmUgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8vIEF2b2lkIHNldHRpbmcgYW4gZW1wdHkgdmFsdWUgZm9yIHRoZSBwaG9uZSBudW1iZXIgY29kZSwgaXQgc2hvdWxkIGFsd2F5cyBoYXZlIGEgdmFsdWVcbiAgICAgICAgaWYgKHBob25lID09PSBudWxsIHx8ICFwaG9uZS5waG9uZU51bWJlckNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe3Bob25lTnVtYmVyOiBwaG9uZT8ucGhvbmVOdW1iZXJDb2RlID8/ICcnfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHBob25lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBob25lTnVtYmVyQ29kZVNlYXJjaEZuKHRlcm06IHN0cmluZywgaXRlbTogUGhvbmVOdW1iZXJJbmZvKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRlcm1DYXNlZCA9IHRlcm0udG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW0uY291bnRyeU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKHRlcm1DYXNlZCkgPiAtMSB8fCBpdGVtLmNvdW50cnlDb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtQ2FzZWQpID4gLTE7XG4gICAgfVxuXG4gICAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgcGhvbmUgbnVtYmVyIGlucHV0IHRvIG9ubHkgYWxsb3cgbnVtYmVyc1xuICAgICAqL1xuICAgIGZpbHRlckNoYXJzKGV2ZW50OiBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5pbnB1dFR5cGUgIT09ICdpbnNlcnRUZXh0Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0Q2hhcjogc3RyaW5nIHwgbnVsbCA9IGV2ZW50LmRhdGE7XG4gICAgICAgIGlmIChpbnB1dENoYXIgJiYgIU5VTUJFUl9PTkxZX1BBVFRFUk4udGVzdChpbnB1dENoYXIpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICAgIDxuZy1zZWxlY3RcbiAgICAgICAgICAgICNzZWxlY3RcbiAgICAgICAgICAgIGFwU2VsZWN0U2luZ2xlXG4gICAgICAgICAgICBkYXRhLXRlc3Q9XCJzdWJzY3JpcHRpb24tYmlsbGluZy1pbmZvcy1waG9uZU51bWJlckNvZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhcC1waG9uZS1udW1iZXItY29kZS1zZWxlY3RcIlxuICAgICAgICAgICAgYmluZExhYmVsPVwiY291bnRyeU5hbWVcIlxuICAgICAgICAgICAgYmluZFZhbHVlPVwicGhvbmVOdW1iZXJDb2RlXCJcbiAgICAgICAgICAgIG5vdEZvdW5kVGV4dD1cIlwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaG9uZU51bWJlckNvZGVcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIFtjbGVhcmFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2l0ZW1zXT1cImNvZGVOdW1iZXJJbmZvc1wiXG4gICAgICAgICAgICBbc2VhcmNoRm5dPVwicGhvbmVOdW1iZXJDb2RlU2VhcmNoRm5cIlxuICAgICAgICAgICAgKGJsdXIpPVwib25Ub3VjaGVkKClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIGxldC1pdGVtPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgbmctbGFiZWwtdG1wPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbSAmJiBpdGVtLmNvdW50cnlDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGFnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCEhZmxhZ3NCdWNrZXRVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImZsYWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTcmNdPVwiZmxhZ3NCdWNrZXRVcmwgKyAnLycgKyBpdGVtLmNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkgKyAnLnBuZydcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5jb3VudHJ5Q29kZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIGxldC1pdGVtPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgbGV0LWl0ZW0kPVwiaXRlbSRcIlxuICAgICAgICAgICAgICAgIG5nLW9wdGlvbi10bXA+XG4gICAgICAgICAgICAgICAgPGFwLWRyb3Bkb3duLWl0ZW0tc2luZ2xlLW9uZS1saW5lXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIml0ZW0uY291bnRyeU5hbWUgKyAnIC0gJyArIGl0ZW0ucGhvbmVOdW1iZXJDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F2YXRhclVybF09XCJmbGFnc0J1Y2tldFVybCArICcvJyArIGl0ZW0uY291bnRyeUNvZGUudG9VcHBlckNhc2UoKSArICcucG5nJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpdGVtJC5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3VuZGVkQXZhdGFyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIGxldC1zZWFyY2hUZXJtPVwic2VhcmNoVGVybVwiXG4gICAgICAgICAgICAgICAgbmctaGVhZGVyLXRtcD5cbiAgICAgICAgICAgICAgICA8YXAtZHJvcGRvd24tc2VhcmNoLWZvcm1cbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICBbc2VsZWN0XT1cInNlbGVjdFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXNlbGVjdD5cbiAgICA8YXAtaW5wdXQtZ3JvdXAgY2xhc3M9XCJwaG9uZS1udW1iZXItaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPGFwLWlucHV0LXByZWZpeD57e2Zvcm1Hcm91cC5jb250cm9scy5waG9uZU51bWJlckNvZGUudmFsdWV9fTwvYXAtaW5wdXQtcHJlZml4PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBhcElucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwaG9uZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0PVwic3Vic2NyaXB0aW9uLWJpbGxpbmctaW5mb3MtcGhvbmVOdW1iZXJJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGRhdGEtcmVjdXJseT1cInBob25lXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaG9uZU51bWJlclwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIChiZWZvcmVpbnB1dCk9XCJmaWx0ZXJDaGFycygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJvblRvdWNoZWQoKVwiXG4gICAgICAgIC8+XG4gICAgPC9hcC1pbnB1dC1ncm91cD5cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -21,6 +21,7 @@ export class DropdownSearchFormComponent {
21
21
  createNew = new EventEmitter();
22
22
  searchTermSignal = signal('');
23
23
  searchTerm$ = new BehaviorSubject('');
24
+ submitSubscription = null;
24
25
  constructor() {
25
26
  this.searchTerm$
26
27
  .pipe(filter(() => !!this.select), takeUntilDestroyed())
@@ -29,16 +30,38 @@ export class DropdownSearchFormComponent {
29
30
  this.select.filter(term);
30
31
  });
31
32
  }
33
+ ngOnDestroy() {
34
+ this.submitSubscription?.unsubscribe();
35
+ }
32
36
  ngAfterViewInit() {
33
37
  setTimeout(() => {
34
38
  this.inputSearch.focusInput();
39
+ this.registerKeyboardSubmit();
35
40
  }, 100);
36
41
  this.select.notFoundTemplate = this.notFoundTpl;
37
42
  this.select.loadingTextTemplate = this.loadingTpl;
43
+ // validate the current row on keypress
38
44
  if (this.createNewEnabled) {
39
45
  this.select.footerTemplate = this.createNewTpl;
40
46
  }
41
47
  }
48
+ /**
49
+ * Register the keyboard submit event allowing to press enter to select the first item found.
50
+ * And escape to close the dropdown. This is useful for keyboard navigation.
51
+ * Use case: search for an item by typing the first characters and press enter to select it.
52
+ * Furthermore: arrow keys currently don't work in the dropdown search form.
53
+ */
54
+ registerKeyboardSubmit() {
55
+ this.submitSubscription?.unsubscribe();
56
+ this.submitSubscription = this.inputSearch.keyup.subscribe(event => {
57
+ if (event.key === 'Enter') {
58
+ this.select.select(this.select.itemsList.filteredItems[0]);
59
+ }
60
+ else if (event.key === 'Escape') {
61
+ this.select.close();
62
+ }
63
+ });
64
+ }
42
65
  onCreateNew() {
43
66
  this.createNew.emit(this.searchTermSignal());
44
67
  }
@@ -74,4 +97,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
74
97
  }], createNew: [{
75
98
  type: Output
76
99
  }] } });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NlbGVjdC9zcmMvZHJvcGRvd24tc2VhcmNoLWZvcm0vZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NlbGVjdC9zcmMvZHJvcGRvd24tc2VhcmNoLWZvcm0vZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBVy9DLE1BQU0sT0FBTywyQkFBMkI7SUFDM0IsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixVQUFVLEdBQUcsUUFBUSxDQUFDO0lBSS9CLE1BQU0sQ0FBcUI7SUFDTSxXQUFXLENBQXdCO0lBQ25CLFdBQVcsQ0FBb0I7SUFDaEMsVUFBVSxDQUFvQjtJQUM1QixZQUFZLENBQW9CO0lBRXhFLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRWpELGdCQUFnQixHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUN0QyxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7SUFFOUM7UUFDSSxJQUFJLENBQUMsV0FBVzthQUNYLElBQUksQ0FDRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFDM0Isa0JBQWtCLEVBQUUsQ0FDdkI7YUFDQSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGVBQWU7UUFDWCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNuRCxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7dUdBM0NRLDJCQUEyQjsyRkFBM0IsMkJBQTJCLDJTQVF6QixvQkFBb0Isd0hBQ0csV0FBVyxtR0FDWixXQUFXLHVHQUNULFdBQVcsNkJDM0NsRCxtL0JBcUNBLG9VRFBtRCxlQUFlLDRGQUFFLFdBQVcsK1ZBQUUsZUFBZSxxRkFBRSxvQkFBb0I7OzJGQUV6RywyQkFBMkI7a0JBVHZDLFNBQVM7K0JBQ0kseUJBQXlCLGNBR3ZCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQzt3REFHMUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlOLE1BQU07c0JBSEwsS0FBSzt1QkFBQzt3QkFDSCxRQUFRLEVBQUUsSUFBSTtxQkFDakI7Z0JBRWdDLFdBQVc7c0JBQTNDLFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNrQixXQUFXO3NCQUEzRCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ0MsVUFBVTtzQkFBekQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNJLFlBQVk7c0JBQTdELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFFdEMsU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvYWRlckNvbXBvbmVudCB9IGZyb20gJ0BhZ29yYXB1bHNlL3VpLWFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUgfSBmcm9tICdAYWdvcmFwdWxzZS91aS1jb21wb25lbnRzL2lucHV0JztcbmltcG9ydCB7IElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICdAYWdvcmFwdWxzZS91aS1jb21wb25lbnRzL2lucHV0LWdyb3VwJztcbmltcG9ydCB7IElucHV0U2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQGFnb3JhcHVsc2UvdWktY29tcG9uZW50cy9pbnB1dC1zZWFyY2gnO1xuaW1wb3J0IHsgU3ltYm9sQ29tcG9uZW50IH0gZnJvbSAnQGFnb3JhcHVsc2UvdWktc3ltYm9sJztcblxuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ1NlbGVjdENvbXBvbmVudCB9IGZyb20gJ0BuZy1zZWxlY3Qvbmctc2VsZWN0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXAtZHJvcGRvd24tc2VhcmNoLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi1zZWFyY2gtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaW1wb3J0czogW0lucHV0R3JvdXBDb21wb25lbnQsIElucHV0RGlyZWN0aXZlLCBTeW1ib2xDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBMb2FkZXJDb21wb25lbnQsIElucHV0U2VhcmNoQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25TZWFyY2hGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXIgPSAnJztcbiAgICBASW5wdXQoKSBjcmVhdGVOZXdFbmFibGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgY3JlYXRlVGV4dCA9ICdDcmVhdGUnO1xuICAgIEBJbnB1dCh7XG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgc2VsZWN0ITogTmdTZWxlY3RDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZChJbnB1dFNlYXJjaENvbXBvbmVudCkgaW5wdXRTZWFyY2ghOiBJbnB1dFNlYXJjaENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdub3RGb3VuZFRwbCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgbm90Rm91bmRUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBWaWV3Q2hpbGQoJ2xvYWRpbmdUcGwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGxvYWRpbmdUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBWaWV3Q2hpbGQoJ2NyZWF0ZU5ld1RwbCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgY3JlYXRlTmV3VHBsITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBPdXRwdXQoKSBjcmVhdGVOZXcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIHNlYXJjaFRlcm1TaWduYWwgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gICAgc2VhcmNoVGVybSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuc2VsZWN0KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0ZXJtID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1TaWduYWwuc2V0KHRlcm0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcih0ZXJtKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmZvY3VzSW5wdXQoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Qubm90Rm91bmRUZW1wbGF0ZSA9IHRoaXMubm90Rm91bmRUcGw7XG4gICAgICAgIHRoaXMuc2VsZWN0LmxvYWRpbmdUZXh0VGVtcGxhdGUgPSB0aGlzLmxvYWRpbmdUcGw7XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZU5ld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0LmZvb3RlclRlbXBsYXRlID0gdGhpcy5jcmVhdGVOZXdUcGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNyZWF0ZU5ldygpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVOZXcuZW1pdCh0aGlzLnNlYXJjaFRlcm1TaWduYWwoKSk7XG4gICAgfVxufVxuIiwiPGFwLWlucHV0LXNlYXJjaFxuICAgIGNsYXNzPVwiZHJvcGRvd24tc2VhcmNoLWlucHV0XCJcbiAgICBbbmdNb2RlbF09XCJzZWFyY2hUZXJtU2lnbmFsKClcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGVybSQubmV4dCgkZXZlbnQpXCIgLz5cblxuPG5nLXRlbXBsYXRlICNub3RGb3VuZFRwbD5cbiAgICA8ZGl2IGNsYXNzPVwib3B0aW9uIG5vdC1mb3VuZFwiPlxuICAgICAgICA8c3Bhbj57eyBzZWxlY3Qubm90Rm91bmRUZXh0ID8gc2VsZWN0Lm5vdEZvdW5kVGV4dCA6ICdOb3QgZm91bmQgdGV4dCcgfX08L3NwYW4+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdUcGw+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3RhdGVcIj5cbiAgICAgICAgPGFwLWxvYWRlciBkaWFtZXRlcj1cIjMwXCIgLz5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7eyBzZWxlY3QubG9hZGluZ1RleHQgPyBzZWxlY3QubG9hZGluZ1RleHQgOiAnTG9hZGluZyBJdGVtcycgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICAgI2NyZWF0ZU5ld1RwbFxuICAgIGxldC1zZWFyY2hUZXJtPVwic2VhcmNoVGVybVwiPlxuICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJjcmVhdGUtbmV3XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvbkNyZWF0ZU5ldygpXCI+XG4gICAgICAgIDxhcC1zeW1ib2xcbiAgICAgICAgICAgIHN5bWJvbElkPVwicGx1c1wiXG4gICAgICAgICAgICBzaXplPVwic21cIiAvPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7IGNyZWF0ZVRleHQgfX1cbiAgICAgICAgICAgIHt7IHNlYXJjaFRlcm0gPyBzZWFyY2hUZXJtIDogJycgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NlbGVjdC9zcmMvZHJvcGRvd24tc2VhcmNoLWZvcm0vZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NlbGVjdC9zcmMvZHJvcGRvd24tc2VhcmNoLWZvcm0vZHJvcGRvd24tc2VhcmNoLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBVy9DLE1BQU0sT0FBTywyQkFBMkI7SUFDM0IsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixVQUFVLEdBQUcsUUFBUSxD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Q0FBQzt3REFHMUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlOLE1BQU07c0JBSEwsS0FBSzt1QkFBQzt3QkFDSCxRQUFRLEVBQUUsSUFBSTtxQkFDakI7Z0JBRWdDLFdBQVc7c0JBQTNDLFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNrQixXQUFXO3NCQUEzRCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ0MsVUFBVTtzQkFBekQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNJLFlBQVk7c0JBQTdELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFFdEMsU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvYWRlckNvbXBvbmVudCB9IGZyb20gJ0BhZ29yYXB1bHNlL3VpLWFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUgfSBmcm9tICdAYWdvcmFwdWxzZS91aS1jb21wb25lbnRzL2lucHV0JztcbmltcG9ydCB7IElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICdAYWdvcmFwdWxzZS91aS1jb21wb25lbnRzL2lucHV0LWdyb3VwJztcbmltcG9ydCB7IElucHV0U2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQGFnb3JhcHVsc2UvdWktY29tcG9uZW50cy9pbnB1dC1zZWFyY2gnO1xuaW1wb3J0IHsgU3ltYm9sQ29tcG9uZW50IH0gZnJvbSAnQGFnb3JhcHVsc2UvdWktc3ltYm9sJztcblxuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBPdXRwdXRSZWZTdWJzY3JpcHRpb24sXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5nU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaWx0ZXIgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcC1kcm9wZG93bi1zZWFyY2gtZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLXNlYXJjaC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1zZWFyY2gtZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBpbXBvcnRzOiBbSW5wdXRHcm91cENvbXBvbmVudCwgSW5wdXREaXJlY3RpdmUsIFN5bWJvbENvbXBvbmVudCwgRm9ybXNNb2R1bGUsIExvYWRlckNvbXBvbmVudCwgSW5wdXRTZWFyY2hDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93blNlYXJjaEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyID0gJyc7XG4gICAgQElucHV0KCkgY3JlYXRlTmV3RW5hYmxlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGNyZWF0ZVRleHQgPSAnQ3JlYXRlJztcbiAgICBASW5wdXQoe1xuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICAgIHNlbGVjdCE6IE5nU2VsZWN0Q29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoSW5wdXRTZWFyY2hDb21wb25lbnQpIGlucHV0U2VhcmNoITogSW5wdXRTZWFyY2hDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnbm90Rm91bmRUcGwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIG5vdEZvdW5kVHBsITogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAVmlld0NoaWxkKCdsb2FkaW5nVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBsb2FkaW5nVHBsITogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAVmlld0NoaWxkKCdjcmVhdGVOZXdUcGwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGNyZWF0ZU5ld1RwbCE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAT3V0cHV0KCkgY3JlYXRlTmV3ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBzZWFyY2hUZXJtU2lnbmFsID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICAgIHNlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBzdWJtaXRTdWJzY3JpcHRpb246IE91dHB1dFJlZlN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuc2VsZWN0KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0ZXJtID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1TaWduYWwuc2V0KHRlcm0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcih0ZXJtKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1Ym1pdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5mb2N1c0lucHV0KCk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyS2V5Ym9hcmRTdWJtaXQoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Qubm90Rm91bmRUZW1wbGF0ZSA9IHRoaXMubm90Rm91bmRUcGw7XG4gICAgICAgIHRoaXMuc2VsZWN0LmxvYWRpbmdUZXh0VGVtcGxhdGUgPSB0aGlzLmxvYWRpbmdUcGw7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGN1cnJlbnQgcm93IG9uIGtleXByZXNzXG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZU5ld0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0LmZvb3RlclRlbXBsYXRlID0gdGhpcy5jcmVhdGVOZXdUcGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciB0aGUga2V5Ym9hcmQgc3VibWl0IGV2ZW50IGFsbG93aW5nIHRvIHByZXNzIGVudGVyIHRvIHNlbGVjdCB0aGUgZmlyc3QgaXRlbSBmb3VuZC5cbiAgICAgKiBBbmQgZXNjYXBlIHRvIGNsb3NlIHRoZSBkcm9wZG93bi4gVGhpcyBpcyB1c2VmdWwgZm9yIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAgICogVXNlIGNhc2U6IHNlYXJjaCBmb3IgYW4gaXRlbSBieSB0eXBpbmcgdGhlIGZpcnN0IGNoYXJhY3RlcnMgYW5kIHByZXNzIGVudGVyIHRvIHNlbGVjdCBpdC5cbiAgICAgKiBGdXJ0aGVybW9yZTogYXJyb3cga2V5cyBjdXJyZW50bHkgZG9uJ3Qgd29yayBpbiB0aGUgZHJvcGRvd24gc2VhcmNoIGZvcm0uXG4gICAgICovXG4gICAgcmVnaXN0ZXJLZXlib2FyZFN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3VibWl0U3Vic2NyaXB0aW9uID0gdGhpcy5pbnB1dFNlYXJjaC5rZXl1cC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0LnNlbGVjdCh0aGlzLnNlbGVjdC5pdGVtc0xpc3QuZmlsdGVyZWRJdGVtc1swXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIG9uQ3JlYXRlTmV3KCkge1xuICAgICAgICB0aGlzLmNyZWF0ZU5ldy5lbWl0KHRoaXMuc2VhcmNoVGVybVNpZ25hbCgpKTtcbiAgICB9XG59XG4iLCI8YXAtaW5wdXQtc2VhcmNoXG4gICAgY2xhc3M9XCJkcm9wZG93bi1zZWFyY2gtaW5wdXRcIlxuICAgIFtuZ01vZGVsXT1cInNlYXJjaFRlcm1TaWduYWwoKVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hUZXJtJC5uZXh0KCRldmVudClcIiAvPlxuXG48bmctdGVtcGxhdGUgI25vdEZvdW5kVHBsPlxuICAgIDxkaXYgY2xhc3M9XCJvcHRpb24gbm90LWZvdW5kXCI+XG4gICAgICAgIDxzcGFuPnt7IHNlbGVjdC5ub3RGb3VuZFRleHQgPyBzZWxlY3Qubm90Rm91bmRUZXh0IDogJ05vdCBmb3VuZCB0ZXh0JyB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RwbD5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zdGF0ZVwiPlxuICAgICAgICA8YXAtbG9hZGVyIGRpYW1ldGVyPVwiMzBcIiAvPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7IHNlbGVjdC5sb2FkaW5nVGV4dCA/IHNlbGVjdC5sb2FkaW5nVGV4dCA6ICdMb2FkaW5nIEl0ZW1zJyB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgICAjY3JlYXRlTmV3VHBsXG4gICAgbGV0LXNlYXJjaFRlcm09XCJzZWFyY2hUZXJtXCI+XG4gICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImNyZWF0ZS1uZXdcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTmV3KClcIj5cbiAgICAgICAgPGFwLXN5bWJvbFxuICAgICAgICAgICAgc3ltYm9sSWQ9XCJwbHVzXCJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiIC8+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgICAge3sgY3JlYXRlVGV4dCB9fVxuICAgICAgICAgICAge3sgc2VhcmNoVGVybSA/IHNlYXJjaFRlcm0gOiAnJyB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -4,11 +4,11 @@ export class StatusComponent {
4
4
  color = 'blue';
5
5
  dot = true;
6
6
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: StatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: StatusComponent, isStandalone: true, selector: "ap-status", inputs: { color: "color", dot: ["dot", "dot", booleanAttribute] }, host: { properties: { "class": "this.color" } }, ngImport: i0, template: "@if (dot) {\n <div class=\"dot\"></div>\n}\n<ng-content></ng-content>\n", styles: ["ap-status{--dot-size: 8px;display:flex;align-items:center;justify-content:center;padding:0 var(--comp-status-padding-horizontal);gap:var(--comp-status-spacing);width:fit-content;height:var(--comp-status-height);border-radius:var(--comp-status-height);color:var(--comp-status-color)}ap-status .dot{display:flex;width:var(--dot-size);min-width:var(--dot-size);max-width:var(--dot-size);height:var(--dot-size);min-height:var(--dot-size);max-height:var(--dot-size);border-radius:100%}ap-status.blue{background-color:var(--comp-status-blue-background-color)}ap-status.blue .dot{background-color:var(--comp-status-blue-dot-background-color)}ap-status.green{background-color:var(--comp-status-green-background-color)}ap-status.green .dot{background-color:var(--comp-status-green-dot-background-color)}ap-status.orange{background-color:var(--comp-status-orange-background-color)}ap-status.orange .dot{background-color:var(--comp-status-orange-dot-background-color)}ap-status.tagOrange{background-color:var(--comp-status-tag-orange-background-color)}ap-status.tagOrange .dot{background-color:var(--comp-status-tag-orange-dot-background-color)}ap-status.grey{background-color:var(--comp-status-grey-background-color)}ap-status.grey .dot{background-color:var(--comp-status-grey-dot-background-color)}ap-status.red{background-color:var(--comp-status-red-background-color)}ap-status.red .dot{background-color:var(--comp-status-red-dot-background-color)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: StatusComponent, isStandalone: true, selector: "ap-status", inputs: { color: "color", dot: ["dot", "dot", booleanAttribute] }, host: { properties: { "class": "this.color" } }, ngImport: i0, template: "@if (dot) {\n <div class=\"dot\"></div>\n}\n<ng-content></ng-content>\n", styles: ["ap-status{--dot-size: 8px;display:flex;align-items:center;justify-content:center;padding:0 var(--comp-status-padding-horizontal);gap:var(--comp-status-spacing);width:fit-content;height:var(--comp-status-height);border-radius:var(--comp-status-height);color:var(--comp-status-color);font-family:Averta}ap-status .dot{display:flex;width:var(--dot-size);min-width:var(--dot-size);max-width:var(--dot-size);height:var(--dot-size);min-height:var(--dot-size);max-height:var(--dot-size);border-radius:100%}ap-status.blue{background-color:var(--comp-status-blue-background-color)}ap-status.blue .dot{background-color:var(--comp-status-blue-dot-background-color)}ap-status.green{background-color:var(--comp-status-green-background-color)}ap-status.green .dot{background-color:var(--comp-status-green-dot-background-color)}ap-status.orange{background-color:var(--comp-status-orange-background-color)}ap-status.orange .dot{background-color:var(--comp-status-orange-dot-background-color)}ap-status.tagOrange{background-color:var(--comp-status-tag-orange-background-color)}ap-status.tagOrange .dot{background-color:var(--comp-status-tag-orange-dot-background-color)}ap-status.grey{background-color:var(--comp-status-grey-background-color)}ap-status.grey .dot{background-color:var(--comp-status-grey-dot-background-color)}ap-status.red{background-color:var(--comp-status-red-background-color)}ap-status.red .dot{background-color:var(--comp-status-red-dot-background-color)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
8
8
  }
9
9
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: StatusComponent, decorators: [{
10
10
  type: Component,
11
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ap-status', standalone: true, imports: [], encapsulation: ViewEncapsulation.None, template: "@if (dot) {\n <div class=\"dot\"></div>\n}\n<ng-content></ng-content>\n", styles: ["ap-status{--dot-size: 8px;display:flex;align-items:center;justify-content:center;padding:0 var(--comp-status-padding-horizontal);gap:var(--comp-status-spacing);width:fit-content;height:var(--comp-status-height);border-radius:var(--comp-status-height);color:var(--comp-status-color)}ap-status .dot{display:flex;width:var(--dot-size);min-width:var(--dot-size);max-width:var(--dot-size);height:var(--dot-size);min-height:var(--dot-size);max-height:var(--dot-size);border-radius:100%}ap-status.blue{background-color:var(--comp-status-blue-background-color)}ap-status.blue .dot{background-color:var(--comp-status-blue-dot-background-color)}ap-status.green{background-color:var(--comp-status-green-background-color)}ap-status.green .dot{background-color:var(--comp-status-green-dot-background-color)}ap-status.orange{background-color:var(--comp-status-orange-background-color)}ap-status.orange .dot{background-color:var(--comp-status-orange-dot-background-color)}ap-status.tagOrange{background-color:var(--comp-status-tag-orange-background-color)}ap-status.tagOrange .dot{background-color:var(--comp-status-tag-orange-dot-background-color)}ap-status.grey{background-color:var(--comp-status-grey-background-color)}ap-status.grey .dot{background-color:var(--comp-status-grey-dot-background-color)}ap-status.red{background-color:var(--comp-status-red-background-color)}ap-status.red .dot{background-color:var(--comp-status-red-dot-background-color)}\n"] }]
11
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ap-status', standalone: true, imports: [], encapsulation: ViewEncapsulation.None, template: "@if (dot) {\n <div class=\"dot\"></div>\n}\n<ng-content></ng-content>\n", styles: ["ap-status{--dot-size: 8px;display:flex;align-items:center;justify-content:center;padding:0 var(--comp-status-padding-horizontal);gap:var(--comp-status-spacing);width:fit-content;height:var(--comp-status-height);border-radius:var(--comp-status-height);color:var(--comp-status-color);font-family:Averta}ap-status .dot{display:flex;width:var(--dot-size);min-width:var(--dot-size);max-width:var(--dot-size);height:var(--dot-size);min-height:var(--dot-size);max-height:var(--dot-size);border-radius:100%}ap-status.blue{background-color:var(--comp-status-blue-background-color)}ap-status.blue .dot{background-color:var(--comp-status-blue-dot-background-color)}ap-status.green{background-color:var(--comp-status-green-background-color)}ap-status.green .dot{background-color:var(--comp-status-green-dot-background-color)}ap-status.orange{background-color:var(--comp-status-orange-background-color)}ap-status.orange .dot{background-color:var(--comp-status-orange-dot-background-color)}ap-status.tagOrange{background-color:var(--comp-status-tag-orange-background-color)}ap-status.tagOrange .dot{background-color:var(--comp-status-tag-orange-dot-background-color)}ap-status.grey{background-color:var(--comp-status-grey-background-color)}ap-status.grey .dot{background-color:var(--comp-status-grey-dot-background-color)}ap-status.red{background-color:var(--comp-status-red-background-color)}ap-status.red .dot{background-color:var(--comp-status-red-dot-background-color)}\n"] }]
12
12
  }], propDecorators: { color: [{
13
13
  type: HostBinding,
14
14
  args: ['class']
@@ -1,17 +1,19 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, forwardRef, Component, ViewEncapsulation, Input, Output } from '@angular/core';
2
+ import { inject, DestroyRef, EventEmitter, forwardRef, Component, ViewEncapsulation, Input, Output } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormGroup, FormControl, Validators, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import { CommonModule, NgOptimizedImage } from '@angular/common';
6
6
  import * as i2 from '@ng-select/ng-select';
7
7
  import { NgSelectModule } from '@ng-select/ng-select';
8
8
  import { InputGroupComponent, InputPrefixComponent } from '@agorapulse/ui-components/input-group';
9
- import { SelectBaseDirective, DropdownItemSingleOneLineComponent } from '@agorapulse/ui-components/select';
9
+ import { DropdownItemSingleOneLineComponent, DropdownSearchFormComponent, SelectBaseDirective } from '@agorapulse/ui-components/select';
10
10
  import { InputDirective } from '@agorapulse/ui-components/input';
11
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
12
 
12
13
  /* eslint-disable @typescript-eslint/no-empty-function */
13
14
  const NUMBER_ONLY_PATTERN = /[0-9]/;
14
15
  class PhoneNumberInputComponent {
16
+ destroyRef = inject(DestroyRef);
15
17
  set errorsDisplayForced(errorsDisplayForced) {
16
18
  if (errorsDisplayForced) {
17
19
  this.formGroup.markAllAsTouched();
@@ -29,9 +31,16 @@ class PhoneNumberInputComponent {
29
31
  this.phoneNumberCode = defaultValue;
30
32
  }
31
33
  }
34
+ set initialCountryCode(initialCountryCode) {
35
+ const firstValue = this.codeNumberInfos.find((codeInfo) => codeInfo.countryCode === initialCountryCode)?.phoneNumberCode;
36
+ if (firstValue) {
37
+ this.formGroup.patchValue({ phoneNumberCode: firstValue });
38
+ }
39
+ }
32
40
  codeNumberInfos = [];
33
41
  name;
34
42
  placeholder;
43
+ searchPlaceholder;
35
44
  set phoneNumber(phoneNumber) {
36
45
  this.formGroup.controls.phoneNumber.setValue(phoneNumber);
37
46
  }
@@ -44,8 +53,22 @@ class PhoneNumberInputComponent {
44
53
  phoneNumberCode: new FormControl('', [Validators.required]),
45
54
  phoneNumber: new FormControl('', [Validators.required]),
46
55
  });
47
- onTouched;
48
- onChange;
56
+ onTouched = () => { };
57
+ onChange = () => { };
58
+ ngOnInit() {
59
+ // Subscribe to form changes to propagate them to the parent component
60
+ this.formGroup.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
61
+ if (this.onChange) {
62
+ this.onChange(value);
63
+ }
64
+ if (value.phoneNumber !== this.phoneNumber) {
65
+ this.changePhoneNumber.emit(value.phoneNumber ?? '');
66
+ }
67
+ if (value.phoneNumberCode !== this.phoneNumberCode) {
68
+ this.changePhoneNumberCode.emit(value.phoneNumberCode ?? '');
69
+ }
70
+ });
71
+ }
49
72
  registerOnChange(fn) {
50
73
  this.onChange = fn;
51
74
  }
@@ -56,14 +79,17 @@ class PhoneNumberInputComponent {
56
79
  return this.formGroup.valid ? null : { phoneNumber: 'invalid', ...this.formGroup.errors };
57
80
  }
58
81
  writeValue(phone) {
59
- this.formGroup.setValue(phone === null ? {
60
- phoneNumber: '',
61
- phoneNumberCode: this.codeNumberInfos[0]?.phoneNumberCode ?? '',
62
- } : phone);
82
+ // Avoid setting an empty value for the phone number code, it should always have a value
83
+ if (phone === null || !phone.phoneNumberCode) {
84
+ this.formGroup.patchValue({ phoneNumber: phone?.phoneNumberCode ?? '' });
85
+ }
86
+ else {
87
+ this.formGroup.patchValue(phone);
88
+ }
63
89
  }
64
90
  phoneNumberCodeSearchFn(term, item) {
65
91
  const termCased = term.toLocaleLowerCase();
66
- return item.countryName.toLocaleLowerCase().indexOf(termCased) > -1 || item.phoneNumberCode.toLocaleLowerCase().indexOf(termCased) > -1;
92
+ return item.countryName.toLocaleLowerCase().indexOf(termCased) > -1 || item.countryCode.toLocaleLowerCase().indexOf(termCased) > -1;
67
93
  }
68
94
  markAsTouched() {
69
95
  this.formGroup.markAllAsTouched();
@@ -81,7 +107,7 @@ class PhoneNumberInputComponent {
81
107
  }
82
108
  }
83
109
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: PhoneNumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: PhoneNumberInputComponent, isStandalone: true, selector: "ap-phone-number-input", inputs: { errorsDisplayForced: "errorsDisplayForced", flagsBucketUrl: "flagsBucketUrl", phoneNumberInfos: "phoneNumberInfos", name: "name", placeholder: "placeholder", phoneNumber: "phoneNumber", phoneNumberCode: "phoneNumberCode" }, outputs: { changePhoneNumber: "changePhoneNumber", changePhoneNumberCode: "changePhoneNumberCode" }, providers: [
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: PhoneNumberInputComponent, isStandalone: true, selector: "ap-phone-number-input", inputs: { errorsDisplayForced: "errorsDisplayForced", flagsBucketUrl: "flagsBucketUrl", phoneNumberInfos: "phoneNumberInfos", initialCountryCode: "initialCountryCode", name: "name", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", phoneNumber: "phoneNumber", phoneNumberCode: "phoneNumberCode" }, outputs: { changePhoneNumber: "changePhoneNumber", changePhoneNumberCode: "changePhoneNumberCode" }, providers: [
85
111
  {
86
112
  provide: NG_VALUE_ACCESSOR,
87
113
  useExisting: forwardRef(() => PhoneNumberInputComponent),
@@ -92,7 +118,7 @@ class PhoneNumberInputComponent {
92
118
  useExisting: forwardRef(() => PhoneNumberInputComponent),
93
119
  multi: true,
94
120
  },
95
- ], ngImport: i0, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n apSelect\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n [items]=\"codeNumberInfos\"\n [clearable]=\"false\"\n [searchable]=\"true\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [selected]=\"item$.selected\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i2.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i2.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "component", type: InputGroupComponent, selector: "ap-input-group", inputs: ["symbolPosition"] }, { kind: "directive", type: SelectBaseDirective, selector: "ng-select[apSelect]", inputs: ["inlineLabel", "symbolId"] }, { kind: "directive", type: InputDirective, selector: "[apInput]" }, { kind: "component", type: InputPrefixComponent, selector: "ap-input-prefix" }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked"], outputs: ["lockedFeatureClicked"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], encapsulation: i0.ViewEncapsulation.None });
121
+ ], ngImport: i0, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n #select\n apSelectSingle\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n appendTo=\"body\"\n [clearable]=\"false\"\n [items]=\"codeNumberInfos\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [avatarUrl]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\"\n [selected]=\"item$.selected\"\n [roundedAvatar]=\"false\"\n />\n </ng-template>\n <ng-template\n let-searchTerm=\"searchTerm\"\n ng-header-tmp>\n <ap-dropdown-search-form\n [searchPlaceholder]=\"searchPlaceholder\"\n [select]=\"select\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ng-dropdown-panel.ap-phone-number-code-select ap-dropdown-item-single-one-line ap-avatar{border:0;max-height:16px;min-height:16px;height:initial;box-shadow:0;overflow:hidden;background:none}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .ap-phone-number-code-select .ng-input input{display:none}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i2.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i2.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: i2.NgHeaderTemplateDirective, selector: "[ng-header-tmp]" }, { kind: "component", type: InputGroupComponent, selector: "ap-input-group", inputs: ["symbolPosition"] }, { kind: "directive", type: InputDirective, selector: "[apInput]" }, { kind: "component", type: InputPrefixComponent, selector: "ap-input-prefix" }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked"], outputs: ["lockedFeatureClicked"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: DropdownSearchFormComponent, selector: "ap-dropdown-search-form", inputs: ["searchPlaceholder", "createNewEnabled", "createText", "select"], outputs: ["createNew"] }], encapsulation: i0.ViewEncapsulation.None });
96
122
  }
97
123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: PhoneNumberInputComponent, decorators: [{
98
124
  type: Component,
@@ -107,6 +133,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
107
133
  DropdownItemSingleOneLineComponent,
108
134
  ReactiveFormsModule,
109
135
  NgOptimizedImage,
136
+ DropdownSearchFormComponent
110
137
  ], providers: [
111
138
  {
112
139
  provide: NG_VALUE_ACCESSOR,
@@ -118,7 +145,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
118
145
  useExisting: forwardRef(() => PhoneNumberInputComponent),
119
146
  multi: true,
120
147
  },
121
- ], encapsulation: ViewEncapsulation.None, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n apSelect\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n [items]=\"codeNumberInfos\"\n [clearable]=\"false\"\n [searchable]=\"true\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [selected]=\"item$.selected\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"] }]
148
+ ], encapsulation: ViewEncapsulation.None, template: "<ng-container [formGroup]=\"formGroup\">\n <ng-select\n #select\n apSelectSingle\n data-test=\"subscription-billing-infos-phoneNumberCode\"\n class=\"ap-phone-number-code-select\"\n bindLabel=\"countryName\"\n bindValue=\"phoneNumberCode\"\n notFoundText=\"\"\n formControlName=\"phoneNumberCode\"\n appendTo=\"body\"\n [clearable]=\"false\"\n [items]=\"codeNumberInfos\"\n [searchFn]=\"phoneNumberCodeSearchFn\"\n (blur)=\"onTouched()\">\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n @if (item && item.countryCode) {\n <div class=\"flag\">\n @if (!!flagsBucketUrl) {\n <img\n width=\"24\"\n height=\"16\"\n alt=\"flag\"\n [ngSrc]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\" />\n } @else {\n <span>{{ item.countryCode }}</span>\n }\n </div>\n }\n </ng-template>\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n <ap-dropdown-item-single-one-line\n [text]=\"item.countryName + ' - ' + item.phoneNumberCode\"\n [avatarUrl]=\"flagsBucketUrl + '/' + item.countryCode.toUpperCase() + '.png'\"\n [selected]=\"item$.selected\"\n [roundedAvatar]=\"false\"\n />\n </ng-template>\n <ng-template\n let-searchTerm=\"searchTerm\"\n ng-header-tmp>\n <ap-dropdown-search-form\n [searchPlaceholder]=\"searchPlaceholder\"\n [select]=\"select\"\n />\n </ng-template>\n </ng-select>\n <ap-input-group class=\"phone-number-input-group\">\n <ap-input-prefix>{{formGroup.controls.phoneNumberCode.value}}</ap-input-prefix>\n <input\n apInput\n class=\"phone-field\"\n data-test=\"subscription-billing-infos-phoneNumberInput\"\n type=\"text\"\n data-recurly=\"phone\"\n formControlName=\"phoneNumber\"\n [placeholder]=\"placeholder\"\n [attr.name]=\"name\"\n (beforeinput)=\"filterChars($event)\"\n (blur)=\"onTouched()\"\n />\n </ap-input-group>\n</ng-container>\n", styles: ["ng-dropdown-panel.ap-phone-number-code-select{width:auto!important}ng-dropdown-panel.ap-phone-number-code-select ap-dropdown-item-single-one-line ap-avatar{border:0;max-height:16px;min-height:16px;height:initial;box-shadow:0;overflow:hidden;background:none}ap-phone-number-input{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--ref-spacing-xxs)}ap-phone-number-input .ap-phone-number-code-select{flex:0 0 70px;width:70px}ap-phone-number-input .ap-phone-number-code-select .flag{display:flex;flex-direction:row;align-items:center;justify-content:center;overflow:hidden}ap-phone-number-input .ap-phone-number-code-select .flag img{max-height:16px;max-width:24px;object-fit:cover;border-radius:4px;object-position:center center}ap-phone-number-input .ap-phone-number-code-select .ng-input{padding:2px var(--ref-spacing-sm)}ap-phone-number-input .ap-phone-number-code-select .ng-input input{display:none}ap-phone-number-input .phone-number-input-group{flex:1 0 auto}\n"] }]
122
149
  }], propDecorators: { errorsDisplayForced: [{
123
150
  type: Input
124
151
  }], flagsBucketUrl: [{
@@ -127,12 +154,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
127
154
  }], phoneNumberInfos: [{
128
155
  type: Input,
129
156
  args: [{ required: true }]
157
+ }], initialCountryCode: [{
158
+ type: Input
130
159
  }], name: [{
131
160
  type: Input,
132
161
  args: [{ required: true }]
133
162
  }], placeholder: [{
134
163
  type: Input,
135
164
  args: [{ required: true }]
165
+ }], searchPlaceholder: [{
166
+ type: Input,
167
+ args: [{ required: true }]
136
168
  }], phoneNumber: [{
137
169
  type: Input
138
170
  }], phoneNumberCode: [{