@elderbyte/ngx-starter 13.7.0 → 13.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { AfterViewInit } from '@angular/core';
2
- import { ElderSelectComponent } from './elder-select/elder-select.component';
2
+ import { ElderSelectComponent } from '../elder-select/elder-select.component';
3
3
  import * as i0 from "@angular/core";
4
- export declare class AutoSelectFirstDirective<TEntity = any, TId = any> implements AfterViewInit {
4
+ export declare class ElderAutoSelectFirstDirective<TEntity = any, TId = any> implements AfterViewInit {
5
5
  readonly elderSelect: ElderSelectComponent<TEntity, TId, any>;
6
6
  /***************************************************************************
7
7
  * *
@@ -34,21 +34,12 @@ export declare class AutoSelectFirstDirective<TEntity = any, TId = any> implemen
34
34
  set autoSelectFirstEnabled(val: boolean | string);
35
35
  set enabled(val: boolean);
36
36
  get enabled(): boolean;
37
- /***************************************************************************
38
- * *
39
- * Public methods *
40
- * *
41
- **************************************************************************/
42
- trySelectFirst(): void;
43
37
  /***************************************************************************
44
38
  * *
45
39
  * Private methods *
46
40
  * *
47
41
  **************************************************************************/
48
42
  private handleAutoSelectFirst;
49
- private firstItemInDataContextSoon;
50
- private firstSuggestionItem;
51
- private updateState;
52
- static ɵfac: i0.ɵɵFactoryDeclaration<AutoSelectFirstDirective<any, any>, never>;
53
- static ɵdir: i0.ɵɵDirectiveDeclaration<AutoSelectFirstDirective<any, any>, "[autoSelectFirst]", never, { "autoSelectFirstEnabled": "autoSelectFirst"; }, {}, never>;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElderAutoSelectFirstDirective<any, any>, never>;
44
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ElderAutoSelectFirstDirective<any, any>, "[autoSelectFirst]", never, { "autoSelectFirstEnabled": "autoSelectFirst"; }, {}, never>;
54
45
  }
@@ -0,0 +1,22 @@
1
+ import { ElderSelectComponent } from '../elder-select/elder-select.component';
2
+ export declare class ElderSelectFirstUtil {
3
+ /***************************************************************************
4
+ * *
5
+ * Fields *
6
+ * *
7
+ **************************************************************************/
8
+ private static readonly log;
9
+ /***************************************************************************
10
+ * *
11
+ * Public methods *
12
+ * *
13
+ **************************************************************************/
14
+ static trySelectFirst<TEntity, TId>(elderSelect: ElderSelectComponent<TEntity, TId, any>): void;
15
+ /***************************************************************************
16
+ * *
17
+ * Private methods *
18
+ * *
19
+ **************************************************************************/
20
+ private static firstItemInDataContextSoon;
21
+ private static firstSuggestionItem;
22
+ }
@@ -36,6 +36,16 @@ export declare class ElderSelectComponent<TEntity = any, TId = any, TValue = TEn
36
36
  nullDisplay: string;
37
37
  readonly entityIdChange: Observable<TId>;
38
38
  readonly entityChange: Observable<TEntity>;
39
+ /**
40
+ * Similar to entity-id change, but emits only when the user
41
+ * has updated the value.
42
+ */
43
+ readonly entityIdUpdated: Observable<TId>;
44
+ /**
45
+ * Similar to entity change, but emits only when the user
46
+ * has updated the value.
47
+ */
48
+ readonly entityUpdated: Observable<TEntity>;
39
49
  private readonly entity$;
40
50
  private _autocomplete;
41
51
  readonly entityWrapped$: Observable<EntityContext<TEntity>>;
@@ -131,6 +141,6 @@ export declare class ElderSelectComponent<TEntity = any, TId = any, TValue = TEn
131
141
  writeValue(value: TValue): void;
132
142
  private isNullOrEmpty;
133
143
  static ɵfac: i0.ɵɵFactoryDeclaration<ElderSelectComponent<any, any, any>, never>;
134
- static ɵcmp: i0.ɵɵComponentDeclaration<ElderSelectComponent<any, any, any>, "elder-select", never, { "nullDisplay": "nullDisplay"; "autocomplete": "autocomplete"; "allowNull": "allowNull"; "entity": "entity"; "entityId": "entityId"; "hintProperty": "hintProperty"; "hintPropertyResolver": "hintPropertyResolver"; }, { "entityIdChange": "entityIdChange"; "entityChange": "entityChange"; }, never, never>;
144
+ static ɵcmp: i0.ɵɵComponentDeclaration<ElderSelectComponent<any, any, any>, "elder-select", never, { "nullDisplay": "nullDisplay"; "autocomplete": "autocomplete"; "allowNull": "allowNull"; "entity": "entity"; "entityId": "entityId"; "hintProperty": "hintProperty"; "hintPropertyResolver": "hintPropertyResolver"; }, { "entityIdChange": "entityIdChange"; "entityChange": "entityChange"; "entityIdUpdated": "entityIdUpdated"; "entityUpdated": "entityUpdated"; }, never, never>;
135
145
  }
