@sumaris-net/ngx-components 1.10.8 → 1.11.0-rc1
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/bundles/sumaris-net.ngx-components.umd.js +5491 -4220
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +10 -0
- package/esm2015/public_api.js +34 -10
- package/esm2015/src/app/core/core.module.js +13 -5
- package/esm2015/src/app/core/core.testing.module.js +51 -0
- package/esm2015/src/app/core/form/entity-editor.class.js +1 -1
- package/esm2015/src/app/core/form/form.utils.js +58 -393
- package/esm2015/src/app/core/home/home.js +1 -1
- package/esm2015/src/app/core/services/validator/base.validator.class.js +1 -1
- package/esm2015/src/app/core/table/table.class.js +4 -3
- package/esm2015/src/app/core/table/testing/table.testing.js +246 -0
- package/esm2015/src/app/core/table/testing/table.testing.module.js +26 -0
- package/esm2015/src/app/core/text-popover/testing/text-popover.testing.js +37 -0
- package/esm2015/src/app/core/text-popover/testing/text-popover.testing.module.js +33 -0
- package/esm2015/src/app/core/text-popover/text-form.component.js +72 -0
- package/esm2015/src/app/core/text-popover/text-popover.component.js +90 -0
- package/esm2015/src/app/shared/directives/directives.module.js +6 -3
- package/esm2015/src/app/shared/directives/drag-and-drop.directive.js +43 -0
- package/esm2015/src/app/shared/forms.js +339 -0
- package/esm2015/src/app/shared/material/chips/chips.module.js +3 -3
- package/esm2015/src/app/shared/material/material.module.js +3 -3
- package/esm2015/src/app/shared/material/material.testing.module.js +102 -0
- package/esm2015/src/app/shared/material/numpad/testing/numpad.test.js +44 -0
- package/esm2015/src/app/shared/shared.module.js +13 -3
- package/esm2015/src/app/shared/shared.testing.module.js +13 -5
- package/esm2015/src/app/shared/testing/tests.page.js +34 -0
- package/esm2015/src/app/shared/toast/toast.testing.js +1 -1
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.js +69 -0
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.module.js +33 -0
- package/esm2015/src/app/shared/upload-file/upload-file-popover.component.js +100 -0
- package/esm2015/src/app/shared/upload-file/upload-file.component.js +189 -0
- package/esm2015/src/app/shared/upload-file/upload-file.model.js +3 -0
- package/esm2015/src/app/shared/validator/form-error-adapter.class.js +1 -1
- package/esm2015/src/environments/environment.class.js +1 -1
- package/esm2015/sumaris-net.ngx-components.js +11 -10
- package/fesm2015/sumaris-net.ngx-components.js +3757 -2698
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +3 -3
- package/public_api.d.ts +24 -8
- package/src/app/core/core.testing.module.d.ts +4 -0
- package/src/app/core/form/entity-editor.class.d.ts +1 -1
- package/src/app/core/form/form.utils.d.ts +39 -114
- package/src/app/core/services/validator/base.validator.class.d.ts +1 -1
- package/src/app/core/table/testing/table.testing.d.ts +51 -0
- package/src/app/core/table/testing/table.testing.module.d.ts +2 -0
- package/src/app/core/text-popover/testing/text-popover.testing.d.ts +7 -0
- package/src/app/core/text-popover/testing/text-popover.testing.module.d.ts +2 -0
- package/src/app/core/text-popover/text-form.component.d.ts +28 -0
- package/src/app/core/text-popover/text-popover.component.d.ts +37 -0
- package/src/app/shared/directives/drag-and-drop.directive.d.ts +14 -0
- package/src/app/shared/forms.d.ts +78 -0
- package/src/app/shared/material/chips/chips.module.d.ts +1 -1
- package/src/app/shared/material/material.testing.module.d.ts +4 -0
- package/src/app/shared/material/numpad/testing/numpad.test.d.ts +10 -0
- package/src/app/shared/shared.testing.module.d.ts +1 -1
- package/src/app/shared/{material/testing/material.testing.page.d.ts → testing/tests.page.d.ts} +3 -2
- package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +15 -0
- package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +2 -0
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +36 -0
- package/src/app/shared/upload-file/upload-file.component.d.ts +45 -0
- package/src/app/shared/upload-file/upload-file.model.d.ts +10 -0
- package/src/app/shared/validator/form-error-adapter.class.d.ts +1 -1
- package/src/assets/i18n/en-US.json +11 -1
- package/src/assets/i18n/en.json +11 -1
- package/src/assets/i18n/fr.json +11 -1
- package/src/theme/_ngx-components.scss +8 -0
- package/sumaris-net.ngx-components.d.ts +10 -9
- package/sumaris-net.ngx-components.metadata.json +1 -1
- package/esm2015/src/app/shared/material/testing/material.testing.module.js +0 -92
- package/esm2015/src/app/shared/material/testing/material.testing.page.js +0 -34
- package/src/app/shared/material/testing/material.testing.module.d.ts +0 -2
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Injector, Input, ViewChild } from '@angular/core';
|
|
3
|
+
import { AppTable, DEFAULT_PAGE_SIZE, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../table.class';
|
|
4
|
+
import { StatusList, Referential, StatusById } from '../../services/model/referential.model';
|
|
5
|
+
import { IonInfiniteScroll } from '@ionic/angular';
|
|
6
|
+
import { EntitiesTableDataSource } from '../entities-table-datasource.class';
|
|
7
|
+
import { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';
|
|
8
|
+
import { AppValidatorService } from '../../services/validator/base.validator.class';
|
|
9
|
+
import { FormBuilder } from '@angular/forms';
|
|
10
|
+
import { isNil, isNotNil } from '../../../shared/functions';
|
|
11
|
+
import { fromUnixMsTimestamp } from '../../../shared/dates';
|
|
12
|
+
import { ReferentialFilter } from '../../services/testing/referential-filter.model';
|
|
13
|
+
import { debounceTime, filter, tap } from 'rxjs/operators';
|
|
14
|
+
import { MatExpansionPanel } from '@angular/material/expansion';
|
|
15
|
+
import { ReferentialValidatorService } from '../../services/testing/referential.validator';
|
|
16
|
+
import { StatusIds } from '../../services/model/model.enum';
|
|
17
|
+
export class TableTestPage extends AppTable {
|
|
18
|
+
constructor(injector, validatorService, formBuilder, cd) {
|
|
19
|
+
super(injector, [
|
|
20
|
+
...RESERVED_START_COLUMNS,
|
|
21
|
+
'label',
|
|
22
|
+
'name',
|
|
23
|
+
'levelId',
|
|
24
|
+
'statusId',
|
|
25
|
+
'updateDate',
|
|
26
|
+
'comments',
|
|
27
|
+
...RESERVED_END_COLUMNS
|
|
28
|
+
], new EntitiesTableDataSource(Referential, new InMemoryEntitiesService(Referential, ReferentialFilter, {
|
|
29
|
+
sortByReplacement: { id: 'id' }
|
|
30
|
+
}), validatorService, {
|
|
31
|
+
suppressErrors: false
|
|
32
|
+
}), null);
|
|
33
|
+
this.validatorService = validatorService;
|
|
34
|
+
this.formBuilder = formBuilder;
|
|
35
|
+
this.cd = cd;
|
|
36
|
+
this.canEdit = true;
|
|
37
|
+
this.filterCriteriaCount = 0;
|
|
38
|
+
this.groupColumns = ['top-start', 'group-1', 'group-2', 'top-end'];
|
|
39
|
+
this.statusList = StatusList;
|
|
40
|
+
this.statusById = StatusById;
|
|
41
|
+
this.useSticky = true;
|
|
42
|
+
// Works with true and false
|
|
43
|
+
this.enableInfiniteScroll = this.mobile;
|
|
44
|
+
this.autoLoad = false;
|
|
45
|
+
this.inlineEdition = true;
|
|
46
|
+
this.i18nColumnPrefix = 'TABLE.TESTING.';
|
|
47
|
+
this.confirmBeforeDelete = true;
|
|
48
|
+
this.confirmBeforeCancel = false;
|
|
49
|
+
this.undoableDeletion = false;
|
|
50
|
+
this.saveBeforeDelete = false;
|
|
51
|
+
this.saveBeforeSort = true;
|
|
52
|
+
this.saveBeforeFilter = true;
|
|
53
|
+
this.propagateRowError = true;
|
|
54
|
+
this.filterForm = formBuilder.group({
|
|
55
|
+
searchText: [null]
|
|
56
|
+
});
|
|
57
|
+
this.onStartEditingRow.subscribe(row => {
|
|
58
|
+
row.validator.patchValue({ entityName: 'TestVO' }, { emitEvent: false });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
get hasMoreData() {
|
|
62
|
+
return this.data.length < 100;
|
|
63
|
+
}
|
|
64
|
+
get dataService() {
|
|
65
|
+
return this._dataSource.dataService;
|
|
66
|
+
}
|
|
67
|
+
ngOnInit() {
|
|
68
|
+
super.ngOnInit();
|
|
69
|
+
// Update filter when changes
|
|
70
|
+
this.registerSubscription(this.filterForm.valueChanges
|
|
71
|
+
.pipe(debounceTime(250), filter(() => this.filterForm.valid), tap(value => {
|
|
72
|
+
const filter = ReferentialFilter.fromObject(value);
|
|
73
|
+
this.filterCriteriaCount = filter.countNotEmptyCriteria();
|
|
74
|
+
this.markForCheck();
|
|
75
|
+
// Applying the filter
|
|
76
|
+
this.setFilter(filter, { emitEvent: false });
|
|
77
|
+
}),
|
|
78
|
+
// Save filter in settings (after a debounce time)
|
|
79
|
+
debounceTime(500), tap(json => this.settings.savePageSetting(this.settingsId, json, 'filter')))
|
|
80
|
+
.subscribe());
|
|
81
|
+
this.registerAutocompleteField('level', {
|
|
82
|
+
items: [
|
|
83
|
+
{ id: 1, label: 'A', name: 'item A' },
|
|
84
|
+
{ id: 1, label: 'B', name: 'item B' }
|
|
85
|
+
],
|
|
86
|
+
mobile: this.mobile
|
|
87
|
+
});
|
|
88
|
+
this.registerSubscription(this.onRefresh.subscribe(() => {
|
|
89
|
+
this.filterForm.markAsUntouched();
|
|
90
|
+
this.filterForm.markAsPristine();
|
|
91
|
+
}));
|
|
92
|
+
this.markAsReady();
|
|
93
|
+
}
|
|
94
|
+
ngAfterViewInit() {
|
|
95
|
+
super.ngAfterViewInit();
|
|
96
|
+
// Restore filter from settings
|
|
97
|
+
this.restoreFilter();
|
|
98
|
+
// Load data
|
|
99
|
+
this.load();
|
|
100
|
+
}
|
|
101
|
+
ngOnDestroy() {
|
|
102
|
+
console.debug('[test-table] Destroying table...');
|
|
103
|
+
super.ngOnDestroy();
|
|
104
|
+
this.stopTimer();
|
|
105
|
+
this.dataService.ngOnDestroy();
|
|
106
|
+
}
|
|
107
|
+
restoreFilter() {
|
|
108
|
+
const json = this.settings.getPageSettings(this.settingsId, 'filter');
|
|
109
|
+
console.debug('[table-test] Restoring filter from settings...', json);
|
|
110
|
+
if (json) {
|
|
111
|
+
const filter = ReferentialFilter.fromObject(json);
|
|
112
|
+
this.filterForm.patchValue(json, { emitEvent: false });
|
|
113
|
+
this.filterCriteriaCount = filter.countNotEmptyCriteria();
|
|
114
|
+
this.setFilter(filter, { emitEvent: false });
|
|
115
|
+
this.markForCheck();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
toggleTimer() {
|
|
119
|
+
if (isNotNil(this.timer))
|
|
120
|
+
this.stopTimer();
|
|
121
|
+
else
|
|
122
|
+
this.startTimer();
|
|
123
|
+
}
|
|
124
|
+
load() {
|
|
125
|
+
console.debug('[test-table] Updating data...');
|
|
126
|
+
this.markAsLoading();
|
|
127
|
+
if (isNil(this.data)) {
|
|
128
|
+
this.data = this.generateData(0, this.enableInfiniteScroll ? this.defaultPageSize : TableTestPage.maxRowCount);
|
|
129
|
+
}
|
|
130
|
+
this.dataService.setValue(this.data, { emitEvent: false });
|
|
131
|
+
this.onRefresh.emit();
|
|
132
|
+
if (this.infiniteScroll) {
|
|
133
|
+
this.infiniteScroll.disabled = !this.infiniteScroll || this.data.length >= TableTestPage.maxRowCount;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
loadMore(event) {
|
|
137
|
+
console.debug('[table-test] Loading more...', event);
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
this.data = [
|
|
140
|
+
...this.data,
|
|
141
|
+
...this.generateData(this.data.length, 20)
|
|
142
|
+
];
|
|
143
|
+
this.dataService.setValue(this.data, { emitEvent: false });
|
|
144
|
+
this.defaultPageSize = this.data.length;
|
|
145
|
+
this.infiniteScroll.disabled = this.data.length >= 100;
|
|
146
|
+
this.doRefresh(event);
|
|
147
|
+
}, 500);
|
|
148
|
+
}
|
|
149
|
+
save() {
|
|
150
|
+
const _super = Object.create(null, {
|
|
151
|
+
save: { get: () => super.save }
|
|
152
|
+
});
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
const saved = yield _super.save.call(this);
|
|
155
|
+
if (saved) {
|
|
156
|
+
// Update source data
|
|
157
|
+
this.data = this.dataService.value;
|
|
158
|
+
}
|
|
159
|
+
return saved;
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
clearControlValue(event, formControl) {
|
|
163
|
+
if (event)
|
|
164
|
+
event.stopPropagation(); // Avoid to enter input the field
|
|
165
|
+
formControl.setValue(null);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
applyFilterAndClosePanel(event) {
|
|
169
|
+
this.defaultPageSize = DEFAULT_PAGE_SIZE;
|
|
170
|
+
this.onRefresh.emit(event);
|
|
171
|
+
this.filterExpansionPanel.close();
|
|
172
|
+
}
|
|
173
|
+
resetFilter(event) {
|
|
174
|
+
this.filterForm.reset({}, { emitEvent: true });
|
|
175
|
+
this.setFilter(ReferentialFilter.fromObject({}), { emitEvent: true });
|
|
176
|
+
this.filterExpansionPanel.close();
|
|
177
|
+
}
|
|
178
|
+
startTimer() {
|
|
179
|
+
this.stopTimer();
|
|
180
|
+
this.timer = setInterval(() => {
|
|
181
|
+
this.data = null; // Reset
|
|
182
|
+
this.load();
|
|
183
|
+
}, 500);
|
|
184
|
+
}
|
|
185
|
+
stopTimer() {
|
|
186
|
+
if (isNotNil(this.timer)) {
|
|
187
|
+
clearInterval(this.timer);
|
|
188
|
+
this.timer = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
generateData(offset, size) {
|
|
192
|
+
offset = offset || 0;
|
|
193
|
+
size = size || 100;
|
|
194
|
+
const result = new Array();
|
|
195
|
+
for (let i = 0; i < size; i++) {
|
|
196
|
+
const id = i + 1 + offset;
|
|
197
|
+
const item = Referential.fromObject({
|
|
198
|
+
id,
|
|
199
|
+
label: 'CODE-' + id,
|
|
200
|
+
name: 'Name #' + id,
|
|
201
|
+
levelId: { id: 1, label: 'A', name: 'Item A' },
|
|
202
|
+
statusId: StatusIds.ENABLE,
|
|
203
|
+
comments: 'My comment #' + id,
|
|
204
|
+
creationDate: fromUnixMsTimestamp(Date.now() - i * 60 * 1000),
|
|
205
|
+
updateDate: fromUnixMsTimestamp(Date.now() - i * 60 * 1000),
|
|
206
|
+
entityName: 'TestVO'
|
|
207
|
+
});
|
|
208
|
+
result.push(item);
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
markForCheck() {
|
|
213
|
+
this.cd.markForCheck();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
TableTestPage.maxRowCount = 100;
|
|
217
|
+
TableTestPage.decorators = [
|
|
218
|
+
{ type: Component, args: [{
|
|
219
|
+
selector: 'app-table-testing',
|
|
220
|
+
template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\" [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n required>\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'comments'\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"loadMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
|
|
221
|
+
providers: [
|
|
222
|
+
{
|
|
223
|
+
provide: AppValidatorService,
|
|
224
|
+
useClass: ReferentialValidatorService
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
provide: AppTable, useExisting: forwardRef(() => TableTestPage),
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
231
|
+
styles: [".table-container .mat-table .mat-column-select{min-width:30px}.table-container .mat-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-table .mat-column-label,.table-container .mat-table .mat-column-levelId,.table-container .mat-table .mat-column-name,.table-container .mat-table .mat-column-statusId{min-width:150px}.table-container .mat-table .mat-column-comments{min-width:100px;max-width:100px}"]
|
|
232
|
+
},] }
|
|
233
|
+
];
|
|
234
|
+
TableTestPage.ctorParameters = () => [
|
|
235
|
+
{ type: Injector },
|
|
236
|
+
{ type: AppValidatorService },
|
|
237
|
+
{ type: FormBuilder },
|
|
238
|
+
{ type: ChangeDetectorRef }
|
|
239
|
+
];
|
|
240
|
+
TableTestPage.propDecorators = {
|
|
241
|
+
enableInfiniteScroll: [{ type: Input }],
|
|
242
|
+
useSticky: [{ type: Input }],
|
|
243
|
+
filterExpansionPanel: [{ type: ViewChild, args: [MatExpansionPanel, { static: true },] }],
|
|
244
|
+
infiniteScroll: [{ type: ViewChild, args: [IonInfiniteScroll,] }]
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS90ZXN0aW5nL3RhYmxlLnRlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvSSxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekcsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFN0YsT0FBTyxFQUFDLGlCQUFpQixFQUE0QixNQUFNLGdCQUFnQixDQUFDO0FBRzVFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBa0IsV0FBVyxFQUFZLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFRLEtBQUssRUFBRSxRQUFRLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUM1RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN6RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFrQjFELE1BQU0sT0FBTyxhQUFjLFNBQVEsUUFBd0M7SUE2QnpFLFlBQVksUUFBa0IsRUFDUixnQkFBcUMsRUFDckMsV0FBd0IsRUFDeEIsRUFBcUI7UUFFekMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNkLEdBQUcsc0JBQXNCO1lBQ3pCLE9BQU87WUFDUCxNQUFNO1lBQ04sU0FBUztZQUNULFVBQVU7WUFDVixZQUFZO1lBQ1osVUFBVTtZQUNWLEdBQUcsb0JBQW9CO1NBQ3hCLEVBQ0MsSUFBSSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUU7WUFDbkcsaUJBQWlCLEVBQUUsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFDO1NBQzlCLENBQUMsRUFBRSxnQkFBZ0IsRUFBRTtZQUNwQixjQUFjLEVBQUUsS0FBSztTQUN0QixDQUFDLEVBQ0YsSUFBSSxDQUFDLENBQUM7UUFuQlkscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFxQjtRQUNyQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQTFCM0MsWUFBTyxHQUFHLElBQUksQ0FBQztRQUdmLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4QixpQkFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckQsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixlQUFVLEdBQUcsVUFBVSxDQUFDO1FBR3hCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFtQ3hCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV4QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFFekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUU5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2xDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQztTQUNuQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBeERELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2hDLENBQUM7SUFLRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBbUQsQ0FBQTtJQUM3RSxDQUFDO0lBaURELFFBQVE7UUFDTixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakIsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZO2FBQ3pCLElBQUksQ0FDSCxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUNuQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVixNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUM7UUFDRixrREFBa0Q7UUFDbEQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUM1RTthQUNBLFNBQVMsRUFBRSxDQUNmLENBQUM7UUFFRixJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFO1lBQ3BDLEtBQUssRUFBRTtnQkFDTCxFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO2dCQUNuQyxFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO2FBQ3BDO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxlQUFlO1FBQ2IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsWUFBWTtRQUNaLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRVMsYUFBYTtRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEUsSUFBSSxJQUFJLEVBQUU7WUFDUixNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztZQUN0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2hIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxhQUFhLENBQUMsV0FBVyxDQUFDO1NBQ3RHO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUF5RTtRQUNoRixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXJELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHO2dCQUNWLEdBQUcsSUFBSSxDQUFDLElBQUk7Z0JBQ1osR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDLEVBQUUsQ0FBQzthQUMxQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1lBRXpELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVLLElBQUk7Ozs7O1lBQ1IsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFNLElBQUksV0FBRSxDQUFDO1lBQ2pDLElBQUksS0FBSyxFQUFFO2dCQUNULHFCQUFxQjtnQkFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQzthQUNwQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUFBO0lBRUQsaUJBQWlCLENBQUMsS0FBYyxFQUFFLFdBQTRCO1FBQzVELElBQUksS0FBSztZQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztRQUNyRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWU7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFlO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVE7WUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFUyxZQUFZLENBQUMsTUFBZSxFQUFFLElBQWE7UUFDbkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxHQUFHLElBQUksSUFBSSxHQUFHLENBQUM7UUFFbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLEVBQUU7Z0JBQ0YsS0FBSyxFQUFFLE9BQU8sR0FBRyxFQUFFO2dCQUNuQixJQUFJLEVBQUUsUUFBUSxHQUFHLEVBQUU7Z0JBQ25CLE9BQU8sRUFBRSxFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO2dCQUM1QyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQzFCLFFBQVEsRUFBRSxjQUFjLEdBQUcsRUFBRTtnQkFDN0IsWUFBWSxFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDN0QsVUFBVSxFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDM0QsVUFBVSxFQUFFLFFBQVE7YUFDckIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7QUF4UE0seUJBQVcsR0FBRyxHQUFHLENBQUM7O1lBbEIxQixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFFN0IsZ3BnQkFBaUM7Z0JBQ2pDLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsbUJBQW1CO3dCQUM1QixRQUFRLEVBQUUsMkJBQTJCO3FCQUN0QztvQkFDRDt3QkFDRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO3FCQUNoRTtpQkFDRjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQW5DMEUsUUFBUTtZQVMzRSxtQkFBbUI7WUFDRixXQUFXO1lBVkgsaUJBQWlCOzs7bUNBbUQvQyxLQUFLO3dCQUNMLEtBQUs7bUNBTUwsU0FBUyxTQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQzs2QkFDM0MsU0FBUyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FwcFRhYmxlLCBERUZBVUxUX1BBR0VfU0laRSwgUkVTRVJWRURfRU5EX0NPTFVNTlMsIFJFU0VSVkVEX1NUQVJUX0NPTFVNTlN9IGZyb20gJy4uL3RhYmxlLmNsYXNzJztcbmltcG9ydCB7IFN0YXR1c0xpc3QsIFJlZmVyZW50aWFsLCBTdGF0dXNCeUlkIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtJb25JbmZpbml0ZVNjcm9sbCwgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybX0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtMb2NhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TG9jYWxTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHtFbnRpdGllc1RhYmxlRGF0YVNvdXJjZX0gZnJvbSAnLi4vZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcyc7XG5pbXBvcnQge0luTWVtb3J5RW50aXRpZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7QXBwVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdG9yL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0JlYW5zLCBpc05pbCwgaXNOb3ROaWwsIHNwbGl0QnlJZH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge2Zyb21Vbml4TXNUaW1lc3RhbXB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQge1JlZmVyZW50aWFsRmlsdGVyfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZXN0aW5nL3JlZmVyZW50aWFsLWZpbHRlci5tb2RlbCc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlsdGVyLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWF0RXhwYW5zaW9uUGFuZWx9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5pbXBvcnQgVGltZW91dCA9IE5vZGVKUy5UaW1lb3V0O1xuaW1wb3J0IHtSZWZlcmVudGlhbFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rlc3RpbmcvcmVmZXJlbnRpYWwudmFsaWRhdG9yJztcbmltcG9ydCB7U3RhdHVzSWRzfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9tb2RlbC5lbnVtJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyLCBNYXRBdXRvY29tcGxldGVGaWVsZCwgTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWd9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9hdXRvY29tcGxldGUvbWF0ZXJpYWwuYXV0b2NvbXBsZXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRhYmxlLXRlc3RpbmcnLFxuICBzdHlsZVVybHM6IFsndGFibGUudGVzdGluZy5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAndGFibGUudGVzdGluZy5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQXBwVmFsaWRhdG9yU2VydmljZSxcbiAgICAgIHVzZUNsYXNzOiBSZWZlcmVudGlhbFZhbGlkYXRvclNlcnZpY2VcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFwcFRhYmxlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUYWJsZVRlc3RQYWdlKSxcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlVGVzdFBhZ2UgZXh0ZW5kcyBBcHBUYWJsZTxSZWZlcmVudGlhbCwgUmVmZXJlbnRpYWxGaWx0ZXI+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHN0YXRpYyBtYXhSb3dDb3VudCA9IDEwMDtcblxuICB0aW1lcjogVGltZW91dDtcbiAgY2FuRWRpdCA9IHRydWU7XG4gIGRhdGE6IFJlZmVyZW50aWFsW107XG4gIGZpbHRlckZvcm06IEZvcm1Hcm91cDtcbiAgZmlsdGVyQ3JpdGVyaWFDb3VudCA9IDA7XG4gIGdyb3VwQ29sdW1ucyA9IFsndG9wLXN0YXJ0JywgJ2dyb3VwLTEnLCAnZ3JvdXAtMicsICd0b3AtZW5kJ107XG5cbiAgcmVhZG9ubHkgc3RhdHVzTGlzdCA9IFN0YXR1c0xpc3Q7XG4gIHJlYWRvbmx5IHN0YXR1c0J5SWQgPSBTdGF0dXNCeUlkO1xuXG4gIEBJbnB1dCgpIGVuYWJsZUluZmluaXRlU2Nyb2xsOiBib29sZWFuO1xuICBASW5wdXQoKSB1c2VTdGlja3kgPSB0cnVlO1xuXG4gIGdldCBoYXNNb3JlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA8IDEwMDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoTWF0RXhwYW5zaW9uUGFuZWwsIHtzdGF0aWM6IHRydWV9KSBmaWx0ZXJFeHBhbnNpb25QYW5lbDogTWF0RXhwYW5zaW9uUGFuZWw7XG4gIEBWaWV3Q2hpbGQoSW9uSW5maW5pdGVTY3JvbGwpIGluZmluaXRlU2Nyb2xsOiBJb25JbmZpbml0ZVNjcm9sbDtcblxuICBnZXQgZGF0YVNlcnZpY2UoKTogSW5NZW1vcnlFbnRpdGllc1NlcnZpY2U8UmVmZXJlbnRpYWw+e1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlLmRhdGFTZXJ2aWNlIGFzIEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlPFJlZmVyZW50aWFsPlxuICB9XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogQXBwVmFsaWRhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICAgICAgICAgICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgW1xuICAgICAgLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUyxcbiAgICAgICdsYWJlbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnbGV2ZWxJZCcsXG4gICAgICAnc3RhdHVzSWQnLFxuICAgICAgJ3VwZGF0ZURhdGUnLFxuICAgICAgJ2NvbW1lbnRzJyxcbiAgICAgIC4uLlJFU0VSVkVEX0VORF9DT0xVTU5TXG4gICAgXSxcbiAgICAgIG5ldyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZShSZWZlcmVudGlhbCwgbmV3IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlKFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbEZpbHRlciwge1xuICAgICAgICBzb3J0QnlSZXBsYWNlbWVudDoge2lkOiAnaWQnfVxuICAgICAgfSksIHZhbGlkYXRvclNlcnZpY2UsIHtcbiAgICAgICAgc3VwcHJlc3NFcnJvcnM6IGZhbHNlXG4gICAgICB9KSxcbiAgICAgIG51bGwpO1xuXG4gICAgLy8gV29ya3Mgd2l0aCB0cnVlIGFuZCBmYWxzZVxuICAgIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwgPSB0aGlzLm1vYmlsZTtcblxuICAgIHRoaXMuYXV0b0xvYWQgPSBmYWxzZTtcbiAgICB0aGlzLmlubGluZUVkaXRpb24gPSB0cnVlO1xuICAgIHRoaXMuaTE4bkNvbHVtblByZWZpeCA9ICdUQUJMRS5URVNUSU5HLic7XG5cbiAgICB0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCA9IGZhbHNlO1xuICAgIHRoaXMudW5kb2FibGVEZWxldGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5zYXZlQmVmb3JlU29ydCA9IHRydWU7XG4gICAgdGhpcy5zYXZlQmVmb3JlRmlsdGVyID0gdHJ1ZTtcbiAgICB0aGlzLnByb3BhZ2F0ZVJvd0Vycm9yID0gdHJ1ZTtcblxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHNlYXJjaFRleHQ6IFtudWxsXVxuICAgIH0pO1xuXG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5zdWJzY3JpYmUocm93ID0+IHtcbiAgICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7ZW50aXR5TmFtZTogJ1Rlc3RWTyd9LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFVwZGF0ZSBmaWx0ZXIgd2hlbiBjaGFuZ2VzXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyRm9ybS52YWxpZCksXG4gICAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIC8vIEFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBTYXZlIGZpbHRlciBpbiBzZXR0aW5ncyAoYWZ0ZXIgYSBkZWJvdW5jZSB0aW1lKVxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIHRhcChqc29uID0+IHRoaXMuc2V0dGluZ3Muc2F2ZVBhZ2VTZXR0aW5nKHRoaXMuc2V0dGluZ3NJZCwganNvbiwgJ2ZpbHRlcicpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQoJ2xldmVsJywge1xuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdBJywgbmFtZTogJ2l0ZW0gQSd9LFxuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdCJywgbmFtZTogJ2l0ZW0gQid9XG4gICAgICAgIF0sXG4gICAgICAgIG1vYmlsZTogdGhpcy5tb2JpbGVcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMub25SZWZyZXNoLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLm1hcmtBc1JlYWR5KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAvLyBSZXN0b3JlIGZpbHRlciBmcm9tIHNldHRpbmdzXG4gICAgdGhpcy5yZXN0b3JlRmlsdGVyKCk7XG5cbiAgICAvLyBMb2FkIGRhdGFcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0ZXN0LXRhYmxlXSBEZXN0cm95aW5nIHRhYmxlLi4uJyk7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMuZGF0YVNlcnZpY2UubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXN0b3JlRmlsdGVyKCkge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnNldHRpbmdzLmdldFBhZ2VTZXR0aW5ncyh0aGlzLnNldHRpbmdzSWQsICdmaWx0ZXInKTtcbiAgICBjb25zb2xlLmRlYnVnKCdbdGFibGUtdGVzdF0gUmVzdG9yaW5nIGZpbHRlciBmcm9tIHNldHRpbmdzLi4uJywganNvbik7XG5cbiAgICBpZiAoanNvbikge1xuICAgICAgY29uc3QgZmlsdGVyID0gUmVmZXJlbnRpYWxGaWx0ZXIuZnJvbU9iamVjdChqc29uKTtcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKGpzb24sIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLmZpbHRlckNyaXRlcmlhQ291bnQgPSBmaWx0ZXIuY291bnROb3RFbXB0eUNyaXRlcmlhKCk7XG4gICAgICB0aGlzLnNldEZpbHRlcihmaWx0ZXIsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVRpbWVyKCkge1xuICAgIGlmIChpc05vdE5pbCh0aGlzLnRpbWVyKSkgdGhpcy5zdG9wVGltZXIoKTtcbiAgICBlbHNlIHRoaXMuc3RhcnRUaW1lcigpO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdGVzdC10YWJsZV0gVXBkYXRpbmcgZGF0YS4uLicpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgaWYgKGlzTmlsKHRoaXMuZGF0YSkpIHtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2VuZXJhdGVEYXRhKDAsIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwgPyB0aGlzLmRlZmF1bHRQYWdlU2l6ZSA6IFRhYmxlVGVzdFBhZ2UubWF4Um93Q291bnQpO1xuICAgIH1cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldFZhbHVlKHRoaXMuZGF0YSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KCk7XG5cbiAgICBpZiAodGhpcy5pbmZpbml0ZVNjcm9sbCkge1xuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbC5kaXNhYmxlZCA9ICF0aGlzLmluZmluaXRlU2Nyb2xsIHx8IHRoaXMuZGF0YS5sZW5ndGggPj0gVGFibGVUZXN0UGFnZS5tYXhSb3dDb3VudDtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZShldmVudD86IEN1c3RvbUV2ZW50ICYgeyB0YXJnZXQ/OiBFdmVudFRhcmdldCAmIHsgY29tcGxldGU/OiAoKSA9PiB2b2lkIH19KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3RhYmxlLXRlc3RdIExvYWRpbmcgbW9yZS4uLicsIGV2ZW50KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gW1xuICAgICAgICAuLi50aGlzLmRhdGEsXG4gICAgICAgIC4uLnRoaXMuZ2VuZXJhdGVEYXRhKHRoaXMuZGF0YS5sZW5ndGgsMjApXG4gICAgICBdO1xuICAgICAgdGhpcy5kYXRhU2VydmljZS5zZXRWYWx1ZSh0aGlzLmRhdGEsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG5cbiAgICAgIHRoaXMuZGVmYXVsdFBhZ2VTaXplID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwuZGlzYWJsZWQgPSB0aGlzLmRhdGEubGVuZ3RoID49IDEwMDtcbiAgICAgIHRoaXMuZG9SZWZyZXNoKGV2ZW50KTtcblxuICAgIH0sIDUwMCk7XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgc3VwZXIuc2F2ZSgpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgLy8gVXBkYXRlIHNvdXJjZSBkYXRhXG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFTZXJ2aWNlLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZWQ7XG4gIH1cblxuICBjbGVhckNvbnRyb2xWYWx1ZShldmVudDogVUlFdmVudCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIEF2b2lkIHRvIGVudGVyIGlucHV0IHRoZSBmaWVsZFxuICAgIGZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IFVJRXZlbnQpIHtcbiAgICB0aGlzLmRlZmF1bHRQYWdlU2l6ZSA9IERFRkFVTFRfUEFHRV9TSVpFO1xuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuZmlsdGVyRXhwYW5zaW9uUGFuZWwuY2xvc2UoKTtcbiAgfVxuXG4gIHJlc2V0RmlsdGVyKGV2ZW50PzogVUlFdmVudCkge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCh7fSwge2VtaXRFdmVudDogdHJ1ZX0pO1xuICAgIHRoaXMuc2V0RmlsdGVyKFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3Qoe30pLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gICAgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpO1xuICB9XG5cbiAgc3RhcnRUaW1lcigpIHtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGEgPSBudWxsOyAvLyBSZXNldFxuICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHN0b3BUaW1lcigpIHtcbiAgICBpZiAoaXNOb3ROaWwodGhpcy50aW1lcikpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhKG9mZnNldD86IG51bWJlciwgc2l6ZT86IG51bWJlciwgKTogUmVmZXJlbnRpYWxbXSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgc2l6ZSA9IHNpemUgfHwgMTAwO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlZmVyZW50aWFsPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCBpZCA9IGkgKyAxICsgb2Zmc2V0O1xuICAgICAgY29uc3QgaXRlbSA9IFJlZmVyZW50aWFsLmZyb21PYmplY3Qoe1xuICAgICAgICBpZCxcbiAgICAgICAgbGFiZWw6ICdDT0RFLScgKyBpZCxcbiAgICAgICAgbmFtZTogJ05hbWUgIycgKyBpZCxcbiAgICAgICAgbGV2ZWxJZDoge2lkOiAxLCBsYWJlbDogJ0EnLCBuYW1lOiAnSXRlbSBBJ30sXG4gICAgICAgIHN0YXR1c0lkOiBTdGF0dXNJZHMuRU5BQkxFLFxuICAgICAgICBjb21tZW50czogJ015IGNvbW1lbnQgIycgKyBpZCxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBmcm9tVW5peE1zVGltZXN0YW1wKERhdGUubm93KCkgLSBpICogNjAgKiAxMDAwKSxcbiAgICAgICAgdXBkYXRlRGF0ZTogZnJvbVVuaXhNc1RpbWVzdGFtcChEYXRlLm5vdygpIC0gaSAqIDYwICogMTAwMCksXG4gICAgICAgIGVudGl0eU5hbWU6ICdUZXN0Vk8nXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
+
import { CoreModule } from '../../core.module';
|
|
5
|
+
import { TableTestPage } from './table.testing';
|
|
6
|
+
import { SharedModule } from '../../../shared/shared.module';
|
|
7
|
+
export class TableTestingModule {
|
|
8
|
+
}
|
|
9
|
+
TableTestingModule.decorators = [
|
|
10
|
+
{ type: NgModule, args: [{
|
|
11
|
+
imports: [
|
|
12
|
+
CommonModule,
|
|
13
|
+
SharedModule,
|
|
14
|
+
CoreModule,
|
|
15
|
+
TranslateModule.forChild()
|
|
16
|
+
],
|
|
17
|
+
declarations: [
|
|
18
|
+
TableTestPage
|
|
19
|
+
],
|
|
20
|
+
exports: [
|
|
21
|
+
TableTestPage,
|
|
22
|
+
TranslateModule
|
|
23
|
+
]
|
|
24
|
+
},] }
|
|
25
|
+
];
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudGVzdGluZy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvdGVzdGluZy90YWJsZS50ZXN0aW5nLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFrQjNELE1BQU0sT0FBTyxrQkFBa0I7OztZQWY5QixRQUFRLFNBQUM7Z0JBQ1IsT0FBTyxFQUFFO29CQUNQLFlBQVk7b0JBQ1osWUFBWTtvQkFDWixVQUFVO29CQUNWLGVBQWUsQ0FBQyxRQUFRLEVBQUU7aUJBQzNCO2dCQUNELFlBQVksRUFBRTtvQkFDWixhQUFhO2lCQUNkO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxhQUFhO29CQUNiLGVBQWU7aUJBQ2hCO2FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGV9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtDb3JlTW9kdWxlfSBmcm9tICcuLi8uLi9jb3JlLm1vZHVsZSc7XG5pbXBvcnQge1RhYmxlVGVzdFBhZ2V9IGZyb20gJy4vdGFibGUudGVzdGluZyc7XG5pbXBvcnQge1NoYXJlZE1vZHVsZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NoYXJlZC5tb2R1bGUnO1xuXG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgU2hhcmVkTW9kdWxlLFxuICAgIENvcmVNb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLmZvckNoaWxkKClcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgVGFibGVUZXN0UGFnZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgVGFibGVUZXN0UGFnZSxcbiAgICBUcmFuc2xhdGVNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVRlc3RpbmdNb2R1bGUge1xufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import { PopoverController } from '@ionic/angular';
|
|
4
|
+
import { TextPopover } from '../text-popover.component';
|
|
5
|
+
export class TextPopoverTestingPage {
|
|
6
|
+
constructor(popoverController) {
|
|
7
|
+
this.popoverController = popoverController;
|
|
8
|
+
}
|
|
9
|
+
showPopover(event, opts) {
|
|
10
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
11
|
+
const modal = yield this.popoverController.create({
|
|
12
|
+
component: TextPopover,
|
|
13
|
+
componentProps: Object.assign({ title: 'modalTitle', placeholder: 'your text' }, opts),
|
|
14
|
+
backdropDismiss: false,
|
|
15
|
+
keyboardClose: false,
|
|
16
|
+
event,
|
|
17
|
+
translucent: true,
|
|
18
|
+
cssClass: 'popover-large',
|
|
19
|
+
});
|
|
20
|
+
yield modal.present();
|
|
21
|
+
const { data } = yield modal.onDidDismiss();
|
|
22
|
+
if (data) {
|
|
23
|
+
console.info('Popover result: ', data);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
TextPopoverTestingPage.decorators = [
|
|
29
|
+
{ type: Component, args: [{
|
|
30
|
+
selector: 'text-popover-testing',
|
|
31
|
+
template: "<ion-toolbar color=\"primary\">\n <ion-title>Text popover</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n <p>Multi lines examples:<br/>\n <small>Press Ctrl+Enter to validate</small>\n <small>\n <pre>multiline: true</pre>\n </small>\n </p>\n\n <ion-button (click)=\"showPopover($event, {})\" color=\"tertiary\">\n <span translate>COMMON.BTN_SHOW</span>\n </ion-button>\n\n <ion-button (click)=\"showPopover($event, {autofocus: true})\" color=\"tertiary\">\n <span translate>COMMON.BTN_SHOW</span> (autofocus)\n </ion-button>\n\n <p>One line examples:\n <small>\n <pre>multiline: false</pre>\n </small>\n </p>\n\n\n <ion-button (click)=\"showPopover($event, {multiline : false})\" color=\"tertiary\">\n <span translate>COMMON.BTN_SHOW</span> \n </ion-button>\n <ion-button (click)=\"showPopover($event, {multiline : false, autofocus: true})\" color=\"tertiary\">\n <span translate>COMMON.BTN_SHOW</span> (autofocus)\n </ion-button>\n\n\n</ion-content>\n"
|
|
32
|
+
},] }
|
|
33
|
+
];
|
|
34
|
+
TextPopoverTestingPage.ctorParameters = () => [
|
|
35
|
+
{ type: PopoverController }
|
|
36
|
+
];
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1wb3BvdmVyLnRlc3RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGV4dC1wb3BvdmVyL3Rlc3RpbmcvdGV4dC1wb3BvdmVyLnRlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFDLFdBQVcsRUFBcUIsTUFBTSwyQkFBMkIsQ0FBQztBQU0xRSxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFlBQ1UsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFFOUMsQ0FBQztJQUVLLFdBQVcsQ0FBQyxLQUFjLEVBQUUsSUFBa0M7O1lBQ2xFLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztnQkFDaEQsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLGNBQWMsRUFBRSxnQkFDZCxLQUFLLEVBQUUsWUFBWSxFQUNuQixXQUFXLEVBQUUsV0FBVyxJQUNyQixJQUFJLENBQ1I7Z0JBQ0QsZUFBZSxFQUFFLEtBQUs7Z0JBQ3RCLGFBQWEsRUFBRSxLQUFLO2dCQUNwQixLQUFLO2dCQUNMLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixRQUFRLEVBQUUsZUFBZTthQUMxQixDQUFDLENBQUM7WUFFSCxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFNUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN4QztRQUNILENBQUM7S0FBQTs7O1lBaENGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQywyaENBQXdDO2FBQ3pDOzs7WUFOTyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BvcG92ZXJDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge1RleHRQb3BvdmVyLCBUZXh0UG9wb3Zlck9wdGlvbnN9IGZyb20gJy4uL3RleHQtcG9wb3Zlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0ZXh0LXBvcG92ZXItdGVzdGluZycsXG4gIHRlbXBsYXRlVXJsOiAndGV4dC1wb3BvdmVyLnRlc3RpbmcuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVGV4dFBvcG92ZXJUZXN0aW5nUGFnZSAge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyXG4gICkge1xuICB9XG5cbiAgYXN5bmMgc2hvd1BvcG92ZXIoZXZlbnQ6IFVJRXZlbnQsIG9wdHM/OiBQYXJ0aWFsPFRleHRQb3BvdmVyT3B0aW9ucz4pIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMucG9wb3ZlckNvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogVGV4dFBvcG92ZXIsXG4gICAgICBjb21wb25lbnRQcm9wczogPFRleHRQb3BvdmVyT3B0aW9ucz57XG4gICAgICAgIHRpdGxlOiAnbW9kYWxUaXRsZScsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAneW91ciB0ZXh0JyxcbiAgICAgICAgLi4ub3B0c1xuICAgICAgfSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2UsXG4gICAgICBrZXlib2FyZENsb3NlOiBmYWxzZSxcbiAgICAgIGV2ZW50LFxuICAgICAgdHJhbnNsdWNlbnQ6IHRydWUsXG4gICAgICBjc3NDbGFzczogJ3BvcG92ZXItbGFyZ2UnLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgbW9kYWwub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgY29uc29sZS5pbmZvKCdQb3BvdmVyIHJlc3VsdDogJywgZGF0YSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { RouterModule } from '@angular/router';
|
|
3
|
+
import { IonicModule } from '@ionic/angular';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
6
|
+
import { TextPopoverTestingPage } from './text-popover.testing';
|
|
7
|
+
const routes = [
|
|
8
|
+
{
|
|
9
|
+
path: 'text-popover',
|
|
10
|
+
pathMatch: 'full',
|
|
11
|
+
component: TextPopoverTestingPage
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
export class TextPopoverTestingModule {
|
|
15
|
+
}
|
|
16
|
+
TextPopoverTestingModule.decorators = [
|
|
17
|
+
{ type: NgModule, args: [{
|
|
18
|
+
imports: [
|
|
19
|
+
CommonModule,
|
|
20
|
+
IonicModule,
|
|
21
|
+
TranslateModule.forChild(),
|
|
22
|
+
RouterModule.forChild(routes)
|
|
23
|
+
],
|
|
24
|
+
declarations: [
|
|
25
|
+
TextPopoverTestingPage
|
|
26
|
+
],
|
|
27
|
+
exports: [
|
|
28
|
+
RouterModule,
|
|
29
|
+
TextPopoverTestingPage
|
|
30
|
+
]
|
|
31
|
+
},] }
|
|
32
|
+
];
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1wb3BvdmVyLnRlc3RpbmcubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3RleHQtcG9wb3Zlci90ZXN0aW5nL3RleHQtcG9wb3Zlci50ZXN0aW5nLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxZQUFZLEVBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxNQUFNLE1BQU0sR0FBVztJQUNyQjtRQUNFLElBQUksRUFBRSxjQUFjO1FBQ3BCLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLFNBQVMsRUFBRSxzQkFBc0I7S0FDbEM7Q0FDRixDQUFDO0FBaUJGLE1BQU0sT0FBTyx3QkFBd0I7OztZQWZwQyxRQUFRLFNBQUM7Z0JBQ1IsT0FBTyxFQUFFO29CQUNQLFlBQVk7b0JBQ1osV0FBVztvQkFDWCxlQUFlLENBQUMsUUFBUSxFQUFFO29CQUMxQixZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztpQkFDOUI7Z0JBQ0QsWUFBWSxFQUFFO29CQUNaLHNCQUFzQjtpQkFDdkI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLFlBQVk7b0JBQ1osc0JBQXNCO2lCQUN2QjthQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JvdXRlck1vZHVsZSwgUm91dGVzfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtJb25pY01vZHVsZX0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1RleHRQb3BvdmVyVGVzdGluZ1BhZ2V9IGZyb20gJy4vdGV4dC1wb3BvdmVyLnRlc3RpbmcnO1xuXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAge1xuICAgIHBhdGg6ICd0ZXh0LXBvcG92ZXInLFxuICAgIHBhdGhNYXRjaDogJ2Z1bGwnLFxuICAgIGNvbXBvbmVudDogVGV4dFBvcG92ZXJUZXN0aW5nUGFnZVxuICB9XG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIElvbmljTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZS5mb3JDaGlsZCgpLFxuICAgIFJvdXRlck1vZHVsZS5mb3JDaGlsZChyb3V0ZXMpXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFRleHRQb3BvdmVyVGVzdGluZ1BhZ2VcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIFJvdXRlck1vZHVsZSxcbiAgICBUZXh0UG9wb3ZlclRlc3RpbmdQYWdlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVGV4dFBvcG92ZXJUZXN0aW5nTW9kdWxlIHtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormBuilder, Validators } from '@angular/forms';
|
|
3
|
+
import { CdkTextareaAutosize } from '@angular/cdk/text-field';
|
|
4
|
+
import { AppForm } from '../form/form.class';
|
|
5
|
+
import { isNotNil } from '../../shared/functions';
|
|
6
|
+
import { focusInput } from '../../shared/inputs';
|
|
7
|
+
export class TextForm extends AppForm {
|
|
8
|
+
constructor(injector, cd, formBuilder) {
|
|
9
|
+
super(injector);
|
|
10
|
+
this.injector = injector;
|
|
11
|
+
this.cd = cd;
|
|
12
|
+
this.formBuilder = formBuilder;
|
|
13
|
+
this.showError = true;
|
|
14
|
+
this.multiline = true;
|
|
15
|
+
this.autoHeight = false;
|
|
16
|
+
this.maxLength = 2000;
|
|
17
|
+
this.autofocus = false;
|
|
18
|
+
this.textAreaChanges = new EventEmitter();
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
const form = this.formBuilder.group({
|
|
22
|
+
text: [null, isNotNil(this.maxLength)
|
|
23
|
+
? Validators.maxLength(this.maxLength)
|
|
24
|
+
: undefined
|
|
25
|
+
]
|
|
26
|
+
});
|
|
27
|
+
this.control = form.get('text');
|
|
28
|
+
this.setForm(form);
|
|
29
|
+
super.ngOnInit();
|
|
30
|
+
}
|
|
31
|
+
textAreaChanged(event) {
|
|
32
|
+
this.textAreaChanges.emit(this.control.value);
|
|
33
|
+
}
|
|
34
|
+
containerResize() {
|
|
35
|
+
var _a;
|
|
36
|
+
(_a = this.autosizeDirective) === null || _a === void 0 ? void 0 : _a.resizeToFitContent(true);
|
|
37
|
+
}
|
|
38
|
+
focusInput() {
|
|
39
|
+
if (this.textArea)
|
|
40
|
+
focusInput(this.textArea);
|
|
41
|
+
if (this.textInput)
|
|
42
|
+
focusInput(this.textInput);
|
|
43
|
+
}
|
|
44
|
+
markForCheck() {
|
|
45
|
+
this.cd.markForCheck();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
TextForm.decorators = [
|
|
49
|
+
{ type: Component, args: [{
|
|
50
|
+
selector: 'app-text-form',
|
|
51
|
+
template: "<form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n <mat-form-field *ngIf=\"multiline; else monoline\">\n <textarea\n #textArea\n matInput\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"control.disabled\"\n [class.fixed-height]=\"!autoHeight\"\n [cdkTextareaAutosize]=\"autoHeight\"\n (keyup)=\"textAreaChanged($event)\"\n (keydown.control.enter)=\"onSubmit.emit($event)\"\n [autofocus]=\"autofocus\"\n ></textarea>\n <mat-error *ngIf=\"control.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH' | translate: control.errors['maxlength'] }}\n </mat-error>\n <mat-hint *ngIf=\"maxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: textArea.value?.length || 0, max: maxLength } }}\n </mat-hint>\n </mat-form-field>\n <ng-template #monoline>\n <mat-form-field>\n <input\n #textInput\n matInput\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"autofocus\"\n />\n <mat-error *ngIf=\"control.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH' | translate: control.errors['maxlength'] }}\n </mat-error>\n <mat-hint *ngIf=\"maxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: textInput.value?.length || 0, max: maxLength } }}\n </mat-hint>\n </mat-form-field>\n </ng-template>\n</form>\n",
|
|
52
|
+
styles: ["textarea.fixed-height{height:11.5em}"]
|
|
53
|
+
},] }
|
|
54
|
+
];
|
|
55
|
+
TextForm.ctorParameters = () => [
|
|
56
|
+
{ type: Injector },
|
|
57
|
+
{ type: ChangeDetectorRef },
|
|
58
|
+
{ type: FormBuilder }
|
|
59
|
+
];
|
|
60
|
+
TextForm.propDecorators = {
|
|
61
|
+
showError: [{ type: Input }],
|
|
62
|
+
placeholder: [{ type: Input }],
|
|
63
|
+
multiline: [{ type: Input }],
|
|
64
|
+
autoHeight: [{ type: Input }],
|
|
65
|
+
maxLength: [{ type: Input }],
|
|
66
|
+
autofocus: [{ type: Input }],
|
|
67
|
+
textAreaChanges: [{ type: Output }],
|
|
68
|
+
textArea: [{ type: ViewChild, args: ['textArea',] }],
|
|
69
|
+
textInput: [{ type: ViewChild, args: ['textInput',] }],
|
|
70
|
+
autosizeDirective: [{ type: ViewChild, args: [CdkTextareaAutosize,] }]
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90ZXh0LXBvcG92ZXIvdGV4dC1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBa0IsV0FBVyxFQUFlLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBTy9DLE1BQU0sT0FBTyxRQUFTLFNBQVEsT0FBdUI7SUFpQm5ELFlBQXNCLFFBQWtCLEVBQVksRUFBcUIsRUFBWSxXQUF3QjtRQUMzRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFESSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVksT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWhCcEcsY0FBUyxHQUFHLElBQUksQ0FBQztRQUVqQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQVd2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2xDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDdEMsQ0FBQyxDQUFDLFNBQVM7YUFDWjtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuQixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDbEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFvQjtRQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxlQUFlOztRQUNiLE1BQUEsSUFBSSxDQUFDLGlCQUFpQiwwQ0FBRSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUU7SUFDbkQsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRVMsWUFBWTtRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7OztZQXRERixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLG1nREFBeUM7O2FBRTFDOzs7WUFiZ0UsUUFBUTtZQUFoRSxpQkFBaUI7WUFDRCxXQUFXOzs7d0JBY2pDLEtBQUs7MEJBQ0wsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLOzhCQUVMLE1BQU07dUJBR04sU0FBUyxTQUFDLFVBQVU7d0JBQ3BCLFNBQVMsU0FBQyxXQUFXO2dDQUNyQixTQUFTLFNBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2RrVGV4dGFyZWFBdXRvc2l6ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90ZXh0LWZpZWxkJztcbmltcG9ydCB7QXBwRm9ybX0gZnJvbSAnLi4vZm9ybS9mb3JtLmNsYXNzJztcbmltcG9ydCB7aXNOb3ROaWx9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtJQXBwRm9ybX0gZnJvbSAnLi4vZm9ybS9mb3JtLnV0aWxzJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZvY3VzSW5wdXR9IGZyb20gJy4uLy4uL3NoYXJlZC9pbnB1dHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGV4dC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RleHQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUZXh0Rm9ybSBleHRlbmRzIEFwcEZvcm08e3RleHQ6IHN0cmluZ30+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2hvd0Vycm9yID0gdHJ1ZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgbXVsdGlsaW5lID0gdHJ1ZTtcbiAgQElucHV0KCkgYXV0b0hlaWdodCA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhMZW5ndGggPSAyMDAwO1xuICBASW5wdXQoKSBhdXRvZm9jdXMgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdGV4dEFyZWFDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cblxuICBAVmlld0NoaWxkKCd0ZXh0QXJlYScpIHRleHRBcmVhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0ZXh0SW5wdXQnKSB0ZXh0SW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoQ2RrVGV4dGFyZWFBdXRvc2l6ZSkgYXV0b3NpemVEaXJlY3RpdmU6IENka1RleHRhcmVhQXV0b3NpemU7XG5cbiAgY29udHJvbDogRm9ybUNvbnRyb2w7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvciwgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHRleHQ6IFtudWxsLCBpc05vdE5pbCh0aGlzLm1heExlbmd0aClcbiAgICAgICAgPyBWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heExlbmd0aClcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIF1cbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyb2wgPSBmb3JtLmdldCgndGV4dCcpIGFzIEZvcm1Db250cm9sO1xuICAgIHRoaXMuc2V0Rm9ybShmb3JtKTtcblxuICAgIHN1cGVyLm5nT25Jbml0KClcbiAgfVxuXG4gIHRleHRBcmVhQ2hhbmdlZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMudGV4dEFyZWFDaGFuZ2VzLmVtaXQodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgfVxuXG4gIGNvbnRhaW5lclJlc2l6ZSgpIHtcbiAgICB0aGlzLmF1dG9zaXplRGlyZWN0aXZlPy5yZXNpemVUb0ZpdENvbnRlbnQodHJ1ZSk7XG4gIH1cblxuICBmb2N1c0lucHV0KCkge1xuICAgIGlmICh0aGlzLnRleHRBcmVhKSBmb2N1c0lucHV0KHRoaXMudGV4dEFyZWEpO1xuICAgIGlmICh0aGlzLnRleHRJbnB1dCkgZm9jdXNJbnB1dCh0aGlzLnRleHRJbnB1dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
3
|
+
import { PopoverController } from '@ionic/angular';
|
|
4
|
+
import { Subscription } from 'rxjs';
|
|
5
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
6
|
+
import { logFormErrors, waitWhilePending } from '../../shared/forms';
|
|
7
|
+
export class TextPopover {
|
|
8
|
+
constructor(popoverController, translate) {
|
|
9
|
+
this.popoverController = popoverController;
|
|
10
|
+
this.translate = translate;
|
|
11
|
+
this.placeholder = '';
|
|
12
|
+
this.editing = true;
|
|
13
|
+
this.multiline = true;
|
|
14
|
+
this.maxLength = 2000;
|
|
15
|
+
this.autofocus = false;
|
|
16
|
+
this.subscription = new Subscription();
|
|
17
|
+
}
|
|
18
|
+
get disabled() {
|
|
19
|
+
return this.form.disabled;
|
|
20
|
+
}
|
|
21
|
+
get enabled() {
|
|
22
|
+
return this.form.enabled;
|
|
23
|
+
}
|
|
24
|
+
get valid() {
|
|
25
|
+
var _a;
|
|
26
|
+
return ((_a = this.form) === null || _a === void 0 ? void 0 : _a.valid) || false;
|
|
27
|
+
}
|
|
28
|
+
get value() {
|
|
29
|
+
var _a;
|
|
30
|
+
return (_a = this.form) === null || _a === void 0 ? void 0 : _a.value.text;
|
|
31
|
+
}
|
|
32
|
+
ngOnInit() {
|
|
33
|
+
this.enable();
|
|
34
|
+
}
|
|
35
|
+
ngAfterViewInit() {
|
|
36
|
+
setTimeout(() => this.form.setValue({ text: this.text }), 0);
|
|
37
|
+
}
|
|
38
|
+
onValidate(event) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
yield waitWhilePending(this.form);
|
|
41
|
+
if (!this.valid) {
|
|
42
|
+
logFormErrors(this.form.control);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const value = this.value;
|
|
47
|
+
this.disable();
|
|
48
|
+
yield this.popoverController.dismiss(value);
|
|
49
|
+
this.form.error = null;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
this.form.error = (err && err.message) || err;
|
|
53
|
+
this.enable();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
disable() {
|
|
58
|
+
this.form.disable();
|
|
59
|
+
}
|
|
60
|
+
enable() {
|
|
61
|
+
if (this.editing)
|
|
62
|
+
this.form.enable();
|
|
63
|
+
}
|
|
64
|
+
cancel() {
|
|
65
|
+
this.popoverController.dismiss();
|
|
66
|
+
}
|
|
67
|
+
ngOnDestroy() {
|
|
68
|
+
this.subscription.unsubscribe();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
TextPopover.decorators = [
|
|
72
|
+
{ type: Component, args: [{
|
|
73
|
+
selector: 'app-text-popover',
|
|
74
|
+
template: "\n<ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <ion-item *ngIf=\"form.error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"form.error|translate\"></ion-label>\n </ion-item>\n\n <app-text-form #form [placeholder]=\"placeholder\"\n [multiline]=\"multiline\"\n [maxLength]=\"maxLength\"\n [autofocus]=\"editing && autofocus\"\n (onSubmit)=\"onValidate($event)\"\n ></app-text-form>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col>\n\n </ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n"
|
|
75
|
+
},] }
|
|
76
|
+
];
|
|
77
|
+
TextPopover.ctorParameters = () => [
|
|
78
|
+
{ type: PopoverController },
|
|
79
|
+
{ type: TranslateService }
|
|
80
|
+
];
|
|
81
|
+
TextPopover.propDecorators = {
|
|
82
|
+
form: [{ type: ViewChild, args: ['form', { static: true },] }],
|
|
83
|
+
text: [{ type: Input }],
|
|
84
|
+
placeholder: [{ type: Input }],
|
|
85
|
+
editing: [{ type: Input }],
|
|
86
|
+
multiline: [{ type: Input }],
|
|
87
|
+
maxLength: [{ type: Input }],
|
|
88
|
+
autofocus: [{ type: Input }]
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1wb3BvdmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90ZXh0LXBvcG92ZXIvdGV4dC1wb3BvdmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFlbkUsTUFBTSxPQUFPLFdBQVc7SUE2QnRCLFlBQXNCLGlCQUFvQyxFQUFZLFNBQTJCO1FBQTNFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQXhCeEYsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQWtCa0UsQ0FBQztJQWhCckcsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxLQUFLOztRQUNQLE9BQU8sT0FBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxLQUFLLEtBQUksS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLEtBQUs7O1FBQ1AsYUFBTyxJQUFJLENBQUMsSUFBSSwwQ0FBRSxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFJRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxlQUFlO1FBQ2IsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFSyxVQUFVLENBQUMsS0FBVTs7WUFDekIsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLE9BQU87YUFDUjtZQUVELElBQUk7Z0JBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDekIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2Y7UUFDSCxDQUFDO0tBQUE7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzs7WUE1RUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLHkxQ0FBNEM7YUFDN0M7OztZQWxCTyxpQkFBaUI7WUFFakIsZ0JBQWdCOzs7bUJBbUJyQixTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTttQkFFbEMsS0FBSzswQkFDTCxLQUFLO3NCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQb3BvdmVyQ29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7VGV4dEZvcm19IGZyb20gJy4vdGV4dC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQge2xvZ0Zvcm1FcnJvcnMsIHdhaXRXaGlsZVBlbmRpbmd9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3Jtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dFBvcG92ZXJPcHRpb25zIHtcbiAgdGV4dD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGVkaXRpbmc/OiBib29sZWFuO1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIGF1dG9mb2N1cz86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10ZXh0LXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgVGV4dFBvcG92ZXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgVGV4dFBvcG92ZXJPcHRpb25zIHtcblxuICBAVmlld0NoaWxkKCdmb3JtJywgeyBzdGF0aWM6IHRydWUgfSkgZm9ybTogVGV4dEZvcm07XG5cbiAgQElucHV0KCkgdGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBlZGl0aW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgbXVsdGlsaW5lID0gdHJ1ZTtcbiAgQElucHV0KCkgbWF4TGVuZ3RoID0gMjAwMDtcbiAgQElucHV0KCkgYXV0b2ZvY3VzID0gZmFsc2U7XG5cbiAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5lbmFibGVkO1xuICB9XG5cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0/LnZhbGlkIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0/LnZhbHVlLnRleHQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyLCBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZW5hYmxlKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvcm0uc2V0VmFsdWUoeyB0ZXh0OiB0aGlzLnRleHQgfSksIDApO1xuICB9XG5cbiAgYXN5bmMgb25WYWxpZGF0ZShldmVudDogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBhd2FpdCB3YWl0V2hpbGVQZW5kaW5nKHRoaXMuZm9ybSk7XG5cbiAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgIGxvZ0Zvcm1FcnJvcnModGhpcy5mb3JtLmNvbnRyb2wpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9wb3ZlckNvbnRyb2xsZXIuZGlzbWlzcyh2YWx1ZSk7XG4gICAgICB0aGlzLmZvcm0uZXJyb3IgPSBudWxsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5mb3JtLmVycm9yID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG4gIH1cblxuICBlbmFibGUoKSB7XG4gICAgaWYgKHRoaXMuZWRpdGluZykgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMucG9wb3ZlckNvbnRyb2xsZXIuZGlzbWlzcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19
|