@meshmakers/shared-ui 3.2.7-0 → 3.2.10-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/meshmakers-shared-ui.mjs +55 -55
- package/fesm2022/meshmakers-shared-ui.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/lib/mm-autocomplete-input/mm-autocomplete-input.component.mjs +0 -302
- package/esm2022/lib/mm-breadcrumb/mm-breadcrumb.component.mjs +0 -113
- package/esm2022/lib/mm-confirmation-window/mm-confirmation-window.component.mjs +0 -75
- package/esm2022/lib/mm-entity-select-input/mm-entity-select-input.component.mjs +0 -305
- package/esm2022/lib/mm-file-upload/mm-file-upload.component.mjs +0 -103
- package/esm2022/lib/mm-message-details/mm-message-details.component.mjs +0 -26
- package/esm2022/lib/mm-multiple-entity-select-input/mm-multiple-entity-select-input.component.mjs +0 -316
- package/esm2022/lib/mm-notification-bar/mm-notification-bar.component.mjs +0 -41
- package/esm2022/lib/mm-progress-window/mm-progress-window.component.mjs +0 -34
- package/esm2022/lib/mm-shared-ui.module.mjs +0 -129
- package/esm2022/lib/mm-table-simple/mm-table-simple.component.mjs +0 -42
- package/esm2022/lib/models/abstractDetailsComponent.mjs +0 -53
- package/esm2022/lib/models/commonValidators.mjs +0 -36
- package/esm2022/lib/models/confirmation.mjs +0 -15
- package/esm2022/lib/models/progressValue.mjs +0 -9
- package/esm2022/lib/services/breadcrumbData.mjs +0 -11
- package/esm2022/lib/services/confirmation.service.mjs +0 -69
- package/esm2022/lib/services/file-upload.service.mjs +0 -38
- package/esm2022/lib/services/progress-notifier.service.mjs +0 -63
- package/esm2022/meshmakers-shared-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -19
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, forwardRef, HostBinding, Input, ViewChild } from "@angular/core";
|
|
2
|
-
import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
|
|
3
|
-
import { MatFormFieldControl } from "@angular/material/form-field";
|
|
4
|
-
import { Subject } from "rxjs";
|
|
5
|
-
import { debounceTime, filter, tap } from "rxjs/operators";
|
|
6
|
-
import { coerceBooleanProperty } from "@angular/cdk/coercion";
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/cdk/a11y";
|
|
9
|
-
import * as i2 from "@angular/common";
|
|
10
|
-
import * as i3 from "@angular/material/autocomplete";
|
|
11
|
-
import * as i4 from "@angular/material/core";
|
|
12
|
-
import * as i5 from "@angular/material/input";
|
|
13
|
-
import * as i6 from "@angular/material/progress-spinner";
|
|
14
|
-
import * as i7 from "@angular/forms";
|
|
15
|
-
export class MmEntitySelectInputComponent {
|
|
16
|
-
elRef;
|
|
17
|
-
injector;
|
|
18
|
-
fm;
|
|
19
|
-
static nextId = 0;
|
|
20
|
-
searchFormControl;
|
|
21
|
-
isLoading;
|
|
22
|
-
filteredEntities = [];
|
|
23
|
-
ngControl;
|
|
24
|
-
errorState;
|
|
25
|
-
focused;
|
|
26
|
-
stateChanges = new Subject();
|
|
27
|
-
id = `ia-entity-select-${MmEntitySelectInputComponent.nextId++}`;
|
|
28
|
-
valueChange = new EventEmitter();
|
|
29
|
-
_selectedEntity;
|
|
30
|
-
inputField;
|
|
31
|
-
describedBy = "";
|
|
32
|
-
activatedValue;
|
|
33
|
-
constructor(elRef, injector, fm) {
|
|
34
|
-
this.elRef = elRef;
|
|
35
|
-
this.injector = injector;
|
|
36
|
-
this.fm = fm;
|
|
37
|
-
this.ngControl = null;
|
|
38
|
-
this.errorState = false;
|
|
39
|
-
this.inputField = null;
|
|
40
|
-
this._dataSource = null;
|
|
41
|
-
this._placeholder = "";
|
|
42
|
-
this._prefix = "";
|
|
43
|
-
this.searchFormControl = new FormControl();
|
|
44
|
-
this.isLoading = false;
|
|
45
|
-
this._disabled = false;
|
|
46
|
-
this.focused = false;
|
|
47
|
-
fm.monitor(elRef.nativeElement, true).subscribe((origin) => {
|
|
48
|
-
this.focused = !!origin;
|
|
49
|
-
this.stateChanges.next();
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
_dataSource;
|
|
53
|
-
get dataSource() {
|
|
54
|
-
return this._dataSource;
|
|
55
|
-
}
|
|
56
|
-
set dataSource(value) {
|
|
57
|
-
this._dataSource = value;
|
|
58
|
-
}
|
|
59
|
-
_disabled = false;
|
|
60
|
-
get disabled() {
|
|
61
|
-
return this._disabled;
|
|
62
|
-
}
|
|
63
|
-
set disabled(dis) {
|
|
64
|
-
this._disabled = coerceBooleanProperty(dis);
|
|
65
|
-
if (this._disabled) {
|
|
66
|
-
this.searchFormControl.disable();
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
this.searchFormControl.enable();
|
|
70
|
-
}
|
|
71
|
-
this.stateChanges.next();
|
|
72
|
-
}
|
|
73
|
-
_placeholder;
|
|
74
|
-
get placeholder() {
|
|
75
|
-
return this._placeholder;
|
|
76
|
-
}
|
|
77
|
-
set placeholder(plh) {
|
|
78
|
-
this._placeholder = plh;
|
|
79
|
-
this.stateChanges.next();
|
|
80
|
-
}
|
|
81
|
-
_required = false;
|
|
82
|
-
get required() {
|
|
83
|
-
return this._required;
|
|
84
|
-
}
|
|
85
|
-
set required(req) {
|
|
86
|
-
this._required = coerceBooleanProperty(req);
|
|
87
|
-
if (this.inputField != null) {
|
|
88
|
-
this.inputField.required = this._required;
|
|
89
|
-
}
|
|
90
|
-
this.stateChanges.next();
|
|
91
|
-
}
|
|
92
|
-
_prefix;
|
|
93
|
-
get prefix() {
|
|
94
|
-
return this._prefix;
|
|
95
|
-
}
|
|
96
|
-
set prefix(value) {
|
|
97
|
-
if (value !== this._prefix) {
|
|
98
|
-
this._prefix = value;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
get value() {
|
|
102
|
-
return this._selectedEntity;
|
|
103
|
-
}
|
|
104
|
-
set value(value) {
|
|
105
|
-
if (value !== this._selectedEntity) {
|
|
106
|
-
this.searchFormControl.setValue(value);
|
|
107
|
-
this.setValue(value);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
get empty() {
|
|
111
|
-
const n = this.searchFormControl.value;
|
|
112
|
-
return !n;
|
|
113
|
-
}
|
|
114
|
-
get shouldLabelFloat() {
|
|
115
|
-
return this.focused || !this.empty;
|
|
116
|
-
}
|
|
117
|
-
ngOnInit() {
|
|
118
|
-
this.ngControl = this.injector.get(NgControl, null);
|
|
119
|
-
if (this.ngControl != null) {
|
|
120
|
-
this.ngControl.valueAccessor = this;
|
|
121
|
-
}
|
|
122
|
-
// If prefix defined, usually this is used for a code scanner.
|
|
123
|
-
// The goal is to select the entity in direct way.
|
|
124
|
-
if (this._prefix) {
|
|
125
|
-
this.searchFormControl.valueChanges
|
|
126
|
-
.pipe(debounceTime(300), filter((value) => typeof value === "string"), filter((value) => value.startsWith(this._prefix)), tap(() => (this.value = null)), tap(() => (this.isLoading = true)))
|
|
127
|
-
.subscribe(async (value) => {
|
|
128
|
-
if (!this._dataSource) {
|
|
129
|
-
this.isLoading = false;
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const resultSet = await this._dataSource?.onFilter(value.replace(this._prefix, "").trim());
|
|
133
|
-
if (resultSet.list) {
|
|
134
|
-
if (resultSet.list.length === 1) {
|
|
135
|
-
this.value = resultSet.list[0];
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
this.filteredEntities = resultSet.list;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
this.isLoading = false;
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
// This is the search functionality when search by human.
|
|
145
|
-
this.searchFormControl.valueChanges
|
|
146
|
-
.pipe(debounceTime(300), tap(() => (this.filteredEntities = [])), filter((value) => typeof value === "string"), tap(() => {
|
|
147
|
-
this.setValue(null);
|
|
148
|
-
}), filter((value) => value.toString().length >= 3), tap(() => (this.isLoading = true)))
|
|
149
|
-
.subscribe(async (value) => {
|
|
150
|
-
if (!this._dataSource) {
|
|
151
|
-
this.isLoading = false;
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
const resultSet = await this._dataSource.onFilter(value);
|
|
155
|
-
if (resultSet?.list) {
|
|
156
|
-
this.filteredEntities = resultSet.list;
|
|
157
|
-
}
|
|
158
|
-
this.isLoading = false;
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
ngOnDestroy() {
|
|
162
|
-
this.stateChanges.complete();
|
|
163
|
-
this.fm.stopMonitoring(this.elRef.nativeElement);
|
|
164
|
-
}
|
|
165
|
-
ngDoCheck() {
|
|
166
|
-
if (this.ngControl != null) {
|
|
167
|
-
this.errorState = (this.ngControl.invalid && this.ngControl.touched) ?? false;
|
|
168
|
-
this.stateChanges.next();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
clear() {
|
|
172
|
-
this.filteredEntities = [];
|
|
173
|
-
this.searchFormControl.reset(null);
|
|
174
|
-
}
|
|
175
|
-
focus() {
|
|
176
|
-
this.elRef.nativeElement.querySelector("input")?.focus();
|
|
177
|
-
}
|
|
178
|
-
onEntitySelected(event) {
|
|
179
|
-
this.value = event.option.value;
|
|
180
|
-
this.filteredEntities = [];
|
|
181
|
-
}
|
|
182
|
-
onEntityActivated(event) {
|
|
183
|
-
this.activatedValue = event.option?.value;
|
|
184
|
-
}
|
|
185
|
-
onEntityClosed() {
|
|
186
|
-
if (this.activatedValue) {
|
|
187
|
-
this.value = this.activatedValue;
|
|
188
|
-
this.activatedValue = null;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
reset() {
|
|
192
|
-
this.value = null;
|
|
193
|
-
}
|
|
194
|
-
onFocusOut() {
|
|
195
|
-
if (this.filteredEntities.length === 1) {
|
|
196
|
-
this.activatedValue = this.filteredEntities[0];
|
|
197
|
-
this.value = this.filteredEntities[0];
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
onTouched() {
|
|
201
|
-
this._onTouched();
|
|
202
|
-
this.stateChanges.next();
|
|
203
|
-
}
|
|
204
|
-
registerOnChange(fn) {
|
|
205
|
-
this._propagateChange = fn;
|
|
206
|
-
}
|
|
207
|
-
registerOnTouched(fn) {
|
|
208
|
-
this.onTouched = fn;
|
|
209
|
-
}
|
|
210
|
-
writeValue(obj) {
|
|
211
|
-
this.clear();
|
|
212
|
-
this.value = obj;
|
|
213
|
-
}
|
|
214
|
-
setDisabledState(isDisabled) {
|
|
215
|
-
this.disabled = isDisabled;
|
|
216
|
-
}
|
|
217
|
-
onContainerClick(event) {
|
|
218
|
-
if (event.target.tagName.toLowerCase() !== "input") {
|
|
219
|
-
this.focus();
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
setDescribedByIds(ids) {
|
|
223
|
-
this.describedBy = ids.join(" ");
|
|
224
|
-
}
|
|
225
|
-
validate(control) {
|
|
226
|
-
const selection = control.value;
|
|
227
|
-
if (typeof selection === "string") {
|
|
228
|
-
return { incorrect: true };
|
|
229
|
-
}
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
_propagateChange = (_) => {
|
|
233
|
-
};
|
|
234
|
-
_onTouched = () => {
|
|
235
|
-
};
|
|
236
|
-
setValue(value) {
|
|
237
|
-
if (value !== this._selectedEntity) {
|
|
238
|
-
this._selectedEntity = value;
|
|
239
|
-
this.valueChange.emit(value);
|
|
240
|
-
this._propagateChange(this._selectedEntity);
|
|
241
|
-
this.stateChanges.next();
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MmEntitySelectInputComponent, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component });
|
|
245
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MmEntitySelectInputComponent, selector: "mm-entity-select", inputs: { dataSource: "dataSource", disabled: "disabled", placeholder: "placeholder", required: "required", prefix: "prefix" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [
|
|
246
|
-
{
|
|
247
|
-
provide: NG_VALUE_ACCESSOR,
|
|
248
|
-
useExisting: forwardRef(() => MmEntitySelectInputComponent),
|
|
249
|
-
multi: true
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
provide: MatFormFieldControl,
|
|
253
|
-
useExisting: MmEntitySelectInputComponent
|
|
254
|
-
},
|
|
255
|
-
{
|
|
256
|
-
provide: NG_VALIDATORS,
|
|
257
|
-
useExisting: forwardRef(() => MmEntitySelectInputComponent),
|
|
258
|
-
multi: true
|
|
259
|
-
}
|
|
260
|
-
], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.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: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { 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: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
|
|
261
|
-
}
|
|
262
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MmEntitySelectInputComponent, decorators: [{
|
|
263
|
-
type: Component,
|
|
264
|
-
args: [{ selector: "mm-entity-select", host: {
|
|
265
|
-
"[id]": "id",
|
|
266
|
-
"[attr.aria-describedby]": "describedBy"
|
|
267
|
-
}, providers: [
|
|
268
|
-
{
|
|
269
|
-
provide: NG_VALUE_ACCESSOR,
|
|
270
|
-
useExisting: forwardRef(() => MmEntitySelectInputComponent),
|
|
271
|
-
multi: true
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
provide: MatFormFieldControl,
|
|
275
|
-
useExisting: MmEntitySelectInputComponent
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
provide: NG_VALIDATORS,
|
|
279
|
-
useExisting: forwardRef(() => MmEntitySelectInputComponent),
|
|
280
|
-
multi: true
|
|
281
|
-
}
|
|
282
|
-
], template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\" (closed)=\"onEntityClosed()\"\n (optionActivated)=\"onEntityActivated($event)\" (optionSelected)=\"onEntitySelected($event)\"\n [displayWith]=\"dataSource?.onDisplayEntity ?? null\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let entity of filteredEntities\" [value]=\"entity\">\n {{dataSource?.onDisplayEntity(entity) ?? null}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"] }]
|
|
283
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.FocusMonitor }], propDecorators: { id: [{
|
|
284
|
-
type: HostBinding
|
|
285
|
-
}], inputField: [{
|
|
286
|
-
type: ViewChild,
|
|
287
|
-
args: ["input"]
|
|
288
|
-
}], describedBy: [{
|
|
289
|
-
type: HostBinding,
|
|
290
|
-
args: ["attr.aria-describedby"]
|
|
291
|
-
}], dataSource: [{
|
|
292
|
-
type: Input
|
|
293
|
-
}], disabled: [{
|
|
294
|
-
type: Input
|
|
295
|
-
}], placeholder: [{
|
|
296
|
-
type: Input
|
|
297
|
-
}], required: [{
|
|
298
|
-
type: Input
|
|
299
|
-
}], prefix: [{
|
|
300
|
-
type: Input
|
|
301
|
-
}], shouldLabelFloat: [{
|
|
302
|
-
type: HostBinding,
|
|
303
|
-
args: ["class.floating"]
|
|
304
|
-
}] } });
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW0tZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL21tLWVudGl0eS1zZWxlY3QtaW5wdXQvbW0tZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL21tLWVudGl0eS1zZWxlY3QtaW5wdXQvbW0tZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUVYLEtBQUssRUFHTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFNBQVMsRUFHVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR25FLE9BQU8sRUFBTSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkMsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQWEsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7OztBQTJCOUQsTUFBTSxPQUFPLDRCQUE0QjtJQW1COUI7SUFDVTtJQUNBO0lBcEJYLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsaUJBQWlCLENBQWM7SUFDeEMsU0FBUyxDQUFVO0lBQ25CLGdCQUFnQixHQUFVLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQW1CO0lBQzVCLFVBQVUsQ0FBVTtJQUNwQixPQUFPLENBQVU7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QUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDO2dCQUMzRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsK0hDdkRILDR4QkFjQTs7NEZEMkNhLDRCQUE0QjtrQkF6QnhDLFNBQVM7K0JBQ0Usa0JBQWtCLFFBR3RCO3dCQUNKLE1BQU0sRUFBRSxJQUFJO3dCQUNaLHlCQUF5QixFQUFFLGFBQWE7cUJBQ3pDLGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLENBQUM7NEJBQzNELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcsOEJBQThCO3lCQUMxQzt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLENBQUM7NEJBQzNELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lJQVllLEVBQUU7c0JBRGpCLFdBQVc7Z0JBS3lCLFVBQVU7c0JBQTlDLFNBQVM7dUJBQUMsT0FBTztnQkFDNEIsV0FBVztzQkFBeEQsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBZ0N6QixVQUFVO3NCQURwQixLQUFLO2dCQVFLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBa0JLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBYUssUUFBUTtzQkFEbEIsS0FBSztnQkFnQkssTUFBTTtzQkFEaEIsS0FBSztnQkE0QkssZ0JBQWdCO3NCQUQxQixXQUFXO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xuaW1wb3J0IHsgRW50aXR5U2VsZWN0RGF0YVNvdXJjZSwgUGFnZWRSZXN1bHREdG8gfSBmcm9tIFwiQG1lc2htYWtlcnMvc2hhcmVkLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBvZiwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlQWN0aXZhdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlXCI7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvZXJjaW9uXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJtbS1lbnRpdHktc2VsZWN0XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbW0tZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbW0tZW50aXR5LXNlbGVjdC1pbnB1dC5jb21wb25lbnQuY3NzXCJdLFxuICBob3N0OiB7XG4gICAgXCJbaWRdXCI6IFwiaWRcIixcbiAgICBcIlthdHRyLmFyaWEtZGVzY3JpYmVkYnldXCI6IFwiZGVzY3JpYmVkQnlcIlxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1tRW50aXR5U2VsZWN0SW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsXG4gICAgICB1c2VFeGlzdGluZzogTW1FbnRpdHlTZWxlY3RJbnB1dENvbXBvbmVudFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1tRW50aXR5U2VsZWN0SW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTW1FbnRpdHlTZWxlY3RJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTWF0Rm9ybUZpZWxkQ29udHJvbDxhbnk+LCBWYWxpZGF0b3Ige1xuICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xuICBwdWJsaWMgZmlsdGVyZWRFbnRpdGllczogYW55W10gPSBbXTtcbiAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbDtcbiAgcHVibGljIGVycm9yU3RhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgQEhvc3RCaW5kaW5nKClcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gYGlhLWVudGl0eS1zZWxlY3QtJHtNbUVudGl0eVNlbGVjdElucHV0Q29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgcHVibGljIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwcml2YXRlIF9zZWxlY3RlZEVudGl0eTogYW55O1xuICBAVmlld0NoaWxkKFwiaW5wdXRcIikgcHJpdmF0ZSByZWFkb25seSBpbnB1dEZpZWxkOiBNYXRJbnB1dCB8IG51bGw7XG4gIEBIb3N0QmluZGluZyhcImF0dHIuYXJpYS1kZXNjcmliZWRieVwiKSBwcml2YXRlIGRlc2NyaWJlZEJ5ID0gXCJcIjtcbiAgcHJpdmF0ZSBhY3RpdmF0ZWRWYWx1ZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmbTogRm9jdXNNb25pdG9yXG4gICkge1xuICAgIHRoaXMubmdDb250cm9sID0gbnVsbDtcbiAgICB0aGlzLmVycm9yU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLmlucHV0RmllbGQgPSBudWxsO1xuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gXCJcIjtcbiAgICB0aGlzLl9wcmVmaXggPSBcIlwiO1xuXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICBmbS5tb25pdG9yKGVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRydWUpLnN1YnNjcmliZSgob3JpZ2luKSA9PiB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSAhIW9yaWdpbjtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGFTb3VyY2U6IEVudGl0eVNlbGVjdERhdGFTb3VyY2U8YW55PiB8IG51bGw7XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IEVudGl0eVNlbGVjdERhdGFTb3VyY2U8YW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhU291cmNlKHZhbHVlOiBFbnRpdHlTZWxlY3REYXRhU291cmNlPGFueT4gfCBudWxsKSB7XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQoZGlzKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoZGlzKTtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLmVuYWJsZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0IHBsYWNlaG9sZGVyKHBsaCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gcGxoO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHJlcSkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHJlcSk7XG4gICAgaWYgKHRoaXMuaW5wdXRGaWVsZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmlucHV0RmllbGQucmVxdWlyZWQgPSB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlZml4OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZml4O1xuICB9XG5cbiAgcHVibGljIHNldCBwcmVmaXgodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fcHJlZml4KSB7XG4gICAgICB0aGlzLl9wcmVmaXggPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRW50aXR5O1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9zZWxlY3RlZEVudGl0eSkge1xuICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG4gPSB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnZhbHVlO1xuICAgIHJldHVybiAhbjtcbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmZsb2F0aW5nXCIpXG4gIHB1YmxpYyBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiBwcmVmaXggZGVmaW5lZCwgdXN1YWxseSB0aGlzIGlzIHVzZWQgZm9yIGEgY29kZSBzY2FubmVyLlxuICAgIC8vIFRoZSBnb2FsIGlzIHRvIHNlbGVjdCB0aGUgZW50aXR5IGluIGRpcmVjdCB3YXkuXG4gICAgaWYgKHRoaXMuX3ByZWZpeCkge1xuICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSxcbiAgICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5zdGFydHNXaXRoKHRoaXMuX3ByZWZpeCkpLFxuICAgICAgICAgIHRhcCgoKSA9PiAodGhpcy52YWx1ZSA9IG51bGwpKSxcbiAgICAgICAgICB0YXAoKCkgPT4gKHRoaXMuaXNMb2FkaW5nID0gdHJ1ZSkpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXG4gICAgICAgICAgaWYgKCF0aGlzLl9kYXRhU291cmNlKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVzdWx0U2V0ID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZT8ub25GaWx0ZXIodmFsdWUucmVwbGFjZSh0aGlzLl9wcmVmaXgsIFwiXCIpLnRyaW0oKSk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0U2V0Lmxpc3QpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRTZXQubGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHJlc3VsdFNldC5saXN0WzBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEVudGl0aWVzID0gcmVzdWx0U2V0Lmxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IHdoZW4gc2VhcmNoIGJ5IGh1bWFuLlxuICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgIHRhcCgoKSA9PiAodGhpcy5maWx0ZXJlZEVudGl0aWVzID0gW10pKSxcbiAgICAgICAgZmlsdGVyKCh2YWx1ZTogYW55KSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+PSAzKSxcbiAgICAgICAgdGFwKCgpID0+ICh0aGlzLmlzTG9hZGluZyA9IHRydWUpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAodmFsdWUgOiBzdHJpbmcpID0+IHtcblxuICAgICAgICBpZiAoIXRoaXMuX2RhdGFTb3VyY2UpXG4gICAgICAgIHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdFNldCA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2Uub25GaWx0ZXIodmFsdWUpO1xuXG4gICAgICAgIGlmIChyZXN1bHRTZXQ/Lmxpc3QpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSByZXN1bHRTZXQubGlzdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZm0uc3RvcE1vbml0b3JpbmcodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xuICAgICAgdGhpcy5lcnJvclN0YXRlID0gKHRoaXMubmdDb250cm9sLmludmFsaWQgJiYgdGhpcy5uZ0NvbnRyb2wudG91Y2hlZCkgPz8gZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRFbnRpdGllcyA9IFtdO1xuICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wucmVzZXQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKT8uZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eVNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICB0aGlzLmZpbHRlcmVkRW50aXRpZXMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eUFjdGl2YXRlZChldmVudDogTWF0QXV0b2NvbXBsZXRlQWN0aXZhdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gZXZlbnQub3B0aW9uPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVudGl0eUNsb3NlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmF0ZWRWYWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuYWN0aXZhdGVkVmFsdWU7XG4gICAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1c091dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWx0ZXJlZEVudGl0aWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5hY3RpdmF0ZWRWYWx1ZSA9IHRoaXMuZmlsdGVyZWRFbnRpdGllc1swXTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmZpbHRlcmVkRW50aXRpZXNbMF07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaW5wdXRcIikge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKFwiIFwiKTtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb246IGFueSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IGluY29ycmVjdDogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpOiB2b2lkID0+IHtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9zZWxlY3RlZEVudGl0eSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkgPSB2YWx1ZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UodGhpcy5fc2VsZWN0ZWRFbnRpdHkpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGlucHV0ICNpbnB1dCAoYmx1cik9XCJvblRvdWNoZWQoKVwiIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIiBbZm9ybUNvbnRyb2xdPVwic2VhcmNoRm9ybUNvbnRyb2xcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIG1hdElucHV0PlxuPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAoY2xvc2VkKT1cIm9uRW50aXR5Q2xvc2VkKClcIlxuICAgICAgICAgICAgICAgICAgKG9wdGlvbkFjdGl2YXRlZCk9XCJvbkVudGl0eUFjdGl2YXRlZCgkZXZlbnQpXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uRW50aXR5U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZGF0YVNvdXJjZT8ub25EaXNwbGF5RW50aXR5ID8/IG51bGxcIj5cbiAgPG1hdC1vcHRpb24gKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImlzLWxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gIDwvbWF0LW9wdGlvbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZW50aXR5IG9mIGZpbHRlcmVkRW50aXRpZXNcIiBbdmFsdWVdPVwiZW50aXR5XCI+XG4gICAgICB7e2RhdGFTb3VyY2U/Lm9uRGlzcGxheUVudGl0eShlbnRpdHkpID8/IG51bGx9fVxuICAgIDwvbWF0LW9wdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG48L21hdC1hdXRvY29tcGxldGU+XG4iXX0=
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, signal, ViewChild } from "@angular/core";
|
|
2
|
-
import { MAT_DIALOG_DATA } from "@angular/material/dialog";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/material/dialog";
|
|
5
|
-
import * as i2 from "@angular/material/snack-bar";
|
|
6
|
-
import * as i3 from "@angular/common";
|
|
7
|
-
import * as i4 from "@angular/material/button";
|
|
8
|
-
import * as i5 from "@angular/material/icon";
|
|
9
|
-
export class MmFileUploadComponent {
|
|
10
|
-
dialogRef;
|
|
11
|
-
data;
|
|
12
|
-
snackBar;
|
|
13
|
-
fileName = signal('');
|
|
14
|
-
fileSize = signal(0);
|
|
15
|
-
uploadProgress = signal(0);
|
|
16
|
-
fileInput;
|
|
17
|
-
selectedFile = null;
|
|
18
|
-
uploadSuccess;
|
|
19
|
-
uploadError;
|
|
20
|
-
constructor(dialogRef, data, snackBar) {
|
|
21
|
-
this.dialogRef = dialogRef;
|
|
22
|
-
this.data = data;
|
|
23
|
-
this.snackBar = snackBar;
|
|
24
|
-
this.uploadError = false;
|
|
25
|
-
this.uploadSuccess = false;
|
|
26
|
-
}
|
|
27
|
-
// Handler for file input change
|
|
28
|
-
onFileChange(event) {
|
|
29
|
-
const file = event.target.files[0];
|
|
30
|
-
this.uploadFile(file);
|
|
31
|
-
}
|
|
32
|
-
// Handler for the file drop
|
|
33
|
-
onFileDrop(event) {
|
|
34
|
-
event.preventDefault();
|
|
35
|
-
const file = event.dataTransfer?.files[0];
|
|
36
|
-
this.uploadFile(file);
|
|
37
|
-
}
|
|
38
|
-
// Prevent default dragover behavior
|
|
39
|
-
onDragOver(event) {
|
|
40
|
-
event.preventDefault();
|
|
41
|
-
}
|
|
42
|
-
// Method to handle file upload
|
|
43
|
-
uploadFile(file) {
|
|
44
|
-
const allowedMimeTypes = this.data.mimeTypes.split(',').map((mimeType) => mimeType.trim());
|
|
45
|
-
const allowedFileExtensions = this.data.fileExtensions?.split(',').map((mimeType) => mimeType.trim()) ?? [];
|
|
46
|
-
if (!file) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
console.log("type: " + file.type);
|
|
50
|
-
console.log("name: " + file.name);
|
|
51
|
-
const extension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();
|
|
52
|
-
console.log("extension: " + extension);
|
|
53
|
-
if (allowedFileExtensions.includes(extension) || allowedMimeTypes.includes(file.type)) {
|
|
54
|
-
this.selectedFile = file;
|
|
55
|
-
this.fileSize.set(Math.round(file.size / 1024)); // Set file size in KB
|
|
56
|
-
this.uploadSuccess = true;
|
|
57
|
-
this.uploadError = false;
|
|
58
|
-
this.fileName.set(file.name); // Set image name
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
this.uploadSuccess = false;
|
|
62
|
-
this.uploadError = true;
|
|
63
|
-
this.snackBar.open('File type not supported!', 'Close', {
|
|
64
|
-
duration: 3000,
|
|
65
|
-
panelClass: 'error',
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Method to remove a file
|
|
70
|
-
removeFile() {
|
|
71
|
-
this.selectedFile = null;
|
|
72
|
-
this.fileName.set('');
|
|
73
|
-
this.fileSize.set(0);
|
|
74
|
-
this.uploadSuccess = false;
|
|
75
|
-
this.uploadError = false;
|
|
76
|
-
this.uploadProgress.set(0);
|
|
77
|
-
}
|
|
78
|
-
onOk() {
|
|
79
|
-
this.dialogRef.close({
|
|
80
|
-
success: true,
|
|
81
|
-
selectedFile: this.selectedFile
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
onCancel() {
|
|
85
|
-
this.dialogRef.close({
|
|
86
|
-
success: false,
|
|
87
|
-
selectedFile: null
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MmFileUploadComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MmFileUploadComponent, selector: "mm-mm-file-upload", viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<h1 mat-dialog-title>{{data.title}}</h1>\n<div\n class=\"file-upload-wrapper\"\n [class.success]=\"uploadSuccess\"\n [class.error]=\"uploadError\"\n (drop)=\"onFileDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n>\n <input\n type=\"file\"\n accept=\"{{data.fileExtensions}}\"\n (change)=\"onFileChange($event)\"\n hidden\n #fileInput\n />\n <div class=\"file-dropper\" (click)=\"fileInput.click()\">\n <mat-icon class=\"material-symbols-outlined\">upload</mat-icon>\n <p>{{data.message}}</p>\n <div *ngIf=\"fileName()\">\n <div *ngIf=\"selectedFile\">\n <p>\n <span class=\"image-name\">{{ fileName() }}</span> ({{\n fileSize()\n }} KB)\n </p>\n <mat-icon class=\"material-symbols-outlined delete-icon\" (click)=\"removeFile()\">delete</mat-icon>\n </div>\n </div>\n </div>\n</div>\n<div style=\"justify-content: flex-end;\" mat-dialog-actions>\n <button (click)=\"onOk()\" [disabled]=\"!selectedFile\" mat-flat-button>Upload</button>\n <button (click)=\"onCancel()\" mat-button>Cancel</button>\n</div>\n\n", styles: [".file-upload-wrapper{display:flex;justify-content:center;align-items:center;flex-direction:column;border:2px dashed #ccc;padding:1rem;margin-bottom:1rem;margin-left:1rem;margin-right:1rem;border-radius:10px;cursor:pointer}.file-upload-wrapper.success{border-color:green}.file-upload-wrapper.error{border-color:red}.file-dropper{display:flex;flex-direction:column;align-items:center}.image-name{font-weight:700}.image-preview{max-width:100%;height:auto;margin-bottom:.5rem;border-radius:10px}.delete-icon{cursor:pointer;color:red}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
92
|
-
}
|
|
93
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MmFileUploadComponent, decorators: [{
|
|
94
|
-
type: Component,
|
|
95
|
-
args: [{ selector: 'mm-mm-file-upload', template: "<h1 mat-dialog-title>{{data.title}}</h1>\n<div\n class=\"file-upload-wrapper\"\n [class.success]=\"uploadSuccess\"\n [class.error]=\"uploadError\"\n (drop)=\"onFileDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n>\n <input\n type=\"file\"\n accept=\"{{data.fileExtensions}}\"\n (change)=\"onFileChange($event)\"\n hidden\n #fileInput\n />\n <div class=\"file-dropper\" (click)=\"fileInput.click()\">\n <mat-icon class=\"material-symbols-outlined\">upload</mat-icon>\n <p>{{data.message}}</p>\n <div *ngIf=\"fileName()\">\n <div *ngIf=\"selectedFile\">\n <p>\n <span class=\"image-name\">{{ fileName() }}</span> ({{\n fileSize()\n }} KB)\n </p>\n <mat-icon class=\"material-symbols-outlined delete-icon\" (click)=\"removeFile()\">delete</mat-icon>\n </div>\n </div>\n </div>\n</div>\n<div style=\"justify-content: flex-end;\" mat-dialog-actions>\n <button (click)=\"onOk()\" [disabled]=\"!selectedFile\" mat-flat-button>Upload</button>\n <button (click)=\"onCancel()\" mat-button>Cancel</button>\n</div>\n\n", styles: [".file-upload-wrapper{display:flex;justify-content:center;align-items:center;flex-direction:column;border:2px dashed #ccc;padding:1rem;margin-bottom:1rem;margin-left:1rem;margin-right:1rem;border-radius:10px;cursor:pointer}.file-upload-wrapper.success{border-color:green}.file-upload-wrapper.error{border-color:red}.file-dropper{display:flex;flex-direction:column;align-items:center}.image-name{font-weight:700}.image-preview{max-width:100%;height:auto;margin-bottom:.5rem;border-radius:10px}.delete-icon{cursor:pointer;color:red}\n"] }]
|
|
96
|
-
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
97
|
-
type: Inject,
|
|
98
|
-
args: [MAT_DIALOG_DATA]
|
|
99
|
-
}] }, { type: i2.MatSnackBar }], propDecorators: { fileInput: [{
|
|
100
|
-
type: ViewChild,
|
|
101
|
-
args: ['fileInput']
|
|
102
|
-
}] } });
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW0tZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVzaG1ha2Vycy9zaGFyZWQtdWkvc3JjL2xpYi9tbS1maWxlLXVwbG9hZC9tbS1maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL21tLWZpbGUtdXBsb2FkL21tLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQVN6RSxNQUFNLE9BQU8scUJBQXFCO0lBV2I7SUFDa0I7SUFDM0I7SUFaQSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNILFNBQVMsQ0FBeUI7SUFDMUQsWUFBWSxHQUFnQixJQUFJLENBQUM7SUFDakMsYUFBYSxDQUFVO0lBQ3ZCLFdBQVcsQ0FBVTtJQUcvQixZQUNtQixTQUE4QyxFQUM1QixJQUFvQixFQUMvQyxRQUFxQjtRQUZaLGNBQVMsR0FBVCxTQUFTLENBQXFDO1FBQzVCLFNBQUksR0FBSixJQUFJLENBQWdCO1FBQy9DLGFBQVEsR0FBUixRQUFRLENBQWE7UUFFN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxZQUFZLENBQUMsS0FBVTtR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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUU7WUFDcEIsT0FBTyxFQUFFLElBQUk7WUFDYixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDWCxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBRTtZQUNwQixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxJQUFJO1NBQ0UsQ0FBQyxDQUFDO0lBQzFCLENBQUM7d0dBeEZVLHFCQUFxQiw4Q0FZdEIsZUFBZTs0RkFaZCxxQkFBcUIsaUtDVmxDLHNsQ0FtQ0E7OzRGRHpCYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1COzswQkFnQjFCLE1BQU07MkJBQUMsZUFBZTttRUFSUyxTQUFTO3NCQUExQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgc2lnbmFsLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XG5pbXBvcnQgeyBGaWxlVXBsb2FkRGF0YSwgRmlsZVVwbG9hZFJlc3VsdCB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlybWF0aW9uXCI7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW0tbW0tZmlsZS11cGxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW0tZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbW0tZmlsZS11cGxvYWQuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTW1GaWxlVXBsb2FkQ29tcG9uZW50ICB7XG4gIHByb3RlY3RlZCBmaWxlTmFtZSA9IHNpZ25hbCgnJyk7XG4gIHByb3RlY3RlZCBmaWxlU2l6ZSA9IHNpZ25hbCgwKTtcbiAgcHJvdGVjdGVkIHVwbG9hZFByb2dyZXNzID0gc2lnbmFsKDApO1xuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKSBwcm90ZWN0ZWQgZmlsZUlucHV0OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCB1cGxvYWRTdWNjZXNzOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgdXBsb2FkRXJyb3I6IGJvb2xlYW47XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE1tRmlsZVVwbG9hZENvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByb3RlY3RlZCBkYXRhOiBGaWxlVXBsb2FkRGF0YSxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhclxuICApIHtcbiAgICB0aGlzLnVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgdGhpcy51cGxvYWRTdWNjZXNzID0gZmFsc2U7XG4gIH1cblxuICAvLyBIYW5kbGVyIGZvciBmaWxlIGlucHV0IGNoYW5nZVxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF0gYXMgRmlsZSB8IG51bGw7XG4gICAgdGhpcy51cGxvYWRGaWxlKGZpbGUpO1xuICB9XG5cbiAgLy8gSGFuZGxlciBmb3IgdGhlIGZpbGUgZHJvcFxuICBvbkZpbGVEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzWzBdIGFzIEZpbGUgfCBudWxsO1xuICAgIHRoaXMudXBsb2FkRmlsZShmaWxlKTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgZGVmYXVsdCBkcmFnb3ZlciBiZWhhdmlvclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLy8gTWV0aG9kIHRvIGhhbmRsZSBmaWxlIHVwbG9hZFxuICB1cGxvYWRGaWxlKGZpbGU6IEZpbGUgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgYWxsb3dlZE1pbWVUeXBlcyA9IHRoaXMuZGF0YS5taW1lVHlwZXMuc3BsaXQoJywnKS5tYXAoKG1pbWVUeXBlKSA9PiBtaW1lVHlwZS50cmltKCkpO1xuICAgIGNvbnN0IGFsbG93ZWRGaWxlRXh0ZW5zaW9ucyA9IHRoaXMuZGF0YS5maWxlRXh0ZW5zaW9ucz8uc3BsaXQoJywnKS5tYXAoKG1pbWVUeXBlKSA9PiBtaW1lVHlwZS50cmltKCkpID8/IFtdO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcInR5cGU6IFwiICsgZmlsZS50eXBlKTtcbiAgICBjb25zb2xlLmxvZyhcIm5hbWU6IFwiICsgZmlsZS5uYW1lKTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlLm5hbWUuc3Vic3RyaW5nKGZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnNvbGUubG9nKFwiZXh0ZW5zaW9uOiBcIiArIGV4dGVuc2lvbik7XG5cbiAgICBpZiAoYWxsb3dlZEZpbGVFeHRlbnNpb25zLmluY2x1ZGVzKGV4dGVuc2lvbikgfHwgYWxsb3dlZE1pbWVUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XG4gICAgICB0aGlzLmZpbGVTaXplLnNldChNYXRoLnJvdW5kKGZpbGUuc2l6ZSAvIDEwMjQpKTsgLy8gU2V0IGZpbGUgc2l6ZSBpbiBLQlxuXG4gICAgICB0aGlzLnVwbG9hZFN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5maWxlTmFtZS5zZXQoZmlsZS5uYW1lKTsgLy8gU2V0IGltYWdlIG5hbWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGxvYWRTdWNjZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmlsZSB0eXBlIG5vdCBzdXBwb3J0ZWQhJywgJ0Nsb3NlJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcGFuZWxDbGFzczogJ2Vycm9yJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1ldGhvZCB0byByZW1vdmUgYSBmaWxlXG4gIHJlbW92ZUZpbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xuICAgIHRoaXMuZmlsZU5hbWUuc2V0KCcnKTtcbiAgICB0aGlzLmZpbGVTaXplLnNldCgwKTtcbiAgICB0aGlzLnVwbG9hZFN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLnVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgdGhpcy51cGxvYWRQcm9ncmVzcy5zZXQoMCk7XG4gIH1cblxuICBvbk9rKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCh7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2VsZWN0ZWRGaWxlOiB0aGlzLnNlbGVjdGVkRmlsZVxuICAgIH0gYXMgRmlsZVVwbG9hZFJlc3VsdCkpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgc2VsZWN0ZWRGaWxlOiBudWxsXG4gICAgfSBhcyBGaWxlVXBsb2FkUmVzdWx0KSk7XG4gIH1cbn1cbiIsIjxoMSBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS50aXRsZX19PC9oMT5cbjxkaXZcbiAgY2xhc3M9XCJmaWxlLXVwbG9hZC13cmFwcGVyXCJcbiAgW2NsYXNzLnN1Y2Nlc3NdPVwidXBsb2FkU3VjY2Vzc1wiXG4gIFtjbGFzcy5lcnJvcl09XCJ1cGxvYWRFcnJvclwiXG4gIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KVwiXG4gIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxuPlxuICA8aW5wdXRcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgYWNjZXB0PVwie3tkYXRhLmZpbGVFeHRlbnNpb25zfX1cIlxuICAgIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgIGhpZGRlblxuICAgICNmaWxlSW5wdXRcbiAgLz5cbiAgPGRpdiBjbGFzcz1cImZpbGUtZHJvcHBlclwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj51cGxvYWQ8L21hdC1pY29uPlxuICAgIDxwPnt7ZGF0YS5tZXNzYWdlfX08L3A+XG4gICAgPGRpdiAqbmdJZj1cImZpbGVOYW1lKClcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEZpbGVcIj5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbWFnZS1uYW1lXCI+e3sgZmlsZU5hbWUoKSB9fTwvc3Bhbj4gKHt7XG4gICAgICAgICAgICBmaWxlU2l6ZSgpXG4gICAgICAgICAgfX0gS0IpXG4gICAgICAgIDwvcD5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBkZWxldGUtaWNvblwiIChjbGljayk9XCJyZW1vdmVGaWxlKClcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IHN0eWxlPVwianVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gIDxidXR0b24gKGNsaWNrKT1cIm9uT2soKVwiIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRGaWxlXCIgbWF0LWZsYXQtYnV0dG9uPlVwbG9hZDwvYnV0dG9uPlxuICA8YnV0dG9uIChjbGljayk9XCJvbkNhbmNlbCgpXCIgbWF0LWJ1dHRvbj5DYW5jZWw8L2J1dHRvbj5cbjwvZGl2PlxuXG4iXX0=
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/material/dialog";
|
|
5
|
-
import * as i2 from "@angular/material/button";
|
|
6
|
-
export class MmMessageDetailsComponent {
|
|
7
|
-
dialogRef;
|
|
8
|
-
data;
|
|
9
|
-
errorMessage;
|
|
10
|
-
constructor(dialogRef, data) {
|
|
11
|
-
this.dialogRef = dialogRef;
|
|
12
|
-
this.data = data;
|
|
13
|
-
this.errorMessage = data.errorMessage;
|
|
14
|
-
}
|
|
15
|
-
ngOnInit() { }
|
|
16
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MmMessageDetailsComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
17
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MmMessageDetailsComponent, selector: "mm-message-details", ngImport: i0, template: "<mat-dialog-content>\n\n <h2>{{errorMessage.title}}</h2>\n <p>{{errorMessage.message}}</p>\n\n\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button class=\"primary-button\" mat-dialog-close mat-flat-button>OK</button>\n</mat-dialog-actions>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }] });
|
|
18
|
-
}
|
|
19
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MmMessageDetailsComponent, decorators: [{
|
|
20
|
-
type: Component,
|
|
21
|
-
args: [{ selector: 'mm-message-details', template: "<mat-dialog-content>\n\n <h2>{{errorMessage.title}}</h2>\n <p>{{errorMessage.message}}</p>\n\n\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button class=\"primary-button\" mat-dialog-close mat-flat-button>OK</button>\n</mat-dialog-actions>\n" }]
|
|
22
|
-
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
23
|
-
type: Inject,
|
|
24
|
-
args: [MAT_DIALOG_DATA]
|
|
25
|
-
}] }] });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW0tbWVzc2FnZS1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lc2htYWtlcnMvc2hhcmVkLXVpL3NyYy9saWIvbW0tbWVzc2FnZS1kZXRhaWxzL21tLW1lc3NhZ2UtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXNobWFrZXJzL3NoYXJlZC11aS9zcmMvbGliL21tLW1lc3NhZ2UtZGV0YWlscy9tbS1tZXNzYWdlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQVF6RSxNQUFNLE9BQU8seUJBQXlCO0lBSTNCO0lBQ3lCO0lBSmxDLFlBQVksQ0FBZTtJQUUzQixZQUNTLFNBQWtELEVBQ3pCLElBQVM7UUFEbEMsY0FBUyxHQUFULFNBQVMsQ0FBeUM7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUV6QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVEsS0FBVSxDQUFDO3dHQVZSLHlCQUF5Qiw4Q0FLMUIsZUFBZTs0RkFMZCx5QkFBeUIsMERDVHRDLHVRQVVBOzs0RkREYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usb0JBQW9COzswQkFTM0IsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnQG1lc2htYWtlcnMvc2hhcmVkLXNlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW0tbWVzc2FnZS1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21tLW1lc3NhZ2UtZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21tLW1lc3NhZ2UtZGV0YWlscy5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTW1NZXNzYWdlRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGVycm9yTWVzc2FnZTogRXJyb3JNZXNzYWdlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxNbU1lc3NhZ2VEZXRhaWxzQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueVxuICApIHtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3JNZXNzYWdlO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxufVxuIiwiPG1hdC1kaWFsb2ctY29udGVudD5cblxuICA8aDI+e3tlcnJvck1lc3NhZ2UudGl0bGV9fTwvaDI+XG4gIDxwPnt7ZXJyb3JNZXNzYWdlLm1lc3NhZ2V9fTwvcD5cblxuXG48L21hdC1kaWFsb2ctY29udGVudD5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIj5cbiAgPGJ1dHRvbiBjbGFzcz1cInByaW1hcnktYnV0dG9uXCIgbWF0LWRpYWxvZy1jbG9zZSBtYXQtZmxhdC1idXR0b24+T0s8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19
|