136
146
  export {};
@@ -2,7 +2,7 @@ import { AfterViewInit, OnDestroy } from '@angular/core';
2
2
  import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
3
3
  import { ElderSelectBase } from './elder-select-base';
4
4
  import * as i0 from "@angular/core";
5
- export declare class SelectOnTabDirective<TEntity = any, TId = any> implements AfterViewInit, OnDestroy {
5
+ export declare class ElderSelectOnTabDirective<TEntity = any, TId = any> implements AfterViewInit, OnDestroy {
6
6
  private readonly autoTrigger;
7
7
  /***************************************************************************
8
8
  * *
@@ -41,6 +41,6 @@ export declare class SelectOnTabDirective<TEntity = any, TId = any> implements A
41
41
  **************************************************************************/
42
42
  ngAfterViewInit(): void;
43
43
  ngOnDestroy(): void;
44
- static ɵfac: i0.ɵɵFactoryDeclaration<SelectOnTabDirective<any, any>, [null, { skipSelf: true; }]>;
45
- static ɵdir: i0.ɵɵDirectiveDeclaration<SelectOnTabDirective<any, any>, "[elderSelectOnTab]", never, {}, {}, never>;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElderSelectOnTabDirective<any, any>, [null, { skipSelf: true; }]>;
45
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ElderSelectOnTabDirective<any, any>, "[elderSelectOnTab]", never, {}, {}, never>;
46
46
  }
@@ -3,10 +3,10 @@ import * as i1 from "./elder-select/elder-select.component";
3
3
  import * as i2 from "./elder-select-value.directive";
4
4
  import * as i3 from "./popup/templated-selection-dialog/templated-selection-dialog.component";
5
5
  import * as i4 from "./popup/selection-model-popup.directive";
6
- import * as i5 from "./select-on-tab.directive";
6
+ import * as i5 from "./elder-select-on-tab.directive";
7
7
  import * as i6 from "./multi/elder-multi-select-chips/elder-multi-select-chips.component";
8
8
  import * as i7 from "./elder-select-chip.directive";
9
- import * as i8 from "./auto-select-first.directive";
9
+ import * as i8 from "./auto/elder-auto-select-first.directive";
10
10
  import * as i9 from "@angular/common";
11
11
  import * as i10 from "@angular/forms";
12
12
  import * as i11 from "@angular/material/form-field";
@@ -28,15 +28,15 @@ import * as i26 from "../input/autocomplete/elder-autocomplete.module";
28
28
  import * as i27 from "@angular/material/chips";
29
29
  export { ElderSelectValueDirective } from './elder-select-value.directive';
30
30
  export { ElderSelectChipDirective } from './elder-select-chip.directive';
31
- export { SelectOnTabDirective } from './select-on-tab.directive';
31
+ export { ElderSelectOnTabDirective } from './elder-select-on-tab.directive';
32
32
  export { ElderSelectComponent } from './elder-select/elder-select.component';
33
33
  export { TemplatedSelectionDialogComponent, ISelectionModelDialogOptions } from './popup/templated-selection-dialog/templated-selection-dialog.component';
34
34
  export { SelectionModelPopupDirective, ElderDataViewSelectionMode } from './popup/selection-model-popup.directive';
35
35
  export { ElderMultiSelectBase } from './multi/elder-multi-select-base';
36
36
  export { ElderMultiSelectChipsComponent } from './multi/elder-multi-select-chips/elder-multi-select-chips.component';
37
- export { AutoSelectFirstDirective } from './auto-select-first.directive';
37
+ export { ElderAutoSelectFirstDirective } from './auto/elder-auto-select-first.directive';
38
38
  export declare class ElderSelectModule {
39
39
  static ɵfac: i0.ɵɵFactoryDeclaration<ElderSelectModule, never>;
40
- static ɵmod: i0.ɵɵNgModuleDeclaration<ElderSelectModule, [typeof i1.ElderSelectComponent, typeof i2.ElderSelectValueDirective, typeof i3.TemplatedSelectionDialogComponent, typeof i4.SelectionModelPopupDirective, typeof i5.SelectOnTabDirective, typeof i6.ElderMultiSelectChipsComponent, typeof i7.ElderSelectChipDirective, typeof i8.AutoSelectFirstDirective], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i10.ReactiveFormsModule, typeof i11.MatFormFieldModule, typeof i12.MatIconModule, typeof i13.MatSelectModule, typeof i14.MatDialogModule, typeof i15.MatButtonModule, typeof i16.MatInputModule, typeof i17.MatAutocompleteModule, typeof i18.MatToolbarModule, typeof i19.MatProgressBarModule, typeof i20.MatProgressSpinnerModule, typeof i21.FlexModule, typeof i22.TranslateModule, typeof i23.ElderFormsDirectivesModule, typeof i24.ElderTableModule, typeof i25.ElderInfiniteScrollModule, typeof i26.ElderAutocompleteModule, typeof i27.MatChipsModule], [typeof i1.ElderSelectComponent, typeof i2.ElderSelectValueDirective, typeof i3.TemplatedSelectionDialogComponent, typeof i4.SelectionModelPopupDirective, typeof i6.ElderMultiSelectChipsComponent, typeof i7.ElderSelectChipDirective, typeof i8.AutoSelectFirstDirective]>;
40
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ElderSelectModule, [typeof i1.ElderSelectComponent, typeof i2.ElderSelectValueDirective, typeof i3.TemplatedSelectionDialogComponent, typeof i4.SelectionModelPopupDirective, typeof i5.ElderSelectOnTabDirective, typeof i6.ElderMultiSelectChipsComponent, typeof i7.ElderSelectChipDirective, typeof i8.ElderAutoSelectFirstDirective], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i10.ReactiveFormsModule, typeof i11.MatFormFieldModule, typeof i12.MatIconModule, typeof i13.MatSelectModule, typeof i14.MatDialogModule, typeof i15.MatButtonModule, typeof i16.MatInputModule, typeof i17.MatAutocompleteModule, typeof i18.MatToolbarModule, typeof i19.MatProgressBarModule, typeof i20.MatProgressSpinnerModule, typeof i21.FlexModule, typeof i22.TranslateModule, typeof i23.ElderFormsDirectivesModule, typeof i24.ElderTableModule, typeof i25.ElderInfiniteScrollModule, typeof i26.ElderAutocompleteModule, typeof i27.MatChipsModule], [typeof i1.ElderSelectComponent, typeof i2.ElderSelectValueDirective, typeof i3.TemplatedSelectionDialogComponent, typeof i4.SelectionModelPopupDirective, typeof i6.ElderMultiSelectChipsComponent, typeof i7.ElderSelectChipDirective, typeof i8.ElderAutoSelectFirstDirective]>;
41
41
  static ɵinj: i0.ɵɵInjectorDeclaration<ElderSelectModule>;
