@elderbyte/ngx-starter 13.6.0 → 13.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/common/utils/collection-util.mjs +4 -1
- package/esm2020/lib/components/select/auto/elder-auto-select-first.directive.mjs +77 -0
- package/esm2020/lib/components/select/auto/elder-select-first-util.mjs +62 -0
- package/esm2020/lib/components/select/elder-select/elder-select.component.mjs +14 -9
- package/esm2020/lib/components/select/elder-select-on-tab.directive.mjs +104 -0
- package/esm2020/lib/components/select/elder-select.module.mjs +11 -11
- package/esm2020/lib/components/select/multi/elder-multi-select-base.mjs +103 -39
- package/esm2020/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +13 -13
- package/fesm2015/elderbyte-ngx-starter.mjs +226 -144
- package/fesm2015/elderbyte-ngx-starter.mjs.map +1 -1
- package/fesm2020/elderbyte-ngx-starter.mjs +226 -144
- package/fesm2020/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/utils/collection-util.d.ts +1 -0
- package/lib/components/select/{auto-select-first.directive.d.ts → auto/elder-auto-select-first.directive.d.ts} +4 -13
- package/lib/components/select/auto/elder-select-first-util.d.ts +22 -0
- package/lib/components/select/elder-select/elder-select.component.d.ts +11 -1
- package/lib/components/select/{select-on-tab.directive.d.ts → elder-select-on-tab.directive.d.ts} +3 -3
- package/lib/components/select/elder-select.module.d.ts +5 -5
- package/lib/components/select/multi/elder-multi-select-base.d.ts +39 -15
- package/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.d.ts +11 -11
- package/package.json +1 -1
- package/esm2020/lib/components/select/auto-select-first.directive.mjs +0 -126
- package/esm2020/lib/components/select/select-on-tab.directive.mjs +0 -104
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AfterViewInit } from '@angular/core';
|
|
2
|
-
import { ElderSelectComponent } from '
|
|
2
|
+
import { ElderSelectComponent } from '../elder-select/elder-select.component';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class
|
|
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
|
-
|
|
50
|
-
|
|
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 {};
|
package/lib/components/select/{select-on-tab.directive.d.ts → elder-select-on-tab.directive.d.ts}
RENAMED
|
@@ -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
|
|
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<
|
|
45
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<
|
|
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 {
|
|
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 {
|
|
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.
|
|
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
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NgZone } from '@angular/core';
|
|
2
2
|
import { ElderSelectBase } from '../elder-select-base';
|
|
3
3
|
import { IDataContext } from '../../../common/data/data-context/data-context';
|
|
4
|
-
import { Observable } from 'rxjs';
|
|
4
|
+
import { BehaviorSubject, Observable } from 'rxjs';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
/**
|
|
7
7
|
* Base component implementation of elder-multi-select.
|
|
@@ -12,15 +12,25 @@ import * as i0 from "@angular/core";
|
|
|
12
12
|
* - The backing Value is a list of the current selected entities. T[]
|
|
13
13
|
*
|
|
14
14
|
*/
|
|
15
|
-
export declare abstract class ElderMultiSelectBase<TId,
|
|
15
|
+
export declare abstract class ElderMultiSelectBase<TId, TEntity, TValue> extends ElderSelectBase<TId, TEntity, TValue[]> {
|
|
16
16
|
/***************************************************************************
|
|
17
17
|
* *
|
|
18
18
|
* Fields *
|
|
19
19
|
* *
|
|
20
20
|
**************************************************************************/
|
|
21
21
|
private readonly logger;
|
|
22
|
-
|
|
23
|
-
readonly
|
|
22
|
+
protected readonly entities$: BehaviorSubject<TEntity[]>;
|
|
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 *
|
|
@@ -32,28 +42,42 @@ export declare abstract class ElderMultiSelectBase<TId, T> extends ElderSelectBa
|
|
|
32
42
|
* Properties *
|
|
33
43
|
* *
|
|
34
44
|
**************************************************************************/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
set entities(entities: TEntity[]);
|
|
46
|
+
get entities(): TEntity[];
|
|
47
|
+
set entityIds(ids: TId[]);
|
|
48
|
+
get entityIds(): TId[];
|
|
49
|
+
/***************************************************************************
|
|
50
|
+
* *
|
|
51
|
+
* Public API *
|
|
52
|
+
* *
|
|
53
|
+
**************************************************************************/
|
|
54
|
+
updateValueByEntities(entities: TEntity[]): void;
|
|
41
55
|
/***************************************************************************
|
|
42
56
|
* *
|
|
43
57
|
* Internal Methods *
|
|
44
58
|
* *
|
|
45
59
|
**************************************************************************/
|
|
46
|
-
protected onSuggestionsDcChanged(data: IDataContext<
|
|
60
|
+
protected onSuggestionsDcChanged(data: IDataContext<TEntity>): void;
|
|
61
|
+
/**
|
|
62
|
+
* This method is invoked after a value has been written to this control.
|
|
63
|
+
*
|
|
64
|
+
*/
|
|
65
|
+
protected writeToControl(value: TValue[]): void;
|
|
47
66
|
/***************************************************************************
|
|
48
67
|
* *
|
|
49
68
|
* Private Methods *
|
|
50
69
|
* *
|
|
51
70
|
**************************************************************************/
|
|
52
|
-
private
|
|
71
|
+
private entityIdsFromValues;
|
|
72
|
+
private entityIdFromValue;
|
|
73
|
+
private entitiesToValues;
|
|
74
|
+
private entityToValue;
|
|
75
|
+
private getEntityIds;
|
|
53
76
|
private equalIds;
|
|
54
|
-
private
|
|
77
|
+
private equalEntities;
|
|
78
|
+
private selectEntitiesByIds;
|
|
55
79
|
private loadEntityByIds;
|
|
56
80
|
private findInDataContext;
|
|
57
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ElderMultiSelectBase<any, any>, never>;
|
|
58
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<ElderMultiSelectBase<any, any>, never, never, { "
|
|
81
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ElderMultiSelectBase<any, any, any>, never>;
|
|
82
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<ElderMultiSelectBase<any, any, any>, never, never, { "entities": "entities"; "entityIds": "entityIds"; }, { "entityIdsChange": "entityIdsChange"; "entityIdsUpdated": "entityIdsUpdated"; "entitiesUpdated": "entitiesUpdated"; }, never>;
|
|
59
83
|
}
|
package/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.d.ts
CHANGED
|
@@ -3,21 +3,21 @@ import { ElderMultiSelectBase } from '../elder-multi-select-base';
|
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import { ThemePalette } from '@angular/material/core/common-behaviors/color';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
declare class
|
|
6
|
+
declare class SelectChip<T> {
|
|
7
7
|
readonly value: T;
|
|
8
8
|
readonly displayText: string;
|
|
9
9
|
readonly color: ThemePalette;
|
|
10
10
|
readonly removeable: boolean;
|
|
11
11
|
constructor(value: T, displayText: string, color: ThemePalette, removeable: boolean);
|
|
12
12
|
}
|
|
13
|
-
export declare class ElderMultiSelectChipsComponent<TId,
|
|
13
|
+
export declare class ElderMultiSelectChipsComponent<TId = any, TEntity = any, TValue = any> extends ElderMultiSelectBase<TId, TEntity, TValue> implements OnInit {
|
|
14
14
|
/***************************************************************************
|
|
15
15
|
* *
|
|
16
16
|
* Fields *
|
|
17
17
|
* *
|
|
18
18
|
**************************************************************************/
|
|
19
19
|
private readonly log;
|
|
20
|
-
readonly
|
|
20
|
+
readonly selectChips$: Observable<SelectChip<TEntity>[]>;
|
|
21
21
|
private readonly chipColorResolver$;
|
|
22
22
|
selectable: boolean;
|
|
23
23
|
allowRemove: boolean;
|
|
@@ -47,18 +47,18 @@ export declare class ElderMultiSelectChipsComponent<TId, T> extends ElderMultiSe
|
|
|
47
47
|
* A function which returns the color of a given label object.
|
|
48
48
|
*/
|
|
49
49
|
set chipColorResolver(fn: (o1: any) => ThemePalette);
|
|
50
|
-
get isOptionDisabledInternalFn(): (option:
|
|
51
|
-
get isOptionHiddenInternalFn(): (option:
|
|
50
|
+
get isOptionDisabledInternalFn(): (option: TEntity) => boolean;
|
|
51
|
+
get isOptionHiddenInternalFn(): (option: TEntity) => boolean;
|
|
52
52
|
/***************************************************************************
|
|
53
53
|
* *
|
|
54
54
|
* Public API *
|
|
55
55
|
* *
|
|
56
56
|
**************************************************************************/
|
|
57
|
-
onOptionSelected(selectedValue:
|
|
58
|
-
addLabels(labels:
|
|
57
|
+
onOptionSelected(selectedValue: TEntity): void;
|
|
58
|
+
addLabels(labels: TEntity[]): void;
|
|
59
59
|
addLabel(label: any): void;
|
|
60
|
-
removeLabel(toRemove:
|
|
61
|
-
replaceWith(
|
|
60
|
+
removeLabel(toRemove: TEntity): void;
|
|
61
|
+
replaceWith(entities: TEntity[]): void;
|
|
62
62
|
/***************************************************************************
|
|
63
63
|
* *
|
|
64
64
|
* Private methods *
|
|
@@ -66,7 +66,7 @@ export declare class ElderMultiSelectChipsComponent<TId, T> extends ElderMultiSe
|
|
|
66
66
|
**************************************************************************/
|
|
67
67
|
private isAlreadyPresent;
|
|
68
68
|
private resetInput;
|
|
69
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ElderMultiSelectChipsComponent<any, any>, never>;
|
|
70
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ElderMultiSelectChipsComponent<any, any>, "elder-multi-select-chips", never, { "allowRemove": "allowRemove"; "chipTemplate": "chipTemplate"; "chipColorResolver": "chipColorResolver"; }, {}, ["chipTemplateQuery"], never>;
|
|
69
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ElderMultiSelectChipsComponent<any, any, any>, never>;
|
|
70
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ElderMultiSelectChipsComponent<any, any, any>, "elder-multi-select-chips", never, { "allowRemove": "allowRemove"; "chipTemplate": "chipTemplate"; "chipColorResolver": "chipColorResolver"; }, {}, ["chipTemplateQuery"], never>;
|
|
71
71
|
}
|
|
72
72
|
export {};
|
package/package.json
CHANGED
|
@@ -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==
|