@ecodev/natural 62.1.2 → 63.0.0
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/fesm2022/ecodev-natural-vanilla.mjs +1193 -0
- package/fesm2022/ecodev-natural-vanilla.mjs.map +1 -0
- package/fesm2022/ecodev-natural.mjs +436 -425
- package/fesm2022/ecodev-natural.mjs.map +1 -1
- package/lib/classes/network-activity.service.d.ts +54 -0
- package/lib/classes/validators.d.ts +1 -1
- package/lib/modules/columns-picker/columns-picker.component.d.ts +2 -2
- package/lib/modules/common/services/seo.provider.d.ts +2 -2
- package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +1 -1
- package/lib/modules/file/abstract-file.d.ts +6 -3
- package/lib/modules/file/component/file.component.d.ts +2 -2
- package/lib/modules/file/file-drop.directive.d.ts +2 -3
- package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +2 -3
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -3
- package/lib/modules/icon/icon.module.d.ts +2 -2
- package/lib/modules/panels/panels.service.d.ts +1 -2
- package/lib/modules/relations/relations.component.d.ts +3 -3
- package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +2 -3
- package/lib/modules/search/group/group.component.d.ts +2 -3
- package/lib/modules/search/input/input.component.d.ts +5 -5
- package/lib/modules/search/search/search.component.d.ts +2 -2
- package/lib/modules/select/abstract-select.component.d.ts +3 -3
- package/lib/modules/select/select/select.component.d.ts +1 -1
- package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +1 -1
- package/lib/modules/table-button/table-button.component.d.ts +4 -2
- package/package.json +16 -14
- package/public-api.d.ts +1 -0
- package/src/lib/_natural.theme.scss +1 -2
- package/vanilla/index.d.ts +5 -0
- package/vanilla/package.json +3 -0
- package/vanilla/public-api.d.ts +11 -0
- package/vanilla/src/lib/classes/crypto.d.ts +8 -0
- package/vanilla/src/lib/classes/data-source.d.ts +32 -0
- package/vanilla/src/lib/classes/query-variable-manager-utils.d.ts +2 -0
- package/vanilla/src/lib/classes/query-variable-manager.d.ts +91 -0
- package/vanilla/src/lib/classes/signing.d.ts +7 -0
- package/vanilla/src/lib/classes/utility.d.ts +77 -0
- package/vanilla/src/lib/modules/search/classes/graphql-doctrine.types.d.ts +83 -0
- package/vanilla/src/lib/modules/search/classes/utils.d.ts +17 -0
- package/vanilla/src/lib/modules/search/types/dropdown-component.d.ts +20 -0
- package/vanilla/src/lib/modules/search/types/facet.d.ts +75 -0
- package/vanilla/src/lib/modules/search/types/values.d.ts +32 -0
- package/vanilla/src/lib/services/abstract-model.service.d.ts +244 -0
- package/vanilla/src/lib/services/debounce.service.d.ts +52 -0
- package/vanilla/src/lib/types/types.d.ts +100 -0
- package/esm2022/ecodev-natural.mjs +0 -5
- package/esm2022/lib/classes/abstract-detail.mjs +0 -229
- package/esm2022/lib/classes/abstract-editable-list.mjs +0 -99
- package/esm2022/lib/classes/abstract-list.mjs +0 -461
- package/esm2022/lib/classes/abstract-navigable-list.mjs +0 -133
- package/esm2022/lib/classes/apollo-utils.mjs +0 -59
- package/esm2022/lib/classes/crypto.mjs +0 -23
- package/esm2022/lib/classes/cumulative-changes.mjs +0 -50
- package/esm2022/lib/classes/data-source.mjs +0 -71
- package/esm2022/lib/classes/providers.mjs +0 -13
- package/esm2022/lib/classes/query-variable-manager-utils.mjs +0 -14
- package/esm2022/lib/classes/query-variable-manager.mjs +0 -172
- package/esm2022/lib/classes/rxjs.mjs +0 -54
- package/esm2022/lib/classes/signing.mjs +0 -38
- package/esm2022/lib/classes/tld.mjs +0 -1476
- package/esm2022/lib/classes/utility.mjs +0 -234
- package/esm2022/lib/classes/validators.mjs +0 -179
- package/esm2022/lib/directives/http-prefix.directive.mjs +0 -47
- package/esm2022/lib/modules/alert/alert.service.mjs +0 -53
- package/esm2022/lib/modules/alert/confirm.component.mjs +0 -16
- package/esm2022/lib/modules/alert/public-api.mjs +0 -6
- package/esm2022/lib/modules/avatar/component/avatar.component.mjs +0 -203
- package/esm2022/lib/modules/avatar/public-api.mjs +0 -6
- package/esm2022/lib/modules/avatar/service/avatar.service.mjs +0 -63
- package/esm2022/lib/modules/avatar/sources/gravatar.mjs +0 -29
- package/esm2022/lib/modules/avatar/sources/image.mjs +0 -13
- package/esm2022/lib/modules/avatar/sources/initials.mjs +0 -39
- package/esm2022/lib/modules/avatar/sources/source.mjs +0 -16
- package/esm2022/lib/modules/columns-picker/columns-picker.component.mjs +0 -145
- package/esm2022/lib/modules/columns-picker/public-api.mjs +0 -5
- package/esm2022/lib/modules/columns-picker/types.mjs +0 -2
- package/esm2022/lib/modules/common/directives/background-density.directive.mjs +0 -63
- package/esm2022/lib/modules/common/directives/linkable-tab.directive.mjs +0 -93
- package/esm2022/lib/modules/common/directives/src-density.directive.mjs +0 -72
- package/esm2022/lib/modules/common/pipes/capitalize.pipe.mjs +0 -24
- package/esm2022/lib/modules/common/pipes/ellipsis.pipe.mjs +0 -17
- package/esm2022/lib/modules/common/pipes/enum.pipe.mjs +0 -24
- package/esm2022/lib/modules/common/pipes/time-ago.pipe.mjs +0 -140
- package/esm2022/lib/modules/common/public-api.mjs +0 -14
- package/esm2022/lib/modules/common/services/memory-storage.mjs +0 -110
- package/esm2022/lib/modules/common/services/seo.provider.mjs +0 -23
- package/esm2022/lib/modules/common/services/seo.service.mjs +0 -235
- package/esm2022/lib/modules/detail-header/detail-header.component.mjs +0 -84
- package/esm2022/lib/modules/detail-header/public-api.mjs +0 -5
- package/esm2022/lib/modules/dialog-trigger/dialog-trigger.component.mjs +0 -72
- package/esm2022/lib/modules/dialog-trigger/public-api.mjs +0 -5
- package/esm2022/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +0 -100
- package/esm2022/lib/modules/dropdown-components/public-api.mjs +0 -14
- package/esm2022/lib/modules/dropdown-components/type-boolean/type-boolean.component.mjs +0 -39
- package/esm2022/lib/modules/dropdown-components/type-date/type-date.component.mjs +0 -173
- package/esm2022/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +0 -134
- package/esm2022/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +0 -80
- package/esm2022/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +0 -48
- package/esm2022/lib/modules/dropdown-components/type-number/type-number.component.mjs +0 -110
- package/esm2022/lib/modules/dropdown-components/type-options/type-options.component.mjs +0 -64
- package/esm2022/lib/modules/dropdown-components/type-select/type-select.component.mjs +0 -175
- package/esm2022/lib/modules/dropdown-components/type-text/type-text.component.mjs +0 -62
- package/esm2022/lib/modules/dropdown-components/types.mjs +0 -41
- package/esm2022/lib/modules/dropdown-components/utils.mjs +0 -35
- package/esm2022/lib/modules/file/abstract-file.mjs +0 -230
- package/esm2022/lib/modules/file/component/file.component.mjs +0 -172
- package/esm2022/lib/modules/file/file-drop.directive.mjs +0 -111
- package/esm2022/lib/modules/file/file-select.directive.mjs +0 -26
- package/esm2022/lib/modules/file/file.service.mjs +0 -43
- package/esm2022/lib/modules/file/public-api.mjs +0 -9
- package/esm2022/lib/modules/file/types.mjs +0 -2
- package/esm2022/lib/modules/file/utils.mjs +0 -129
- package/esm2022/lib/modules/fixed-button/fixed-button.component.mjs +0 -30
- package/esm2022/lib/modules/fixed-button/public-api.mjs +0 -5
- package/esm2022/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +0 -56
- package/esm2022/lib/modules/fixed-button-detail/public-api.mjs +0 -5
- package/esm2022/lib/modules/hierarchic-selector/classes/flat-node.mjs +0 -18
- package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs +0 -2
- package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs +0 -2
- package/esm2022/lib/modules/hierarchic-selector/classes/model-node.mjs +0 -14
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +0 -398
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +0 -243
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +0 -38
- package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +0 -22
- package/esm2022/lib/modules/hierarchic-selector/public-api.mjs +0 -10
- package/esm2022/lib/modules/icon/icon.directive.mjs +0 -96
- package/esm2022/lib/modules/icon/icon.module.mjs +0 -33
- package/esm2022/lib/modules/icon/public-api.mjs +0 -6
- package/esm2022/lib/modules/logger/error-handler.mjs +0 -87
- package/esm2022/lib/modules/logger/error.module.mjs +0 -22
- package/esm2022/lib/modules/logger/public-api.mjs +0 -6
- package/esm2022/lib/modules/matomo/matomo.service.mjs +0 -96
- package/esm2022/lib/modules/matomo/public-api.mjs +0 -5
- package/esm2022/lib/modules/panels/abstract-panel.mjs +0 -76
- package/esm2022/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs +0 -12
- package/esm2022/lib/modules/panels/panels.component.mjs +0 -27
- package/esm2022/lib/modules/panels/panels.module.mjs +0 -10
- package/esm2022/lib/modules/panels/panels.service.mjs +0 -329
- package/esm2022/lib/modules/panels/panels.urlmatcher.mjs +0 -75
- package/esm2022/lib/modules/panels/public-api.mjs +0 -11
- package/esm2022/lib/modules/panels/types.mjs +0 -3
- package/esm2022/lib/modules/relations/public-api.mjs +0 -5
- package/esm2022/lib/modules/relations/relations.component.mjs +0 -254
- package/esm2022/lib/modules/search/classes/graphql-doctrine.mjs +0 -111
- package/esm2022/lib/modules/search/classes/graphql-doctrine.types.mjs +0 -14
- package/esm2022/lib/modules/search/classes/transformers.mjs +0 -142
- package/esm2022/lib/modules/search/classes/url.mjs +0 -53
- package/esm2022/lib/modules/search/classes/utils.mjs +0 -25
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container-animations.mjs +0 -44
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container.component.mjs +0 -87
- package/esm2022/lib/modules/search/dropdown-container/dropdown-ref.mjs +0 -24
- package/esm2022/lib/modules/search/dropdown-container/dropdown.service.mjs +0 -90
- package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +0 -45
- package/esm2022/lib/modules/search/group/group.component.mjs +0 -53
- package/esm2022/lib/modules/search/input/input.component.mjs +0 -365
- package/esm2022/lib/modules/search/public-api.mjs +0 -7
- package/esm2022/lib/modules/search/search/search.component.mjs +0 -102
- package/esm2022/lib/modules/search/types/dropdown-component.mjs +0 -2
- package/esm2022/lib/modules/search/types/facet.mjs +0 -2
- package/esm2022/lib/modules/search/types/values.mjs +0 -2
- package/esm2022/lib/modules/select/abstract-select.component.mjs +0 -232
- package/esm2022/lib/modules/select/public-api.mjs +0 -7
- package/esm2022/lib/modules/select/select/select.component.mjs +0 -310
- package/esm2022/lib/modules/select/select-enum/select-enum.component.mjs +0 -57
- package/esm2022/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +0 -155
- package/esm2022/lib/modules/sidenav/public-api.mjs +0 -9
- package/esm2022/lib/modules/sidenav/sidenav/sidenav.component.mjs +0 -15
- package/esm2022/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +0 -90
- package/esm2022/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +0 -11
- package/esm2022/lib/modules/sidenav/sidenav-stack.service.mjs +0 -50
- package/esm2022/lib/modules/sidenav/sidenav.service.mjs +0 -196
- package/esm2022/lib/modules/stamp/public-api.mjs +0 -5
- package/esm2022/lib/modules/stamp/stamp.component.mjs +0 -23
- package/esm2022/lib/modules/table-button/public-api.mjs +0 -5
- package/esm2022/lib/modules/table-button/table-button.component.mjs +0 -78
- package/esm2022/lib/services/abstract-model.service.mjs +0 -526
- package/esm2022/lib/services/debounce.service.mjs +0 -149
- package/esm2022/lib/services/enum.service.mjs +0 -64
- package/esm2022/lib/services/link-mutation.service.mjs +0 -154
- package/esm2022/lib/services/persistence.service.mjs +0 -115
- package/esm2022/lib/services/swiss-parsing-date-adapter.service.mjs +0 -63
- package/esm2022/lib/types/types.mjs +0 -2
- package/esm2022/public-api.mjs +0 -46
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
import { Component, ContentChild, DestroyRef, inject, Input, TemplateRef, ViewChild, } from '@angular/core';
|
|
2
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
-
import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
4
|
-
import { merge } from 'lodash-es';
|
|
5
|
-
import { debounceTime, distinctUntilChanged, finalize, map } from 'rxjs/operators';
|
|
6
|
-
import { NaturalQueryVariablesManager } from '../../../classes/query-variable-manager';
|
|
7
|
-
import { AbstractSelect } from '../abstract-select.component';
|
|
8
|
-
import { RouterLink } from '@angular/router';
|
|
9
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
10
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
11
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
12
|
-
import { NaturalIconDirective } from '../../icon/icon.directive';
|
|
13
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
14
|
-
import { MatInputModule } from '@angular/material/input';
|
|
15
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
16
|
-
import { MatOptionModule } from '@angular/material/core';
|
|
17
|
-
import { CommonModule } from '@angular/common';
|
|
18
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "@angular/material/autocomplete";
|
|
21
|
-
import * as i2 from "@angular/material/core";
|
|
22
|
-
import * as i3 from "@angular/common";
|
|
23
|
-
import * as i4 from "@angular/material/form-field";
|
|
24
|
-
import * as i5 from "@angular/material/input";
|
|
25
|
-
import * as i6 from "@angular/forms";
|
|
26
|
-
import * as i7 from "@angular/material/icon";
|
|
27
|
-
import * as i8 from "@angular/material/progress-spinner";
|
|
28
|
-
import * as i9 from "@angular/material/button";
|
|
29
|
-
import * as i10 from "@angular/material/tooltip";
|
|
30
|
-
/**
|
|
31
|
-
* Default usage:
|
|
32
|
-
* ```html
|
|
33
|
-
* <natural-select [service]="myServiceInstance" [(model)]="myModel" (modelChange)=myChangeFn($event) />
|
|
34
|
-
* ```
|
|
35
|
-
*
|
|
36
|
-
* Custom template usage :
|
|
37
|
-
* ```html
|
|
38
|
-
* <natural-select [service]="svc" [(ngModel)]="model">
|
|
39
|
-
* <ng-template let-item="item">
|
|
40
|
-
* <span>{{ item.xxx }}</span>
|
|
41
|
-
* </ng-template>
|
|
42
|
-
* </natural-select>
|
|
43
|
-
* ```
|
|
44
|
-
*
|
|
45
|
-
* `[(ngModel)]` and `(ngModelChange)` are optional.
|
|
46
|
-
*
|
|
47
|
-
* Placeholder :
|
|
48
|
-
* ```html
|
|
49
|
-
* <natural-select placeholder="my placeholder" />
|
|
50
|
-
* ```
|
|
51
|
-
*
|
|
52
|
-
* Search with like %xxx% on specified field `name` instead of custom filter on whole object
|
|
53
|
-
* ```html
|
|
54
|
-
* <natural-select searchField="name" />
|
|
55
|
-
* ```
|
|
56
|
-
*
|
|
57
|
-
* Allows to input free string without selecting an option from autocomplete suggestions
|
|
58
|
-
* ```html
|
|
59
|
-
* <natural-select [optionRequired]="false" />
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
|
-
export class NaturalSelectComponent extends AbstractSelect {
|
|
63
|
-
destroyRef = inject(DestroyRef);
|
|
64
|
-
autoTrigger;
|
|
65
|
-
itemTemplate;
|
|
66
|
-
/**
|
|
67
|
-
* Service with watchAll function that accepts queryVariables.
|
|
68
|
-
*/
|
|
69
|
-
service;
|
|
70
|
-
/**
|
|
71
|
-
* If false, allows to input free string without selecting an option from autocomplete suggestions
|
|
72
|
-
*/
|
|
73
|
-
optionRequired = true;
|
|
74
|
-
/**
|
|
75
|
-
* The field on which to search for, default to 'custom'.
|
|
76
|
-
*/
|
|
77
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
78
|
-
searchField = 'custom';
|
|
79
|
-
/**
|
|
80
|
-
* The operator with which to search for, default to 'search' if `searchField` is 'custom', else 'like'.
|
|
81
|
-
*/
|
|
82
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
83
|
-
searchOperator = null;
|
|
84
|
-
/**
|
|
85
|
-
* Cache the committed value during search mode.
|
|
86
|
-
* It's used to be restored in case we cancel the selection
|
|
87
|
-
*/
|
|
88
|
-
lastValidValue = null;
|
|
89
|
-
/**
|
|
90
|
-
* Additional filter for query
|
|
91
|
-
*/
|
|
92
|
-
set filter(filter) {
|
|
93
|
-
this.variablesManager.set('additional-filter', { filter: filter });
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Items returned by server to show in listing
|
|
97
|
-
*/
|
|
98
|
-
items = null;
|
|
99
|
-
/**
|
|
100
|
-
* Whether we are searching something
|
|
101
|
-
*/
|
|
102
|
-
loading = false;
|
|
103
|
-
/**
|
|
104
|
-
* If some items are not shown in result list
|
|
105
|
-
* Shows a message after list if true
|
|
106
|
-
*/
|
|
107
|
-
hasMoreItems = false;
|
|
108
|
-
nbTotal = 0;
|
|
109
|
-
/**
|
|
110
|
-
* Default page size
|
|
111
|
-
*/
|
|
112
|
-
pageSize = 10;
|
|
113
|
-
/**
|
|
114
|
-
* Init search options
|
|
115
|
-
*/
|
|
116
|
-
variablesManager = new NaturalQueryVariablesManager();
|
|
117
|
-
/**
|
|
118
|
-
* Whether the value can be changed
|
|
119
|
-
*/
|
|
120
|
-
set disabled(disabled) {
|
|
121
|
-
disabled ? this.internalCtrl.disable() : this.internalCtrl.enable();
|
|
122
|
-
}
|
|
123
|
-
ngOnInit() {
|
|
124
|
-
super.ngOnInit();
|
|
125
|
-
this.initService();
|
|
126
|
-
}
|
|
127
|
-
ngAfterViewInit() {
|
|
128
|
-
this.internalCtrl.valueChanges
|
|
129
|
-
.pipe(takeUntilDestroyed(this.destroyRef), distinctUntilChanged(), debounceTime(300))
|
|
130
|
-
.subscribe(val => this.search(val));
|
|
131
|
-
}
|
|
132
|
-
onInternalFormChange() {
|
|
133
|
-
// If we allow free string typing, then we propagate it as it is being typed
|
|
134
|
-
if (!this.optionRequired) {
|
|
135
|
-
this.propagateValue(this.internalCtrl.value);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
onBlur() {
|
|
139
|
-
if (this.internalCtrl.dirty) {
|
|
140
|
-
this.reset();
|
|
141
|
-
}
|
|
142
|
-
super.onBlur();
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Reset form to it's initial value
|
|
146
|
-
* Discard searched text (in autocomplete use case)
|
|
147
|
-
* Doest not commit the change to the model (no change event is emitted)
|
|
148
|
-
*/
|
|
149
|
-
reset() {
|
|
150
|
-
this.internalCtrl.setValue(this.lastValidValue);
|
|
151
|
-
this.internalCtrl.markAsPristine();
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Enter semantic means we want to validate something.
|
|
155
|
-
* If we hit ENTER while typing a text, the stroke is ignored because the value is invalid (it's accepted in free text mode)
|
|
156
|
-
* If we hit ENTER while the input field is empty, we validate the unselection (empty is a valid value)
|
|
157
|
-
*/
|
|
158
|
-
onKeyEnter() {
|
|
159
|
-
if (!this.internalCtrl.value) {
|
|
160
|
-
this.clear();
|
|
161
|
-
this.autoTrigger.closePanel();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
writeValue(value) {
|
|
165
|
-
super.writeValue(value);
|
|
166
|
-
this.lastValidValue = this.internalCtrl.value;
|
|
167
|
-
}
|
|
168
|
-
initService() {
|
|
169
|
-
// Assert given service has a watchAll function
|
|
170
|
-
if (typeof this.service.watchAll !== 'function') {
|
|
171
|
-
throw new TypeError('Provided service does not contain watchAll function');
|
|
172
|
-
}
|
|
173
|
-
const defaultPagination = {
|
|
174
|
-
pagination: {
|
|
175
|
-
pageIndex: 0,
|
|
176
|
-
pageSize: this.pageSize,
|
|
177
|
-
},
|
|
178
|
-
};
|
|
179
|
-
const variables = merge(defaultPagination, this.getSearchFilter(null));
|
|
180
|
-
this.variablesManager.set('variables', variables);
|
|
181
|
-
}
|
|
182
|
-
startSearch() {
|
|
183
|
-
// Start search only once
|
|
184
|
-
if (this.items) {
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
// Init query, and when query results arrive, finish loading, and count items
|
|
188
|
-
this.items = this.service.watchAll(this.variablesManager).pipe(takeUntilDestroyed(this.destroyRef), finalize(() => (this.loading = false)), map(data => {
|
|
189
|
-
this.loading = false;
|
|
190
|
-
this.nbTotal = data.length;
|
|
191
|
-
const nbListed = Math.min(data.length, this.pageSize);
|
|
192
|
-
this.hasMoreItems = this.nbTotal > nbListed;
|
|
193
|
-
return data.items;
|
|
194
|
-
}));
|
|
195
|
-
this.loading = true;
|
|
196
|
-
this.items.subscribe();
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Commit the model change
|
|
200
|
-
* Set internal form as pristine to reflect that the visible value match the model
|
|
201
|
-
*/
|
|
202
|
-
propagateValue(value) {
|
|
203
|
-
this.internalCtrl.markAsPristine();
|
|
204
|
-
this.lastValidValue = this.internalCtrl.value;
|
|
205
|
-
this.loading = false;
|
|
206
|
-
// If we cleared value via button, but we allow free string typing, then force to empty string
|
|
207
|
-
if (!this.optionRequired && value === null) {
|
|
208
|
-
value = '';
|
|
209
|
-
}
|
|
210
|
-
super.propagateValue(value);
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Very important to return something, above all if [select]='displayedValue' attribute value is used
|
|
214
|
-
*/
|
|
215
|
-
getDisplayFn() {
|
|
216
|
-
if (this.displayWith) {
|
|
217
|
-
return this.displayWith;
|
|
218
|
-
}
|
|
219
|
-
return (item) => {
|
|
220
|
-
if (!item) {
|
|
221
|
-
return '';
|
|
222
|
-
}
|
|
223
|
-
if (typeof item === 'string') {
|
|
224
|
-
return item;
|
|
225
|
-
}
|
|
226
|
-
return item.fullName || item.name || item.iban || item[this.searchField] || item.id;
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
clear() {
|
|
230
|
-
this.search(null);
|
|
231
|
-
super.clear();
|
|
232
|
-
}
|
|
233
|
-
search(term) {
|
|
234
|
-
if (typeof term === 'string' || term === null) {
|
|
235
|
-
if (term) {
|
|
236
|
-
this.loading = !!this.items;
|
|
237
|
-
}
|
|
238
|
-
this.variablesManager.merge('variables', this.getSearchFilter(term));
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
showClearButton() {
|
|
242
|
-
return this.internalCtrl?.enabled && !!this.clearLabel && !!this.internalCtrl.value;
|
|
243
|
-
}
|
|
244
|
-
getSearchFilter(term) {
|
|
245
|
-
const searchOperator = this.searchOperator ?? (this.searchField === 'custom' ? 'search' : 'like');
|
|
246
|
-
if (term && searchOperator === 'like') {
|
|
247
|
-
term = '%' + term + '%';
|
|
248
|
-
}
|
|
249
|
-
return {
|
|
250
|
-
filter: {
|
|
251
|
-
groups: [
|
|
252
|
-
{
|
|
253
|
-
conditions: [
|
|
254
|
-
{
|
|
255
|
-
[this.searchField]: term
|
|
256
|
-
? {
|
|
257
|
-
[searchOperator]: { value: term },
|
|
258
|
-
}
|
|
259
|
-
: null,
|
|
260
|
-
},
|
|
261
|
-
],
|
|
262
|
-
},
|
|
263
|
-
],
|
|
264
|
-
},
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
getVariablesForDebug() {
|
|
268
|
-
return this.variablesManager.variables.value;
|
|
269
|
-
}
|
|
270
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
271
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: NaturalSelectComponent, isStandalone: true, selector: "natural-select", inputs: { service: "service", optionRequired: "optionRequired", searchField: "searchField", searchOperator: "searchOperator", filter: "filter", disabled: "disabled" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "autoTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n @for (item of items | async; track $index) {\n <mat-option [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n />\n </mat-option>\n }\n @if (hasMoreItems) {\n <div class=\"mat-caption\" i18n style=\"padding: 5px 10px\">Saisir pour chercher parmi {{ nbTotal }} r\u00E9sultats</div>\n }\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"onBlur()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"reset()\"\n (keydown.enter)=\"onKeyEnter()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n\n <!-- Meta data -->\n @if (!loading && showIcon) {\n <mat-icon [naturalIcon]=\"icon\" matIconPrefix />\n }\n\n @if (loading) {\n <div class=\"loading-wrapper\" matIconPrefix>\n <mat-progress-spinner [diameter]=\"21\" [strokeWidth]=\"5\" mode=\"indeterminate\" />\n </div>\n }\n\n <!-- Clear button -->\n <div matIconSuffix>\n @if (internalCtrl.pristine && internalCtrl.value && internalCtrl.enabled && !clearLabel) {\n <button (click)=\"clear()\" mat-icon-button i18n-matTooltip matTooltip=\"D\u00E9s\u00E9lectionner\">\n <mat-icon naturalIcon=\"close\" />\n </button>\n }\n @if (internalCtrl.dirty && internalCtrl.enabled && optionRequired) {\n <button (click)=\"reset()\" mat-icon-button i18n-matTooltip matTooltip=\"Annuler la recherche\">\n <mat-icon naturalIcon=\"undo\" />\n </button>\n }\n @if (internalCtrl.pristine && internalCtrl.value && navigateTo) {\n <button\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <mat-icon naturalIcon=\"open_in_browser\" />\n </button>\n }\n </div>\n\n @if (hasRequiredError()) {\n <mat-error i18n>Ce champ est requis</mat-error>\n } @else if (error) {\n <mat-error>{{ error }}</mat-error>\n }\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n@if (showClearButton()) {\n <div class=\"external-buttons\">\n @if (showClearButton()) {\n <button (click)=\"clear()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n }\n </div>\n}\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}:host .loading-wrapper{display:flex;justify-content:center;align-items:center;width:48px;height:48px}\n"], dependencies: [{ kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
272
|
-
}
|
|
273
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSelectComponent, decorators: [{
|
|
274
|
-
type: Component,
|
|
275
|
-
args: [{ selector: 'natural-select', standalone: true, imports: [
|
|
276
|
-
MatAutocompleteModule,
|
|
277
|
-
CommonModule,
|
|
278
|
-
MatOptionModule,
|
|
279
|
-
MatFormFieldModule,
|
|
280
|
-
MatInputModule,
|
|
281
|
-
FormsModule,
|
|
282
|
-
ReactiveFormsModule,
|
|
283
|
-
MatIconModule,
|
|
284
|
-
NaturalIconDirective,
|
|
285
|
-
MatProgressSpinnerModule,
|
|
286
|
-
MatButtonModule,
|
|
287
|
-
MatTooltipModule,
|
|
288
|
-
RouterLink,
|
|
289
|
-
], template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n @for (item of items | async; track $index) {\n <mat-option [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n />\n </mat-option>\n }\n @if (hasMoreItems) {\n <div class=\"mat-caption\" i18n style=\"padding: 5px 10px\">Saisir pour chercher parmi {{ nbTotal }} r\u00E9sultats</div>\n }\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"onBlur()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"reset()\"\n (keydown.enter)=\"onKeyEnter()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n\n <!-- Meta data -->\n @if (!loading && showIcon) {\n <mat-icon [naturalIcon]=\"icon\" matIconPrefix />\n }\n\n @if (loading) {\n <div class=\"loading-wrapper\" matIconPrefix>\n <mat-progress-spinner [diameter]=\"21\" [strokeWidth]=\"5\" mode=\"indeterminate\" />\n </div>\n }\n\n <!-- Clear button -->\n <div matIconSuffix>\n @if (internalCtrl.pristine && internalCtrl.value && internalCtrl.enabled && !clearLabel) {\n <button (click)=\"clear()\" mat-icon-button i18n-matTooltip matTooltip=\"D\u00E9s\u00E9lectionner\">\n <mat-icon naturalIcon=\"close\" />\n </button>\n }\n @if (internalCtrl.dirty && internalCtrl.enabled && optionRequired) {\n <button (click)=\"reset()\" mat-icon-button i18n-matTooltip matTooltip=\"Annuler la recherche\">\n <mat-icon naturalIcon=\"undo\" />\n </button>\n }\n @if (internalCtrl.pristine && internalCtrl.value && navigateTo) {\n <button\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <mat-icon naturalIcon=\"open_in_browser\" />\n </button>\n }\n </div>\n\n @if (hasRequiredError()) {\n <mat-error i18n>Ce champ est requis</mat-error>\n } @else if (error) {\n <mat-error>{{ error }}</mat-error>\n }\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n@if (showClearButton()) {\n <div class=\"external-buttons\">\n @if (showClearButton()) {\n <button (click)=\"clear()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n }\n </div>\n}\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}:host .loading-wrapper{display:flex;justify-content:center;align-items:center;width:48px;height:48px}\n"] }]
|
|
290
|
-
}], propDecorators: { autoTrigger: [{
|
|
291
|
-
type: ViewChild,
|
|
292
|
-
args: [MatAutocompleteTrigger]
|
|
293
|
-
}], itemTemplate: [{
|
|
294
|
-
type: ContentChild,
|
|
295
|
-
args: [TemplateRef]
|
|
296
|
-
}], service: [{
|
|
297
|
-
type: Input,
|
|
298
|
-
args: [{ required: true }]
|
|
299
|
-
}], optionRequired: [{
|
|
300
|
-
type: Input
|
|
301
|
-
}], searchField: [{
|
|
302
|
-
type: Input
|
|
303
|
-
}], searchOperator: [{
|
|
304
|
-
type: Input
|
|
305
|
-
}], filter: [{
|
|
306
|
-
type: Input
|
|
307
|
-
}], disabled: [{
|
|
308
|
-
type: Input
|
|
309
|
-
}] } });
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUMscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBQyw0QkFBNEIsRUFBaUIsTUFBTSx5Q0FBeUMsQ0FBQztBQUdyRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFB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QUFZO3dCQUNaLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsd0JBQXdCO3dCQUN4QixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsVUFBVTtxQkFDYjs4QkFvQnlDLFdBQVc7c0JBQXBELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNDLFlBQVk7c0JBQTdDLFlBQVk7dUJBQUMsV0FBVztnQkFLTyxPQUFPO3NCQUF0QyxLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztnQkFLUCxjQUFjO3NCQUE3QixLQUFLO2dCQU1VLFdBQVc7c0JBQTFCLEtBQUs7Z0JBTVUsY0FBYztzQkFBN0IsS0FBSztnQkFZSyxNQUFNO3NCQURoQixLQUFLO2dCQXFDYyxRQUFRO3NCQUQzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGVzdHJveVJlZixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVNb2R1bGUsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge21lcmdlfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmluYWxpemUsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtQYWdpbmF0ZWREYXRhfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2RhdGEtc291cmNlJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge05hdHVyYWxBYnN0cmFjdE1vZGVsU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWJzdHJhY3QtbW9kZWwuc2VydmljZSc7XG5pbXBvcnQge0V4dHJhY3RUYWxsT25lLCBFeHRyYWN0VmFsbCwgTGl0ZXJhbH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHtBYnN0cmFjdFNlbGVjdH0gZnJvbSAnLi4vYWJzdHJhY3Qtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQge1JvdXRlckxpbmt9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge01hdFRvb2x0aXBNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQge05hdHVyYWxJY29uRGlyZWN0aXZlfSBmcm9tICcuLi8uLi9pY29uL2ljb24uZGlyZWN0aXZlJztcbmltcG9ydCB7TWF0SWNvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQge01hdElucHV0TW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQge01hdEZvcm1GaWVsZE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQge01hdE9wdGlvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbi8vIFJldHVybiB0aGUgdHlwZSBvZiBUVmFsdWUgZm9yIHRoZSBnaXZlbiBUU2VydmljZVxudHlwZSBWYWx1ZVR5cGVGb3I8VFNlcnZpY2U+ID0gc3RyaW5nIHwgRXh0cmFjdFRhbGxPbmU8VFNlcnZpY2U+O1xuXG4vKipcbiAqIERlZmF1bHQgdXNhZ2U6XG4gKiBgYGBodG1sXG4gKiA8bmF0dXJhbC1zZWxlY3QgW3NlcnZpY2VdPVwibXlTZXJ2aWNlSW5zdGFuY2VcIiBbKG1vZGVsKV09XCJteU1vZGVsXCIgKG1vZGVsQ2hhbmdlKT1teUNoYW5nZUZuKCRldmVudCkgLz5cbiAqIGBgYFxuICpcbiAqIEN1c3RvbSB0ZW1wbGF0ZSB1c2FnZSA6XG4gKiBgYGBodG1sXG4gKiA8bmF0dXJhbC1zZWxlY3QgW3NlcnZpY2VdPVwic3ZjXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cbiAqICAgICAgICAgPHNwYW4+e3sgaXRlbS54eHggfX08L3NwYW4+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqIDwvbmF0dXJhbC1zZWxlY3Q+XG4gKiBgYGBcbiAqXG4gKiBgWyhuZ01vZGVsKV1gIGFuZCBgKG5nTW9kZWxDaGFuZ2UpYCBhcmUgb3B0aW9uYWwuXG4gKlxuICogUGxhY2Vob2xkZXIgOlxuICogYGBgaHRtbFxuICogPG5hdHVyYWwtc2VsZWN0IHBsYWNlaG9sZGVyPVwibXkgcGxhY2Vob2xkZXJcIiAvPlxuICogYGBgXG4gKlxuICogU2VhcmNoIHdpdGggbGlrZSAleHh4JSBvbiBzcGVjaWZpZWQgZmllbGQgYG5hbWVgIGluc3RlYWQgb2YgY3VzdG9tIGZpbHRlciBvbiB3aG9sZSBvYmplY3RcbiAqIGBgYGh0bWxcbiAqIDxuYXR1cmFsLXNlbGVjdCBzZWFyY2hGaWVsZD1cIm5hbWVcIiAvPlxuICogYGBgXG4gKlxuICogQWxsb3dzIHRvIGlucHV0IGZyZWUgc3RyaW5nIHdpdGhvdXQgc2VsZWN0aW5nIGFuIG9wdGlvbiBmcm9tIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICogYGBgaHRtbFxuICogPG5hdHVyYWwtc2VsZWN0IFtvcHRpb25SZXF1aXJlZF09XCJmYWxzZVwiIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLXNlbGVjdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuc2NzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSxcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBOYXR1cmFsSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIFJvdXRlckxpbmssXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbFNlbGVjdENvbXBvbmVudDxcbiAgICAgICAgVFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgICAgICAgICAgUXVlcnlWYXJpYWJsZXMsXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnlcbiAgICAgICAgPixcbiAgICA+XG4gICAgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdDxWYWx1ZVR5cGVGb3I8VFNlcnZpY2U+LCBWYWx1ZVR5cGVGb3I8VFNlcnZpY2U+PlxuICAgIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdFxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIHB1YmxpYyBhdXRvVHJpZ2dlciE6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gICAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgcHVibGljIGl0ZW1UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIHdpdGggd2F0Y2hBbGwgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHF1ZXJ5VmFyaWFibGVzLlxuICAgICAqL1xuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBwdWJsaWMgc2VydmljZSE6IFRTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogSWYgZmFsc2UsIGFsbG93cyB0byBpbnB1dCBmcmVlIHN0cmluZyB3aXRob3V0IHNlbGVjdGluZyBhbiBvcHRpb24gZnJvbSBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbnNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uUmVxdWlyZWQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIG9uIHdoaWNoIHRvIHNlYXJjaCBmb3IsIGRlZmF1bHQgdG8gJ2N1c3RvbScuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZWR1bmRhbnQtdHlwZS1jb25zdGl0dWVudHNcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoRmllbGQ6ICdjdXN0b20nIHwgc3RyaW5nID0gJ2N1c3RvbSc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0b3Igd2l0aCB3aGljaCB0byBzZWFyY2ggZm9yLCBkZWZhdWx0IHRvICdzZWFyY2gnIGlmIGBzZWFyY2hGaWVsZGAgaXMgJ2N1c3RvbScsIGVsc2UgJ2xpa2UnLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVkdW5kYW50LXR5cGUtY29uc3RpdHVlbnRzXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaE9wZXJhdG9yOiAnc2VhcmNoJyB8IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGUgdGhlIGNvbW1pdHRlZCB2YWx1ZSBkdXJpbmcgc2VhcmNoIG1vZGUuXG4gICAgICogSXQncyB1c2VkIHRvIGJlIHJlc3RvcmVkIGluIGNhc2Ugd2UgY2FuY2VsIHRoZSBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGxhc3RWYWxpZFZhbHVlOiBWYWx1ZVR5cGVGb3I8VFNlcnZpY2U+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGZpbHRlciBmb3IgcXVlcnlcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmlsdGVyKGZpbHRlcjogRXh0cmFjdFZhbGw8VFNlcnZpY2U+WydmaWx0ZXInXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZXNNYW5hZ2VyLnNldCgnYWRkaXRpb25hbC1maWx0ZXInLCB7ZmlsdGVyOiBmaWx0ZXJ9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVtcyByZXR1cm5lZCBieSBzZXJ2ZXIgdG8gc2hvdyBpbiBsaXN0aW5nXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1zOiBudWxsIHwgT2JzZXJ2YWJsZTxyZWFkb25seSBhbnlbXT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB3ZSBhcmUgc2VhcmNoaW5nIHNvbWV0aGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBJZiBzb21lIGl0ZW1zIGFyZSBub3Qgc2hvd24gaW4gcmVzdWx0IGxpc3RcbiAgICAgKiBTaG93cyBhIG1lc3NhZ2UgYWZ0ZXIgbGlzdCBpZiB0cnVlXG4gICAgICovXG4gICAgcHVibGljIGhhc01vcmVJdGVtcyA9IGZhbHNlO1xuXG4gICAgcHVibGljIG5iVG90YWwgPSAwO1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBwYWdlIHNpemVcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhZ2VTaXplID0gMTA7XG5cbiAgICAvKipcbiAgICAgKiBJbml0IHNlYXJjaCBvcHRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YXJpYWJsZXNNYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8UXVlcnlWYXJpYWJsZXM+KCk7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICBkaXNhYmxlZCA/IHRoaXMuaW50ZXJuYWxDdHJsLmRpc2FibGUoKSA6IHRoaXMuaW50ZXJuYWxDdHJsLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5pbml0U2VydmljZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDdHJsLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5zZWFyY2godmFsKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW50ZXJuYWxGb3JtQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyBJZiB3ZSBhbGxvdyBmcmVlIHN0cmluZyB0eXBpbmcsIHRoZW4gd2UgcHJvcGFnYXRlIGl0IGFzIGl0IGlzIGJlaW5nIHR5cGVkXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25SZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZSh0aGlzLmludGVybmFsQ3RybC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEN0cmwuZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5vbkJsdXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBmb3JtIHRvIGl0J3MgaW5pdGlhbCB2YWx1ZVxuICAgICAqIERpc2NhcmQgc2VhcmNoZWQgdGV4dCAoaW4gYXV0b2NvbXBsZXRlIHVzZSBjYXNlKVxuICAgICAqIERvZXN0IG5vdCBjb21taXQgdGhlIGNoYW5nZSB0byB0aGUgbW9kZWwgKG5vIGNoYW5nZSBldmVudCBpcyBlbWl0dGVkKVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEN0cmwuc2V0VmFsdWUodGhpcy5sYXN0VmFsaWRWYWx1ZSk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDdHJsLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW50ZXIgc2VtYW50aWMgbWVhbnMgd2Ugd2FudCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuXG4gICAgICogSWYgd2UgaGl0IEVOVEVSIHdoaWxlIHR5cGluZyBhIHRleHQsIHRoZSBzdHJva2UgaXMgaWdub3JlZCBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBpbnZhbGlkIChpdCdzIGFjY2VwdGVkIGluIGZyZWUgdGV4dCBtb2RlKVxuICAgICAqIElmIHdlIGhpdCBFTlRFUiB3aGlsZSB0aGUgaW5wdXQgZmllbGQgaXMgZW1wdHksIHdlIHZhbGlkYXRlIHRoZSB1bnNlbGVjdGlvbiAoZW1wdHkgaXMgYSB2YWxpZCB2YWx1ZSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlFbnRlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmludGVybmFsQ3RybC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5hdXRvVHJpZ2dlci5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogVmFsdWVUeXBlRm9yPFRTZXJ2aWNlPiB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMubGFzdFZhbGlkVmFsdWUgPSB0aGlzLmludGVybmFsQ3RybC52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICAvLyBBc3NlcnQgZ2l2ZW4gc2VydmljZSBoYXMgYSB3YXRjaEFsbCBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VydmljZS53YXRjaEFsbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvdmlkZWQgc2VydmljZSBkb2VzIG5vdCBjb250YWluIHdhdGNoQWxsIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UGFnaW5hdGlvbiA9IHtcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKGRlZmF1bHRQYWdpbmF0aW9uLCB0aGlzLmdldFNlYXJjaEZpbHRlcihudWxsKSk7XG4gICAgICAgIHRoaXMudmFyaWFibGVzTWFuYWdlci5zZXQoJ3ZhcmlhYmxlcycsIHZhcmlhYmxlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0U2VhcmNoKCk6IHZvaWQge1xuICAgICAgICAvLyBTdGFydCBzZWFyY2ggb25seSBvbmNlXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0IHF1ZXJ5LCBhbmQgd2hlbiBxdWVyeSByZXN1bHRzIGFycml2ZSwgZmluaXNoIGxvYWRpbmcsIGFuZCBjb3VudCBpdGVtc1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5zZXJ2aWNlLndhdGNoQWxsKHRoaXMudmFyaWFibGVzTWFuYWdlcikucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSksXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5uYlRvdGFsID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbmJMaXN0ZWQgPSBNYXRoLm1pbihkYXRhLmxlbmd0aCwgdGhpcy5wYWdlU2l6ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNNb3JlSXRlbXMgPSB0aGlzLm5iVG90YWwgPiBuYkxpc3RlZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLml0ZW1zO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pdGVtcy5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21taXQgdGhlIG1vZGVsIGNoYW5nZVxuICAgICAqIFNldCBpbnRlcm5hbCBmb3JtIGFzIHByaXN0aW5lIHRvIHJlZmxlY3QgdGhhdCB0aGUgdmlzaWJsZSB2YWx1ZSBtYXRjaCB0aGUgbW9kZWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgcHJvcGFnYXRlVmFsdWUodmFsdWU6IFZhbHVlVHlwZUZvcjxUU2VydmljZT4gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDdHJsLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIHRoaXMubGFzdFZhbGlkVmFsdWUgPSB0aGlzLmludGVybmFsQ3RybC52YWx1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSWYgd2UgY2xlYXJlZCB2YWx1ZSB2aWEgYnV0dG9uLCBidXQgd2UgYWxsb3cgZnJlZSBzdHJpbmcgdHlwaW5nLCB0aGVuIGZvcmNlIHRvIGVtcHR5IHN0cmluZ1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9uUmVxdWlyZWQgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5wcm9wYWdhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyeSBpbXBvcnRhbnQgdG8gcmV0dXJuIHNvbWV0aGluZywgYWJvdmUgYWxsIGlmIFtzZWxlY3RdPSdkaXNwbGF5ZWRWYWx1ZScgYXR0cmlidXRlIHZhbHVlIGlzIHVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGlzcGxheUZuKCk6IChpdGVtOiBWYWx1ZVR5cGVGb3I8VFNlcnZpY2U+IHwgbnVsbCkgPT4gc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVdpdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbS5mdWxsTmFtZSB8fCBpdGVtLm5hbWUgfHwgaXRlbS5pYmFuIHx8IGl0ZW1bdGhpcy5zZWFyY2hGaWVsZF0gfHwgaXRlbS5pZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoKG51bGwpO1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2godGVybTogVmFsdWVUeXBlRm9yPFRTZXJ2aWNlPiB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyB8fCB0ZXJtID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGVybSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9ICEhdGhpcy5pdGVtcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YXJpYWJsZXNNYW5hZ2VyLm1lcmdlKCd2YXJpYWJsZXMnLCB0aGlzLmdldFNlYXJjaEZpbHRlcih0ZXJtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEN0cmw/LmVuYWJsZWQgJiYgISF0aGlzLmNsZWFyTGFiZWwgJiYgISF0aGlzLmludGVybmFsQ3RybC52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlYXJjaEZpbHRlcih0ZXJtOiBzdHJpbmcgfCBudWxsKTogUXVlcnlWYXJpYWJsZXMge1xuICAgICAgICBjb25zdCBzZWFyY2hPcGVyYXRvciA9IHRoaXMuc2VhcmNoT3BlcmF0b3IgPz8gKHRoaXMuc2VhcmNoRmllbGQgPT09ICdjdXN0b20nID8gJ3NlYXJjaCcgOiAnbGlrZScpO1xuICAgICAgICBpZiAodGVybSAmJiBzZWFyY2hPcGVyYXRvciA9PT0gJ2xpa2UnKSB7XG4gICAgICAgICAgICB0ZXJtID0gJyUnICsgdGVybSArICclJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBncm91cHM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMuc2VhcmNoRmllbGRdOiB0ZXJtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hPcGVyYXRvcl06IHt2YWx1ZTogdGVybX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmFyaWFibGVzRm9yRGVidWcoKTogUmVhZG9ubHk8UXVlcnlWYXJpYWJsZXM+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFibGVzTWFuYWdlci52YXJpYWJsZXMudmFsdWU7XG4gICAgfVxufVxuIiwiPCEtLSBBdXRvY29tcGxldGUgbWVudSAtLT5cbjxtYXQtYXV0b2NvbXBsZXRlXG4gICAgI2FjPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAob3B0aW9uU2VsZWN0ZWQpPVwicHJvcGFnYXRlVmFsdWUoJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIlxuICAgIFtkaXNwbGF5V2l0aF09XCJnZXREaXNwbGF5Rm4oKVwiXG4gICAgcGFuZWxXaWR0aD1cImF1dG8gIWltcG9ydGFudFwiXG4+XG4gICAgQGZvciAoaXRlbSBvZiBpdGVtcyB8IGFzeW5jOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogaXRlbX1cIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZSA/IGl0ZW1UZW1wbGF0ZSA6IGRlZmF1bHRBQ0l0ZW1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIH1cbiAgICBAaWYgKGhhc01vcmVJdGVtcykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWNhcHRpb25cIiBpMThuIHN0eWxlPVwicGFkZGluZzogNXB4IDEwcHhcIj5TYWlzaXIgcG91ciBjaGVyY2hlciBwYXJtaSB7eyBuYlRvdGFsIH19IHLDqXN1bHRhdHM8L2Rpdj5cbiAgICB9XG48L21hdC1hdXRvY29tcGxldGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEFDSXRlbSBsZXQtaXRlbT1cIml0ZW1cIj5cbiAgICA8c3Bhbj57eyBnZXREaXNwbGF5Rm4oKShpdGVtKSB9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gSW5wdXQgZm9yIGF1dG9jb21wbGV0ZSAtLT5cbjxtYXQtZm9ybS1maWVsZCBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZygpXCI+XG4gICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuXG4gICAgPGlucHV0XG4gICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkludGVybmFsRm9ybUNoYW5nZSgpXCJcbiAgICAgICAgKGNsaWNrKT1cImF1dG9UcmlnZ2VyLm9wZW5QYW5lbCgpXCJcbiAgICAgICAgKGZvY3VzKT1cInN0YXJ0U2VhcmNoKClcIlxuICAgICAgICAoa2V5ZG93bi5lc2MpPVwicmVzZXQoKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uS2V5RW50ZXIoKVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnRlcm5hbEN0cmxcIlxuICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImFjXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlJlY2hlcmNoZSBldCBzw6lsZWN0aW9uXCJcbiAgICAgICAgaTE4bi1hcmlhLWxhYmVsXG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIFtlcnJvclN0YXRlTWF0Y2hlcl09XCJtYXRjaGVyXCJcbiAgICAvPlxuXG4gICAgQGlmIChoaW50KCkpIHtcbiAgICAgICAgPG1hdC1oaW50Pnt7IGhpbnQoKSB9fTwvbWF0LWhpbnQ+XG4gICAgfVxuXG4gICAgPCEtLSBNZXRhIGRhdGEgLS0+XG4gICAgQGlmICghbG9hZGluZyAmJiBzaG93SWNvbikge1xuICAgICAgICA8bWF0LWljb24gW25hdHVyYWxJY29uXT1cImljb25cIiBtYXRJY29uUHJlZml4IC8+XG4gICAgfVxuXG4gICAgQGlmIChsb2FkaW5nKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXdyYXBwZXJcIiBtYXRJY29uUHJlZml4PlxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIFtkaWFtZXRlcl09XCIyMVwiIFtzdHJva2VXaWR0aF09XCI1XCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIENsZWFyIGJ1dHRvbiAtLT5cbiAgICA8ZGl2IG1hdEljb25TdWZmaXg+XG4gICAgICAgIEBpZiAoaW50ZXJuYWxDdHJsLnByaXN0aW5lICYmIGludGVybmFsQ3RybC52YWx1ZSAmJiBpbnRlcm5hbEN0cmwuZW5hYmxlZCAmJiAhY2xlYXJMYWJlbCkge1xuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xlYXIoKVwiIG1hdC1pY29uLWJ1dHRvbiBpMThuLW1hdFRvb2x0aXAgbWF0VG9vbHRpcD1cIkTDqXPDqWxlY3Rpb25uZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gbmF0dXJhbEljb249XCJjbG9zZVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGludGVybmFsQ3RybC5kaXJ0eSAmJiBpbnRlcm5hbEN0cmwuZW5hYmxlZCAmJiBvcHRpb25SZXF1aXJlZCkge1xuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVzZXQoKVwiIG1hdC1pY29uLWJ1dHRvbiBpMThuLW1hdFRvb2x0aXAgbWF0VG9vbHRpcD1cIkFubnVsZXIgbGEgcmVjaGVyY2hlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIG5hdHVyYWxJY29uPVwidW5kb1wiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGludGVybmFsQ3RybC5wcmlzdGluZSAmJiBpbnRlcm5hbEN0cmwudmFsdWUgJiYgbmF2aWdhdGVUbykge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIm5hdmlnYXRlVG9cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJOYXZpZ3VlciB2ZXJzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gbmF0dXJhbEljb249XCJvcGVuX2luX2Jyb3dzZXJcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaGFzUmVxdWlyZWRFcnJvcigpKSB7XG4gICAgICAgIDxtYXQtZXJyb3IgaTE4bj5DZSBjaGFtcCBlc3QgcmVxdWlzPC9tYXQtZXJyb3I+XG4gICAgfSBAZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgPG1hdC1lcnJvcj57eyBlcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIH1cbjwvbWF0LWZvcm0tZmllbGQ+XG5cbjwhLS0gQWRkaXRpb25hbCAodW4pc2VsZWN0Lyh1bilsaW5rIGJ1dHRvbnMgZm9yIG1vcmUgdmlzdWFsIGNvaGVzaW9uIHdpdGggbmF0dXJhbC1yZWxhdGlvbnMgLS0+PCEtLSBbY2xlYXJMYWJlbF0gYW5kL29yIFtzZWxlY3RMYWJlbF0gaGFzIHRvIGJlIGdpdmVuIGFzIGF0dHJpYnV0ZSBpbnB1dCAtLT5cbkBpZiAoc2hvd0NsZWFyQnV0dG9uKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZXh0ZXJuYWwtYnV0dG9uc1wiPlxuICAgICAgICBAaWYgKHNob3dDbGVhckJ1dHRvbigpKSB7XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhcigpXCIgY29sb3I9XCJ3YXJuXCIgbWF0LWJ1dHRvbj57eyBjbGVhckxhYmVsIH19PC9idXR0b24+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbn1cbiJdfQ==
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Component, inject, Input } from '@angular/core';
|
|
2
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
-
import { NaturalEnumService } from '../../../services/enum.service';
|
|
4
|
-
import { AbstractSelect } from '../abstract-select.component';
|
|
5
|
-
import { MatOptionModule } from '@angular/material/core';
|
|
6
|
-
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
8
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/material/form-field";
|
|
11
|
-
import * as i2 from "@angular/material/select";
|
|
12
|
-
import * as i3 from "@angular/material/core";
|
|
13
|
-
import * as i4 from "@angular/forms";
|
|
14
|
-
import * as i5 from "@angular/common";
|
|
15
|
-
export class NaturalSelectEnumComponent extends AbstractSelect {
|
|
16
|
-
enumService = inject(NaturalEnumService);
|
|
17
|
-
/**
|
|
18
|
-
* The name of the enum type, eg: `"ActionStatus"`
|
|
19
|
-
*/
|
|
20
|
-
enumName;
|
|
21
|
-
/**
|
|
22
|
-
* If given an extra option is added to select `null` with given label
|
|
23
|
-
*/
|
|
24
|
-
nullLabel;
|
|
25
|
-
/**
|
|
26
|
-
* Functions that receives an enum value and returns whether that value is disabled
|
|
27
|
-
*/
|
|
28
|
-
optionDisabled;
|
|
29
|
-
/**
|
|
30
|
-
* Whether the user should be allowed to select multiple options
|
|
31
|
-
*/
|
|
32
|
-
multiple = false;
|
|
33
|
-
items;
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
super.ngOnInit();
|
|
36
|
-
this.items = this.enumService.get(this.enumName);
|
|
37
|
-
}
|
|
38
|
-
getDisplayFn() {
|
|
39
|
-
throw new Error('This should never be called');
|
|
40
|
-
}
|
|
41
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSelectEnumComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
42
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: NaturalSelectEnumComponent, isStandalone: true, selector: "natural-select-enum", inputs: { enumName: "enumName", nullLabel: "nullLabel", optionDisabled: "optionDisabled", multiple: "multiple" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\n <mat-label>{{ placeholder }}</mat-label>\n <mat-select\n (selectionChange)=\"propagateValue($event.value)\"\n [formControl]=\"internalCtrl\"\n (blur)=\"onBlur()\"\n [errorStateMatcher]=\"matcher\"\n [multiple]=\"multiple\"\n >\n @if (nullLabel) {\n <mat-option [value]=\"null\">{{ nullLabel }}</mat-option>\n }\n @for (item of items | async; track item.value) {\n <mat-option [value]=\"item.value\" [disabled]=\"optionDisabled ? optionDisabled(item) : false\">\n {{ item.name }}\n </mat-option>\n }\n </mat-select>\n\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n\n @if (hasRequiredError()) {\n <mat-error i18n>Ce champ est requis</mat-error>\n } @else if (error) {\n <mat-error>{{ error }}</mat-error>\n }\n</mat-form-field>\n", styles: [":host{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatOptionModule }] });
|
|
43
|
-
}
|
|
44
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalSelectEnumComponent, decorators: [{
|
|
45
|
-
type: Component,
|
|
46
|
-
args: [{ selector: 'natural-select-enum', standalone: true, imports: [MatFormFieldModule, MatSelectModule, FormsModule, ReactiveFormsModule, CommonModule, MatOptionModule], template: "<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\n <mat-label>{{ placeholder }}</mat-label>\n <mat-select\n (selectionChange)=\"propagateValue($event.value)\"\n [formControl]=\"internalCtrl\"\n (blur)=\"onBlur()\"\n [errorStateMatcher]=\"matcher\"\n [multiple]=\"multiple\"\n >\n @if (nullLabel) {\n <mat-option [value]=\"null\">{{ nullLabel }}</mat-option>\n }\n @for (item of items | async; track item.value) {\n <mat-option [value]=\"item.value\" [disabled]=\"optionDisabled ? optionDisabled(item) : false\">\n {{ item.name }}\n </mat-option>\n }\n </mat-select>\n\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n\n @if (hasRequiredError()) {\n <mat-error i18n>Ce champ est requis</mat-error>\n } @else if (error) {\n <mat-error>{{ error }}</mat-error>\n }\n</mat-form-field>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
|
|
47
|
-
}], propDecorators: { enumName: [{
|
|
48
|
-
type: Input,
|
|
49
|
-
args: [{ required: true }]
|
|
50
|
-
}], nullLabel: [{
|
|
51
|
-
type: Input
|
|
52
|
-
}], optionDisabled: [{
|
|
53
|
-
type: Input
|
|
54
|
-
}], multiple: [{
|
|
55
|
-
type: Input
|
|
56
|
-
}] } });
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWVudW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvc2VsZWN0L3NlbGVjdC1lbnVtL3NlbGVjdC1lbnVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3QtZW51bS9zZWxlY3QtZW51bS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUF1QixXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQVEsa0JBQWtCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7QUFXaEUsTUFBTSxPQUFPLDBCQUEyQixTQUFRLGNBQTRCO0lBQ3ZELFdBQVcsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUUxRDs7T0FFRztJQUM2QixRQUFRLENBQVU7SUFFbEQ7O09BRUc7SUFDYSxTQUFTLENBQVU7SUFFbkM7O09BRUc7SUFDYSxjQUFjLENBQTRCO0lBRTFEOztPQUVHO0lBQ2EsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUUxQixLQUFLLENBQXVCO0lBRW5CLFFBQVE7UUFDcEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxZQUFZO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7dUdBaENRLDBCQUEwQjsyRkFBMUIsMEJBQTBCLHdOQ25CdkMsKzdCQTZCQSxvR0RaYyxrQkFBa0IsK2RBQUUsZUFBZSxtckJBQUUsV0FBVyxzSUFBRSxtQkFBbUIsaU5BQUUsWUFBWSxtRkFBRSxlQUFlOzsyRkFFckcsMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNJLHFCQUFxQixjQUduQixJQUFJLFdBQ1AsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxlQUFlLENBQUM7OEJBUS9FLFFBQVE7c0JBQXZDLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUtQLFNBQVM7c0JBQXhCLEtBQUs7Z0JBS1UsY0FBYztzQkFBN0IsS0FBSztnQkFLVSxRQUFRO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIGluamVjdCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SUVudW0sIE5hdHVyYWxFbnVtU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW51bS5zZXJ2aWNlJztcbmltcG9ydCB7QWJzdHJhY3RTZWxlY3R9IGZyb20gJy4uL2Fic3RyYWN0LXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHtNYXRPcHRpb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge01hdFNlbGVjdE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcblxudHlwZSBWYWx1ZSA9IElFbnVtWyd2YWx1ZSddIHwgSUVudW1bJ3ZhbHVlJ11bXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLXNlbGVjdC1lbnVtJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LWVudW0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9zZWxlY3QtZW51bS5jb21wb25lbnQuc2NzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGUsIE1hdE9wdGlvbk1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxTZWxlY3RFbnVtQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RTZWxlY3Q8VmFsdWUsIFZhbHVlPiBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW51bVNlcnZpY2UgPSBpbmplY3QoTmF0dXJhbEVudW1TZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUsIGVnOiBgXCJBY3Rpb25TdGF0dXNcImBcbiAgICAgKi9cbiAgICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSkgcHVibGljIGVudW1OYW1lITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWYgZ2l2ZW4gYW4gZXh0cmEgb3B0aW9uIGlzIGFkZGVkIHRvIHNlbGVjdCBgbnVsbGAgd2l0aCBnaXZlbiBsYWJlbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBudWxsTGFiZWw/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbnMgdGhhdCByZWNlaXZlcyBhbiBlbnVtIHZhbHVlIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhhdCB2YWx1ZSBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25EaXNhYmxlZD86IChpdGVtOiBJRW51bSkgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gc2VsZWN0IG11bHRpcGxlIG9wdGlvbnNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpdGVtcz86IE9ic2VydmFibGU8SUVudW1bXT47XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmVudW1TZXJ2aWNlLmdldCh0aGlzLmVudW1OYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGlzcGxheUZuKCk6IChpdGVtOiBWYWx1ZSB8IG51bGwpID0+IHN0cmluZyB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkJyk7XG4gICAgfVxufVxuIiwiPG1hdC1mb3JtLWZpZWxkIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nKClcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgPG1hdC1zZWxlY3RcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJwcm9wYWdhdGVWYWx1ZSgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImludGVybmFsQ3RybFwiXG4gICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgW2Vycm9yU3RhdGVNYXRjaGVyXT1cIm1hdGNoZXJcIlxuICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgID5cbiAgICAgICAgQGlmIChudWxsTGFiZWwpIHtcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJudWxsXCI+e3sgbnVsbExhYmVsIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMgfCBhc3luYzsgdHJhY2sgaXRlbS52YWx1ZSkge1xuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0udmFsdWVcIiBbZGlzYWJsZWRdPVwib3B0aW9uRGlzYWJsZWQgPyBvcHRpb25EaXNhYmxlZChpdGVtKSA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIH1cbiAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICBAaWYgKGhpbnQoKSkge1xuICAgICAgICA8bWF0LWhpbnQ+e3sgaGludCgpIH19PC9tYXQtaGludD5cbiAgICB9XG5cbiAgICBAaWYgKGhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgICA8bWF0LWVycm9yIGkxOG4+Q2UgY2hhbXAgZXN0IHJlcXVpczwvbWF0LWVycm9yPlxuICAgIH0gQGVsc2UgaWYgKGVycm9yKSB7XG4gICAgICAgIDxtYXQtZXJyb3I+e3sgZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICB9XG48L21hdC1mb3JtLWZpZWxkPlxuIl19
|