42
42
  }
@@ -21,6 +21,16 @@ export declare abstract class ElderMultiSelectBase<TId, TEntity, TValue> extends
21
21
  private readonly logger;
22
22
  protected readonly entities$: BehaviorSubject<TEntity[]>;
23
23
  readonly entityIdsChange: Observable<TId[]>;
24
+ /**
25
+ * Similar to entity-id change, but emits only when the user
26
+ * has updated the value.
27
+ */
28
+ readonly entityIdsUpdated: Observable<TId[]>;
29
+ /**
30
+ * Similar to entity change, but emits only when the user
31
+ * has updated the value.
32
+ */
33
+ readonly entitiesUpdated: Observable<TEntity[]>;
24
34
  /***************************************************************************
25
35
  * *
26
36
  * Constructor *
@@ -69,5 +79,5 @@ export declare abstract class ElderMultiSelectBase<TId, TEntity, TValue> extends
69
79
  private loadEntityByIds;
70
80
  private findInDataContext;
71
81
  static ɵfac: i0.ɵɵFactoryDeclaration<ElderMultiSelectBase<any, any, any>, never>;
72
- static ɵdir: i0.ɵɵDirectiveDeclaration<ElderMultiSelectBase<any, any, any>, never, never, { "entities": "entities"; "entityIds": "entityIds"; }, { "entityIdsChange": "entityIdsChange"; }, never>;
82
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ElderMultiSelectBase<any, any, any>, never, never, { "entities": "entities"; "entityIds": "entityIds"; }, { "entityIdsChange": "entityIdsChange"; "entityIdsUpdated": "entityIdsUpdated"; "entitiesUpdated": "entitiesUpdated"; }, never>;
73
83
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elderbyte/ngx-starter",
3
- "version": "13.7.0",
3
+ "version": "13.7.3",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0",
@@ -1,126 +0,0 @@
1
- import { Directive, Input } from '@angular/core';
2
- import { LoggerFactory } from '@elderbyte/ts-logger';
3
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
4
- import { EMPTY, of } from 'rxjs';
5
- import { catchError, filter, first, map, switchMap, takeUntil, tap, timeout } from 'rxjs/operators';
6
- import { ElderSelectComponentState } from './elder-select-base';
7
- import { DataSourceAdapter } from '../../common/data/datasource/data-source-adapter';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./elder-select/elder-select.component";
10
- export class AutoSelectFirstDirective {
11
- /***************************************************************************
12
- * *
13
- * Constructor *
14
- * *
15
- **************************************************************************/
16
- constructor(elderSelect) {
17
- this.elderSelect = elderSelect;
18
- /***************************************************************************
19
- * *
20
- * Fields *
21
- * *
22
- **************************************************************************/
23
- this.log = LoggerFactory.getLogger(this.constructor.name);
24
- }
25
- /***************************************************************************
26
- * *
27
- * Life Cycle *
28
- * *
29
- **************************************************************************/
30
- ngAfterViewInit() {
31
- setTimeout(() => {
32
- this.log.info('autoSelectFirst after-view init, auto selecting value');
33
- this.handleAutoSelectFirst();
34
- }, 10);
35
- }
36
- /***************************************************************************
37
- * *
38
- * Properties *
39
- * *
40
- **************************************************************************/
41
- /**
42
- * After data is loaded into this select, ensure that
43
- * a value is selected or select the first automatically.
44
- */
45
- set autoSelectFirstEnabled(val) {
46
- this.enabled = coerceBooleanProperty(val);
47
- }
48
- set enabled(val) {
49
- this._enabled = val;
50
- }
51
- get enabled() {
52
- return this._enabled;
53
- }
54
- /***************************************************************************
55
- * *
56
- * Public methods *
57
- * *
58
- **************************************************************************/
59
- trySelectFirst() {
60
- const suggestionsDc = this.elderSelect.suggestionsDc;
61
- const dataContextFirstItem = suggestionsDc?.isStarted
62
- ? this.firstItemInDataContextSoon(suggestionsDc)
63
- : of(null);
64
- dataContextFirstItem.pipe(takeUntil(this.elderSelect.valueChange.pipe(filter(value => !!value))), switchMap(firstItem => firstItem ? of(firstItem) : this.firstSuggestionItem())).subscribe(firstItem => {
65
- if (firstItem && !this.elderSelect.entityId) {
66
- this.elderSelect.updateValueByEntity(firstItem);
67
- }
68
- }, err => {
69
- this.elderSelect.updateState(ElderSelectComponentState.error(err));
70
- this.log.error('Failed to load first entity for auto-select-first flow!', err);
71
- });
72
- }
73
- /***************************************************************************
74
- * *
75
- * Private methods *
76
- * *
77
- **************************************************************************/
78
- handleAutoSelectFirst() {
79
- if (!this.elderSelect.value) {
80
- this.log.debug('Attempting to auto select first entity...');
81
- this.trySelectFirst();
82
- }
83
- else {
84
- this.log.warn('Conflict avoided: Aborted auto selection because value id already present!');
85
- }
86
- }
87
- firstItemInDataContextSoon(dataContext) {
88
- return dataContext.data.pipe(filter(data => data && data.length > 0), map(data => data[0]), timeout(250), catchError(timeoutError => {
89
- this.log.warn('Gave up waiting for DataContext items, timeout reached. Falling back to sugestion lookup.', timeoutError);
90
- return of(null);
91
- }), first());
92
- }
93
- firstSuggestionItem() {
94
- const suggestionsDc = this.elderSelect.suggestionsDc;
95
- const dataSource = suggestionsDc?.dataSource;
96
- if (dataSource) {
97
- this.updateState(ElderSelectComponentState.loading());
98
- return DataSourceAdapter.from(dataSource)
99
- .findFirst(this.elderSelect.filters, this.elderSelect.sorts).pipe(tap(() => this.updateState(ElderSelectComponentState.idle())), catchError(err => {
100
- this.log.error('Failed to load suggestions!', err);
101
- this.elderSelect.updateState(ElderSelectComponentState.error(err));
102
- return of(null);
103
- }));
104
- }
105
- else {
106
- this.log.warn('Failed to load first suggestion!');
107
- this.updateState(ElderSelectComponentState.idle());
108
- return EMPTY;
109
- }
110
- }
111
- updateState(state) {
112
- this.elderSelect.updateState(state);
113
- }
114
- }
115
- AutoSelectFirstDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: AutoSelectFirstDirective, deps: [{ token: i1.ElderSelectComponent }], target: i0.ɵɵFactoryTarget.Directive });
116
- AutoSelectFirstDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.1", type: AutoSelectFirstDirective, selector: "[autoSelectFirst]", inputs: { autoSelectFirstEnabled: ["autoSelectFirst", "autoSelectFirstEnabled"] }, ngImport: i0 });
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: AutoSelectFirstDirective, decorators: [{
118
- type: Directive,
119
- args: [{
120
- selector: '[autoSelectFirst]'
121
- }]
122
- }], ctorParameters: function () { return [{ type: i1.ElderSelectComponent }]; }, propDecorators: { autoSelectFirstEnabled: [{
123
- type: Input,
124
- args: ['autoSelectFirst']
125
- }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1zZWxlY3QtZmlyc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3QvYXV0by1zZWxlY3QtZmlyc3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEtBQUssRUFBYyxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQzs7O0FBTW5GLE1BQU0sT0FBTyx3QkFBd0I7SUFZbkM7Ozs7Z0ZBSTRFO0lBRTVFLFlBQ2tCLFdBQW9EO1FBQXBELGdCQUFXLEdBQVgsV0FBVyxDQUF5QztRQWpCdEU7Ozs7b0ZBSTRFO1FBRTNELFFBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFZbEUsQ0FBQztJQUVMOzs7O2dGQUk0RTtJQUVyRSxlQUFlO1FBQ3BCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lB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QUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzJHQStDWSxzQkFBc0I7c0JBRGhDLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge0VNUFRZLCBPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGZpbHRlciwgZmlyc3QsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCwgdGltZW91dH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFbGRlclNlbGVjdENvbXBvbmVudFN0YXRlfSBmcm9tICcuL2VsZGVyLXNlbGVjdC1iYXNlJztcbmltcG9ydCB7SURhdGFDb250ZXh0fSBmcm9tICcuLi8uLi9jb21tb24vZGF0YS9kYXRhLWNvbnRleHQvZGF0YS1jb250ZXh0JztcbmltcG9ydCB7RGF0YVNvdXJjZUFkYXB0ZXJ9IGZyb20gJy4uLy4uL2NvbW1vbi9kYXRhL2RhdGFzb3VyY2UvZGF0YS1zb3VyY2UtYWRhcHRlcic7XG5pbXBvcnQge0VsZGVyU2VsZWN0Q29tcG9uZW50fSBmcm9tICcuL2VsZGVyLXNlbGVjdC9lbGRlci1zZWxlY3QuY29tcG9uZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2F1dG9TZWxlY3RGaXJzdF0nXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9TZWxlY3RGaXJzdERpcmVjdGl2ZTxURW50aXR5ID0gYW55LCBUSWQgPSBhbnk+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVsZGVyU2VsZWN0OiBFbGRlclNlbGVjdENvbXBvbmVudDxURW50aXR5LCBUSWQsIGFueT5cbiAgKSB7IH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogTGlmZSBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyAvLyBIQUNLOiBXYWl0IHVudGlsIG5nTW9kZWwgaGFzIGRvbmUgaXRzIHN0cmFuZ2UgbnVsbC9lbXB0eSB2YWx1ZSBpbml0Li4uXG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdXRvU2VsZWN0Rmlyc3QgYWZ0ZXItdmlldyBpbml0LCBhdXRvIHNlbGVjdGluZyB2YWx1ZScpO1xuICAgICAgdGhpcy5oYW5kbGVBdXRvU2VsZWN0Rmlyc3QoKTtcbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQWZ0ZXIgZGF0YSBpcyBsb2FkZWQgaW50byB0aGlzIHNlbGVjdCwgZW5zdXJlIHRoYXRcbiAgICogYSB2YWx1ZSBpcyBzZWxlY3RlZCBvciBzZWxlY3QgdGhlIGZpcnN0IGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBASW5wdXQoJ2F1dG9TZWxlY3RGaXJzdCcpXG4gIHB1YmxpYyBzZXQgYXV0b1NlbGVjdEZpcnN0RW5hYmxlZCh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZW5hYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHRyeVNlbGVjdEZpcnN0KCk6IHZvaWQge1xuXG4gICAgY29uc3Qgc3VnZ2VzdGlvbnNEYyA9IHRoaXMuZWxkZXJTZWxlY3Quc3VnZ2VzdGlvbnNEYztcblxuICAgIGNvbnN0IGRhdGFDb250ZXh0Rmlyc3RJdGVtOiBPYnNlcnZhYmxlPFRFbnRpdHk+ID0gc3VnZ2VzdGlvbnNEYz8uaXNTdGFydGVkXG4gICAgICA/IHRoaXMuZmlyc3RJdGVtSW5EYXRhQ29udGV4dFNvb24oc3VnZ2VzdGlvbnNEYylcbiAgICAgIDogb2YobnVsbCk7XG5cbiAgICBkYXRhQ29udGV4dEZpcnN0SXRlbS5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZWxkZXJTZWxlY3QudmFsdWVDaGFuZ2UucGlwZShmaWx0ZXIodmFsdWUgPT4gISF2YWx1ZSkpKSxcbiAgICAgIHN3aXRjaE1hcChmaXJzdEl0ZW0gPT4gZmlyc3RJdGVtID8gb2YoZmlyc3RJdGVtKSA6IHRoaXMuZmlyc3RTdWdnZXN0aW9uSXRlbSgpKVxuICAgICkuc3Vic2NyaWJlKFxuICAgICAgZmlyc3RJdGVtID0+IHtcbiAgICAgICAgaWYgKGZpcnN0SXRlbSAmJiAhdGhpcy5lbGRlclNlbGVjdC5lbnRpdHlJZCkge1xuICAgICAgICAgIHRoaXMuZWxkZXJTZWxlY3QudXBkYXRlVmFsdWVCeUVudGl0eShmaXJzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgdGhpcy5lbGRlclNlbGVjdC51cGRhdGVTdGF0ZShFbGRlclNlbGVjdENvbXBvbmVudFN0YXRlLmVycm9yKGVycikpO1xuICAgICAgICB0aGlzLmxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgZmlyc3QgZW50aXR5IGZvciBhdXRvLXNlbGVjdC1maXJzdCBmbG93IScsIGVycik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgaGFuZGxlQXV0b1NlbGVjdEZpcnN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbGRlclNlbGVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ0F0dGVtcHRpbmcgdG8gYXV0byBzZWxlY3QgZmlyc3QgZW50aXR5Li4uJyk7XG4gICAgICB0aGlzLnRyeVNlbGVjdEZpcnN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oJ0NvbmZsaWN0IGF2b2lkZWQ6IEFib3J0ZWQgYXV0byBzZWxlY3Rpb24gYmVjYXVzZSB2YWx1ZSBpZCBhbHJlYWR5IHByZXNlbnQhJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaXJzdEl0ZW1JbkRhdGFDb250ZXh0U29vbihkYXRhQ29udGV4dDogSURhdGFDb250ZXh0PFRFbnRpdHk+KTogT2JzZXJ2YWJsZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIHJldHVybiBkYXRhQ29udGV4dC5kYXRhLnBpcGUoXG4gICAgICBmaWx0ZXIoZGF0YSA9PiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCksXG4gICAgICBtYXAoZGF0YSA9PiBkYXRhWzBdKSxcbiAgICAgIHRpbWVvdXQoMjUwKSxcbiAgICAgIGNhdGNoRXJyb3IodGltZW91dEVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2cud2FybignR2F2ZSB1cCB3YWl0aW5nIGZvciBEYXRhQ29udGV4dCBpdGVtcywgdGltZW91dCByZWFjaGVkLiBGYWxsaW5nIGJhY2sgdG8gc3VnZXN0aW9uIGxvb2t1cC4nLCB0aW1lb3V0RXJyb3IpO1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KSxcbiAgICAgIGZpcnN0KClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXJzdFN1Z2dlc3Rpb25JdGVtKCk6IE9ic2VydmFibGU8VEVudGl0eSB8IG51bGw+IHtcblxuICAgIGNvbnN0IHN1Z2dlc3Rpb25zRGMgPSB0aGlzLmVsZGVyU2VsZWN0LnN1Z2dlc3Rpb25zRGM7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IHN1Z2dlc3Rpb25zRGM/LmRhdGFTb3VyY2U7XG5cbiAgICBpZiAoZGF0YVNvdXJjZSkge1xuXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlKEVsZGVyU2VsZWN0Q29tcG9uZW50U3RhdGUubG9hZGluZygpKTtcblxuICAgICAgcmV0dXJuIERhdGFTb3VyY2VBZGFwdGVyLmZyb20oZGF0YVNvdXJjZSlcbiAgICAgICAgLmZpbmRGaXJzdCh0aGlzLmVsZGVyU2VsZWN0LmZpbHRlcnMsIHRoaXMuZWxkZXJTZWxlY3Quc29ydHMpLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMudXBkYXRlU3RhdGUoRWxkZXJTZWxlY3RDb21wb25lbnRTdGF0ZS5pZGxlKCkpKSxcbiAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3VnZ2VzdGlvbnMhJywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuZWxkZXJTZWxlY3QudXBkYXRlU3RhdGUoRWxkZXJTZWxlY3RDb21wb25lbnRTdGF0ZS5lcnJvcihlcnIpKTtcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybignRmFpbGVkIHRvIGxvYWQgZmlyc3Qgc3VnZ2VzdGlvbiEnKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoRWxkZXJTZWxlY3RDb21wb25lbnRTdGF0ZS5pZGxlKCkpO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdGUoc3RhdGU6IEVsZGVyU2VsZWN0Q29tcG9uZW50U3RhdGUpIHtcbiAgICB0aGlzLmVsZGVyU2VsZWN0LnVwZGF0ZVN0YXRlKHN0YXRlKTtcbiAgfVxufVxuIl19
@@ -1,104 +0,0 @@
1
- import { Directive, HostListener, Inject, SkipSelf } from '@angular/core';
2
- import { Subject } from 'rxjs/internal/Subject';
3
- import { delay, map, takeUntil } from 'rxjs/operators';
4
- import { merge } from 'rxjs';
5
- import { LoggerFactory } from '@elderbyte/ts-logger';
6
- import { ELDER_SELECT_BASE } from './elder-select-base';
7
- import { isElderEntityValueAccessor } from './elder-entity-value-accessor';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/material/autocomplete";
10
- import * as i2 from "./elder-select-base";
11
- export class SelectOnTabDirective {
12
- /***************************************************************************
13
- * *
14
- * Constructor *
15
- * *
16
- **************************************************************************/
17
- constructor(autoTrigger, elderSelectBase) {
18
- this.autoTrigger = autoTrigger;
19
- /***************************************************************************
20
- * *
21
- * Fields *
22
- * *
23
- **************************************************************************/
24
- this.logger = LoggerFactory.getLogger(this.constructor.name);
25
- this.destroy$ = new Subject();
26
- /**
27
- * Whether the autocomplete panel was open before the event
28
- */
29
- this.panelOpen = false;
30
- /**
31
- * Whether the user selected an option.
32
- * (We want to ignore selections if there is already a selection present and the user tabs away)
33
- */
34
- this.userInput = false;
35
- this.controlValueAccessor = elderSelectBase;
36
- }
37
- /***************************************************************************
38
- * *
39
- * Event Listener *
40
- * *
41
- **************************************************************************/
42
- onBlur() {
43
- if (!this.panelOpen) {
44
- return;
45
- }
46
- if (this.controlValueAccessor.value) {
47
- // If there is already a value present, only allow tab based value setting if the user actually modified the value
48
- if (!this.userInput) {
49
- this.logger.warn('Discarding TAB since the user did probably not intend to change the value! userInput:', this.userInput);
50
- return;
51
- }
52
- }
53
- const activeOption = this.autoTrigger.activeOption;
54
- if (activeOption) {
55
- const entity = activeOption.value;
56
- this.updateValueByEntity(entity);
57
- this.autoTrigger.writeValue(entity);
58
- this.logger.warn('Wrote option.value to control: ', entity);
59
- }
60
- }
61
- updateValueByEntity(entity) {
62
- if (isElderEntityValueAccessor(this.controlValueAccessor)) {
63
- // Since elder-select may use the entity id as value (valueAsId),
64
- // we can not directly write to the value safely.
65
- this.controlValueAccessor.updateValueByEntity(entity);
66
- }
67
- else {
68
- // By default, write the selected option to the control value
69
- this.controlValueAccessor.updateValue(entity);
70
- }
71
- }
72
- /***************************************************************************
73
- * *
74
- * Life Cycle *
75
- * *
76
- **************************************************************************/
77
- ngAfterViewInit() {
78
- const autocomplete = this.autoTrigger.autocomplete;
79
- merge(autocomplete.opened.pipe(map(() => true)), autocomplete.closed.pipe(map(() => false))).pipe(takeUntil(this.destroy$), delay(0)).subscribe(value => this.panelOpen = value);
80
- this.autoTrigger.optionSelections.pipe(// TODO https://github.com/angular/components/pull/14813
81
- takeUntil(this.destroy$), map(opt => opt.isUserInput)).subscribe(isUserInput => this.userInput = isUserInput);
82
- }
83
- ngOnDestroy() {
84
- this.destroy$.next();
85
- this.destroy$.complete();
86
- }
87
- }
88
- SelectOnTabDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SelectOnTabDirective, deps: [{ token: i1.MatAutocompleteTrigger }, { token: ELDER_SELECT_BASE, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive });
89
- SelectOnTabDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.1", type: SelectOnTabDirective, selector: "[elderSelectOnTab]", host: { listeners: { "keydown.tab": "onBlur()" } }, ngImport: i0 });
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SelectOnTabDirective, decorators: [{
91
- type: Directive,
92
- args: [{
93
- selector: '[elderSelectOnTab]'
94
- }]
95
- }], ctorParameters: function () { return [{ type: i1.MatAutocompleteTrigger }, { type: i2.ElderSelectBase, decorators: [{
96
- type: SkipSelf
97
- }, {
98
- type: Inject,
99
- args: [ELDER_SELECT_BASE]
100
- }] }]; }, propDecorators: { onBlur: [{
101
- type: HostListener,
102
- args: ['keydown.tab']
103
- }] } });
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LW9uLXRhYi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3NlbGVjdC9zZWxlY3Qtb24tdGFiLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBUSxZQUFZLEVBQUUsTUFBTSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV4RyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDOUMsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFDLGlCQUFpQixFQUFrQixNQUFNLHFCQUFxQixDQUFDO0FBRXZFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7O0FBS3pFLE1BQU0sT0FBTyxvQkFBb0I7SUF5Qi9COzs7O2dGQUk0RTtJQUU1RSxZQUNtQixXQUFtQyxFQUNiLGVBQStDO1FBRHJFLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQTlCdEQ7Ozs7b0ZBSTRFO1FBRTNELFdBQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7UUFJakQ7O1dBRUc7UUFDSyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTFCOzs7V0FHRztRQUNLLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFZeEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBR3JFLE1BQU07UUFFWCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUVoQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7WUFDbkMsa0hBQWtIO1lBQ2xILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1RkFBdUYsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFILE9BQU87YUFDUjtTQUNGO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFrQyxDQUFDO1FBRXpFLElBQUksWUFBWSxFQUFFO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQWU7UUFDekMsSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUN6RCxpRUFBaUU7WUFDakUsaURBQWlEO1lBQ2pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsNkRBQTZEO1lBQzdELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRXJFLGVBQWU7UUFDcEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDbkQsS0FBSyxDQUNILFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN6QyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDM0MsQ0FBQyxJQUFJLENBQ0osU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNULENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBRSx3REFBd0Q7UUFDOUYsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUM1QixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7O2lIQXZHVSxvQkFBb0Isd0RBaUNULGlCQUFpQjtxR0FqQzVCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQUhoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7aUJBQy9COzswQkFrQ0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUI7NENBWWhDLE1BQU07c0JBRFosWUFBWTt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEhvc3QsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBPbkRlc3Ryb3ksIFNraXBTZWxmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9pbnRlcm5hbC9TdWJqZWN0JztcbmltcG9ydCB7ZGVsYXksIG1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge21lcmdlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHtWYWx1ZUFjY2Vzc29yQmFzZX0gZnJvbSAnLi4vLi4vY29tbW9uL2Zvcm1zL3ZhbHVlLWFjY2Vzc29yLWJhc2UnO1xuaW1wb3J0IHtFTERFUl9TRUxFQ1RfQkFTRSwgRWxkZXJTZWxlY3RCYXNlfSBmcm9tICcuL2VsZGVyLXNlbGVjdC1iYXNlJztcbmltcG9ydCB7TWF0T3B0aW9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7aXNFbGRlckVudGl0eVZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZWxkZXItZW50aXR5LXZhbHVlLWFjY2Vzc29yJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2VsZGVyU2VsZWN0T25UYWJdJ1xufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RPblRhYkRpcmVjdGl2ZTxURW50aXR5ID0gYW55LCBUSWQgPSBhbnk+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PG5ldmVyPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbFZhbHVlQWNjZXNzb3I6IFZhbHVlQWNjZXNzb3JCYXNlPGFueT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGF1dG9jb21wbGV0ZSBwYW5lbCB3YXMgb3BlbiBiZWZvcmUgdGhlIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIHBhbmVsT3BlbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB1c2VyIHNlbGVjdGVkIGFuIG9wdGlvbi5cbiAgICogKFdlIHdhbnQgdG8gaWdub3JlIHNlbGVjdGlvbnMgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlbGVjdGlvbiBwcmVzZW50IGFuZCB0aGUgdXNlciB0YWJzIGF3YXkpXG4gICAqL1xuICBwcml2YXRlIHVzZXJJbnB1dCA9IGZhbHNlO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0b1RyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsXG4gICAgQFNraXBTZWxmKCkgQEluamVjdChFTERFUl9TRUxFQ1RfQkFTRSkgZWxkZXJTZWxlY3RCYXNlOiBFbGRlclNlbGVjdEJhc2U8YW55LCBhbnksIGFueT5cbiAgKSB7XG4gICAgdGhpcy5jb250cm9sVmFsdWVBY2Nlc3NvciA9IGVsZGVyU2VsZWN0QmFzZTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBFdmVudCBMaXN0ZW5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24udGFiJylcbiAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcblxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAodGhpcy5jb250cm9sVmFsdWVBY2Nlc3Nvci52YWx1ZSkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlIHByZXNlbnQsIG9ubHkgYWxsb3cgdGFiIGJhc2VkIHZhbHVlIHNldHRpbmcgaWYgdGhlIHVzZXIgYWN0dWFsbHkgbW9kaWZpZWQgdGhlIHZhbHVlXG4gICAgICBpZiAoIXRoaXMudXNlcklucHV0KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0Rpc2NhcmRpbmcgVEFCIHNpbmNlIHRoZSB1c2VyIGRpZCBwcm9iYWJseSBub3QgaW50ZW5kIHRvIGNoYW5nZSB0aGUgdmFsdWUhIHVzZXJJbnB1dDonLCB0aGlzLnVzZXJJbnB1dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLmF1dG9UcmlnZ2VyLmFjdGl2ZU9wdGlvbiBhcyBNYXRPcHRpb248VEVudGl0eT47XG5cbiAgICBpZiAoYWN0aXZlT3B0aW9uKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBhY3RpdmVPcHRpb24udmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlQnlFbnRpdHkoZW50aXR5KTtcbiAgICAgIHRoaXMuYXV0b1RyaWdnZXIud3JpdGVWYWx1ZShlbnRpdHkpO1xuICAgICAgdGhpcy5sb2dnZXIud2FybignV3JvdGUgb3B0aW9uLnZhbHVlIHRvIGNvbnRyb2w6ICcsIGVudGl0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZUJ5RW50aXR5KGVudGl0eTogVEVudGl0eSk6IHZvaWQge1xuICAgIGlmIChpc0VsZGVyRW50aXR5VmFsdWVBY2Nlc3Nvcih0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yKSkge1xuICAgICAgLy8gU2luY2UgZWxkZXItc2VsZWN0IG1heSB1c2UgdGhlIGVudGl0eSBpZCBhcyB2YWx1ZSAodmFsdWVBc0lkKSxcbiAgICAgIC8vIHdlIGNhbiBub3QgZGlyZWN0bHkgd3JpdGUgdG8gdGhlIHZhbHVlIHNhZmVseS5cbiAgICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3IudXBkYXRlVmFsdWVCeUVudGl0eShlbnRpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCeSBkZWZhdWx0LCB3cml0ZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBjb250cm9sIHZhbHVlXG4gICAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yLnVwZGF0ZVZhbHVlKGVudGl0eSk7XG4gICAgfVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBhdXRvY29tcGxldGUgPSB0aGlzLmF1dG9UcmlnZ2VyLmF1dG9jb21wbGV0ZTtcbiAgICBtZXJnZShcbiAgICAgIGF1dG9jb21wbGV0ZS5vcGVuZWQucGlwZShtYXAoKCkgPT4gdHJ1ZSkpLFxuICAgICAgYXV0b2NvbXBsZXRlLmNsb3NlZC5waXBlKG1hcCgoKSA9PiBmYWxzZSkpXG4gICAgKS5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgZGVsYXkoMClcbiAgICApLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnBhbmVsT3BlbiA9IHZhbHVlKTtcblxuICAgIHRoaXMuYXV0b1RyaWdnZXIub3B0aW9uU2VsZWN0aW9ucy5waXBlKCAvLyBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvcHVsbC8xNDgxM1xuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgbWFwKG9wdCA9PiBvcHQuaXNVc2VySW5wdXQpXG4gICAgKS5zdWJzY3JpYmUoaXNVc2VySW5wdXQgPT4gdGhpcy51c2VySW5wdXQgPSBpc1VzZXJJbnB1dCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbn1cbiJdfQ==