ng-tailwind 2.24.310 → 2.24.314
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/README.md +24 -24
- package/animations/ngt-angular-animations.d.ts +5 -5
- package/base/ngt-base-ng-model.d.ts +32 -32
- package/bundles/ng-tailwind.umd.js +7318 -7271
- package/bundles/ng-tailwind.umd.js.map +1 -1
- package/components/ngt-action/ngt-action.component.d.ts +13 -13
- package/components/ngt-action/ngt-action.module.d.ts +2 -2
- package/components/ngt-button/ngt-button.component.d.ts +22 -22
- package/components/ngt-button/ngt-button.module.d.ts +2 -2
- package/components/ngt-checkbox/ngt-checkbox.component.d.ts +41 -41
- package/components/ngt-checkbox/ngt-checkbox.module.d.ts +2 -2
- package/components/ngt-content/ngt-content.component.d.ts +9 -9
- package/components/ngt-content/ngt-content.module.d.ts +2 -2
- package/components/ngt-datatable/ngt-datatable.component.d.ts +112 -112
- package/components/ngt-datatable/ngt-datatable.module.d.ts +2 -2
- package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +11 -11
- package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +11 -11
- package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +24 -24
- package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +47 -47
- package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +19 -19
- package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +10 -10
- package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +17 -17
- package/components/ngt-date/ngt-date.component.d.ts +71 -71
- package/components/ngt-date/ngt-date.module.d.ts +2 -2
- package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +5 -5
- package/components/ngt-dropdown/ngt-dropdown.component.d.ts +42 -42
- package/components/ngt-dropdown/ngt-dropdown.module.d.ts +2 -2
- package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +11 -11
- package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +12 -12
- package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +21 -21
- package/components/ngt-dropzone/ngt-dropzone.component.d.ts +103 -103
- package/components/ngt-dropzone/ngt-dropzone.module.d.ts +2 -2
- package/components/ngt-floating-button/ngt-floating-button.component.d.ts +32 -32
- package/components/ngt-floating-button/ngt-floating-button.module.d.ts +2 -2
- package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +7 -7
- package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.d.ts +2 -2
- package/components/ngt-form/ngt-form.component.d.ts +52 -52
- package/components/ngt-form/ngt-form.module.d.ts +2 -2
- package/components/ngt-header-nav/ngt-header-nav.component.d.ts +11 -11
- package/components/ngt-header-nav/ngt-header-nav.module.d.ts +2 -2
- package/components/ngt-helper/ngt-helper.component.d.ts +15 -10
- package/components/ngt-helper/ngt-helper.module.d.ts +2 -2
- package/components/ngt-input/ngt-input.component.d.ts +92 -92
- package/components/ngt-input/ngt-input.module.d.ts +2 -2
- package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +2 -2
- package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +2 -2
- package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +12 -12
- package/components/ngt-modal/ngt-modal.component.d.ts +19 -19
- package/components/ngt-modal/ngt-modal.module.d.ts +2 -2
- package/components/ngt-multi-select/ngt-multi-select.component.d.ts +97 -97
- package/components/ngt-multi-select/ngt-multi-select.module.d.ts +2 -2
- package/components/ngt-pagination/ngt-pagination.component.d.ts +40 -40
- package/components/ngt-pagination/ngt-pagination.module.d.ts +2 -2
- package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +9 -9
- package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +9 -9
- package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +14 -14
- package/components/ngt-portlet/ngt-portlet.component.d.ts +17 -17
- package/components/ngt-portlet/ngt-portlet.module.d.ts +2 -2
- package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +6 -6
- package/components/ngt-radio-button/ngt-radio-button.component.d.ts +27 -27
- package/components/ngt-radio-button/ngt-radio-button.module.d.ts +2 -2
- package/components/ngt-section/ngt-section.component.d.ts +23 -23
- package/components/ngt-section/ngt-section.module.d.ts +2 -2
- package/components/ngt-select/ngt-select.component.d.ts +122 -122
- package/components/ngt-select/ngt-select.directive.d.ts +13 -13
- package/components/ngt-select/ngt-select.module.d.ts +2 -2
- package/components/ngt-shining/ngt-shining.component.d.ts +16 -16
- package/components/ngt-shining/ngt-shining.module.d.ts +2 -2
- package/components/ngt-sidenav/ngt-sidenav.component.d.ts +29 -29
- package/components/ngt-sidenav/ngt-sidenav.module.d.ts +2 -2
- package/components/ngt-slider/ngt-slider.component.d.ts +31 -31
- package/components/ngt-slider/ngt-slider.module.d.ts +2 -2
- package/components/ngt-svg/ngt-svg.component.d.ts +10 -10
- package/components/ngt-svg/ngt-svg.module.d.ts +2 -2
- package/components/ngt-tag/ngt-tag.component.d.ts +10 -10
- package/components/ngt-tag/ngt-tag.module.d.ts +2 -2
- package/components/ngt-textarea/ngt-textarea.component.d.ts +46 -46
- package/components/ngt-textarea/ngt-textarea.module.d.ts +2 -2
- package/components/ngt-validation/ngt-validation.component.d.ts +10 -10
- package/components/ngt-validation/ngt-validation.module.d.ts +2 -2
- package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +65 -63
- package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +2 -2
- package/enums/size.enum.d.ts +8 -8
- package/esm2015/animations/ngt-angular-animations.js +34 -34
- package/esm2015/base/ngt-base-ng-model.js +90 -90
- package/esm2015/components/ngt-action/ngt-action.component.js +49 -49
- package/esm2015/components/ngt-action/ngt-action.module.js +19 -19
- package/esm2015/components/ngt-button/ngt-button.component.js +106 -106
- package/esm2015/components/ngt-button/ngt-button.module.js +19 -19
- package/esm2015/components/ngt-checkbox/ngt-checkbox.component.js +137 -137
- package/esm2015/components/ngt-checkbox/ngt-checkbox.module.js +19 -19
- package/esm2015/components/ngt-content/ngt-content.component.js +33 -33
- package/esm2015/components/ngt-content/ngt-content.module.js +15 -15
- package/esm2015/components/ngt-datatable/ngt-datatable.component.js +400 -400
- package/esm2015/components/ngt-datatable/ngt-datatable.module.js +58 -58
- package/esm2015/components/ngt-datatable/ngt-tbody/ngt-tbody.component.js +58 -60
- package/esm2015/components/ngt-datatable/ngt-td/ngt-td.component.js +63 -63
- package/esm2015/components/ngt-datatable/ngt-td-check/ngt-td-check.component.js +102 -102
- package/esm2015/components/ngt-datatable/ngt-th/ngt-th.component.js +192 -192
- package/esm2015/components/ngt-datatable/ngt-th-check/ngt-th-check.component.js +87 -87
- package/esm2015/components/ngt-datatable/ngt-thead/ngt-thead.component.js +56 -58
- package/esm2015/components/ngt-datatable/ngt-tr/ngt-tr.component.js +76 -76
- package/esm2015/components/ngt-date/ngt-date.component.js +354 -352
- package/esm2015/components/ngt-date/ngt-date.module.js +25 -25
- package/esm2015/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.js +20 -20
- package/esm2015/components/ngt-dropdown/ngt-dropdown.component.js +165 -165
- package/esm2015/components/ngt-dropdown/ngt-dropdown.module.js +16 -16
- package/esm2015/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.js +47 -47
- package/esm2015/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.js +46 -45
- package/esm2015/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.js +67 -67
- package/esm2015/components/ngt-dropzone/ngt-dropzone.component.js +411 -411
- package/esm2015/components/ngt-dropzone/ngt-dropzone.module.js +37 -37
- package/esm2015/components/ngt-floating-button/ngt-floating-button.component.js +94 -94
- package/esm2015/components/ngt-floating-button/ngt-floating-button.module.js +19 -19
- package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.js +23 -23
- package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.js +15 -15
- package/esm2015/components/ngt-form/ngt-form.component.js +181 -181
- package/esm2015/components/ngt-form/ngt-form.module.js +17 -17
- package/esm2015/components/ngt-header-nav/ngt-header-nav.component.js +38 -38
- package/esm2015/components/ngt-header-nav/ngt-header-nav.module.js +15 -15
- package/esm2015/components/ngt-helper/ngt-helper.component.js +44 -24
- package/esm2015/components/ngt-helper/ngt-helper.module.js +19 -19
- package/esm2015/components/ngt-input/ngt-input.component.js +610 -608
- package/esm2015/components/ngt-input/ngt-input.module.js +28 -28
- package/esm2015/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.js +11 -11
- package/esm2015/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.js +11 -11
- package/esm2015/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.js +40 -40
- package/esm2015/components/ngt-modal/ngt-modal.component.js +79 -79
- package/esm2015/components/ngt-modal/ngt-modal.module.js +28 -28
- package/esm2015/components/ngt-multi-select/ngt-multi-select.component.js +392 -392
- package/esm2015/components/ngt-multi-select/ngt-multi-select.module.js +33 -33
- package/esm2015/components/ngt-pagination/ngt-pagination.component.js +172 -172
- package/esm2015/components/ngt-pagination/ngt-pagination.module.js +23 -23
- package/esm2015/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.js +32 -32
- package/esm2015/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.js +33 -33
- package/esm2015/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.js +47 -45
- package/esm2015/components/ngt-portlet/ngt-portlet.component.js +58 -58
- package/esm2015/components/ngt-portlet/ngt-portlet.module.js +32 -32
- package/esm2015/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.js +19 -19
- package/esm2015/components/ngt-radio-button/ngt-radio-button.component.js +97 -97
- package/esm2015/components/ngt-radio-button/ngt-radio-button.module.js +18 -18
- package/esm2015/components/ngt-section/ngt-section.component.js +98 -98
- package/esm2015/components/ngt-section/ngt-section.module.js +21 -21
- package/esm2015/components/ngt-select/ngt-select.component.js +467 -465
- package/esm2015/components/ngt-select/ngt-select.directive.js +35 -35
- package/esm2015/components/ngt-select/ngt-select.module.js +40 -40
- package/esm2015/components/ngt-shining/ngt-shining.component.js +41 -41
- package/esm2015/components/ngt-shining/ngt-shining.module.js +15 -15
- package/esm2015/components/ngt-sidenav/ngt-sidenav.component.js +123 -123
- package/esm2015/components/ngt-sidenav/ngt-sidenav.module.js +15 -15
- package/esm2015/components/ngt-slider/ngt-slider.component.js +82 -82
- package/esm2015/components/ngt-slider/ngt-slider.module.js +17 -17
- package/esm2015/components/ngt-svg/ngt-svg.component.js +52 -52
- package/esm2015/components/ngt-svg/ngt-svg.module.js +19 -19
- package/esm2015/components/ngt-tag/ngt-tag.component.js +36 -36
- package/esm2015/components/ngt-tag/ngt-tag.module.js +17 -17
- package/esm2015/components/ngt-textarea/ngt-textarea.component.js +211 -209
- package/esm2015/components/ngt-textarea/ngt-textarea.module.js +24 -24
- package/esm2015/components/ngt-validation/ngt-validation.component.js +24 -24
- package/esm2015/components/ngt-validation/ngt-validation.module.js +15 -15
- package/esm2015/directives/ngt-stylizable/ngt-stylizable.directive.js +227 -220
- package/esm2015/directives/ngt-stylizable/ngt-stylizable.module.js +15 -15
- package/esm2015/enums/size.enum.js +11 -11
- package/esm2015/helpers/enum/enum.js +7 -7
- package/esm2015/helpers/form/form.js +14 -14
- package/esm2015/helpers/routing/route.js +11 -11
- package/esm2015/helpers/uuid.js +10 -10
- package/esm2015/ng-tailwind.js +10 -10
- package/esm2015/public-api.js +117 -117
- package/esm2015/services/http/ngt-attachment-http.service.js +3 -3
- package/esm2015/services/http/ngt-http-form.service.js +3 -3
- package/esm2015/services/http/ngt-http-resource.service.js +3 -3
- package/esm2015/services/http/ngt-http-validation.service.js +4 -4
- package/esm2015/services/http/ngt-http.service.js +3 -3
- package/esm2015/services/http/ngt-translate.service.js +3 -3
- package/esm2015/services/ngt-stylizable/ngt-stylizable.service.js +273 -266
- package/fesm2015/ng-tailwind.js +6404 -6365
- package/fesm2015/ng-tailwind.js.map +1 -1
- package/helpers/enum/enum.d.ts +1 -1
- package/helpers/form/form.d.ts +4 -4
- package/helpers/routing/route.d.ts +2 -2
- package/helpers/uuid.d.ts +1 -1
- package/ng-tailwind.d.ts +10 -10
- package/ng-tailwind.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +80 -80
- package/services/http/ngt-attachment-http.service.d.ts +10 -10
- package/services/http/ngt-http-form.service.d.ts +5 -5
- package/services/http/ngt-http-resource.service.d.ts +12 -12
- package/services/http/ngt-http-validation.service.d.ts +10 -10
- package/services/http/ngt-http.service.d.ts +27 -27
- package/services/http/ngt-translate.service.d.ts +27 -27
- package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -93
|
@@ -1,400 +1,400 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Optional, Output, ViewChild, } from '@angular/core';
|
|
3
|
-
import { getEnumFromString } from '../../helpers/enum/enum';
|
|
4
|
-
import { NgtHttpService } from '../../services/http/ngt-http.service';
|
|
5
|
-
import { NgtTranslateService } from '../../services/http/ngt-translate.service';
|
|
6
|
-
export class NgtDatatableComponent {
|
|
7
|
-
constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
|
|
8
|
-
this.injector = injector;
|
|
9
|
-
this.ngtHttpService = ngtHttpService;
|
|
10
|
-
this.changeDetector = changeDetector;
|
|
11
|
-
this.ngtTranslateService = ngtTranslateService;
|
|
12
|
-
this.type = NgtDatatableType.REMOTE;
|
|
13
|
-
this.filterTagBgColor = 'bg-blue-500';
|
|
14
|
-
this.searchDelay = 500;
|
|
15
|
-
this.searchTermMinLength = 1;
|
|
16
|
-
this.searchTermOnEnter = true;
|
|
17
|
-
this.defaultFilters = {};
|
|
18
|
-
this.filtersDescription = {};
|
|
19
|
-
this.onDataChange = new EventEmitter();
|
|
20
|
-
this.onClearFilter = new EventEmitter();
|
|
21
|
-
this.onClearSelectedElements = new EventEmitter();
|
|
22
|
-
this.onSelectedElementsChange = new EventEmitter();
|
|
23
|
-
this.onToogleAllCheckboxes = new EventEmitter();
|
|
24
|
-
this.onToogleCheckbox = new EventEmitter();
|
|
25
|
-
this.onOpenSearchModal = new EventEmitter();
|
|
26
|
-
this.onSearch = new EventEmitter();
|
|
27
|
-
this.data = [];
|
|
28
|
-
this.loading = false;
|
|
29
|
-
this.cleaningFilter = false;
|
|
30
|
-
this.componentReady = false;
|
|
31
|
-
this.filtersTranslated = [];
|
|
32
|
-
this.columnCount = [];
|
|
33
|
-
this.selectedElements = [];
|
|
34
|
-
this.subscriptions = [];
|
|
35
|
-
this.currentState = {
|
|
36
|
-
filters: {
|
|
37
|
-
defaultFilters: {},
|
|
38
|
-
silentFilters: {},
|
|
39
|
-
qualifiedFilters: {},
|
|
40
|
-
},
|
|
41
|
-
sort: {
|
|
42
|
-
field: '',
|
|
43
|
-
direction: ''
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
if (this.table && this.table.nativeElement && this.table.nativeElement.rows
|
|
49
|
-
&& this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
|
|
50
|
-
this.columnCount = this.table.nativeElement.rows[0].cells;
|
|
51
|
-
}
|
|
52
|
-
if (this.inputSearch) {
|
|
53
|
-
this.initSearchWithInput();
|
|
54
|
-
}
|
|
55
|
-
this.initCheckboxEvent();
|
|
56
|
-
if (this.searchDelay == 500) {
|
|
57
|
-
this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
|
|
58
|
-
}
|
|
59
|
-
if (this.searchTermMinLength == 1) {
|
|
60
|
-
this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
ngOnDestroy() {
|
|
64
|
-
this.destroySubscriptions();
|
|
65
|
-
}
|
|
66
|
-
setSearchModalTemplate(template) {
|
|
67
|
-
this.searchModalTemplate = template;
|
|
68
|
-
}
|
|
69
|
-
openSearchModal(reference) {
|
|
70
|
-
this.searchModal.open();
|
|
71
|
-
this.onOpenSearchModal.emit(reference);
|
|
72
|
-
}
|
|
73
|
-
clearSelectedElements() {
|
|
74
|
-
this.selectedElements = [];
|
|
75
|
-
this.onClearSelectedElements.emit();
|
|
76
|
-
}
|
|
77
|
-
getCurrentState() {
|
|
78
|
-
return this.currentState;
|
|
79
|
-
}
|
|
80
|
-
init() {
|
|
81
|
-
this.componentReady = true;
|
|
82
|
-
}
|
|
83
|
-
search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
|
|
84
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
-
if (this.canApplyFilters(filters)) {
|
|
86
|
-
this.onSearch.emit(filters);
|
|
87
|
-
if (searchType == NgtDatatableSearchType.DEFAULT) {
|
|
88
|
-
this.currentState.filters.defaultFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), filters);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
this.currentState.filters.silentFilters = Object.assign(Object.assign({}, this.currentState.filters.silentFilters), filters);
|
|
92
|
-
}
|
|
93
|
-
this.applyFiltersDescription();
|
|
94
|
-
return this.apply(1, applyDelayOnSearch);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
sort(field, direction) {
|
|
99
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
this.currentState.sort = {
|
|
101
|
-
field: field,
|
|
102
|
-
direction: direction
|
|
103
|
-
};
|
|
104
|
-
return this.apply(this.ngtPagination.getCurrentPage());
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
|
|
108
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
-
return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => { var _a; return !((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) ? this.apply(1, false) : null; });
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
getData() {
|
|
113
|
-
return this.data;
|
|
114
|
-
}
|
|
115
|
-
getCurrentSort() {
|
|
116
|
-
return this.currentState.sort;
|
|
117
|
-
}
|
|
118
|
-
setPerPage(perPage) {
|
|
119
|
-
this.ngtPagination.onRegistersPerPageChange(perPage);
|
|
120
|
-
}
|
|
121
|
-
applyFiltersDescription() {
|
|
122
|
-
if (!this.cleaningFilter) {
|
|
123
|
-
this.filtersTranslated = [];
|
|
124
|
-
for (let reference in this.currentState.filters.defaultFilters) {
|
|
125
|
-
if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
|
|
126
|
-
this.filtersTranslated.push({
|
|
127
|
-
reference: reference,
|
|
128
|
-
value: this.currentState.filters.defaultFilters[reference],
|
|
129
|
-
translation: this.filtersDescription[reference]
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
setFilterDescription(reference, description) {
|
|
136
|
-
this.filtersDescription[reference] = description;
|
|
137
|
-
}
|
|
138
|
-
removeFilter(reference) {
|
|
139
|
-
this.cleaningFilter = true;
|
|
140
|
-
if (!reference) {
|
|
141
|
-
this.currentState.filters.defaultFilters = {};
|
|
142
|
-
this.currentState.filters.silentFilters = {};
|
|
143
|
-
this.filtersTranslated = [];
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
delete this.currentState.filters.defaultFilters[reference];
|
|
147
|
-
delete this.currentState.filters.silentFilters[reference];
|
|
148
|
-
this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
|
|
149
|
-
}
|
|
150
|
-
this.onClearFilter.emit(reference);
|
|
151
|
-
if (this.inputSearch && (reference === 'term' || !reference)) {
|
|
152
|
-
this.inputSearch.clearInput();
|
|
153
|
-
}
|
|
154
|
-
this.apply(this.ngtPagination.getCurrentPage(), false).then(() => this.cleaningFilter = false);
|
|
155
|
-
}
|
|
156
|
-
hasAppliedFilter(filter) {
|
|
157
|
-
const reference = typeof filter === 'string' ? filter : Object.keys(filter !== null && filter !== void 0 ? filter : {})[0];
|
|
158
|
-
const appliedFilters = this.currentState.filters.qualifiedFilters;
|
|
159
|
-
return !!Object.keys(appliedFilters).find(key => key == reference);
|
|
160
|
-
}
|
|
161
|
-
hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
|
|
162
|
-
var _a;
|
|
163
|
-
let appliedFilters = {};
|
|
164
|
-
if (searchType == NgtDatatableSearchType.DEFAULT) {
|
|
165
|
-
appliedFilters = this.currentState.filters.defaultFilters;
|
|
166
|
-
}
|
|
167
|
-
else if (searchType == NgtDatatableSearchType.SILENT) {
|
|
168
|
-
appliedFilters = this.currentState.filters.silentFilters;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
appliedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
|
|
172
|
-
}
|
|
173
|
-
return !!((_a = Object.values(appliedFilters)) === null || _a === void 0 ? void 0 : _a.find(filter => !!filter));
|
|
174
|
-
}
|
|
175
|
-
ngOnChanges(changes) {
|
|
176
|
-
if (changes.inputSearch) {
|
|
177
|
-
if (changes.inputSearch.currentValue) {
|
|
178
|
-
this.initSearchWithInput();
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
if (changes.type) {
|
|
182
|
-
this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
|
|
186
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
187
|
-
return new Promise(resolve => {
|
|
188
|
-
if (!this.componentReady) {
|
|
189
|
-
return resolve();
|
|
190
|
-
}
|
|
191
|
-
else if (this.searchTimeout) {
|
|
192
|
-
clearTimeout(this.searchTimeout);
|
|
193
|
-
}
|
|
194
|
-
this.ngtPagination.displayPagination = false;
|
|
195
|
-
this.selectedElements = [];
|
|
196
|
-
if (this.type === NgtDatatableType.REMOTE) {
|
|
197
|
-
if (this.remoteResource) {
|
|
198
|
-
if (loader) {
|
|
199
|
-
this.loading = true;
|
|
200
|
-
this.bindVisibilityAttributes();
|
|
201
|
-
}
|
|
202
|
-
if (applyDelayOnSearch) {
|
|
203
|
-
this.searchTimeout = setTimeout(() => {
|
|
204
|
-
this.loadData(page).then(() => resolve());
|
|
205
|
-
}, this.searchDelay);
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
this.loadData(page).then(() => resolve());
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
console.error('The property [remoteResource] needs to be present to be able to make remote search');
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else if (this.type == NgtDatatableType.FIXED) {
|
|
216
|
-
this.bindVisibilityAttributes();
|
|
217
|
-
resolve();
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
loadData(page) {
|
|
223
|
-
return new Promise((resolve, reject) => {
|
|
224
|
-
const pagination = Object.assign(Object.assign({}, this.ngtPagination.getPagination()), { page: page });
|
|
225
|
-
this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
|
|
226
|
-
this.searching = true;
|
|
227
|
-
if (this.inputSearch) {
|
|
228
|
-
this.inputSearch.isDisabled = true;
|
|
229
|
-
}
|
|
230
|
-
this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
|
|
231
|
-
this.proccessRemoteResponse(response.data);
|
|
232
|
-
this.ngtPagination.proccessPagination(response.meta);
|
|
233
|
-
this.searching = false;
|
|
234
|
-
this.loading = false;
|
|
235
|
-
if (this.inputSearch) {
|
|
236
|
-
this.inputSearch.isDisabled = false;
|
|
237
|
-
}
|
|
238
|
-
this.onDataChange.emit(this.data);
|
|
239
|
-
this.bindVisibilityAttributes();
|
|
240
|
-
resolve();
|
|
241
|
-
}, (error) => {
|
|
242
|
-
console.error(error);
|
|
243
|
-
this.loading = false;
|
|
244
|
-
this.inputSearch.isDisabled = false;
|
|
245
|
-
this.changeDetector.detectChanges();
|
|
246
|
-
reject();
|
|
247
|
-
}));
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
getQualifiedFilters() {
|
|
251
|
-
const qualifiedFilters = {};
|
|
252
|
-
const requestedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
|
|
253
|
-
if (requestedFilters) {
|
|
254
|
-
for (const reference in requestedFilters) {
|
|
255
|
-
const filter = requestedFilters[reference];
|
|
256
|
-
if (this.isValidFilter(filter)) {
|
|
257
|
-
if (filter instanceof NgtCustomFilter) {
|
|
258
|
-
if (filter.tagLabel) {
|
|
259
|
-
this.filtersDescription[reference] = filter.tagLabel;
|
|
260
|
-
this.applyFiltersDescription();
|
|
261
|
-
}
|
|
262
|
-
qualifiedFilters[reference] = filter.term;
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
qualifiedFilters[reference] = filter;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return qualifiedFilters;
|
|
271
|
-
}
|
|
272
|
-
bindVisibilityAttributes() {
|
|
273
|
-
this.changeDetector.detectChanges();
|
|
274
|
-
if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
|
|
275
|
-
this.emptyStateVisible = true;
|
|
276
|
-
}
|
|
277
|
-
else if (this.type == NgtDatatableType.FIXED) {
|
|
278
|
-
this.emptyStateVisible = false;
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
this.emptyStateVisible = false;
|
|
282
|
-
}
|
|
283
|
-
this.changeDetector.detectChanges();
|
|
284
|
-
}
|
|
285
|
-
proccessRemoteResponse(response) {
|
|
286
|
-
this.data = response;
|
|
287
|
-
}
|
|
288
|
-
initSearchWithInput() {
|
|
289
|
-
this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
|
|
290
|
-
if (this.currentState.filters.defaultFilters['term']) {
|
|
291
|
-
if (!value) {
|
|
292
|
-
this.removeFilter('term');
|
|
293
|
-
}
|
|
294
|
-
else if (value.length < this.searchTermMinLength) {
|
|
295
|
-
delete this.currentState.filters.defaultFilters['term'];
|
|
296
|
-
this.search({ term: '' });
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
if (value.length >= this.searchTermMinLength) {
|
|
300
|
-
this.search({ term: value });
|
|
301
|
-
}
|
|
302
|
-
}));
|
|
303
|
-
if (this.searchTermOnEnter) {
|
|
304
|
-
this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
|
|
305
|
-
event.stopImmediatePropagation();
|
|
306
|
-
if (event.keyCode == 13) {
|
|
307
|
-
if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
|
|
308
|
-
this.apply(1, false);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
initCheckboxEvent() {
|
|
315
|
-
this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
|
|
316
|
-
this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
|
|
317
|
-
if (checkedElement.checked) {
|
|
318
|
-
this.selectedElements.push(checkedElement);
|
|
319
|
-
}
|
|
320
|
-
this.onSelectedElementsChange.emit(this.selectedElements);
|
|
321
|
-
}));
|
|
322
|
-
}
|
|
323
|
-
canApplyFilters(filters) {
|
|
324
|
-
if (!this.searching) {
|
|
325
|
-
for (const reference in filters) {
|
|
326
|
-
if (this.isValidFilter(filters[reference])) {
|
|
327
|
-
return true;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
isValidFilter(filter) {
|
|
334
|
-
const value = Object.values(filter !== null && filter !== void 0 ? filter : {})[0];
|
|
335
|
-
const hasValue = !!((value instanceof NgtCustomFilter && value.term) || value);
|
|
336
|
-
const isApplied = this.hasAppliedFilter(filter);
|
|
337
|
-
return isApplied || (!isApplied && hasValue);
|
|
338
|
-
}
|
|
339
|
-
destroySubscriptions() {
|
|
340
|
-
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
341
|
-
this.subscriptions = [];
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
NgtDatatableComponent.decorators = [
|
|
345
|
-
{ type: Component, args: [{
|
|
346
|
-
selector: 'ngt-datatable',
|
|
347
|
-
template: "<div class=\"w-full\">\n <div class=\"flex flex-wrap w-full\">\n <ngt-tag *ngIf=\"hasAppliedFilters()\" (click)=\"removeFilter()\" class=\"mr-0 sm:mr-4 mb-4 w-full sm:w-auto\"\n color.bg=\"bg-red-500\" ngt-stylizable>Limpar Filtros</ngt-tag>\n\n <ng-container *ngIf=\"hasAppliedFilters()\">\n <ng-container *ngFor=\"let filter of filtersTranslated\">\n <ngt-tag (click)=\"removeFilter(filter.reference)\" class=\"mr-0 sm:mr-4 mb-4 w-full sm:w-auto\"\n [color.bg]=\"filterTagBgColor\" ngt-stylizable>\n {{ filter.translation + ': ' + (filter?.value?.tagValue ? filter.value.tagValue : filter.value)}}\n </ngt-tag>\n </ng-container>\n </ng-container>\n </div>\n\n <table style=\"display: table;\" class=\"text-left w-full border-collapse table-responsive\" #table>\n <ng-content></ng-content>\n </table>\n\n <p *ngIf=\"emptyStateVisible\" class=\"mt-8 mx-auto self-center text-center text-xl\">\n {{ ngtTranslateService.ngtDatatableNoDataFound }}\n </p>\n\n <div *ngIf=\"loading\">\n <div *ngFor=\"let i of [1, 2, 3, 4]\" class=\"flex w-full mt-3\">\n <ng-container *ngIf=\"columnCount.length >= 2\">\n <ng-container *ngFor=\"let j of columnCount; let last = last\">\n <ng-container *ngIf=\"last\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n\n <ng-container *ngIf=\"!last\">\n <ngt-shining class=\"h-10 w-full mr-10\"></ngt-shining>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"columnCount.length < 2\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full mr-10 ml-10\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n </div>\n </div>\n</div>\n\n<div class=\"clearfix mt-2 md:mt-8\" [hidden]='!data || data.length == 0'>\n <ngt-pagination [pagesInterval]='4' (onPageChange)='apply($event, false)' (onPerPageChange)='apply(1, false)'\n #ngtPagination>\n </ngt-pagination>\n</div>\n\n<ngt-modal #searchModal [customLayout]='true'>\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\n</ngt-modal>",
|
|
348
|
-
styles: ["@media (max-width:767px){.table-responsive{display:block;position:relative;width:100%}.table-responsive tbody,.table-responsive td,.table-responsive th,.table-responsive thead,.table-responsive tr{display:block}.table-responsive td,.table-responsive th{height:50px}.table-responsive thead{float:left;margin-bottom:15px}.table-responsive tbody{width:auto;position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}.table-responsive tbody tr{display:inline-block;min-width:100%}}"]
|
|
349
|
-
},] }
|
|
350
|
-
];
|
|
351
|
-
NgtDatatableComponent.ctorParameters = () => [
|
|
352
|
-
{ type: Injector },
|
|
353
|
-
{ type: NgtHttpService },
|
|
354
|
-
{ type: ChangeDetectorRef },
|
|
355
|
-
{ type: NgtTranslateService, decorators: [{ type: Optional }] }
|
|
356
|
-
];
|
|
357
|
-
NgtDatatableComponent.propDecorators = {
|
|
358
|
-
table: [{ type: ViewChild, args: ['table', { static: true },] }],
|
|
359
|
-
ngtPagination: [{ type: ViewChild, args: ['ngtPagination', { static: true },] }],
|
|
360
|
-
searchModal: [{ type: ViewChild, args: ['searchModal', { static: true },] }],
|
|
361
|
-
remoteResource: [{ type: Input }],
|
|
362
|
-
type: [{ type: Input }],
|
|
363
|
-
filterTagBgColor: [{ type: Input }],
|
|
364
|
-
inputSearch: [{ type: Input }],
|
|
365
|
-
searchDelay: [{ type: Input }],
|
|
366
|
-
searchTermMinLength: [{ type: Input }],
|
|
367
|
-
searchTermOnEnter: [{ type: Input }],
|
|
368
|
-
defaultFilters: [{ type: Input }],
|
|
369
|
-
filtersDescription: [{ type: Input }],
|
|
370
|
-
onDataChange: [{ type: Output }],
|
|
371
|
-
onClearFilter: [{ type: Output }],
|
|
372
|
-
onClearSelectedElements: [{ type: Output }],
|
|
373
|
-
onSelectedElementsChange: [{ type: Output }],
|
|
374
|
-
onToogleAllCheckboxes: [{ type: Output }],
|
|
375
|
-
onToogleCheckbox: [{ type: Output }],
|
|
376
|
-
onOpenSearchModal: [{ type: Output }],
|
|
377
|
-
onSearch: [{ type: Output }]
|
|
378
|
-
};
|
|
379
|
-
export var NgtDatatableType;
|
|
380
|
-
(function (NgtDatatableType) {
|
|
381
|
-
NgtDatatableType["REMOTE"] = "REMOTE";
|
|
382
|
-
NgtDatatableType["FIXED"] = "FIXED";
|
|
383
|
-
})(NgtDatatableType || (NgtDatatableType = {}));
|
|
384
|
-
export var NgtDatatableSearchType;
|
|
385
|
-
(function (NgtDatatableSearchType) {
|
|
386
|
-
NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
|
|
387
|
-
NgtDatatableSearchType["SILENT"] = "SILENT";
|
|
388
|
-
})(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
|
|
389
|
-
export var NgtDatatableParam;
|
|
390
|
-
(function (NgtDatatableParam) {
|
|
391
|
-
NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
|
|
392
|
-
NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
|
|
393
|
-
NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
|
|
394
|
-
NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
|
|
395
|
-
})(NgtDatatableParam || (NgtDatatableParam = {}));
|
|
396
|
-
export class NgtCheckedElement {
|
|
397
|
-
}
|
|
398
|
-
export class NgtCustomFilter {
|
|
399
|
-
}
|
|
400
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQXNDLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBVWhGLE1BQU0sT0FBTyxxQkFBcUI7SUFpRDlCLFlBQ1ksUUFBa0IsRUFDbEIsY0FBOEIsRUFDOUIsY0FBaUMsRUFFbEMsbUJBQXdDO1FBSnZDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUVsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBaERuQyxTQUFJLEdBQXFCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNqRCxxQkFBZ0IsR0FBVyxhQUFhLENBQUM7UUFFekMsZ0JBQVcsR0FBVyxHQUFHLENBQUM7UUFDMUIsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBQ2hDLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUNsQyxtQkFBYyxHQUFRLEVBQUUsQ0FBQztRQUN6Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFdkIsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyRCxrQkFBYSxHQUFzQixJQUFJ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Q04sTUFBTTsrQkFDTixNQUFNO2dDQUNOLE1BQU07dUJBQ04sTUFBTTs7QUFtWlgsTUFBTSxDQUFOLElBQVksZ0JBR1g7QUFIRCxXQUFZLGdCQUFnQjtJQUN4QixxQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBRzNCO0FBRUQsTUFBTSxDQUFOLElBQVksc0JBR1g7QUFIRCxXQUFZLHNCQUFzQjtJQUM5Qiw2Q0FBbUIsQ0FBQTtJQUNuQiwyQ0FBaUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsc0JBQXNCLEtBQXRCLHNCQUFzQixRQUdqQztBQUVELE1BQU0sQ0FBTixJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDekIseUVBQWdCLENBQUE7SUFDaEIscUVBQWMsQ0FBQTtJQUNkLDJFQUFpQixDQUFBO0lBQ2pCLDZFQUFrQixDQUFBO0FBQ3RCLENBQUMsRUFMVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBSzVCO0FBRUQsTUFBTSxPQUFPLGlCQUFpQjtDQUk3QjtBQUVELE1BQU0sT0FBTyxlQUFlO0NBSTNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xuaW1wb3J0IHsgTmd0SHR0cFBhZ2luYXRpb24sIE5ndEh0dHBSZXNwb25zZSwgTmd0SHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0VHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LXBhZ2luYXRpb24vbmd0LXBhZ2luYXRpb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3QtZGF0YXRhYmxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd0RGF0YXRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ25ndFBhZ2luYXRpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmd0UGFnaW5hdGlvbjogTmd0UGFnaW5hdGlvbkNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hNb2RhbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBzZWFyY2hNb2RhbDogTmd0TW9kYWxDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgcmVtb3RlUmVzb3VyY2U6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdHlwZTogTmd0RGF0YXRhYmxlVHlwZSA9IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXJUYWdCZ0NvbG9yOiBzdHJpbmcgPSAnYmctYmx1ZS01MDAnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbnB1dFNlYXJjaDogTmd0SW5wdXRDb21wb25lbnQ7XG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaERlbGF5OiBudW1iZXIgPSA1MDA7XG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaFRlcm1NaW5MZW5ndGg6IG51bWJlciA9IDE7XG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaFRlcm1PbkVudGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdEZpbHRlcnM6IGFueSA9IHt9O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXJzRGVzY3JpcHRpb24gPSB7fTtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25EYXRhQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xlYXJGaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGVhclNlbGVjdGVkRWxlbWVudHM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uVG9vZ2xlQWxsQ2hlY2tib3hlczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblRvb2dsZUNoZWNrYm94OiBFdmVudEVtaXR0ZXI8Tmd0Q2hlY2tlZEVsZW1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25PcGVuU2VhcmNoTW9kYWw6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWFyY2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIHNlYXJjaE1vZGFsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHVibGljIGRhdGEgPSBbXTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBjbGVhbmluZ0ZpbHRlciA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb21wb25lbnRSZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBmaWx0ZXJzVHJhbnNsYXRlZCA9IFtdO1xuICAgIHB1YmxpYyBlbXB0eVN0YXRlVmlzaWJsZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29sdW1uQ291bnQgPSBbXTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRFbGVtZW50czogQXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+ID0gW107XG5cbiAgICBwcml2YXRlIHNlYXJjaGluZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHNlYXJjaFRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcbiAgICBwcml2YXRlIGN1cnJlbnRTdGF0ZSA9IHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHt9LFxuICAgICAgICAgICAgc2lsZW50RmlsdGVyczoge30sXG4gICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgICAgZmllbGQ6ICcnLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgbmd0SHR0cFNlcnZpY2U6IE5ndEh0dHBTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgcHVibGljIG5ndFRyYW5zbGF0ZVNlcnZpY2U6IE5ndFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHsgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy50YWJsZSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NcbiAgICAgICAgICAgICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkNvdW50ID0gdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NbMF0uY2VsbHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRDaGVja2JveEV2ZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoRGVsYXkgPT0gNTAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERlbGF5ID0gdGhpcy5pbmplY3Rvci5nZXQoJ05ndERhdGF0YWJsZVNlYXJjaERlbGF5JywgNTAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoID0gdGhpcy5pbmplY3Rvci5nZXQoJ05ndERhdGF0YWJsZVNlYXJjaFRlcm1NaW5MZW5ndGgnLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTZWFyY2hNb2RhbFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoTW9kYWxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuU2VhcmNoTW9kYWwocmVmZXJlbmNlPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoTW9kYWwub3BlbigpO1xuICAgICAgICB0aGlzLm9uT3BlblNlYXJjaE1vZGFsLmVtaXQocmVmZXJlbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3RlZEVsZW1lbnRzKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5vbkNsZWFyU2VsZWN0ZWRFbGVtZW50cy5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKFxuICAgICAgICBmaWx0ZXJzOiBPYmplY3QsXG4gICAgICAgIHNlYXJjaFR5cGU6IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUgPSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQsXG4gICAgICAgIGFwcGx5RGVsYXlPblNlYXJjaDogYm9vbGVhbiA9IHRydWVcbiAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQXBwbHlGaWx0ZXJzKGZpbHRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoLmVtaXQoZmlsdGVycyk7XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLmZpbHRlcnMgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMsIC4uLmZpbHRlcnMgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNEZXNjcmlwdGlvbigpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseSgxLCBhcHBseURlbGF5T25TZWFyY2gpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNvcnQoZmllbGQ6IGFueSwgZGlyZWN0aW9uOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuc29ydCA9IHtcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkodGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWZyZXNoKHN0YXlJblBhZ2U6IE5ndERhdGF0YWJsZVBhcmFtID0gTmd0RGF0YXRhYmxlUGFyYW0uUkVTRVRfUEFHRSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkoXG4gICAgICAgICAgICBzdGF5SW5QYWdlID8gdGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkgOiAxLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBsb2FkZXJcbiAgICAgICAgKS50aGVuKCgpID0+ICF0aGlzLmRhdGE/Lmxlbmd0aCA/IHRoaXMuYXBwbHkoMSwgZmFsc2UpIDogbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRTb3J0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUuc29ydDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UGVyUGFnZShwZXJQYWdlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLm9uUmVnaXN0ZXJzUGVyUGFnZUNoYW5nZShwZXJQYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGVhbmluZ0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzVHJhbnNsYXRlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCByZWZlcmVuY2UgaW4gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdICYmIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb246IHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpbHRlckRlc2NyaXB0aW9uKHJlZmVyZW5jZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV0gPSBkZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyKHJlZmVyZW5jZT86IGFueSkge1xuICAgICAgICB0aGlzLmNsZWFuaW5nRmlsdGVyID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXJlZmVyZW5jZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVyc1tyZWZlcmVuY2VdO1xuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICYmIGVsZW1lbnQucmVmZXJlbmNlICE9PSByZWZlcmVuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkNsZWFyRmlsdGVyLmVtaXQocmVmZXJlbmNlKTtcblxuICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCAmJiAocmVmZXJlbmNlID09PSAndGVybScgfHwgIXJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guY2xlYXJJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBseSh0aGlzLm5ndFBhZ2luYXRpb24uZ2V0Q3VycmVudFBhZ2UoKSwgZmFsc2UpLnRoZW4oKCkgPT4gdGhpcy5jbGVhbmluZ0ZpbHRlciA9IGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQXBwbGllZEZpbHRlcihmaWx0ZXI6IE9iamVjdCB8IE5ndEN1c3RvbUZpbHRlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2U6IHN0cmluZyA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8gZmlsdGVyIDogT2JqZWN0LmtleXMoZmlsdGVyID8/IHt9KVswXTtcbiAgICAgICAgY29uc3QgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnM7XG5cbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMoYXBwbGllZEZpbHRlcnMpLmZpbmQoa2V5ID0+IGtleSA9PSByZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNBcHBsaWVkRmlsdGVycyhzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XG4gICAgICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHt9O1xuXG4gICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzO1xuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5TSUxFTlQpIHtcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LnZhbHVlcyhhcHBsaWVkRmlsdGVycyk/LmZpbmQoZmlsdGVyID0+ICEhZmlsdGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaW5wdXRTZWFyY2guY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy50eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBnZXRFbnVtRnJvbVN0cmluZyhjaGFuZ2VzLnR5cGUuY3VycmVudFZhbHVlLCBOZ3REYXRhdGFibGVUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhcHBseShwYWdlID0gMSwgYXBwbHlEZWxheU9uU2VhcmNoOiBib29sZWFuID0gdHJ1ZSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5kaXNwbGF5UGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3RlUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwbHlEZWxheU9uU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2UpLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VhcmNoRGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YShwYWdlKS50aGVuKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgcHJvcGVydHkgW3JlbW90ZVJlc291cmNlXSBuZWVkcyB0byBiZSBwcmVzZW50IHRvIGJlIGFibGUgdG8gbWFrZSByZW1vdGUgc2VhcmNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZERhdGEocGFnZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uOiBOZ3RIdHRwUGFnaW5hdGlvbiA9IHsgLi4udGhpcy5uZ3RQYWdpbmF0aW9uLmdldFBhZ2luYXRpb24oKSwgLi4ueyBwYWdlOiBwYWdlIH0gfTtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5xdWFsaWZpZWRGaWx0ZXJzID0gdGhpcy5nZXRRdWFsaWZpZWRGaWx0ZXJzKCk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RIdHRwU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3RlUmVzb3VyY2UsIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycywgcGFnaW5hdGlvbiwgdGhpcy5jdXJyZW50U3RhdGUuc29ydFxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2U6IE5ndEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jY2Vzc1JlbW90ZVJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLnByb2NjZXNzUGFnaW5hdGlvbihyZXNwb25zZS5tZXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZS5lbWl0KHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRRdWFsaWZpZWRGaWx0ZXJzKCkge1xuICAgICAgICBjb25zdCBxdWFsaWZpZWRGaWx0ZXJzID0ge307XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWx0ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBpbiByZXF1ZXN0ZWRGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdGVkRmlsdGVyc1tyZWZlcmVuY2VdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZEZpbHRlcihmaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBOZ3RDdXN0b21GaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIudGFnTGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZmlsdGVyLnRhZ0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyc1tyZWZlcmVuY2VdID0gZmlsdGVyLnRlcm07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzW3JlZmVyZW5jZV0gPSBmaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVhbGlmaWVkRmlsdGVycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLlJFTU9URSAmJiAhdGhpcy5kYXRhLmxlbmd0aCAmJiAhdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jY2Vzc1JlbW90ZVJlc3BvbnNlKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U2VhcmNoV2l0aElucHV0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2gub25WYWx1ZUNoYW5nZSgpLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzWyd0ZXJtJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIoJ3Rlcm0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzWyd0ZXJtJ107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKHsgdGVybTogJycgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCh7IHRlcm06IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybU9uRW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gudmFsdWUgJiYgdGhpcy5pbnB1dFNlYXJjaC52YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5KDEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q2hlY2tib3hFdmVudCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLm9uVG9vZ2xlQ2hlY2tib3guc3Vic2NyaWJlKChjaGVja2VkRWxlbWVudDogTmd0Q2hlY2tlZEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gY2hlY2tlZEVsZW1lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzLnB1c2goY2hlY2tlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEVsZW1lbnRzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5BcHBseUZpbHRlcnMoZmlsdGVyczogT2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hpbmcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIGZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkRmlsdGVyKGZpbHRlcnNbcmVmZXJlbmNlXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZEZpbHRlcihmaWx0ZXI6IE9iamVjdCB8IE5ndEN1c3RvbUZpbHRlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZTogc3RyaW5nIHwgTmd0Q3VzdG9tRmlsdGVyID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXIgPz8ge30pWzBdO1xuICAgICAgICBjb25zdCBoYXNWYWx1ZTogYm9vbGVhbiA9ICEhKCh2YWx1ZSBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlciAmJiB2YWx1ZS50ZXJtKSB8fCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGlzQXBwbGllZDogYm9vbGVhbiA9IHRoaXMuaGFzQXBwbGllZEZpbHRlcihmaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiBpc0FwcGxpZWQgfHwgKCFpc0FwcGxpZWQgJiYgaGFzVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlVHlwZSB7XG4gICAgUkVNT1RFID0gJ1JFTU9URScsXG4gICAgRklYRUQgPSAnRklYRUQnXG59XG5cbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVNlYXJjaFR5cGUge1xuICAgIERFRkFVTFQgPSAnREVGQVVMVCcsXG4gICAgU0lMRU5UID0gJ1NJTEVOVCcsXG59XG5cbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVBhcmFtIHtcbiAgICBTVEFZX0lOX1BBR0UgPSAxLFxuICAgIFJFU0VUX1BBR0UgPSAwLFxuICAgIEVOQUJMRV9MT0FERVIgPSAxLFxuICAgIERJU0FCTEVfTE9BREVSID0gMFxufVxuXG5leHBvcnQgY2xhc3MgTmd0Q2hlY2tlZEVsZW1lbnQge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyBjaGVja2VkOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWZlcmVuY2U6IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ndEN1c3RvbUZpbHRlciB7XG4gICAgcHVibGljIHRlcm06IHN0cmluZztcbiAgICBwdWJsaWMgdGFnVmFsdWU6IHN0cmluZztcbiAgICBwdWJsaWMgdGFnTGFiZWw/OiBzdHJpbmc7XG59XG4iXX0=
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Optional, Output, ViewChild, } from '@angular/core';
|
|
3
|
+
import { getEnumFromString } from '../../helpers/enum/enum';
|
|
4
|
+
import { NgtHttpService } from '../../services/http/ngt-http.service';
|
|
5
|
+
import { NgtTranslateService } from '../../services/http/ngt-translate.service';
|
|
6
|
+
export class NgtDatatableComponent {
|
|
7
|
+
constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
|
|
8
|
+
this.injector = injector;
|
|
9
|
+
this.ngtHttpService = ngtHttpService;
|
|
10
|
+
this.changeDetector = changeDetector;
|
|
11
|
+
this.ngtTranslateService = ngtTranslateService;
|
|
12
|
+
this.type = NgtDatatableType.REMOTE;
|
|
13
|
+
this.filterTagBgColor = 'bg-blue-500';
|
|
14
|
+
this.searchDelay = 500;
|
|
15
|
+
this.searchTermMinLength = 1;
|
|
16
|
+
this.searchTermOnEnter = true;
|
|
17
|
+
this.defaultFilters = {};
|
|
18
|
+
this.filtersDescription = {};
|
|
19
|
+
this.onDataChange = new EventEmitter();
|
|
20
|
+
this.onClearFilter = new EventEmitter();
|
|
21
|
+
this.onClearSelectedElements = new EventEmitter();
|
|
22
|
+
this.onSelectedElementsChange = new EventEmitter();
|
|
23
|
+
this.onToogleAllCheckboxes = new EventEmitter();
|
|
24
|
+
this.onToogleCheckbox = new EventEmitter();
|
|
25
|
+
this.onOpenSearchModal = new EventEmitter();
|
|
26
|
+
this.onSearch = new EventEmitter();
|
|
27
|
+
this.data = [];
|
|
28
|
+
this.loading = false;
|
|
29
|
+
this.cleaningFilter = false;
|
|
30
|
+
this.componentReady = false;
|
|
31
|
+
this.filtersTranslated = [];
|
|
32
|
+
this.columnCount = [];
|
|
33
|
+
this.selectedElements = [];
|
|
34
|
+
this.subscriptions = [];
|
|
35
|
+
this.currentState = {
|
|
36
|
+
filters: {
|
|
37
|
+
defaultFilters: {},
|
|
38
|
+
silentFilters: {},
|
|
39
|
+
qualifiedFilters: {},
|
|
40
|
+
},
|
|
41
|
+
sort: {
|
|
42
|
+
field: '',
|
|
43
|
+
direction: ''
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
if (this.table && this.table.nativeElement && this.table.nativeElement.rows
|
|
49
|
+
&& this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
|
|
50
|
+
this.columnCount = this.table.nativeElement.rows[0].cells;
|
|
51
|
+
}
|
|
52
|
+
if (this.inputSearch) {
|
|
53
|
+
this.initSearchWithInput();
|
|
54
|
+
}
|
|
55
|
+
this.initCheckboxEvent();
|
|
56
|
+
if (this.searchDelay == 500) {
|
|
57
|
+
this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
|
|
58
|
+
}
|
|
59
|
+
if (this.searchTermMinLength == 1) {
|
|
60
|
+
this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
ngOnDestroy() {
|
|
64
|
+
this.destroySubscriptions();
|
|
65
|
+
}
|
|
66
|
+
setSearchModalTemplate(template) {
|
|
67
|
+
this.searchModalTemplate = template;
|
|
68
|
+
}
|
|
69
|
+
openSearchModal(reference) {
|
|
70
|
+
this.searchModal.open();
|
|
71
|
+
this.onOpenSearchModal.emit(reference);
|
|
72
|
+
}
|
|
73
|
+
clearSelectedElements() {
|
|
74
|
+
this.selectedElements = [];
|
|
75
|
+
this.onClearSelectedElements.emit();
|
|
76
|
+
}
|
|
77
|
+
getCurrentState() {
|
|
78
|
+
return this.currentState;
|
|
79
|
+
}
|
|
80
|
+
init() {
|
|
81
|
+
this.componentReady = true;
|
|
82
|
+
}
|
|
83
|
+
search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
if (this.canApplyFilters(filters)) {
|
|
86
|
+
this.onSearch.emit(filters);
|
|
87
|
+
if (searchType == NgtDatatableSearchType.DEFAULT) {
|
|
88
|
+
this.currentState.filters.defaultFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), filters);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.currentState.filters.silentFilters = Object.assign(Object.assign({}, this.currentState.filters.silentFilters), filters);
|
|
92
|
+
}
|
|
93
|
+
this.applyFiltersDescription();
|
|
94
|
+
return this.apply(1, applyDelayOnSearch);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
sort(field, direction) {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
this.currentState.sort = {
|
|
101
|
+
field: field,
|
|
102
|
+
direction: direction
|
|
103
|
+
};
|
|
104
|
+
return this.apply(this.ngtPagination.getCurrentPage());
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => { var _a; return !((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) ? this.apply(1, false) : null; });
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
getData() {
|
|
113
|
+
return this.data;
|
|
114
|
+
}
|
|
115
|
+
getCurrentSort() {
|
|
116
|
+
return this.currentState.sort;
|
|
117
|
+
}
|
|
118
|
+
setPerPage(perPage) {
|
|
119
|
+
this.ngtPagination.onRegistersPerPageChange(perPage);
|
|
120
|
+
}
|
|
121
|
+
applyFiltersDescription() {
|
|
122
|
+
if (!this.cleaningFilter) {
|
|
123
|
+
this.filtersTranslated = [];
|
|
124
|
+
for (let reference in this.currentState.filters.defaultFilters) {
|
|
125
|
+
if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
|
|
126
|
+
this.filtersTranslated.push({
|
|
127
|
+
reference: reference,
|
|
128
|
+
value: this.currentState.filters.defaultFilters[reference],
|
|
129
|
+
translation: this.filtersDescription[reference]
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
setFilterDescription(reference, description) {
|
|
136
|
+
this.filtersDescription[reference] = description;
|
|
137
|
+
}
|
|
138
|
+
removeFilter(reference) {
|
|
139
|
+
this.cleaningFilter = true;
|
|
140
|
+
if (!reference) {
|
|
141
|
+
this.currentState.filters.defaultFilters = {};
|
|
142
|
+
this.currentState.filters.silentFilters = {};
|
|
143
|
+
this.filtersTranslated = [];
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
delete this.currentState.filters.defaultFilters[reference];
|
|
147
|
+
delete this.currentState.filters.silentFilters[reference];
|
|
148
|
+
this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
|
|
149
|
+
}
|
|
150
|
+
this.onClearFilter.emit(reference);
|
|
151
|
+
if (this.inputSearch && (reference === 'term' || !reference)) {
|
|
152
|
+
this.inputSearch.clearInput();
|
|
153
|
+
}
|
|
154
|
+
this.apply(this.ngtPagination.getCurrentPage(), false).then(() => this.cleaningFilter = false);
|
|
155
|
+
}
|
|
156
|
+
hasAppliedFilter(filter) {
|
|
157
|
+
const reference = typeof filter === 'string' ? filter : Object.keys(filter !== null && filter !== void 0 ? filter : {})[0];
|
|
158
|
+
const appliedFilters = this.currentState.filters.qualifiedFilters;
|
|
159
|
+
return !!Object.keys(appliedFilters).find(key => key == reference);
|
|
160
|
+
}
|
|
161
|
+
hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
|
|
162
|
+
var _a;
|
|
163
|
+
let appliedFilters = {};
|
|
164
|
+
if (searchType == NgtDatatableSearchType.DEFAULT) {
|
|
165
|
+
appliedFilters = this.currentState.filters.defaultFilters;
|
|
166
|
+
}
|
|
167
|
+
else if (searchType == NgtDatatableSearchType.SILENT) {
|
|
168
|
+
appliedFilters = this.currentState.filters.silentFilters;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
appliedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
|
|
172
|
+
}
|
|
173
|
+
return !!((_a = Object.values(appliedFilters)) === null || _a === void 0 ? void 0 : _a.find(filter => !!filter));
|
|
174
|
+
}
|
|
175
|
+
ngOnChanges(changes) {
|
|
176
|
+
if (changes.inputSearch) {
|
|
177
|
+
if (changes.inputSearch.currentValue) {
|
|
178
|
+
this.initSearchWithInput();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (changes.type) {
|
|
182
|
+
this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
|
|
186
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
return new Promise(resolve => {
|
|
188
|
+
if (!this.componentReady) {
|
|
189
|
+
return resolve();
|
|
190
|
+
}
|
|
191
|
+
else if (this.searchTimeout) {
|
|
192
|
+
clearTimeout(this.searchTimeout);
|
|
193
|
+
}
|
|
194
|
+
this.ngtPagination.displayPagination = false;
|
|
195
|
+
this.selectedElements = [];
|
|
196
|
+
if (this.type === NgtDatatableType.REMOTE) {
|
|
197
|
+
if (this.remoteResource) {
|
|
198
|
+
if (loader) {
|
|
199
|
+
this.loading = true;
|
|
200
|
+
this.bindVisibilityAttributes();
|
|
201
|
+
}
|
|
202
|
+
if (applyDelayOnSearch) {
|
|
203
|
+
this.searchTimeout = setTimeout(() => {
|
|
204
|
+
this.loadData(page).then(() => resolve());
|
|
205
|
+
}, this.searchDelay);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.loadData(page).then(() => resolve());
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
console.error('The property [remoteResource] needs to be present to be able to make remote search');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else if (this.type == NgtDatatableType.FIXED) {
|
|
216
|
+
this.bindVisibilityAttributes();
|
|
217
|
+
resolve();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
loadData(page) {
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
const pagination = Object.assign(Object.assign({}, this.ngtPagination.getPagination()), { page: page });
|
|
225
|
+
this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
|
|
226
|
+
this.searching = true;
|
|
227
|
+
if (this.inputSearch) {
|
|
228
|
+
this.inputSearch.isDisabled = true;
|
|
229
|
+
}
|
|
230
|
+
this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
|
|
231
|
+
this.proccessRemoteResponse(response.data);
|
|
232
|
+
this.ngtPagination.proccessPagination(response.meta);
|
|
233
|
+
this.searching = false;
|
|
234
|
+
this.loading = false;
|
|
235
|
+
if (this.inputSearch) {
|
|
236
|
+
this.inputSearch.isDisabled = false;
|
|
237
|
+
}
|
|
238
|
+
this.onDataChange.emit(this.data);
|
|
239
|
+
this.bindVisibilityAttributes();
|
|
240
|
+
resolve();
|
|
241
|
+
}, (error) => {
|
|
242
|
+
console.error(error);
|
|
243
|
+
this.loading = false;
|
|
244
|
+
this.inputSearch.isDisabled = false;
|
|
245
|
+
this.changeDetector.detectChanges();
|
|
246
|
+
reject();
|
|
247
|
+
}));
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
getQualifiedFilters() {
|
|
251
|
+
const qualifiedFilters = {};
|
|
252
|
+
const requestedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
|
|
253
|
+
if (requestedFilters) {
|
|
254
|
+
for (const reference in requestedFilters) {
|
|
255
|
+
const filter = requestedFilters[reference];
|
|
256
|
+
if (this.isValidFilter(filter)) {
|
|
257
|
+
if (filter instanceof NgtCustomFilter) {
|
|
258
|
+
if (filter.tagLabel) {
|
|
259
|
+
this.filtersDescription[reference] = filter.tagLabel;
|
|
260
|
+
this.applyFiltersDescription();
|
|
261
|
+
}
|
|
262
|
+
qualifiedFilters[reference] = filter.term;
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
qualifiedFilters[reference] = filter;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return qualifiedFilters;
|
|
271
|
+
}
|
|
272
|
+
bindVisibilityAttributes() {
|
|
273
|
+
this.changeDetector.detectChanges();
|
|
274
|
+
if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
|
|
275
|
+
this.emptyStateVisible = true;
|
|
276
|
+
}
|
|
277
|
+
else if (this.type == NgtDatatableType.FIXED) {
|
|
278
|
+
this.emptyStateVisible = false;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
this.emptyStateVisible = false;
|
|
282
|
+
}
|
|
283
|
+
this.changeDetector.detectChanges();
|
|
284
|
+
}
|
|
285
|
+
proccessRemoteResponse(response) {
|
|
286
|
+
this.data = response;
|
|
287
|
+
}
|
|
288
|
+
initSearchWithInput() {
|
|
289
|
+
this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
|
|
290
|
+
if (this.currentState.filters.defaultFilters['term']) {
|
|
291
|
+
if (!value) {
|
|
292
|
+
this.removeFilter('term');
|
|
293
|
+
}
|
|
294
|
+
else if (value.length < this.searchTermMinLength) {
|
|
295
|
+
delete this.currentState.filters.defaultFilters['term'];
|
|
296
|
+
this.search({ term: '' });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (value.length >= this.searchTermMinLength) {
|
|
300
|
+
this.search({ term: value });
|
|
301
|
+
}
|
|
302
|
+
}));
|
|
303
|
+
if (this.searchTermOnEnter) {
|
|
304
|
+
this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
|
|
305
|
+
event.stopImmediatePropagation();
|
|
306
|
+
if (event.keyCode == 13) {
|
|
307
|
+
if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
|
|
308
|
+
this.apply(1, false);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
initCheckboxEvent() {
|
|
315
|
+
this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
|
|
316
|
+
this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
|
|
317
|
+
if (checkedElement.checked) {
|
|
318
|
+
this.selectedElements.push(checkedElement);
|
|
319
|
+
}
|
|
320
|
+
this.onSelectedElementsChange.emit(this.selectedElements);
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
canApplyFilters(filters) {
|
|
324
|
+
if (!this.searching) {
|
|
325
|
+
for (const reference in filters) {
|
|
326
|
+
if (this.isValidFilter(filters[reference])) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
isValidFilter(filter) {
|
|
334
|
+
const value = Object.values(filter !== null && filter !== void 0 ? filter : {})[0];
|
|
335
|
+
const hasValue = !!((value instanceof NgtCustomFilter && value.term) || value);
|
|
336
|
+
const isApplied = this.hasAppliedFilter(filter);
|
|
337
|
+
return isApplied || (!isApplied && hasValue);
|
|
338
|
+
}
|
|
339
|
+
destroySubscriptions() {
|
|
340
|
+
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
341
|
+
this.subscriptions = [];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
NgtDatatableComponent.decorators = [
|
|
345
|
+
{ type: Component, args: [{
|
|
346
|
+
selector: 'ngt-datatable',
|
|
347
|
+
template: "<div class=\"w-full\">\r\n <div class=\"flex flex-wrap w-full\">\r\n <ngt-tag *ngIf=\"hasAppliedFilters()\" (click)=\"removeFilter()\" class=\"mr-0 sm:mr-4 mb-4 w-full sm:w-auto\"\r\n color.bg=\"bg-red-500\" ngt-stylizable>Limpar Filtros</ngt-tag>\r\n\r\n <ng-container *ngIf=\"hasAppliedFilters()\">\r\n <ng-container *ngFor=\"let filter of filtersTranslated\">\r\n <ngt-tag (click)=\"removeFilter(filter.reference)\" class=\"mr-0 sm:mr-4 mb-4 w-full sm:w-auto\"\r\n [color.bg]=\"filterTagBgColor\" ngt-stylizable>\r\n {{ filter.translation + ': ' + (filter?.value?.tagValue ? filter.value.tagValue : filter.value)}}\r\n </ngt-tag>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <table style=\"display: table;\" class=\"text-left w-full border-collapse table-responsive\" #table>\r\n <ng-content></ng-content>\r\n </table>\r\n\r\n <p *ngIf=\"emptyStateVisible\" class=\"mt-8 mx-auto self-center text-center text-xl\">\r\n {{ ngtTranslateService.ngtDatatableNoDataFound }}\r\n </p>\r\n\r\n <div *ngIf=\"loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4]\" class=\"flex w-full mt-3\">\r\n <ng-container *ngIf=\"columnCount.length >= 2\">\r\n <ng-container *ngFor=\"let j of columnCount; let last = last\">\r\n <ng-container *ngIf=\"last\">\r\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!last\">\r\n <ngt-shining class=\"h-10 w-full mr-10\"></ngt-shining>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"columnCount.length < 2\">\r\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\r\n <ngt-shining class=\"h-10 w-full mr-10 ml-10\"></ngt-shining>\r\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"clearfix mt-2 md:mt-8\" [hidden]='!data || data.length == 0'>\r\n <ngt-pagination [pagesInterval]='4' (onPageChange)='apply($event, false)' (onPerPageChange)='apply(1, false)'\r\n #ngtPagination>\r\n </ngt-pagination>\r\n</div>\r\n\r\n<ngt-modal #searchModal [customLayout]='true'>\r\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\r\n</ngt-modal>",
|
|
348
|
+
styles: ["@media (max-width:767px){.table-responsive{display:block;position:relative;width:100%}.table-responsive tbody,.table-responsive td,.table-responsive th,.table-responsive thead,.table-responsive tr{display:block}.table-responsive td,.table-responsive th{height:50px}.table-responsive thead{float:left;margin-bottom:15px}.table-responsive tbody{width:auto;position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}.table-responsive tbody tr{display:inline-block;min-width:100%}}"]
|
|
349
|
+
},] }
|
|
350
|
+
];
|
|
351
|
+
NgtDatatableComponent.ctorParameters = () => [
|
|
352
|
+
{ type: Injector },
|
|
353
|
+
{ type: NgtHttpService },
|
|
354
|
+
{ type: ChangeDetectorRef },
|
|
355
|
+
{ type: NgtTranslateService, decorators: [{ type: Optional }] }
|
|
356
|
+
];
|
|
357
|
+
NgtDatatableComponent.propDecorators = {
|
|
358
|
+
table: [{ type: ViewChild, args: ['table', { static: true },] }],
|
|
359
|
+
ngtPagination: [{ type: ViewChild, args: ['ngtPagination', { static: true },] }],
|
|
360
|
+
searchModal: [{ type: ViewChild, args: ['searchModal', { static: true },] }],
|
|
361
|
+
remoteResource: [{ type: Input }],
|
|
362
|
+
type: [{ type: Input }],
|
|
363
|
+
filterTagBgColor: [{ type: Input }],
|
|
364
|
+
inputSearch: [{ type: Input }],
|
|
365
|
+
searchDelay: [{ type: Input }],
|
|
366
|
+
searchTermMinLength: [{ type: Input }],
|
|
367
|
+
searchTermOnEnter: [{ type: Input }],
|
|
368
|
+
defaultFilters: [{ type: Input }],
|
|
369
|
+
filtersDescription: [{ type: Input }],
|
|
370
|
+
onDataChange: [{ type: Output }],
|
|
371
|
+
onClearFilter: [{ type: Output }],
|
|
372
|
+
onClearSelectedElements: [{ type: Output }],
|
|
373
|
+
onSelectedElementsChange: [{ type: Output }],
|
|
374
|
+
onToogleAllCheckboxes: [{ type: Output }],
|
|
375
|
+
onToogleCheckbox: [{ type: Output }],
|
|
376
|
+
onOpenSearchModal: [{ type: Output }],
|
|
377
|
+
onSearch: [{ type: Output }]
|
|
378
|
+
};
|
|
379
|
+
export var NgtDatatableType;
|
|
380
|
+
(function (NgtDatatableType) {
|
|
381
|
+
NgtDatatableType["REMOTE"] = "REMOTE";
|
|
382
|
+
NgtDatatableType["FIXED"] = "FIXED";
|
|
383
|
+
})(NgtDatatableType || (NgtDatatableType = {}));
|
|
384
|
+
export var NgtDatatableSearchType;
|
|
385
|
+
(function (NgtDatatableSearchType) {
|
|
386
|
+
NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
|
|
387
|
+
NgtDatatableSearchType["SILENT"] = "SILENT";
|
|
388
|
+
})(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
|
|
389
|
+
export var NgtDatatableParam;
|
|
390
|
+
(function (NgtDatatableParam) {
|
|
391
|
+
NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
|
|
392
|
+
NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
|
|
393
|
+
NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
|
|
394
|
+
NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
|
|
395
|
+
})(NgtDatatableParam || (NgtDatatableParam = {}));
|
|
396
|
+
export class NgtCheckedElement {
|
|
397
|
+
}
|
|
398
|
+
export class NgtCustomFilter {
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQXNDLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBVWhGLE1BQU0sT0FBTyxxQkFBcUI7SUFpRDlCLFlBQ1ksUUFBa0IsRUFDbEIsY0FBOEIsRUFDOUIsY0FBaUMsRUFFbEMsbUJBQXdDO1FBSnZDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUVsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBaERuQyxTQUFJLEdBQXFCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNqRCxxQkFBZ0IsR0FBVyxhQUFhLENBQUM7UUFFekMsZ0JBQVcsR0FBVyxHQUFHLENBQUM7UUFDMUIsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBQ2hDLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUNsQyxtQkFBYyxHQUFRLEVBQUUsQ0FBQztRQUN6Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFdkIsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyRCxrQkFBYSxHQUFzQixJQUFJ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Q04sTUFBTTsrQkFDTixNQUFNO2dDQUNOLE1BQU07dUJBQ04sTUFBTTs7QUFtWlgsTUFBTSxDQUFOLElBQVksZ0JBR1g7QUFIRCxXQUFZLGdCQUFnQjtJQUN4QixxQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBRzNCO0FBRUQsTUFBTSxDQUFOLElBQVksc0JBR1g7QUFIRCxXQUFZLHNCQUFzQjtJQUM5Qiw2Q0FBbUIsQ0FBQTtJQUNuQiwyQ0FBaUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsc0JBQXNCLEtBQXRCLHNCQUFzQixRQUdqQztBQUVELE1BQU0sQ0FBTixJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDekIseUVBQWdCLENBQUE7SUFDaEIscUVBQWMsQ0FBQTtJQUNkLDJFQUFpQixDQUFBO0lBQ2pCLDZFQUFrQixDQUFBO0FBQ3RCLENBQUMsRUFMVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBSzVCO0FBRUQsTUFBTSxPQUFPLGlCQUFpQjtDQUk3QjtBQUVELE1BQU0sT0FBTyxlQUFlO0NBSTNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBnZXRFbnVtRnJvbVN0cmluZyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bS9lbnVtJztcclxuaW1wb3J0IHsgTmd0SHR0cFBhZ2luYXRpb24sIE5ndEh0dHBSZXNwb25zZSwgTmd0SHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5ndFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9uZ3QtcGFnaW5hdGlvbi9uZ3QtcGFnaW5hdGlvbi5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25ndC1kYXRhdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL25ndC1kYXRhdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5ndERhdGF0YWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnbmd0UGFnaW5hdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuZ3RQYWdpbmF0aW9uOiBOZ3RQYWdpbmF0aW9uQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoTW9kYWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgc2VhcmNoTW9kYWw6IE5ndE1vZGFsQ29tcG9uZW50O1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xyXG4gICAgQElucHV0KCkgcHVibGljIHR5cGU6IE5ndERhdGF0YWJsZVR5cGUgPSBOZ3REYXRhdGFibGVUeXBlLlJFTU9URTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXJUYWdCZ0NvbG9yOiBzdHJpbmcgPSAnYmctYmx1ZS01MDAnO1xyXG4gICAgQElucHV0KCkgcHVibGljIGlucHV0U2VhcmNoOiBOZ3RJbnB1dENvbXBvbmVudDtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hEZWxheTogbnVtYmVyID0gNTAwO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaFRlcm1NaW5MZW5ndGg6IG51bWJlciA9IDE7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoVGVybU9uRW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGRlZmF1bHRGaWx0ZXJzOiBhbnkgPSB7fTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXJzRGVzY3JpcHRpb24gPSB7fTtcclxuXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRGF0YUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xlYXJGaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsZWFyU2VsZWN0ZWRFbGVtZW50czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2VsZWN0ZWRFbGVtZW50c0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PE5ndENoZWNrZWRFbGVtZW50Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uVG9vZ2xlQWxsQ2hlY2tib3hlczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uVG9vZ2xlQ2hlY2tib3g6IEV2ZW50RW1pdHRlcjxOZ3RDaGVja2VkRWxlbWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uT3BlblNlYXJjaE1vZGFsOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWFyY2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIHB1YmxpYyBzZWFyY2hNb2RhbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgcHVibGljIGRhdGEgPSBbXTtcclxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgY2xlYW5pbmdGaWx0ZXIgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb21wb25lbnRSZWFkeSA9IGZhbHNlO1xyXG4gICAgcHVibGljIGZpbHRlcnNUcmFuc2xhdGVkID0gW107XHJcbiAgICBwdWJsaWMgZW1wdHlTdGF0ZVZpc2libGU6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgY29sdW1uQ291bnQgPSBbXTtcclxuICAgIHB1YmxpYyBzZWxlY3RlZEVsZW1lbnRzOiBBcnJheTxOZ3RDaGVja2VkRWxlbWVudD4gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIHNlYXJjaGluZzogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgc2VhcmNoVGltZW91dDogYW55O1xyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XHJcbiAgICBwcml2YXRlIGN1cnJlbnRTdGF0ZSA9IHtcclxuICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB7fSxcclxuICAgICAgICAgICAgc2lsZW50RmlsdGVyczoge30sXHJcbiAgICAgICAgICAgIHF1YWxpZmllZEZpbHRlcnM6IHt9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc29ydDoge1xyXG4gICAgICAgICAgICBmaWVsZDogJycsXHJcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJydcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIG5ndEh0dHBTZXJ2aWNlOiBOZ3RIdHRwU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBAT3B0aW9uYWwoKVxyXG4gICAgICAgIHB1YmxpYyBuZ3RUcmFuc2xhdGVTZXJ2aWNlOiBOZ3RUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgICApIHsgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAodGhpcy50YWJsZSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NcclxuICAgICAgICAgICAgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NbMF0gJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NbMF0uY2VsbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5Db3VudCA9IHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRDaGVja2JveEV2ZW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaERlbGF5ID09IDUwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaERlbGF5ID0gdGhpcy5pbmplY3Rvci5nZXQoJ05ndERhdGF0YWJsZVNlYXJjaERlbGF5JywgNTAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGggPSB0aGlzLmluamVjdG9yLmdldCgnTmd0RGF0YXRhYmxlU2VhcmNoVGVybU1pbkxlbmd0aCcsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRTZWFyY2hNb2RhbFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hNb2RhbFRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5TZWFyY2hNb2RhbChyZWZlcmVuY2U/OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsLm9wZW4oKTtcclxuICAgICAgICB0aGlzLm9uT3BlblNlYXJjaE1vZGFsLmVtaXQocmVmZXJlbmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3RlZEVsZW1lbnRzKCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMub25DbGVhclNlbGVjdGVkRWxlbWVudHMuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDdXJyZW50U3RhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goXHJcbiAgICAgICAgZmlsdGVyczogT2JqZWN0LFxyXG4gICAgICAgIHNlYXJjaFR5cGU6IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUgPSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQsXHJcbiAgICAgICAgYXBwbHlEZWxheU9uU2VhcmNoOiBib29sZWFuID0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuQXBwbHlGaWx0ZXJzKGZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2guZW1pdChmaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycywgLi4uZmlsdGVycyB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMsIC4uLmZpbHRlcnMgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNEZXNjcmlwdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkoMSwgYXBwbHlEZWxheU9uU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNvcnQoZmllbGQ6IGFueSwgZGlyZWN0aW9uOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5zb3J0ID0ge1xyXG4gICAgICAgICAgICBmaWVsZDogZmllbGQsXHJcbiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkodGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyByZWZyZXNoKHN0YXlJblBhZ2U6IE5ndERhdGF0YWJsZVBhcmFtID0gTmd0RGF0YXRhYmxlUGFyYW0uUkVTRVRfUEFHRSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseShcclxuICAgICAgICAgICAgc3RheUluUGFnZSA/IHRoaXMubmd0UGFnaW5hdGlvbi5nZXRDdXJyZW50UGFnZSgpIDogMSxcclxuICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgIGxvYWRlclxyXG4gICAgICAgICkudGhlbigoKSA9PiAhdGhpcy5kYXRhPy5sZW5ndGggPyB0aGlzLmFwcGx5KDEsIGZhbHNlKSA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEN1cnJlbnRTb3J0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5zb3J0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRQZXJQYWdlKHBlclBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5vblJlZ2lzdGVyc1BlclBhZ2VDaGFuZ2UocGVyUGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jbGVhbmluZ0ZpbHRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gW107XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCByZWZlcmVuY2UgaW4gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV0gJiYgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzW3JlZmVyZW5jZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uOiB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEZpbHRlckRlc2NyaXB0aW9uKHJlZmVyZW5jZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzRGVzY3JpcHRpb25bcmVmZXJlbmNlXSA9IGRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVGaWx0ZXIocmVmZXJlbmNlPzogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jbGVhbmluZ0ZpbHRlciA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICghcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzW3JlZmVyZW5jZV07XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICYmIGVsZW1lbnQucmVmZXJlbmNlICE9PSByZWZlcmVuY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkNsZWFyRmlsdGVyLmVtaXQocmVmZXJlbmNlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2ggJiYgKHJlZmVyZW5jZSA9PT0gJ3Rlcm0nIHx8ICFyZWZlcmVuY2UpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guY2xlYXJJbnB1dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hcHBseSh0aGlzLm5ndFBhZ2luYXRpb24uZ2V0Q3VycmVudFBhZ2UoKSwgZmFsc2UpLnRoZW4oKCkgPT4gdGhpcy5jbGVhbmluZ0ZpbHRlciA9IGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzQXBwbGllZEZpbHRlcihmaWx0ZXI6IE9iamVjdCB8IE5ndEN1c3RvbUZpbHRlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZTogc3RyaW5nID0gdHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycgPyBmaWx0ZXIgOiBPYmplY3Qua2V5cyhmaWx0ZXIgPz8ge30pWzBdO1xyXG4gICAgICAgIGNvbnN0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5xdWFsaWZpZWRGaWx0ZXJzO1xyXG5cclxuICAgICAgICByZXR1cm4gISFPYmplY3Qua2V5cyhhcHBsaWVkRmlsdGVycykuZmluZChrZXkgPT4ga2V5ID09IHJlZmVyZW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc0FwcGxpZWRGaWx0ZXJzKHNlYXJjaFR5cGU6IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUgPSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQpIHtcclxuICAgICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XHJcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycztcclxuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5TSUxFTlQpIHtcclxuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LnZhbHVlcyhhcHBsaWVkRmlsdGVycyk/LmZpbmQoZmlsdGVyID0+ICEhZmlsdGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLmlucHV0U2VhcmNoKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmlucHV0U2VhcmNoLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzLnR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gZ2V0RW51bUZyb21TdHJpbmcoY2hhbmdlcy50eXBlLmN1cnJlbnRWYWx1ZSwgTmd0RGF0YXRhYmxlVHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhcHBseShwYWdlID0gMSwgYXBwbHlEZWxheU9uU2VhcmNoOiBib29sZWFuID0gdHJ1ZSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb21wb25lbnRSZWFkeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaFRpbWVvdXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5ndFBhZ2luYXRpb24uZGlzcGxheVBhZ2luYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBOZ3REYXRhdGFibGVUeXBlLlJFTU9URSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3RlUmVzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwbHlEZWxheU9uU2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YShwYWdlKS50aGVuKCgpID0+IHJlc29sdmUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VhcmNoRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZERhdGEocGFnZSkudGhlbigoKSA9PiByZXNvbHZlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIHByb3BlcnR5IFtyZW1vdGVSZXNvdXJjZV0gbmVlZHMgdG8gYmUgcHJlc2VudCB0byBiZSBhYmxlIHRvIG1ha2UgcmVtb3RlIHNlYXJjaCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLkZJWEVEKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZERhdGEocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGFnaW5hdGlvbjogTmd0SHR0cFBhZ2luYXRpb24gPSB7IC4uLnRoaXMubmd0UGFnaW5hdGlvbi5nZXRQYWdpbmF0aW9uKCksIC4uLnsgcGFnZTogcGFnZSB9IH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnMgPSB0aGlzLmdldFF1YWxpZmllZEZpbHRlcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RIdHRwU2VydmljZS5nZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdGVSZXNvdXJjZSwgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5xdWFsaWZpZWRGaWx0ZXJzLCBwYWdpbmF0aW9uLCB0aGlzLmN1cnJlbnRTdGF0ZS5zb3J0XHJcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2U6IE5ndEh0dHBSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2NjZXNzUmVtb3RlUmVzcG9uc2UocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5wcm9jY2Vzc1BhZ2luYXRpb24ocmVzcG9uc2UubWV0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UuZW1pdCh0aGlzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UXVhbGlmaWVkRmlsdGVycygpIHtcclxuICAgICAgICBjb25zdCBxdWFsaWZpZWRGaWx0ZXJzID0ge307XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkRmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycywgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzIH07XHJcblxyXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIHJlcXVlc3RlZEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RlZEZpbHRlcnNbcmVmZXJlbmNlXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkRmlsdGVyKGZpbHRlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmd0Q3VzdG9tRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIudGFnTGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV0gPSBmaWx0ZXIudGFnTGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZEZpbHRlcnNbcmVmZXJlbmNlXSA9IGZpbHRlci50ZXJtO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZEZpbHRlcnNbcmVmZXJlbmNlXSA9IGZpbHRlcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBxdWFsaWZpZWRGaWx0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50eXBlID09IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFICYmICF0aGlzLmRhdGEubGVuZ3RoICYmICF0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jY2Vzc1JlbW90ZVJlc3BvbnNlKHJlc3BvbnNlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTZWFyY2hXaXRoSW5wdXQoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2gub25WYWx1ZUNoYW5nZSgpLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbJ3Rlcm0nXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIoJ3Rlcm0nKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1sndGVybSddO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goeyB0ZXJtOiAnJyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCh7IHRlcm06IHZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm1PbkVudGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMTMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaC52YWx1ZSAmJiB0aGlzLmlucHV0U2VhcmNoLnZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseSgxLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q2hlY2tib3hFdmVudCgpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgdGhpcy5vblRvb2dsZUNoZWNrYm94LnN1YnNjcmliZSgoY2hlY2tlZEVsZW1lbnQ6IE5ndENoZWNrZWRFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gY2hlY2tlZEVsZW1lbnQuaWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkRWxlbWVudC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzLnB1c2goY2hlY2tlZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEVsZW1lbnRzKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FuQXBwbHlGaWx0ZXJzKGZpbHRlcnM6IE9iamVjdCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hpbmcpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCByZWZlcmVuY2UgaW4gZmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZEZpbHRlcihmaWx0ZXJzW3JlZmVyZW5jZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBPYmplY3QgfCBOZ3RDdXN0b21GaWx0ZXIpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTogc3RyaW5nIHwgTmd0Q3VzdG9tRmlsdGVyID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXIgPz8ge30pWzBdO1xyXG4gICAgICAgIGNvbnN0IGhhc1ZhbHVlOiBib29sZWFuID0gISEoKHZhbHVlIGluc3RhbmNlb2YgTmd0Q3VzdG9tRmlsdGVyICYmIHZhbHVlLnRlcm0pIHx8IHZhbHVlKTtcclxuICAgICAgICBjb25zdCBpc0FwcGxpZWQ6IGJvb2xlYW4gPSB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoZmlsdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlzQXBwbGllZCB8fCAoIWlzQXBwbGllZCAmJiBoYXNWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZXN0cm95U3Vic2NyaXB0aW9ucygpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBOZ3REYXRhdGFibGVUeXBlIHtcclxuICAgIFJFTU9URSA9ICdSRU1PVEUnLFxyXG4gICAgRklYRUQgPSAnRklYRUQnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVNlYXJjaFR5cGUge1xyXG4gICAgREVGQVVMVCA9ICdERUZBVUxUJyxcclxuICAgIFNJTEVOVCA9ICdTSUxFTlQnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBOZ3REYXRhdGFibGVQYXJhbSB7XHJcbiAgICBTVEFZX0lOX1BBR0UgPSAxLFxyXG4gICAgUkVTRVRfUEFHRSA9IDAsXHJcbiAgICBFTkFCTEVfTE9BREVSID0gMSxcclxuICAgIERJU0FCTEVfTE9BREVSID0gMFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmd0Q2hlY2tlZEVsZW1lbnQge1xyXG4gICAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgY2hlY2tlZDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyByZWZlcmVuY2U6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5ndEN1c3RvbUZpbHRlciB7XHJcbiAgICBwdWJsaWMgdGVybTogc3RyaW5nO1xyXG4gICAgcHVibGljIHRhZ1ZhbHVlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGFnTGFiZWw/OiBzdHJpbmc7XHJcbn1cclxuIl19
|