@annalib/anna-core 20.2.22 → 20.2.25
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/{esm2022 → esm2020}/annalib-anna-core.mjs +4 -4
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +14 -14
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +13 -13
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -11
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +43 -43
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +14 -14
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -22
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +13 -13
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +22 -22
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +14 -14
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +47 -0
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +273 -273
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +46 -46
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +39 -39
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +21 -21
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +6 -6
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +29 -29
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +39 -39
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +27 -27
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -22
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +55 -55
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +26 -26
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +17 -17
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1272 -0
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +135 -135
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +65 -65
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +178 -178
- package/esm2020/lib/anna-core.module.mjs +237 -0
- package/{esm2022 → esm2020}/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +160 -160
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +371 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +252 -252
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +185 -185
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +314 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +298 -298
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +865 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -64
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +352 -0
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +204 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +1 -1
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +180 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +1 -1
- package/{esm2022 → esm2020}/public-api.mjs +57 -57
- package/fesm2015/annalib-anna-core.mjs +6131 -0
- package/fesm2015/annalib-anna-core.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/annalib-anna-core.mjs +5999 -5984
- package/fesm2020/annalib-anna-core.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +45 -45
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
- package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +128 -128
- package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
- package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
- package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
- package/lib/anna-core.module.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +175 -175
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -89
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
- package/package.json +11 -5
- package/public-api.d.ts +42 -42
- package/src/lib/anna-common-scss/_icons.scss +1 -1
- package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -47
- package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1272
- package/esm2022/lib/anna-core.module.mjs +0 -226
- package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -371
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -312
- package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -863
- package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -352
- package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -204
- package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -180
- package/fesm2022/annalib-anna-core.mjs.map +0 -1
package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs
RENAMED
|
@@ -1,151 +1,151 @@
|
|
|
1
|
-
// Angular import statements
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
4
|
-
// Third party import statements
|
|
5
|
-
import { Subject } from 'rxjs';
|
|
6
|
-
import { cloneDeep } from 'lodash-es';
|
|
7
|
-
//sub-entries of anna lib import statement
|
|
8
|
-
import { AnnaFilterService } from './anna-filter.service';
|
|
9
|
-
import { AnnaSortService } from './anna-sort.service';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "./anna-filter.service";
|
|
12
|
-
import * as i2 from "@angular/router";
|
|
13
|
-
import * as i3 from "./anna-sort.service";
|
|
14
|
-
export class AnnaGtHelperService {
|
|
15
|
-
constructor(annaFilterService, router, route, annaSortService) {
|
|
16
|
-
this.annaFilterService = annaFilterService;
|
|
17
|
-
this.router = router;
|
|
18
|
-
this.route = route;
|
|
19
|
-
this.annaSortService = annaSortService;
|
|
20
|
-
this.virtualScrollSubject = new Subject();
|
|
21
|
-
}
|
|
22
|
-
calculateNumberOfSkeletonColumnsForTable(tableHeaders) {
|
|
23
|
-
let numberOfSkeletonColumns = [];
|
|
24
|
-
var headersInEachColumn = 0;
|
|
25
|
-
tableHeaders.forEach((column) => {
|
|
26
|
-
if (column.visible) {
|
|
27
|
-
headersInEachColumn = 0;
|
|
28
|
-
column.headerInfo.forEach(() => {
|
|
29
|
-
headersInEachColumn++;
|
|
30
|
-
});
|
|
31
|
-
numberOfSkeletonColumns.push(Array(headersInEachColumn).fill(0));
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
return numberOfSkeletonColumns;
|
|
35
|
-
}
|
|
36
|
-
initColumnFilterAndSorting() {
|
|
37
|
-
this.annaFilterService.tooltipSelectedMap = new Map();
|
|
38
|
-
this.annaFilterService.selectedRadio = null;
|
|
39
|
-
this.annaFilterService.appliedFiltersArray = [];
|
|
40
|
-
this.annaFilterService.initialValueMap = new Map();
|
|
41
|
-
this.annaSortService.columnSortState = new Map();
|
|
42
|
-
this.annaSortService.noSortingAppliedData = [];
|
|
43
|
-
}
|
|
44
|
-
enableOrDisableClearAllBtn() {
|
|
45
|
-
let isFilterApplied = this.annaFilterService.appliedFiltersArray.length > 0;
|
|
46
|
-
let isSortApplied = this.isSortingAppliedToTable();
|
|
47
|
-
return isFilterApplied || isSortApplied ? false : true;
|
|
48
|
-
}
|
|
49
|
-
updateFiltersInURL() {
|
|
50
|
-
let latestQueryParams = this.prepareQueryParamsOnFilter();
|
|
51
|
-
if (Object.keys(latestQueryParams).length > 0) {
|
|
52
|
-
this.router.navigate([], {
|
|
53
|
-
queryParams: { filters: JSON.stringify(latestQueryParams) },
|
|
54
|
-
relativeTo: this.route.parent,
|
|
55
|
-
queryParamsHandling: 'merge',
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
this.router.navigate([], {
|
|
60
|
-
relativeTo: this.route.parent,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
prepareQueryParamsOnFilter() {
|
|
65
|
-
let query = {};
|
|
66
|
-
if (this.annaFilterService.appliedFiltersArray.length > 0) {
|
|
67
|
-
query['appliedFilters'] = this.annaFilterService.appliedFiltersArray;
|
|
68
|
-
query['selectedFilterData'] = JSON.stringify(Array.from(this.annaFilterService.tooltipSelectedMap));
|
|
69
|
-
}
|
|
70
|
-
if (this.checkIfSortingIsApplied()) {
|
|
71
|
-
query['sortState'] = JSON.stringify(Array.from(this.annaSortService.columnSortState));
|
|
72
|
-
}
|
|
73
|
-
return query;
|
|
74
|
-
}
|
|
75
|
-
checkIfSortingIsApplied() {
|
|
76
|
-
let isSortingApplied = false;
|
|
77
|
-
for (let val of this.annaSortService.columnSortState.values()) {
|
|
78
|
-
if (val == 'ASC' || val == 'DESC') {
|
|
79
|
-
isSortingApplied = true;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return isSortingApplied;
|
|
83
|
-
}
|
|
84
|
-
initTableFilters(clonedTableData) {
|
|
85
|
-
this.annaFilterService.tooltipSelectedMap = new Map();
|
|
86
|
-
this.annaFilterService.selectedRadio = null;
|
|
87
|
-
this.annaFilterService.appliedFiltersArray = [];
|
|
88
|
-
this.annaSortService.columnSortState = new Map();
|
|
89
|
-
this.annaSortService.noSortingAppliedData = cloneDeep(clonedTableData);
|
|
90
|
-
this.annaFilterService.updateStateOfAllTheKeys(this.annaSortService.columnSortState);
|
|
91
|
-
}
|
|
92
|
-
initFilters() {
|
|
93
|
-
this.annaFilterService.tooltipSelectedMap = new Map();
|
|
94
|
-
this.annaFilterService.appliedFiltersArray = [];
|
|
95
|
-
}
|
|
96
|
-
setDataAsPerPersistingFilter(isPersistingFilter, clonedTable, filters) {
|
|
97
|
-
let usersTable;
|
|
98
|
-
if (isPersistingFilter) {
|
|
99
|
-
usersTable = this.annaFilterService.filterData(clonedTable, '');
|
|
100
|
-
this.annaSortService.noSortingAppliedData = cloneDeep(usersTable);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
usersTable = clonedTable;
|
|
104
|
-
this.annaSortService.noSortingAppliedData = cloneDeep(usersTable);
|
|
105
|
-
}
|
|
106
|
-
if (filters?.sortState) {
|
|
107
|
-
this.annaSortService.columnSortState = new Map(JSON.parse(filters.sortState));
|
|
108
|
-
usersTable = this.callSort(usersTable);
|
|
109
|
-
}
|
|
110
|
-
this.annaFilterService.updateStateOfAllTheKeys(this.annaSortService.columnSortState);
|
|
111
|
-
return usersTable;
|
|
112
|
-
}
|
|
113
|
-
callSort(usersTable) {
|
|
114
|
-
for (let [key, value] of this.annaSortService.columnSortState) {
|
|
115
|
-
if (value == 'ASC') {
|
|
116
|
-
usersTable = this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, usersTable, key);
|
|
117
|
-
}
|
|
118
|
-
else if (value == 'DESC') {
|
|
119
|
-
usersTable = this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, usersTable, key);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return usersTable;
|
|
123
|
-
}
|
|
124
|
-
isSortingAppliedToTable() {
|
|
125
|
-
let isSortingApplied = false;
|
|
126
|
-
for (let val of this.annaSortService.columnSortState?.values()) {
|
|
127
|
-
if (val == 'ASC' || val == 'DESC') {
|
|
128
|
-
isSortingApplied = true;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return isSortingApplied;
|
|
132
|
-
}
|
|
133
|
-
updateQueryParamsFilter(key, value, operation, queryParamObj) {
|
|
134
|
-
if (operation == 'ADD') {
|
|
135
|
-
queryParamObj[key] = value;
|
|
136
|
-
}
|
|
137
|
-
else if (operation == 'DELETE') {
|
|
138
|
-
delete queryParamObj[key];
|
|
139
|
-
}
|
|
140
|
-
return queryParamObj;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
146
|
-
type: Injectable,
|
|
147
|
-
args: [{
|
|
148
|
-
providedIn: 'root',
|
|
149
|
-
}]
|
|
150
|
-
}], ctorParameters: function () { return [{ type: i1.AnnaFilterService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.AnnaSortService }]; } });
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1nZW5lcmljLXRhYmxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLWdlbmVyaWMtdGFibGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsMENBQTBDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFLdEQsTUFBTSxPQUFPLG1CQUFtQjtJQUU1QixZQUNZLGlCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsZUFBZ0M7UUFIaEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBTDVDLHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFNbEMsQ0FBQztJQUVKLHdDQUF3QyxDQUFDLFlBQW1CO1FBQ3hELElBQUksdUJBQXVCLEdBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM1QixJQUFJLE1B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SUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtnQkFDL0IsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1NBQ0o7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLFNBQTJCLEVBQUUsYUFBa0I7UUFDNUYsSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFO1lBQ3BCLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDOUI7YUFBTSxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUU7WUFDOUIsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDOytHQW5KUSxtQkFBbUI7bUhBQW5CLG1CQUFtQixjQUZoQixNQUFNOzs0RkFFVCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5cclxuLy9zdWItZW50cmllcyBvZiBhbm5hIGxpYiBpbXBvcnQgc3RhdGVtZW50XHJcbmltcG9ydCB7IEFubmFGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hbm5hLWZpbHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSAnLi9hbm5hLXNvcnQuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hR3RIZWxwZXJTZXJ2aWNlIHtcclxuICAgIHZpcnR1YWxTY3JvbGxTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYW5uYUZpbHRlclNlcnZpY2U6IEFubmFGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSBhbm5hU29ydFNlcnZpY2U6IEFubmFTb3J0U2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBjYWxjdWxhdGVOdW1iZXJPZlNrZWxldG9uQ29sdW1uc0ZvclRhYmxlKHRhYmxlSGVhZGVyczogYW55W10pOiBudW1iZXJbXVtdIHtcclxuICAgICAgICBsZXQgbnVtYmVyT2ZTa2VsZXRvbkNvbHVtbnM6IGFueVtdW10gPSBbXTtcclxuICAgICAgICB2YXIgaGVhZGVyc0luRWFjaENvbHVtbiA9IDA7XHJcbiAgICAgICAgdGFibGVIZWFkZXJzLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnNJbkVhY2hDb2x1bW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLmhlYWRlckluZm8uZm9yRWFjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc0luRWFjaENvbHVtbisrO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBudW1iZXJPZlNrZWxldG9uQ29sdW1ucy5wdXNoKEFycmF5KGhlYWRlcnNJbkVhY2hDb2x1bW4pLmZpbGwoMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlck9mU2tlbGV0b25Db2x1bW5zO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb2x1bW5GaWx0ZXJBbmRTb3J0aW5nKCkge1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5hcHBsaWVkRmlsdGVyc0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlT3JEaXNhYmxlQ2xlYXJBbGxCdG4oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyQXBwbGllZCA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCBpc1NvcnRBcHBsaWVkID0gdGhpcy5pc1NvcnRpbmdBcHBsaWVkVG9UYWJsZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJBcHBsaWVkIHx8IGlzU29ydEFwcGxpZWQgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRmlsdGVyc0luVVJMKCkge1xyXG4gICAgICAgIGxldCBsYXRlc3RRdWVyeVBhcmFtcyA9IHRoaXMucHJlcGFyZVF1ZXJ5UGFyYW1zT25GaWx0ZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGxhdGVzdFF1ZXJ5UGFyYW1zKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBmaWx0ZXJzOiBKU09OLnN0cmluZ2lmeShsYXRlc3RRdWVyeVBhcmFtcykgfSxcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUucGFyZW50LFxyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUucGFyZW50LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJlcGFyZVF1ZXJ5UGFyYW1zT25GaWx0ZXIoKSB7XHJcbiAgICAgICAgbGV0IHF1ZXJ5OiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5WydhcHBsaWVkRmlsdGVycyddID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5hcHBsaWVkRmlsdGVyc0FycmF5O1xyXG4gICAgICAgICAgICBxdWVyeVsnc2VsZWN0ZWRGaWx0ZXJEYXRhJ10gPSBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZCgpKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Wydzb3J0U3RhdGUnXSA9IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcXVlcnk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWQoKSB7XHJcbiAgICAgICAgbGV0IGlzU29ydGluZ0FwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWwgPT0gJ0FTQycgfHwgdmFsID09ICdERVNDJykge1xyXG4gICAgICAgICAgICAgICAgaXNTb3J0aW5nQXBwbGllZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpc1NvcnRpbmdBcHBsaWVkO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRUYWJsZUZpbHRlcnMoY2xvbmVkVGFibGVEYXRhOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gY2xvbmVEZWVwKGNsb25lZFRhYmxlRGF0YSk7XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS51cGRhdGVTdGF0ZU9mQWxsVGhlS2V5cyh0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJzKCkge1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGFBc1BlclBlcnNpc3RpbmdGaWx0ZXIoaXNQZXJzaXN0aW5nRmlsdGVyOiBib29sZWFuLCBjbG9uZWRUYWJsZTogYW55LCBmaWx0ZXJzOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGxldCB1c2Vyc1RhYmxlO1xyXG4gICAgICAgIGlmIChpc1BlcnNpc3RpbmdGaWx0ZXIpIHtcclxuICAgICAgICAgICAgdXNlcnNUYWJsZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuZmlsdGVyRGF0YShjbG9uZWRUYWJsZSwgJycpO1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5ub1NvcnRpbmdBcHBsaWVkRGF0YSA9IGNsb25lRGVlcCh1c2Vyc1RhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1c2Vyc1RhYmxlID0gY2xvbmVkVGFibGU7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gY2xvbmVEZWVwKHVzZXJzVGFibGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbHRlcnM/LnNvcnRTdGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKEpTT04ucGFyc2UoZmlsdGVycy5zb3J0U3RhdGUpKTtcclxuICAgICAgICAgICAgdXNlcnNUYWJsZSA9IHRoaXMuY2FsbFNvcnQodXNlcnNUYWJsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnVwZGF0ZVN0YXRlT2ZBbGxUaGVLZXlzKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB1c2Vyc1RhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxTb3J0KHVzZXJzVGFibGU6IGFueSk6IGFueSB7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gJ0FTQycpIHtcclxuICAgICAgICAgICAgICAgIHVzZXJzVGFibGUgPSB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UodHJ1ZSwgdXNlcnNUYWJsZSwga2V5KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAnREVTQycpIHtcclxuICAgICAgICAgICAgICAgIHVzZXJzVGFibGUgPSB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UoZmFsc2UsIHVzZXJzVGFibGUsIGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVzZXJzVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTb3J0aW5nQXBwbGllZFRvVGFibGUoKSB7XHJcbiAgICAgICAgbGV0IGlzU29ydGluZ0FwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlPy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsID09ICdBU0MnIHx8IHZhbCA9PSAnREVTQycpIHtcclxuICAgICAgICAgICAgICAgIGlzU29ydGluZ0FwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaXNTb3J0aW5nQXBwbGllZDtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVRdWVyeVBhcmFtc0ZpbHRlcihrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgb3BlcmF0aW9uOiAnQUREJyB8ICdERUxFVEUnLCBxdWVyeVBhcmFtT2JqOiBhbnkpIHtcclxuICAgICAgICBpZiAob3BlcmF0aW9uID09ICdBREQnKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1PYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09ICdERUxFVEUnKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtT2JqW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBxdWVyeVBhcmFtT2JqO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
1
|
+
// Angular import statements
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
4
|
+
// Third party import statements
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
6
|
+
import { cloneDeep } from 'lodash-es';
|
|
7
|
+
//sub-entries of anna lib import statement
|
|
8
|
+
import { AnnaFilterService } from './anna-filter.service';
|
|
9
|
+
import { AnnaSortService } from './anna-sort.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "./anna-filter.service";
|
|
12
|
+
import * as i2 from "@angular/router";
|
|
13
|
+
import * as i3 from "./anna-sort.service";
|
|
14
|
+
export class AnnaGtHelperService {
|
|
15
|
+
constructor(annaFilterService, router, route, annaSortService) {
|
|
16
|
+
this.annaFilterService = annaFilterService;
|
|
17
|
+
this.router = router;
|
|
18
|
+
this.route = route;
|
|
19
|
+
this.annaSortService = annaSortService;
|
|
20
|
+
this.virtualScrollSubject = new Subject();
|
|
21
|
+
}
|
|
22
|
+
calculateNumberOfSkeletonColumnsForTable(tableHeaders) {
|
|
23
|
+
let numberOfSkeletonColumns = [];
|
|
24
|
+
var headersInEachColumn = 0;
|
|
25
|
+
tableHeaders.forEach((column) => {
|
|
26
|
+
if (column.visible) {
|
|
27
|
+
headersInEachColumn = 0;
|
|
28
|
+
column.headerInfo.forEach(() => {
|
|
29
|
+
headersInEachColumn++;
|
|
30
|
+
});
|
|
31
|
+
numberOfSkeletonColumns.push(Array(headersInEachColumn).fill(0));
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return numberOfSkeletonColumns;
|
|
35
|
+
}
|
|
36
|
+
initColumnFilterAndSorting() {
|
|
37
|
+
this.annaFilterService.tooltipSelectedMap = new Map();
|
|
38
|
+
this.annaFilterService.selectedRadio = null;
|
|
39
|
+
this.annaFilterService.appliedFiltersArray = [];
|
|
40
|
+
this.annaFilterService.initialValueMap = new Map();
|
|
41
|
+
this.annaSortService.columnSortState = new Map();
|
|
42
|
+
this.annaSortService.noSortingAppliedData = [];
|
|
43
|
+
}
|
|
44
|
+
enableOrDisableClearAllBtn() {
|
|
45
|
+
let isFilterApplied = this.annaFilterService.appliedFiltersArray.length > 0;
|
|
46
|
+
let isSortApplied = this.isSortingAppliedToTable();
|
|
47
|
+
return isFilterApplied || isSortApplied ? false : true;
|
|
48
|
+
}
|
|
49
|
+
updateFiltersInURL() {
|
|
50
|
+
let latestQueryParams = this.prepareQueryParamsOnFilter();
|
|
51
|
+
if (Object.keys(latestQueryParams).length > 0) {
|
|
52
|
+
this.router.navigate([], {
|
|
53
|
+
queryParams: { filters: JSON.stringify(latestQueryParams) },
|
|
54
|
+
relativeTo: this.route.parent,
|
|
55
|
+
queryParamsHandling: 'merge',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this.router.navigate([], {
|
|
60
|
+
relativeTo: this.route.parent,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
prepareQueryParamsOnFilter() {
|
|
65
|
+
let query = {};
|
|
66
|
+
if (this.annaFilterService.appliedFiltersArray.length > 0) {
|
|
67
|
+
query['appliedFilters'] = this.annaFilterService.appliedFiltersArray;
|
|
68
|
+
query['selectedFilterData'] = JSON.stringify(Array.from(this.annaFilterService.tooltipSelectedMap));
|
|
69
|
+
}
|
|
70
|
+
if (this.checkIfSortingIsApplied()) {
|
|
71
|
+
query['sortState'] = JSON.stringify(Array.from(this.annaSortService.columnSortState));
|
|
72
|
+
}
|
|
73
|
+
return query;
|
|
74
|
+
}
|
|
75
|
+
checkIfSortingIsApplied() {
|
|
76
|
+
let isSortingApplied = false;
|
|
77
|
+
for (let val of this.annaSortService.columnSortState.values()) {
|
|
78
|
+
if (val == 'ASC' || val == 'DESC') {
|
|
79
|
+
isSortingApplied = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return isSortingApplied;
|
|
83
|
+
}
|
|
84
|
+
initTableFilters(clonedTableData) {
|
|
85
|
+
this.annaFilterService.tooltipSelectedMap = new Map();
|
|
86
|
+
this.annaFilterService.selectedRadio = null;
|
|
87
|
+
this.annaFilterService.appliedFiltersArray = [];
|
|
88
|
+
this.annaSortService.columnSortState = new Map();
|
|
89
|
+
this.annaSortService.noSortingAppliedData = cloneDeep(clonedTableData);
|
|
90
|
+
this.annaFilterService.updateStateOfAllTheKeys(this.annaSortService.columnSortState);
|
|
91
|
+
}
|
|
92
|
+
initFilters() {
|
|
93
|
+
this.annaFilterService.tooltipSelectedMap = new Map();
|
|
94
|
+
this.annaFilterService.appliedFiltersArray = [];
|
|
95
|
+
}
|
|
96
|
+
setDataAsPerPersistingFilter(isPersistingFilter, clonedTable, filters) {
|
|
97
|
+
let usersTable;
|
|
98
|
+
if (isPersistingFilter) {
|
|
99
|
+
usersTable = this.annaFilterService.filterData(clonedTable, '');
|
|
100
|
+
this.annaSortService.noSortingAppliedData = cloneDeep(usersTable);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
usersTable = clonedTable;
|
|
104
|
+
this.annaSortService.noSortingAppliedData = cloneDeep(usersTable);
|
|
105
|
+
}
|
|
106
|
+
if (filters?.sortState) {
|
|
107
|
+
this.annaSortService.columnSortState = new Map(JSON.parse(filters.sortState));
|
|
108
|
+
usersTable = this.callSort(usersTable);
|
|
109
|
+
}
|
|
110
|
+
this.annaFilterService.updateStateOfAllTheKeys(this.annaSortService.columnSortState);
|
|
111
|
+
return usersTable;
|
|
112
|
+
}
|
|
113
|
+
callSort(usersTable) {
|
|
114
|
+
for (let [key, value] of this.annaSortService.columnSortState) {
|
|
115
|
+
if (value == 'ASC') {
|
|
116
|
+
usersTable = this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, usersTable, key);
|
|
117
|
+
}
|
|
118
|
+
else if (value == 'DESC') {
|
|
119
|
+
usersTable = this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, usersTable, key);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return usersTable;
|
|
123
|
+
}
|
|
124
|
+
isSortingAppliedToTable() {
|
|
125
|
+
let isSortingApplied = false;
|
|
126
|
+
for (let val of this.annaSortService.columnSortState?.values()) {
|
|
127
|
+
if (val == 'ASC' || val == 'DESC') {
|
|
128
|
+
isSortingApplied = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return isSortingApplied;
|
|
132
|
+
}
|
|
133
|
+
updateQueryParamsFilter(key, value, operation, queryParamObj) {
|
|
134
|
+
if (operation == 'ADD') {
|
|
135
|
+
queryParamObj[key] = value;
|
|
136
|
+
}
|
|
137
|
+
else if (operation == 'DELETE') {
|
|
138
|
+
delete queryParamObj[key];
|
|
139
|
+
}
|
|
140
|
+
return queryParamObj;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
AnnaGtHelperService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AnnaGtHelperService, deps: [{ token: i1.AnnaFilterService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
144
|
+
AnnaGtHelperService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AnnaGtHelperService, providedIn: 'root' });
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AnnaGtHelperService, decorators: [{
|
|
146
|
+
type: Injectable,
|
|
147
|
+
args: [{
|
|
148
|
+
providedIn: 'root',
|
|
149
|
+
}]
|
|
150
|
+
}], ctorParameters: function () { return [{ type: i1.AnnaFilterService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.AnnaSortService }]; } });
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1nZW5lcmljLXRhYmxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLWdlbmVyaWMtdGFibGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsMENBQTBDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFLdEQsTUFBTSxPQUFPLG1CQUFtQjtJQUU1QixZQUNZLGlCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsZUFBZ0M7UUFIaEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBTDVDLHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFNbEMsQ0FBQztJQUVKLHdDQUF3QyxDQUFDLFlBQW1CO1FBQ3hELElBQUksdUJBQXVCLEdBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM1QixJQUFJLE1B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SUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtnQkFDL0IsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1NBQ0o7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLFNBQTJCLEVBQUUsYUFBa0I7UUFDNUYsSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFO1lBQ3BCLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDOUI7YUFBTSxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUU7WUFDOUIsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDOztpSEFuSlEsbUJBQW1CO3FIQUFuQixtQkFBbUIsY0FGaEIsTUFBTTs0RkFFVCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5cclxuLy9zdWItZW50cmllcyBvZiBhbm5hIGxpYiBpbXBvcnQgc3RhdGVtZW50XHJcbmltcG9ydCB7IEFubmFGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hbm5hLWZpbHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSAnLi9hbm5hLXNvcnQuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hR3RIZWxwZXJTZXJ2aWNlIHtcclxuICAgIHZpcnR1YWxTY3JvbGxTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYW5uYUZpbHRlclNlcnZpY2U6IEFubmFGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSBhbm5hU29ydFNlcnZpY2U6IEFubmFTb3J0U2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBjYWxjdWxhdGVOdW1iZXJPZlNrZWxldG9uQ29sdW1uc0ZvclRhYmxlKHRhYmxlSGVhZGVyczogYW55W10pOiBudW1iZXJbXVtdIHtcclxuICAgICAgICBsZXQgbnVtYmVyT2ZTa2VsZXRvbkNvbHVtbnM6IGFueVtdW10gPSBbXTtcclxuICAgICAgICB2YXIgaGVhZGVyc0luRWFjaENvbHVtbiA9IDA7XHJcbiAgICAgICAgdGFibGVIZWFkZXJzLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnNJbkVhY2hDb2x1bW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLmhlYWRlckluZm8uZm9yRWFjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc0luRWFjaENvbHVtbisrO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBudW1iZXJPZlNrZWxldG9uQ29sdW1ucy5wdXNoKEFycmF5KGhlYWRlcnNJbkVhY2hDb2x1bW4pLmZpbGwoMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlck9mU2tlbGV0b25Db2x1bW5zO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb2x1bW5GaWx0ZXJBbmRTb3J0aW5nKCkge1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5hcHBsaWVkRmlsdGVyc0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlT3JEaXNhYmxlQ2xlYXJBbGxCdG4oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyQXBwbGllZCA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCBpc1NvcnRBcHBsaWVkID0gdGhpcy5pc1NvcnRpbmdBcHBsaWVkVG9UYWJsZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJBcHBsaWVkIHx8IGlzU29ydEFwcGxpZWQgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRmlsdGVyc0luVVJMKCkge1xyXG4gICAgICAgIGxldCBsYXRlc3RRdWVyeVBhcmFtcyA9IHRoaXMucHJlcGFyZVF1ZXJ5UGFyYW1zT25GaWx0ZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGxhdGVzdFF1ZXJ5UGFyYW1zKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBmaWx0ZXJzOiBKU09OLnN0cmluZ2lmeShsYXRlc3RRdWVyeVBhcmFtcykgfSxcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUucGFyZW50LFxyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUucGFyZW50LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJlcGFyZVF1ZXJ5UGFyYW1zT25GaWx0ZXIoKSB7XHJcbiAgICAgICAgbGV0IHF1ZXJ5OiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5WydhcHBsaWVkRmlsdGVycyddID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5hcHBsaWVkRmlsdGVyc0FycmF5O1xyXG4gICAgICAgICAgICBxdWVyeVsnc2VsZWN0ZWRGaWx0ZXJEYXRhJ10gPSBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZCgpKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Wydzb3J0U3RhdGUnXSA9IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcXVlcnk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWQoKSB7XHJcbiAgICAgICAgbGV0IGlzU29ydGluZ0FwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWwgPT0gJ0FTQycgfHwgdmFsID09ICdERVNDJykge1xyXG4gICAgICAgICAgICAgICAgaXNTb3J0aW5nQXBwbGllZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpc1NvcnRpbmdBcHBsaWVkO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRUYWJsZUZpbHRlcnMoY2xvbmVkVGFibGVEYXRhOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gY2xvbmVEZWVwKGNsb25lZFRhYmxlRGF0YSk7XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS51cGRhdGVTdGF0ZU9mQWxsVGhlS2V5cyh0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJzKCkge1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGFBc1BlclBlcnNpc3RpbmdGaWx0ZXIoaXNQZXJzaXN0aW5nRmlsdGVyOiBib29sZWFuLCBjbG9uZWRUYWJsZTogYW55LCBmaWx0ZXJzOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGxldCB1c2Vyc1RhYmxlO1xyXG4gICAgICAgIGlmIChpc1BlcnNpc3RpbmdGaWx0ZXIpIHtcclxuICAgICAgICAgICAgdXNlcnNUYWJsZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuZmlsdGVyRGF0YShjbG9uZWRUYWJsZSwgJycpO1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5ub1NvcnRpbmdBcHBsaWVkRGF0YSA9IGNsb25lRGVlcCh1c2Vyc1RhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1c2Vyc1RhYmxlID0gY2xvbmVkVGFibGU7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gY2xvbmVEZWVwKHVzZXJzVGFibGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbHRlcnM/LnNvcnRTdGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKEpTT04ucGFyc2UoZmlsdGVycy5zb3J0U3RhdGUpKTtcclxuICAgICAgICAgICAgdXNlcnNUYWJsZSA9IHRoaXMuY2FsbFNvcnQodXNlcnNUYWJsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnVwZGF0ZVN0YXRlT2ZBbGxUaGVLZXlzKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB1c2Vyc1RhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxTb3J0KHVzZXJzVGFibGU6IGFueSk6IGFueSB7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gJ0FTQycpIHtcclxuICAgICAgICAgICAgICAgIHVzZXJzVGFibGUgPSB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UodHJ1ZSwgdXNlcnNUYWJsZSwga2V5KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAnREVTQycpIHtcclxuICAgICAgICAgICAgICAgIHVzZXJzVGFibGUgPSB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UoZmFsc2UsIHVzZXJzVGFibGUsIGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVzZXJzVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTb3J0aW5nQXBwbGllZFRvVGFibGUoKSB7XHJcbiAgICAgICAgbGV0IGlzU29ydGluZ0FwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlPy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsID09ICdBU0MnIHx8IHZhbCA9PSAnREVTQycpIHtcclxuICAgICAgICAgICAgICAgIGlzU29ydGluZ0FwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaXNTb3J0aW5nQXBwbGllZDtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVRdWVyeVBhcmFtc0ZpbHRlcihrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgb3BlcmF0aW9uOiAnQUREJyB8ICdERUxFVEUnLCBxdWVyeVBhcmFtT2JqOiBhbnkpIHtcclxuICAgICAgICBpZiAob3BlcmF0aW9uID09ICdBREQnKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1PYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09ICdERUxFVEUnKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtT2JqW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBxdWVyeVBhcmFtT2JqO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|