@elderbyte/ngx-starter 13.7.1 → 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/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 +5 -6
- 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 +10 -4
- package/fesm2015/elderbyte-ngx-starter.mjs +111 -95
- package/fesm2015/elderbyte-ngx-starter.mjs.map +1 -1
- package/fesm2020/elderbyte-ngx-starter.mjs +111 -95
- package/fesm2020/elderbyte-ngx-starter.mjs.map +1 -1
- 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/{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 +11 -1
- 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
|
+
}
|
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
|
}
|
|
@@ -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,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==
|