@competer/primeng-table 0.0.0-stage → 14.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +279 -3
- package/esm2020/competer-primeng-table.mjs +5 -0
- package/esm2020/lib/components/column-selector/column-selector.mjs +147 -0
- package/esm2020/lib/components/ecs-primeng-table/ecs-primeng-table.mjs +1411 -0
- package/esm2020/lib/components/ecs-primeng-table/ecs-primeng-table.service.mjs +222 -0
- package/esm2020/lib/components/export-excel/export-excel.mjs +153 -0
- package/esm2020/lib/components/export-excel/export-excel.service.mjs +23 -0
- package/esm2020/lib/components/table-button/table-button.mjs +63 -0
- package/esm2020/lib/components/table-cell/table-cell.mjs +159 -0
- package/esm2020/lib/components/table-predefined-filters/table-predefined-filters.mjs +94 -0
- package/esm2020/lib/components/views-management/views-management.mjs +117 -0
- package/esm2020/lib/enums/cell-display.enum.mjs +7 -0
- package/esm2020/lib/enums/cell-overflow-behaviour.enum.mjs +14 -0
- package/esm2020/lib/enums/data-align-horizontal.enum.mjs +16 -0
- package/esm2020/lib/enums/data-align-vertical.enum.mjs +16 -0
- package/esm2020/lib/enums/data-type.enum.enum.mjs +21 -0
- package/esm2020/lib/enums/device-type.enum.mjs +8 -0
- package/esm2020/lib/enums/frozen-column-align.enum.mjs +17 -0
- package/esm2020/lib/enums/index.mjs +9 -0
- package/esm2020/lib/enums/table-view-save-mode.enum.mjs +19 -0
- package/esm2020/lib/interfaces/columns-metadata.interface.mjs +2 -0
- package/esm2020/lib/interfaces/excel-export-request.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +11 -0
- package/esm2020/lib/interfaces/predefined-filter.interface.mjs +2 -0
- package/esm2020/lib/interfaces/table-button.interface.mjs +2 -0
- package/esm2020/lib/interfaces/table-configuration.interface.mjs +2 -0
- package/esm2020/lib/interfaces/table-options.interface.mjs +107 -0
- package/esm2020/lib/interfaces/table-paged-response.interface.mjs +2 -0
- package/esm2020/lib/interfaces/table-query-request.interface.mjs +2 -0
- package/esm2020/lib/interfaces/table-view-data.interface.mjs +2 -0
- package/esm2020/lib/interfaces/table-view.interface.mjs +2 -0
- package/esm2020/lib/pipes/ui-translate.pipe.mjs +21 -0
- package/esm2020/lib/services/http.service.mjs +18 -0
- package/esm2020/lib/services/i18n.service.mjs +61 -0
- package/esm2020/lib/services/index.mjs +5 -0
- package/esm2020/lib/services/notification.service.mjs +17 -0
- package/esm2020/lib/services/table-state.service.mjs +38 -0
- package/esm2020/lib/utils/create-table-options.mjs +37 -0
- package/esm2020/lib/utils/data-align-horizontal-as-text.mjs +23 -0
- package/esm2020/lib/utils/data-align-vertical-as-text.mjs +23 -0
- package/esm2020/lib/utils/data-type-as-text.mjs +25 -0
- package/esm2020/lib/utils/frozen-column-align-as-text.mjs +21 -0
- package/esm2020/lib/utils/highlight-text.mjs +36 -0
- package/esm2020/lib/utils/index.mjs +7 -0
- package/esm2020/lib/utils/tree-table-state.mjs +239 -0
- package/esm2020/public-api.mjs +19 -0
- package/fesm2015/competer-primeng-table.mjs +3119 -0
- package/fesm2015/competer-primeng-table.mjs.map +1 -0
- package/fesm2020/competer-primeng-table.mjs +3049 -0
- package/fesm2020/competer-primeng-table.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/column-selector/column-selector.d.ts +55 -0
- package/lib/components/ecs-primeng-table/ecs-primeng-table.d.ts +256 -0
- package/lib/components/ecs-primeng-table/ecs-primeng-table.service.d.ts +52 -0
- package/lib/components/export-excel/export-excel.d.ts +51 -0
- package/lib/components/export-excel/export-excel.service.d.ts +6 -0
- package/lib/components/table-button/table-button.d.ts +16 -0
- package/lib/components/table-cell/table-cell.d.ts +69 -0
- package/lib/components/table-predefined-filters/table-predefined-filters.d.ts +39 -0
- package/lib/components/views-management/views-management.d.ts +34 -0
- package/lib/enums/cell-display.enum.d.ts +5 -0
- package/lib/enums/cell-overflow-behaviour.enum.d.ts +12 -0
- package/lib/enums/data-align-horizontal.enum.d.ts +14 -0
- package/lib/enums/data-align-vertical.enum.d.ts +14 -0
- package/lib/enums/data-type.enum.enum.d.ts +19 -0
- package/lib/enums/device-type.enum.d.ts +6 -0
- package/lib/enums/frozen-column-align.enum.d.ts +15 -0
- package/lib/enums/index.d.ts +8 -0
- package/lib/enums/table-view-save-mode.enum.d.ts +17 -0
- package/lib/interfaces/columns-metadata.interface.d.ts +66 -0
- package/lib/interfaces/excel-export-request.interface.d.ts +20 -0
- package/lib/interfaces/index.d.ts +10 -0
- package/lib/interfaces/predefined-filter.interface.d.ts +101 -0
- package/lib/interfaces/table-button.interface.d.ts +75 -0
- package/lib/interfaces/table-configuration.interface.d.ts +23 -0
- package/lib/interfaces/table-options.interface.d.ts +604 -0
- package/lib/interfaces/table-paged-response.interface.d.ts +16 -0
- package/lib/interfaces/table-query-request.interface.d.ts +28 -0
- package/lib/interfaces/table-view-data.interface.d.ts +28 -0
- package/lib/interfaces/table-view.interface.d.ts +15 -0
- package/lib/pipes/ui-translate.pipe.d.ts +13 -0
- package/lib/services/http.service.d.ts +34 -0
- package/lib/services/i18n.service.d.ts +20 -0
- package/lib/services/index.d.ts +4 -0
- package/lib/services/notification.service.d.ts +23 -0
- package/lib/services/table-state.service.d.ts +31 -0
- package/lib/utils/create-table-options.d.ts +5 -0
- package/lib/utils/data-align-horizontal-as-text.d.ts +11 -0
- package/lib/utils/data-align-vertical-as-text.d.ts +11 -0
- package/lib/utils/data-type-as-text.d.ts +11 -0
- package/lib/utils/frozen-column-align-as-text.d.ts +11 -0
- package/lib/utils/highlight-text.d.ts +17 -0
- package/lib/utils/index.d.ts +6 -0
- package/lib/utils/tree-table-state.d.ts +66 -0
- package/package.json +58 -3
- package/public-api.d.ts +10 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { ECSPrimengTableI18nService } from '../../services/i18n.service';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
4
|
+
import { CellOverflowBehaviour, FrozenColumnAlign, TableViewSaveMode } from '../../enums';
|
|
5
|
+
import { DomHandler } from 'primeng/dom';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../../services";
|
|
8
|
+
export class ECSPrimengTableService {
|
|
9
|
+
constructor(http, notification) {
|
|
10
|
+
this.http = http;
|
|
11
|
+
this.notification = notification;
|
|
12
|
+
this.i18n = inject(ECSPrimengTableI18nService);
|
|
13
|
+
}
|
|
14
|
+
fetchTableConfiguration(url) {
|
|
15
|
+
return this.http.handleHttpGetRequest(url);
|
|
16
|
+
}
|
|
17
|
+
fetchTableData(url, postData) {
|
|
18
|
+
return this.http.handleHttpPostRequest(url, postData);
|
|
19
|
+
}
|
|
20
|
+
fetchExcelReport(url, postData) {
|
|
21
|
+
let httpOptions = new HttpHeaders({
|
|
22
|
+
'accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
23
|
+
'Content-Type': 'application/json'
|
|
24
|
+
});
|
|
25
|
+
return this.http.handleHttpPostRequest(url, postData, httpOptions, "blob");
|
|
26
|
+
}
|
|
27
|
+
getIconBlob(url) {
|
|
28
|
+
return this.http.handleHttpGetRequest(url, "blob");
|
|
29
|
+
}
|
|
30
|
+
downloadFile(data, fileName, contentType) {
|
|
31
|
+
const blob = new Blob([data], { type: contentType });
|
|
32
|
+
const url = window.URL.createObjectURL(blob);
|
|
33
|
+
const link = document.createElement('a');
|
|
34
|
+
link.href = url;
|
|
35
|
+
link.download = fileName;
|
|
36
|
+
link.click();
|
|
37
|
+
window.URL.revokeObjectURL(url);
|
|
38
|
+
}
|
|
39
|
+
handleTableError(error, customTitle = 'Data Loading Error') {
|
|
40
|
+
const message = error.message || 'Unknown error occurred';
|
|
41
|
+
this.notification.showToast('error', this.i18n.text(customTitle), this.i18n.text(message));
|
|
42
|
+
}
|
|
43
|
+
orderColumnsWithFrozens(colsToOrder) {
|
|
44
|
+
const frozenLeftColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Left);
|
|
45
|
+
const frozenRightColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Right);
|
|
46
|
+
const nonFrozenColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Noone);
|
|
47
|
+
return [...frozenLeftColumns, ...nonFrozenColumns, ...frozenRightColumns];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Handles click events on action buttons in a row of data.
|
|
51
|
+
*
|
|
52
|
+
* @param {function} action - The action function to be executed when the button is clicked. It should accept one parameter, which is the row data.
|
|
53
|
+
* @param {any} [rowData=null] - The data of the row corresponding to the clicked button. Defaults to null.
|
|
54
|
+
*
|
|
55
|
+
* @returns {void}
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* // Define an action for a button
|
|
59
|
+
* const deleteAction = (rowData) => {
|
|
60
|
+
* console.log(`Delete row with id: ${rowData.rowID}`);
|
|
61
|
+
* };
|
|
62
|
+
*
|
|
63
|
+
* // Use handleButtonsClick with row data
|
|
64
|
+
* handleButtonsClick(deleteAction, { rowID: 1, name: 'John Doe' });
|
|
65
|
+
*/
|
|
66
|
+
handleButtonsClick(action, rowData = null) {
|
|
67
|
+
if (action) { // If the button has an assigned action
|
|
68
|
+
action(rowData); // Perform the action
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
handlePredefinedFilterClick(action, rowData = null, option) {
|
|
72
|
+
if (action) { // If the button has an assigned action
|
|
73
|
+
action(rowData, option); // Perform the action
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
getColumnStyle(col, headerCols = false) {
|
|
77
|
+
let styles = {};
|
|
78
|
+
if (!headerCols) {
|
|
79
|
+
switch (col.cellOverflowBehaviour) {
|
|
80
|
+
case CellOverflowBehaviour.Wrap:
|
|
81
|
+
styles['white-space'] = 'normal';
|
|
82
|
+
styles['word-wrap'] = 'break-word';
|
|
83
|
+
styles['word-break'] = 'break-all';
|
|
84
|
+
styles['overflow'] = 'hidden';
|
|
85
|
+
break;
|
|
86
|
+
/*case CellOverflowBehaviour.Ellipsis:
|
|
87
|
+
styles['white-space'] = 'nowrap';
|
|
88
|
+
styles['overflow'] = 'hidden';
|
|
89
|
+
styles['text-overflow'] = 'ellipsis';
|
|
90
|
+
styles['width'] = '100%';
|
|
91
|
+
styles['min-width'] = '100%';
|
|
92
|
+
styles['max-width'] = '100%';
|
|
93
|
+
break;*/
|
|
94
|
+
/*
|
|
95
|
+
display: block;
|
|
96
|
+
width: 100%;
|
|
97
|
+
text-align: center;
|
|
98
|
+
*/
|
|
99
|
+
case CellOverflowBehaviour.Hidden:
|
|
100
|
+
default:
|
|
101
|
+
styles['white-space'] = 'nowrap';
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (col.initialWidth > 0) {
|
|
106
|
+
const width = `${col.initialWidth}px`;
|
|
107
|
+
styles['width'] = width;
|
|
108
|
+
styles['min-width'] = width;
|
|
109
|
+
styles['max-width'] = width;
|
|
110
|
+
}
|
|
111
|
+
return styles;
|
|
112
|
+
/*let styles: Record<string, string> = {};
|
|
113
|
+
if(!headerCols){
|
|
114
|
+
styles = {
|
|
115
|
+
'white-space': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'normal' : 'nowrap',
|
|
116
|
+
'word-wrap': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'break-word' : 'normal',
|
|
117
|
+
'word-break': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'break-all' : 'normal'
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (col.initialWidth > 0) {
|
|
121
|
+
styles['max-width'] = col.initialWidth + 'px';
|
|
122
|
+
styles['min-width'] = col.initialWidth + 'px';
|
|
123
|
+
styles['width'] = col.initialWidth + 'px';
|
|
124
|
+
}
|
|
125
|
+
return styles;*/
|
|
126
|
+
}
|
|
127
|
+
fetchTableViews(tableViewSaveAs, recoverListEndpoint, tableViewSaveKey) {
|
|
128
|
+
let tableViewList = [];
|
|
129
|
+
let tableViewNotParsed = null;
|
|
130
|
+
if (tableViewSaveKey !== "" && tableViewSaveKey !== '') {
|
|
131
|
+
switch (tableViewSaveAs) {
|
|
132
|
+
case TableViewSaveMode.None:
|
|
133
|
+
tableViewNotParsed = null;
|
|
134
|
+
break;
|
|
135
|
+
case TableViewSaveMode.SessionStorage:
|
|
136
|
+
tableViewNotParsed = sessionStorage.getItem(tableViewSaveKey);
|
|
137
|
+
break;
|
|
138
|
+
case TableViewSaveMode.LocalStorage:
|
|
139
|
+
tableViewNotParsed = localStorage.getItem(tableViewSaveKey);
|
|
140
|
+
break;
|
|
141
|
+
case TableViewSaveMode.DatabaseStorage:
|
|
142
|
+
const postData = {
|
|
143
|
+
tableViewSaveKey: tableViewSaveKey
|
|
144
|
+
};
|
|
145
|
+
return this.http.handleHttpPostRequest(recoverListEndpoint, postData);
|
|
146
|
+
default:
|
|
147
|
+
this.notification.showToast("error", this.i18n.text("SAVE VIEW TYPE DOES NOT EXIST"), this.i18n.text("This type of save view does not exist."));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
tableViewList = tableViewNotParsed ? JSON.parse(tableViewNotParsed) : [];
|
|
151
|
+
this.sortViews(tableViewList);
|
|
152
|
+
return tableViewList;
|
|
153
|
+
}
|
|
154
|
+
sortViews(tableSaveViewList) {
|
|
155
|
+
tableSaveViewList.sort((a, b) => a.viewAlias.toLowerCase().localeCompare(b.viewAlias.toLowerCase()));
|
|
156
|
+
}
|
|
157
|
+
updateViewsMenuItems(tableSaveViewList) {
|
|
158
|
+
return tableSaveViewList.map(item => ({
|
|
159
|
+
label: item.viewAlias,
|
|
160
|
+
lastActive: item.lastActive
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
viewsSaveToDatabase(tableSaveViewList, setListEndpoint, tableViewSaveKey) {
|
|
164
|
+
const serializedSaveViews = tableSaveViewList.map(view => ({
|
|
165
|
+
viewAlias: view.viewAlias,
|
|
166
|
+
viewData: JSON.stringify(view.viewData),
|
|
167
|
+
lastActive: view.lastActive
|
|
168
|
+
}));
|
|
169
|
+
const postData = {
|
|
170
|
+
tableViewSaveKey: tableViewSaveKey,
|
|
171
|
+
views: serializedSaveViews
|
|
172
|
+
};
|
|
173
|
+
return this.http.handleHttpPostRequest(setListEndpoint, postData);
|
|
174
|
+
}
|
|
175
|
+
fetchSelectionKeys(endpoint, request) {
|
|
176
|
+
return this.http.handleHttpPostRequest(endpoint, request);
|
|
177
|
+
}
|
|
178
|
+
viewGenerateData(dt, globalSearchText, currentPage, currentRowsPerPage, modifyFiltersFn) {
|
|
179
|
+
let colsWidth = this.computeColumnWidths(dt);
|
|
180
|
+
let tableWidth = this.computeTableWidth(dt);
|
|
181
|
+
const filtersWithoutGlobalAndSelectedRows = { ...modifyFiltersFn(JSON.parse(JSON.stringify(dt.filters))) };
|
|
182
|
+
if (filtersWithoutGlobalAndSelectedRows['rowID']) {
|
|
183
|
+
filtersWithoutGlobalAndSelectedRows['rowID'][0].value = null;
|
|
184
|
+
}
|
|
185
|
+
if (filtersWithoutGlobalAndSelectedRows['selector']) {
|
|
186
|
+
filtersWithoutGlobalAndSelectedRows['selector'][0].value = null;
|
|
187
|
+
}
|
|
188
|
+
const tableView = {
|
|
189
|
+
columnsShown: [...dt.columns],
|
|
190
|
+
multiSortMeta: dt.multiSortMeta,
|
|
191
|
+
filters: { ...filtersWithoutGlobalAndSelectedRows },
|
|
192
|
+
globalSearchText: globalSearchText,
|
|
193
|
+
currentPage: currentPage,
|
|
194
|
+
currentRowsPerPage: currentRowsPerPage,
|
|
195
|
+
tableWidth: tableWidth,
|
|
196
|
+
columnsWidth: colsWidth
|
|
197
|
+
};
|
|
198
|
+
return tableView;
|
|
199
|
+
}
|
|
200
|
+
computeColumnWidths(dt) {
|
|
201
|
+
let widths = [];
|
|
202
|
+
const headers = dt.el.nativeElement.querySelectorAll('.p-datatable-thead > tr > th');
|
|
203
|
+
headers.forEach((header) => widths.push(DomHandler.getOuterWidth(header)));
|
|
204
|
+
return widths.join(',');
|
|
205
|
+
}
|
|
206
|
+
computeTableWidth(dt) {
|
|
207
|
+
let tableWidth = 0;
|
|
208
|
+
if (dt.columnResizeMode === 'expand') {
|
|
209
|
+
tableWidth = DomHandler.getOuterWidth(dt.tableViewChild?.nativeElement);
|
|
210
|
+
}
|
|
211
|
+
return tableWidth;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
ECSPrimengTableService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ECSPrimengTableService, deps: [{ token: i1.ECSPrimengTableHttpService }, { token: i1.ECSPrimengTableNotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
215
|
+
ECSPrimengTableService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ECSPrimengTableService, providedIn: 'root' });
|
|
216
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ECSPrimengTableService, decorators: [{
|
|
217
|
+
type: Injectable,
|
|
218
|
+
args: [{
|
|
219
|
+
providedIn: 'root'
|
|
220
|
+
}]
|
|
221
|
+
}], ctorParameters: function () { return [{ type: i1.ECSPrimengTableHttpService }, { type: i1.ECSPrimengTableNotificationService }]; } });
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLXByaW1lbmctdGFibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Vjcy1wcmltZW5nLXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy9lY3MtcHJpbWVuZy10YWJsZS9lY3MtcHJpbWVuZy10YWJsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFHakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSTFGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7OztBQUt6QyxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFlBQ1UsSUFBZ0MsRUFDaEMsWUFBZ0Q7UUFEaEQsU0FBSSxHQUFKLElBQUksQ0FBNEI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBSHpDLFNBQUksR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUl4RCxDQUFDO0lBRUosdUJBQXVCLENBQUMsR0FBVztRQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxjQUFjLENBQUMsR0FBVyxFQUFFLFFBQTRCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBc0IsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsUUFBNkI7UUFDekQsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFD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LFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxFQUFFO1lBQ2xDLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDM0U7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOztvSEEvTlEsc0JBQXNCO3dIQUF0QixzQkFBc0IsY0FGckIsTUFBTTs0RkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRUNTUHJpbWVuZ1RhYmxlSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pMThuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBFQ1NQcmltZW5nVGFibGVIdHRwU2VydmljZSwgRUNTUHJpbWVuZ1RhYmxlTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgSUNvbHVtbk1ldGFkYXRhLCBJRXhjZWxFeHBvcnRSZXF1ZXN0LCBJUHJlZGVmaW5lZEZpbHRlciwgSVRhYmxlQ29uZmlndXJhdGlvbiwgSVRhYmxlUGFnZWRSZXNwb25zZSwgSVRhYmxlVmlldywgSVRhYmxlVmlld0RhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgQ2VsbE92ZXJmbG93QmVoYXZpb3VyLCBGcm96ZW5Db2x1bW5BbGlnbiwgVGFibGVWaWV3U2F2ZU1vZGUgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IElUYWJsZVF1ZXJ5UmVxdWVzdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGFibGUtcXVlcnktcmVxdWVzdC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgRG9tSGFuZGxlciB9IGZyb20gJ3ByaW1lbmcvZG9tJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEVDU1ByaW1lbmdUYWJsZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChFQ1NQcmltZW5nVGFibGVJMThuU2VydmljZSk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEVDU1ByaW1lbmdUYWJsZUh0dHBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb246IEVDU1ByaW1lbmdUYWJsZU5vdGlmaWNhdGlvblNlcnZpY2VcclxuICApIHt9XHJcbiAgXHJcbiAgZmV0Y2hUYWJsZUNvbmZpZ3VyYXRpb24odXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxJVGFibGVDb25maWd1cmF0aW9uPj57XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuaGFuZGxlSHR0cEdldFJlcXVlc3Q8SVRhYmxlQ29uZmlndXJhdGlvbj4odXJsKTtcclxuICB9XHJcbiAgZmV0Y2hUYWJsZURhdGEodXJsOiBzdHJpbmcsIHBvc3REYXRhOiBJVGFibGVRdWVyeVJlcXVlc3QpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxJVGFibGVQYWdlZFJlc3BvbnNlPj57XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuaGFuZGxlSHR0cFBvc3RSZXF1ZXN0PElUYWJsZVBhZ2VkUmVzcG9uc2U+KHVybCwgcG9zdERhdGEpO1xyXG4gIH1cclxuICBmZXRjaEV4Y2VsUmVwb3J0KHVybDogc3RyaW5nLCBwb3N0RGF0YTogSUV4Y2VsRXhwb3J0UmVxdWVzdCk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEJsb2I+PntcclxuICAgIGxldCBodHRwT3B0aW9ucyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuaGFuZGxlSHR0cFBvc3RSZXF1ZXN0PEJsb2I+KHVybCwgcG9zdERhdGEsIGh0dHBPcHRpb25zLCBcImJsb2JcIik7XHJcbiAgfVxyXG4gIGdldEljb25CbG9iKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QmxvYj4+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5oYW5kbGVIdHRwR2V0UmVxdWVzdDxCbG9iPih1cmwsXCJibG9iXCIpO1xyXG4gICAgfVxyXG5cclxuICBkb3dubG9hZEZpbGUoZGF0YTogQmxvYiwgZmlsZU5hbWU6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcclxuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGxpbmsuaHJlZiA9IHVybDtcclxuICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG4gIGhhbmRsZVRhYmxlRXJyb3IoXHJcbiAgICBlcnJvcjogYW55LFxyXG4gICAgY3VzdG9tVGl0bGU6IHN0cmluZyA9ICdEYXRhIExvYWRpbmcgRXJyb3InXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvciBvY2N1cnJlZCc7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbi5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuLnRleHQoY3VzdG9tVGl0bGUpLCB0aGlzLmkxOG4udGV4dChtZXNzYWdlKSk7XHJcbiAgfVxyXG5cclxuICBvcmRlckNvbHVtbnNXaXRoRnJvemVucyhjb2xzVG9PcmRlcjogSUNvbHVtbk1ldGFkYXRhW10pOiBJQ29sdW1uTWV0YWRhdGFbXXtcclxuICAgIGNvbnN0IGZyb3plbkxlZnRDb2x1bW5zID0gY29sc1RvT3JkZXIuZmlsdGVyKGNvbCA9PiBjb2wuZnJvemVuQ29sdW1uQWxpZ24gPT09IEZyb3plbkNvbHVtbkFsaWduLkxlZnQpO1xyXG4gICAgY29uc3QgZnJvemVuUmlnaHRDb2x1bW5zID0gY29sc1RvT3JkZXIuZmlsdGVyKGNvbCA9PiBjb2wuZnJvemVuQ29sdW1uQWxpZ24gPT09IEZyb3plbkNvbHVtbkFsaWduLlJpZ2h0KTtcclxuICAgIGNvbnN0IG5vbkZyb3plbkNvbHVtbnMgPSBjb2xzVG9PcmRlci5maWx0ZXIoY29sID0+IGNvbC5mcm96ZW5Db2x1bW5BbGlnbiA9PT0gRnJvemVuQ29sdW1uQWxpZ24uTm9vbmUpO1xyXG4gICAgcmV0dXJuIFsuLi5mcm96ZW5MZWZ0Q29sdW1ucywgLi4ubm9uRnJvemVuQ29sdW1ucywgLi4uZnJvemVuUmlnaHRDb2x1bW5zXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIGFjdGlvbiBidXR0b25zIGluIGEgcm93IG9mIGRhdGEuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gYWN0aW9uIC0gVGhlIGFjdGlvbiBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC4gSXQgc2hvdWxkIGFjY2VwdCBvbmUgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgcm93IGRhdGEuXHJcbiAgICogQHBhcmFtIHthbnl9IFtyb3dEYXRhPW51bGxdIC0gVGhlIGRhdGEgb2YgdGhlIHJvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGlja2VkIGJ1dHRvbi4gRGVmYXVsdHMgdG8gbnVsbC5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIC8vIERlZmluZSBhbiBhY3Rpb24gZm9yIGEgYnV0dG9uXHJcbiAgICogY29uc3QgZGVsZXRlQWN0aW9uID0gKHJvd0RhdGEpID0+IHtcclxuICAgKiAgIGNvbnNvbGUubG9nKGBEZWxldGUgcm93IHdpdGggaWQ6ICR7cm93RGF0YS5yb3dJRH1gKTtcclxuICAgKiB9O1xyXG4gICAqIFxyXG4gICAqIC8vIFVzZSBoYW5kbGVCdXR0b25zQ2xpY2sgd2l0aCByb3cgZGF0YVxyXG4gICAqIGhhbmRsZUJ1dHRvbnNDbGljayhkZWxldGVBY3Rpb24sIHsgcm93SUQ6IDEsIG5hbWU6ICdKb2huIERvZScgfSk7XHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uc0NsaWNrKGFjdGlvbjogKHJvd0RhdGE6IGFueSkgPT4gdm9pZCwgcm93RGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKGFjdGlvbikgeyAvLyBJZiB0aGUgYnV0dG9uIGhhcyBhbiBhc3NpZ25lZCBhY3Rpb25cclxuICAgICAgYWN0aW9uKHJvd0RhdGEpOyAvLyBQZXJmb3JtIHRoZSBhY3Rpb25cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVByZWRlZmluZWRGaWx0ZXJDbGljayhhY3Rpb246IChyb3dEYXRhOiBhbnksIG9wdGlvbjogSVByZWRlZmluZWRGaWx0ZXIpID0+IHZvaWQsIHJvd0RhdGE6IGFueSA9IG51bGwsIG9wdGlvbjogSVByZWRlZmluZWRGaWx0ZXIpOiB2b2lkIHtcclxuICAgIGlmIChhY3Rpb24pIHsgLy8gSWYgdGhlIGJ1dHRvbiBoYXMgYW4gYXNzaWduZWQgYWN0aW9uXHJcbiAgICAgIGFjdGlvbihyb3dEYXRhLCBvcHRpb24pOyAvLyBQZXJmb3JtIHRoZSBhY3Rpb25cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbHVtblN0eWxlKGNvbDogYW55LCBoZWFkZXJDb2xzOiBib29sZWFuID0gZmFsc2UpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIGxldCBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICAgIGlmICghaGVhZGVyQ29scykge1xyXG4gICAgICBzd2l0Y2ggKGNvbC5jZWxsT3ZlcmZsb3dCZWhhdmlvdXIpIHtcclxuICAgICAgICBjYXNlIENlbGxPdmVyZmxvd0JlaGF2aW91ci5XcmFwOlxyXG4gICAgICAgICAgc3R5bGVzWyd3aGl0ZS1zcGFjZSddID0gJ25vcm1hbCc7XHJcbiAgICAgICAgICBzdHlsZXNbJ3dvcmQtd3JhcCddID0gJ2JyZWFrLXdvcmQnO1xyXG4gICAgICAgICAgc3R5bGVzWyd3b3JkLWJyZWFrJ10gPSAnYnJlYWstYWxsJztcclxuICAgICAgICAgIHN0eWxlc1snb3ZlcmZsb3cnXSA9ICdoaWRkZW4nO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvKmNhc2UgQ2VsbE92ZXJmbG93QmVoYXZpb3VyLkVsbGlwc2lzOlxyXG4gICAgICAgICAgc3R5bGVzWyd3aGl0ZS1zcGFjZSddID0gJ25vd3JhcCc7XHJcbiAgICAgICAgICBzdHlsZXNbJ292ZXJmbG93J10gPSAnaGlkZGVuJztcclxuICAgICAgICAgIHN0eWxlc1sndGV4dC1vdmVyZmxvdyddID0gJ2VsbGlwc2lzJztcclxuICAgICAgICAgIHN0eWxlc1snd2lkdGgnXSA9ICcxMDAlJztcclxuICAgICAgICAgIHN0eWxlc1snbWluLXdpZHRoJ10gPSAnMTAwJSc7XHJcbiAgICAgICAgICBzdHlsZXNbJ21heC13aWR0aCddID0gJzEwMCUnO1xyXG4gICAgICAgIGJyZWFrOyovXHJcbiAgICAgICAgLypcclxuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gIHdpZHRoOiAxMDAlOyAgXHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgICovXHJcblxyXG4gICAgICAgIGNhc2UgQ2VsbE92ZXJmbG93QmVoYXZpb3VyLkhpZGRlbjpcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBzdHlsZXNbJ3doaXRlLXNwYWNlJ10gPSAnbm93cmFwJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2wuaW5pdGlhbFdpZHRoID4gMCkge1xyXG4gICAgICBjb25zdCB3aWR0aCA9IGAke2NvbC5pbml0aWFsV2lkdGh9cHhgO1xyXG4gICAgICBzdHlsZXNbJ3dpZHRoJ10gPSB3aWR0aDtcclxuICAgICAgc3R5bGVzWydtaW4td2lkdGgnXSA9IHdpZHRoO1xyXG4gICAgICBzdHlsZXNbJ21heC13aWR0aCddID0gd2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0eWxlcztcclxuXHJcbiAgICAvKmxldCBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICAgIGlmKCFoZWFkZXJDb2xzKXtcclxuICAgICAgc3R5bGVzID0ge1xyXG4gICAgICAgICAgJ3doaXRlLXNwYWNlJzogY29sLmNlbGxPdmVyZmxvd0JlaGF2aW91ciA9PT0gQ2VsbE92ZXJmbG93QmVoYXZpb3VyLldyYXAgPyAnbm9ybWFsJyA6ICdub3dyYXAnLFxyXG4gICAgICAgICAgJ3dvcmQtd3JhcCc6IGNvbC5jZWxsT3ZlcmZsb3dCZWhhdmlvdXIgPT09IENlbGxPdmVyZmxvd0JlaGF2aW91ci5XcmFwID8gJ2JyZWFrLXdvcmQnIDogJ25vcm1hbCcsXHJcbiAgICAgICAgICAnd29yZC1icmVhayc6IGNvbC5jZWxsT3ZlcmZsb3dCZWhhdmlvdXIgPT09IENlbGxPdmVyZmxvd0JlaGF2aW91ci5XcmFwID8gJ2JyZWFrLWFsbCcgOiAnbm9ybWFsJ1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC5pbml0aWFsV2lkdGggPiAwKSB7XHJcbiAgICAgICAgc3R5bGVzWydtYXgtd2lkdGgnXSA9IGNvbC5pbml0aWFsV2lkdGggKyAncHgnO1xyXG4gICAgICAgIHN0eWxlc1snbWluLXdpZHRoJ10gPSBjb2wuaW5pdGlhbFdpZHRoICsgJ3B4JztcclxuICAgICAgICBzdHlsZXNbJ3dpZHRoJ10gPSBjb2wuaW5pdGlhbFdpZHRoICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHlsZXM7Ki9cclxuICB9XHJcblxyXG4gIGZldGNoVGFibGVWaWV3cyh0YWJsZVZpZXdTYXZlQXM6IFRhYmxlVmlld1NhdmVNb2RlLCByZWNvdmVyTGlzdEVuZHBvaW50OiBzdHJpbmcsIHRhYmxlVmlld1NhdmVLZXk6IHN0cmluZyk6IElUYWJsZVZpZXdbXSB8IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPElUYWJsZVZpZXdbXT4+e1xyXG4gICAgbGV0IHRhYmxlVmlld0xpc3Q6IElUYWJsZVZpZXdbXSA9IFtdO1xyXG4gICAgbGV0IHRhYmxlVmlld05vdFBhcnNlZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBpZih0YWJsZVZpZXdTYXZlS2V5ICE9PSBcIlwiICYmIHRhYmxlVmlld1NhdmVLZXkgIT09ICcnKXtcclxuICAgICAgICBzd2l0Y2godGFibGVWaWV3U2F2ZUFzKXtcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVZpZXdTYXZlTW9kZS5Ob25lOlxyXG4gICAgICAgICAgICAgICAgdGFibGVWaWV3Tm90UGFyc2VkID0gbnVsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVWaWV3U2F2ZU1vZGUuU2Vzc2lvblN0b3JhZ2U6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVZpZXdOb3RQYXJzZWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRhYmxlVmlld1NhdmVLZXkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVZpZXdTYXZlTW9kZS5Mb2NhbFN0b3JhZ2U6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVZpZXdOb3RQYXJzZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0YWJsZVZpZXdTYXZlS2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVWaWV3U2F2ZU1vZGUuRGF0YWJhc2VTdG9yYWdlOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zdERhdGE6IGFueSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJsZVZpZXdTYXZlS2V5OiB0YWJsZVZpZXdTYXZlS2V5XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5oYW5kbGVIdHRwUG9zdFJlcXVlc3Q8SVRhYmxlVmlld1tdPihyZWNvdmVyTGlzdEVuZHBvaW50LHBvc3REYXRhKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uLnNob3dUb2FzdChcImVycm9yXCIsIHRoaXMuaTE4bi50ZXh0KFwiU0FWRSBWSUVXIFRZUEUgRE9FUyBOT1QgRVhJU1RcIiksIHRoaXMuaTE4bi50ZXh0KFwiVGhpcyB0eXBlIG9mIHNhdmUgdmlldyBkb2VzIG5vdCBleGlzdC5cIikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRhYmxlVmlld0xpc3QgPSB0YWJsZVZpZXdOb3RQYXJzZWQgPyBKU09OLnBhcnNlKHRhYmxlVmlld05vdFBhcnNlZCkgOiBbXTtcclxuICAgIHRoaXMuc29ydFZpZXdzKHRhYmxlVmlld0xpc3QpO1xyXG4gICAgcmV0dXJuIHRhYmxlVmlld0xpc3Q7XHJcbiAgfVxyXG4gIHNvcnRWaWV3cyh0YWJsZVNhdmVWaWV3TGlzdDogSVRhYmxlVmlld1tdKTogdm9pZHtcclxuICAgICAgdGFibGVTYXZlVmlld0xpc3Quc29ydCgoYSwgYikgPT4gXHJcbiAgICAgICAgICBhLnZpZXdBbGlhcy50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi52aWV3QWxpYXMudG9Mb3dlckNhc2UoKSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgdXBkYXRlVmlld3NNZW51SXRlbXModGFibGVTYXZlVmlld0xpc3Q6IElUYWJsZVZpZXdbXSk6IE1lbnVJdGVtW117XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlU2F2ZVZpZXdMaXN0Lm1hcChpdGVtID0+ICh7XHJcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLnZpZXdBbGlhcyxcclxuICAgICAgICAgICAgbGFzdEFjdGl2ZTogaXRlbS5sYXN0QWN0aXZlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIHZpZXdzU2F2ZVRvRGF0YWJhc2UodGFibGVTYXZlVmlld0xpc3Q6IElUYWJsZVZpZXdbXSwgc2V0TGlzdEVuZHBvaW50OiBzdHJpbmcsIHRhYmxlVmlld1NhdmVLZXk6IHN0cmluZyk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPGFueT4+e1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTYXZlVmlld3MgPSB0YWJsZVNhdmVWaWV3TGlzdC5tYXAodmlldyA9PiAoe1xyXG4gICAgICAgICAgICB2aWV3QWxpYXM6IHZpZXcudmlld0FsaWFzLFxyXG4gICAgICAgICAgICB2aWV3RGF0YTogSlNPTi5zdHJpbmdpZnkodmlldy52aWV3RGF0YSksXHJcbiAgICAgICAgICAgIGxhc3RBY3RpdmU6IHZpZXcubGFzdEFjdGl2ZVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICBjb25zdCBwb3N0RGF0YTogYW55ID0ge1xyXG4gICAgICAgICAgICB0YWJsZVZpZXdTYXZlS2V5OiB0YWJsZVZpZXdTYXZlS2V5LFxyXG4gICAgICAgICAgICB2aWV3czogc2VyaWFsaXplZFNhdmVWaWV3c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5oYW5kbGVIdHRwUG9zdFJlcXVlc3Q8YW55PihzZXRMaXN0RW5kcG9pbnQscG9zdERhdGEpO1xyXG4gICAgfVxyXG4gIGZldGNoU2VsZWN0aW9uS2V5cyhlbmRwb2ludDogc3RyaW5nLCByZXF1ZXN0OiBJVGFibGVRdWVyeVJlcXVlc3QpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnlbXT4+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuaGFuZGxlSHR0cFBvc3RSZXF1ZXN0PGFueVtdPihlbmRwb2ludCwgcmVxdWVzdCk7XHJcbiAgfVxyXG4gIHZpZXdHZW5lcmF0ZURhdGEoZHQ6IFRhYmxlLCBnbG9iYWxTZWFyY2hUZXh0OiBzdHJpbmcgfCBudWxsLCBjdXJyZW50UGFnZTogbnVtYmVyLCBjdXJyZW50Um93c1BlclBhZ2U6IG51bWJlciwgbW9kaWZ5RmlsdGVyc0ZuOiAoZmlsdGVyczogYW55KSA9PiBhbnkpOiBJVGFibGVWaWV3RGF0YXtcclxuICAgICAgICBsZXQgY29sc1dpZHRoID0gdGhpcy5jb21wdXRlQ29sdW1uV2lkdGhzKGR0KTtcclxuICAgICAgICBsZXQgdGFibGVXaWR0aCA9IHRoaXMuY29tcHV0ZVRhYmxlV2lkdGgoZHQpO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnNXaXRob3V0R2xvYmFsQW5kU2VsZWN0ZWRSb3dzID0gey4uLm1vZGlmeUZpbHRlcnNGbihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGR0LmZpbHRlcnMpKSl9O1xyXG4gICAgICAgIGlmIChmaWx0ZXJzV2l0aG91dEdsb2JhbEFuZFNlbGVjdGVkUm93c1sncm93SUQnXSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJzV2l0aG91dEdsb2JhbEFuZFNlbGVjdGVkUm93c1sncm93SUQnXVswXS52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJzV2l0aG91dEdsb2JhbEFuZFNlbGVjdGVkUm93c1snc2VsZWN0b3InXSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJzV2l0aG91dEdsb2JhbEFuZFNlbGVjdGVkUm93c1snc2VsZWN0b3InXVswXS52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlVmlldzogSVRhYmxlVmlld0RhdGEgPSB7XHJcbiAgICAgICAgICBjb2x1bW5zU2hvd246IFsuLi5kdC5jb2x1bW5zIV0sXHJcbiAgICAgICAgICBtdWx0aVNvcnRNZXRhOiBkdC5tdWx0aVNvcnRNZXRhLFxyXG4gICAgICAgICAgZmlsdGVyczogey4uLmZpbHRlcnNXaXRob3V0R2xvYmFsQW5kU2VsZWN0ZWRSb3dzfSxcclxuICAgICAgICAgIGdsb2JhbFNlYXJjaFRleHQ6IGdsb2JhbFNlYXJjaFRleHQsXHJcbiAgICAgICAgICBjdXJyZW50UGFnZTogY3VycmVudFBhZ2UsXHJcbiAgICAgICAgICBjdXJyZW50Um93c1BlclBhZ2U6IGN1cnJlbnRSb3dzUGVyUGFnZSxcclxuICAgICAgICAgIHRhYmxlV2lkdGg6IHRhYmxlV2lkdGgsXHJcbiAgICAgICAgICBjb2x1bW5zV2lkdGg6IGNvbHNXaWR0aFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGFibGVWaWV3O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXB1dGVDb2x1bW5XaWR0aHMoZHQ6IFRhYmxlKTogYW55IHtcclxuICAgICAgbGV0IHdpZHRoczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IGR0LmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnAtZGF0YXRhYmxlLXRoZWFkID4gdHIgPiB0aCcpO1xyXG4gICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlcjogSFRNTEVsZW1lbnQpID0+IHdpZHRocy5wdXNoKERvbUhhbmRsZXIuZ2V0T3V0ZXJXaWR0aChoZWFkZXIpKSk7XHJcbiAgICAgIHJldHVybiB3aWR0aHMuam9pbignLCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXB1dGVUYWJsZVdpZHRoKGR0OiBUYWJsZSk6IGFueSB7XHJcbiAgICAgICAgbGV0IHRhYmxlV2lkdGggPSAwO1xyXG4gICAgICAgIGlmIChkdC5jb2x1bW5SZXNpemVNb2RlID09PSAnZXhwYW5kJykge1xyXG4gICAgICAgICAgICB0YWJsZVdpZHRoID0gRG9tSGFuZGxlci5nZXRPdXRlcldpZHRoKGR0LnRhYmxlVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlV2lkdGg7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { ECSPrimengTableI18nService } from '../../services/i18n.service';
|
|
2
|
+
import { ECSTableTranslatePipe } from '../../pipes/ui-translate.pipe';
|
|
3
|
+
import { inject, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import { ButtonModule } from 'primeng/button';
|
|
6
|
+
import { DialogModule } from 'primeng/dialog';
|
|
7
|
+
import { SelectButtonModule } from 'primeng/selectbutton';
|
|
8
|
+
import { InputTextModule } from 'primeng/inputtext';
|
|
9
|
+
import { TooltipModule } from 'primeng/tooltip';
|
|
10
|
+
import { CheckboxModule } from 'primeng/checkbox';
|
|
11
|
+
import { CommonModule } from '@angular/common';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "../../services";
|
|
14
|
+
import * as i2 from "./export-excel.service";
|
|
15
|
+
import * as i3 from "@angular/common";
|
|
16
|
+
import * as i4 from "primeng/dialog";
|
|
17
|
+
import * as i5 from "primeng/api";
|
|
18
|
+
import * as i6 from "@angular/forms";
|
|
19
|
+
import * as i7 from "primeng/button";
|
|
20
|
+
import * as i8 from "primeng/selectbutton";
|
|
21
|
+
import * as i9 from "primeng/inputtext";
|
|
22
|
+
import * as i10 from "primeng/tooltip";
|
|
23
|
+
import * as i11 from "primeng/checkbox";
|
|
24
|
+
export class ExportExcel {
|
|
25
|
+
constructor(notificationSerivce, exportExcelService) {
|
|
26
|
+
this.notificationSerivce = notificationSerivce;
|
|
27
|
+
this.exportExcelService = exportExcelService;
|
|
28
|
+
this.i18n = inject(ECSPrimengTableI18nService);
|
|
29
|
+
this.translatedOptionSets = new WeakMap();
|
|
30
|
+
this.visible = false;
|
|
31
|
+
this.rowCheckboxSelectorActive = false;
|
|
32
|
+
this.excelReportTitle = "";
|
|
33
|
+
this.includeTimeInTitle = true;
|
|
34
|
+
this.exportUseIconsInBools = false;
|
|
35
|
+
this.allowTitleUserEdit = false;
|
|
36
|
+
this.exportToExcel = new EventEmitter();
|
|
37
|
+
this.visibleChange = new EventEmitter();
|
|
38
|
+
this.option_exportColumns_selected = false;
|
|
39
|
+
this.option_exportColumns = [
|
|
40
|
+
{ label: 'Only visible', value: false },
|
|
41
|
+
{ label: 'All columns', value: true }
|
|
42
|
+
];
|
|
43
|
+
this.option_applyCurrentFilters_selected = false;
|
|
44
|
+
this.option_applyCurrentFilters = [
|
|
45
|
+
{ label: 'No filters', value: false },
|
|
46
|
+
{ label: 'Apply current filters', value: true }
|
|
47
|
+
];
|
|
48
|
+
this.option_applyCurrentSorts_selected = false;
|
|
49
|
+
this.option_applyCurrentSorts = [
|
|
50
|
+
{ label: 'No sorts', value: false },
|
|
51
|
+
{ label: 'Apply current sorts', value: true }
|
|
52
|
+
];
|
|
53
|
+
this.option_selectedRowsExport_selected = 0;
|
|
54
|
+
this.option_selectedRowsExport = [
|
|
55
|
+
{ label: 'All rows', value: 0 },
|
|
56
|
+
{ label: 'Selected rows', value: 1 },
|
|
57
|
+
{ label: 'Not selected rows', value: 2 }
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
ngOnChanges(changes) {
|
|
61
|
+
// If visible changes from false to true, reset values
|
|
62
|
+
if (changes['visible'] && changes['visible'].currentValue === true && changes['visible'].previousValue === false) {
|
|
63
|
+
this.resetValues();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
resetValues() {
|
|
67
|
+
this.includeTimeInTitle = true;
|
|
68
|
+
this.exportUseIconsInBools = false;
|
|
69
|
+
this.option_exportColumns_selected = false;
|
|
70
|
+
this.option_applyCurrentFilters_selected = false;
|
|
71
|
+
this.option_applyCurrentSorts_selected = false;
|
|
72
|
+
this.option_selectedRowsExport_selected = 0;
|
|
73
|
+
}
|
|
74
|
+
getExcelReport() {
|
|
75
|
+
let excelReportFinalTitle = "";
|
|
76
|
+
this.excelReportTitle = this.excelReportTitle?.trim();
|
|
77
|
+
if (!this.excelReportTitle || this.excelReportTitle.length <= 0) {
|
|
78
|
+
this.notificationSerivce.clearToasts();
|
|
79
|
+
this.notificationSerivce.showToast("error", this.i18n.text("REPORT NAME NOT VALID"), this.i18n.text("The report name is not valid"));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const allowedPattern = /^[A-Za-z0-9 _-]*$/;
|
|
83
|
+
if (!allowedPattern.test(this.excelReportTitle)) {
|
|
84
|
+
this.notificationSerivce.clearToasts();
|
|
85
|
+
this.notificationSerivce.showToast("error", this.i18n.text("INVALID CHARACTERS IN REPORT NAME"), this.i18n.text("The report name contains invalid characters."));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (this.includeTimeInTitle) {
|
|
89
|
+
excelReportFinalTitle = this.excelReportTitle + this.exportExcelService.getCurrentTimeString() + ".xlsx";
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
excelReportFinalTitle = this.excelReportTitle + ".xlsx";
|
|
93
|
+
}
|
|
94
|
+
this.exportToExcel.emit({
|
|
95
|
+
allColumns: this.option_exportColumns_selected,
|
|
96
|
+
applyFilters: this.option_applyCurrentFilters_selected,
|
|
97
|
+
applySorts: this.option_applyCurrentSorts_selected,
|
|
98
|
+
selectedRows: this.option_selectedRowsExport_selected,
|
|
99
|
+
filename: excelReportFinalTitle,
|
|
100
|
+
useIconInBools: this.exportUseIconsInBools
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
translatedOptions(options) {
|
|
104
|
+
const labels = options.map(option => this.i18n.text(option.label));
|
|
105
|
+
const cached = this.translatedOptionSets.get(options);
|
|
106
|
+
if (cached?.length === options.length && cached.every((option, index) => option.label === labels[index] && option.value === options[index].value)) {
|
|
107
|
+
return cached;
|
|
108
|
+
}
|
|
109
|
+
const translated = options.map((option, index) => ({ ...option, label: labels[index] }));
|
|
110
|
+
this.translatedOptionSets.set(options, translated);
|
|
111
|
+
return translated;
|
|
112
|
+
}
|
|
113
|
+
filterSelectorDisabled() {
|
|
114
|
+
return this.option_selectedRowsExport_selected >= 1;
|
|
115
|
+
}
|
|
116
|
+
onChangeExportRows(event) {
|
|
117
|
+
if (event.value >= 1) {
|
|
118
|
+
this.option_applyCurrentFilters_selected = true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
closeModal() {
|
|
122
|
+
this.visibleChange.emit(false);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
ExportExcel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ExportExcel, deps: [{ token: i1.ECSPrimengTableNotificationService }, { token: i2.ExportExcelService }], target: i0.ɵɵFactoryTarget.Component });
|
|
126
|
+
ExportExcel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ExportExcel, isStandalone: true, selector: "ecs-export-excel", inputs: { visible: "visible", rowCheckboxSelectorActive: "rowCheckboxSelectorActive", excelReportTitle: "excelReportTitle", allowTitleUserEdit: "allowTitleUserEdit" }, outputs: { exportToExcel: "exportToExcel", visibleChange: "visibleChange" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\r\n [closable]=\"false\" [closeOnEscape]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '70vw', 'max-width': '70vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <div>\r\n <span class=\"p-dialog-title\">{{ 'Export data to Excel' | ecsTranslate }}</span>\r\n </div>\r\n </ng-template>\r\n <div style=\"display: grid; grid-template-columns: 4fr 8fr; gap: 1rem; align-items: center; margin-top: 10px;\">\r\n <div style=\"justify-self: end;\">\r\n {{ 'Report filename' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <input pInputText id=\"reportTitle\" [attr.aria-label]=\"'Report filename' | ecsTranslate\" [(ngModel)]=\"excelReportTitle\" autocomplete=\"off\" style=\"width: 100%;\" [disabled]=\"!allowTitleUserEdit\" maxlength=\"100\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i [pTooltip]=\"'Activating this option will add the current <b>\\'_{year}{month}{day}_{hours}{minutes}{seconds}_UTC\\'</b> at the end of your filename.' | ecsTranslate\"\r\n tooltipPosition=\"top\"\r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n {{ 'Include time in report filename?' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"includeTimeInTitle\"></p-checkbox>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i [pTooltip]=\"'Activating this option will make boolean values be shown as icons in the Excel report:<br>True \u2192 <span class=\\'bool-icon bool-true\\'>\u2714</span><br>False \u2192 <span class=\\'bool-icon bool-false\\'>\u2718</span>' | ecsTranslate\"\r\n tooltipPosition=\"top\"\r\n tooltipStyleClass=\"excel-export-tooltip\"\r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n {{ 'Use icons in boolean fields?' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"exportUseIconsInBools\"></p-checkbox>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n {{ 'Export columns' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_exportColumns_selected\" [options]=\"translatedOptions(option_exportColumns)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <ng-container *ngIf=\"filterSelectorDisabled()\">\r\n <i [pTooltip]=\"'Sorts are active because you want to export selected rows following a filter criteria' | ecsTranslate\" tooltipPosition=\"top\" class=\"pi pi-info-circle\"></i>\r\n </ng-container>\r\n {{ 'Filters to apply' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentFilters_selected\" [options]=\"translatedOptions(option_applyCurrentFilters)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" [disabled]=\"filterSelectorDisabled()\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n {{ 'Sorts to apply' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentSorts_selected\" [options]=\"translatedOptions(option_applyCurrentSorts)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n\r\n <ng-container *ngIf=\"rowCheckboxSelectorActive\">\r\n <div style=\"justify-self: end;\">\r\n {{ 'Selected rows' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_selectedRowsExport_selected\" [options]=\"translatedOptions(option_selectedRowsExport)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" (onChange)=\"onChangeExportRows($event)\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"closeModal()\" [label]=\"'Cancel export' | ecsTranslate\" outlined=\"true\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n <p-button (click)=\"getExcelReport()\" [label]=\"'Export' | ecsTranslate\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n </ng-template>\r\n</p-dialog>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: ECSTableTranslatePipe, name: "ecsTranslate" }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i8.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i9.InputText, selector: "[pInputText]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i10.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i11.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }] });
|
|
127
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ExportExcel, decorators: [{
|
|
128
|
+
type: Component,
|
|
129
|
+
args: [{ selector: 'ecs-export-excel', imports: [
|
|
130
|
+
CommonModule,
|
|
131
|
+
ECSTableTranslatePipe,
|
|
132
|
+
DialogModule,
|
|
133
|
+
FormsModule,
|
|
134
|
+
ButtonModule,
|
|
135
|
+
SelectButtonModule,
|
|
136
|
+
InputTextModule,
|
|
137
|
+
TooltipModule,
|
|
138
|
+
CheckboxModule
|
|
139
|
+
], standalone: true, template: "<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\r\n [closable]=\"false\" [closeOnEscape]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '70vw', 'max-width': '70vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <div>\r\n <span class=\"p-dialog-title\">{{ 'Export data to Excel' | ecsTranslate }}</span>\r\n </div>\r\n </ng-template>\r\n <div style=\"display: grid; grid-template-columns: 4fr 8fr; gap: 1rem; align-items: center; margin-top: 10px;\">\r\n <div style=\"justify-self: end;\">\r\n {{ 'Report filename' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <input pInputText id=\"reportTitle\" [attr.aria-label]=\"'Report filename' | ecsTranslate\" [(ngModel)]=\"excelReportTitle\" autocomplete=\"off\" style=\"width: 100%;\" [disabled]=\"!allowTitleUserEdit\" maxlength=\"100\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i [pTooltip]=\"'Activating this option will add the current <b>\\'_{year}{month}{day}_{hours}{minutes}{seconds}_UTC\\'</b> at the end of your filename.' | ecsTranslate\"\r\n tooltipPosition=\"top\"\r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n {{ 'Include time in report filename?' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"includeTimeInTitle\"></p-checkbox>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i [pTooltip]=\"'Activating this option will make boolean values be shown as icons in the Excel report:<br>True \u2192 <span class=\\'bool-icon bool-true\\'>\u2714</span><br>False \u2192 <span class=\\'bool-icon bool-false\\'>\u2718</span>' | ecsTranslate\"\r\n tooltipPosition=\"top\"\r\n tooltipStyleClass=\"excel-export-tooltip\"\r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n {{ 'Use icons in boolean fields?' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"exportUseIconsInBools\"></p-checkbox>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n {{ 'Export columns' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_exportColumns_selected\" [options]=\"translatedOptions(option_exportColumns)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <ng-container *ngIf=\"filterSelectorDisabled()\">\r\n <i [pTooltip]=\"'Sorts are active because you want to export selected rows following a filter criteria' | ecsTranslate\" tooltipPosition=\"top\" class=\"pi pi-info-circle\"></i>\r\n </ng-container>\r\n {{ 'Filters to apply' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentFilters_selected\" [options]=\"translatedOptions(option_applyCurrentFilters)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" [disabled]=\"filterSelectorDisabled()\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n {{ 'Sorts to apply' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentSorts_selected\" [options]=\"translatedOptions(option_applyCurrentSorts)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n\r\n <ng-container *ngIf=\"rowCheckboxSelectorActive\">\r\n <div style=\"justify-self: end;\">\r\n {{ 'Selected rows' | ecsTranslate }}\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_selectedRowsExport_selected\" [options]=\"translatedOptions(option_selectedRowsExport)\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" (onChange)=\"onChangeExportRows($event)\"><ng-template pTemplate=\"item\" let-option>{{ option.label | ecsTranslate }}</ng-template></p-selectButton>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"closeModal()\" [label]=\"'Cancel export' | ecsTranslate\" outlined=\"true\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n <p-button (click)=\"getExcelReport()\" [label]=\"'Export' | ecsTranslate\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n </ng-template>\r\n</p-dialog>\r\n" }]
|
|
140
|
+
}], ctorParameters: function () { return [{ type: i1.ECSPrimengTableNotificationService }, { type: i2.ExportExcelService }]; }, propDecorators: { visible: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], rowCheckboxSelectorActive: [{
|
|
143
|
+
type: Input
|
|
144
|
+
}], excelReportTitle: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], allowTitleUserEdit: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], exportToExcel: [{
|
|
149
|
+
type: Output
|
|
150
|
+
}], visibleChange: [{
|
|
151
|
+
type: Output
|
|
152
|
+
}] } });
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LWV4Y2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWNzLXByaW1lbmctdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2V4cG9ydC1leGNlbC9leHBvcnQtZXhjZWwudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY3MtcHJpbWVuZy10YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvZXhwb3J0LWV4Y2VsL2V4cG9ydC1leGNlbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUcxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFrQi9DLE1BQU0sT0FBTyxXQUFXO0lBc0J0QixZQUNVLG1CQUF1RCxFQUN2RCxrQkFBc0M7UUFEdEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQztRQUN2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OzZGQUFYLFdBQVcsc1ZDOUJ4QiwrdktBOEVBLDJDRDdESSxZQUFZLDhIQUNaLHFCQUFxQixvREFDckIsWUFBWSxpMEJBQ1osV0FBVyxpeEJBQ1gsWUFBWSxzUkFDWixrQkFBa0IsNlNBQ2xCLGVBQWUsbUdBQ2YsYUFBYSwwVkFDYixjQUFjOzRGQUtMLFdBQVc7a0JBaEJ2QixTQUFTOytCQUNFLGtCQUFrQixXQUNuQjt3QkFDUCxZQUFZO3dCQUNaLHFCQUFxQjt3QkFDckIsWUFBWTt3QkFDWixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsY0FBYztxQkFDZixjQUNXLElBQUk7MEpBU1AsT0FBTztzQkFBZixLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBUUcsYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVDU1ByaW1lbmdUYWJsZUkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaTE4bi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRUNTVGFibGVUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvdWktdHJhbnNsYXRlLnBpcGUnO1xyXG5pbXBvcnQgeyBpbmplY3QsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTZWxlY3RCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3NlbGVjdGJ1dHRvbic7XHJcbmltcG9ydCB7IEVDU1ByaW1lbmdUYWJsZU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IEV4cG9ydEV4Y2VsU2VydmljZSB9IGZyb20gJy4vZXhwb3J0LWV4Y2VsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dCc7XHJcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlY3MtZXhwb3J0LWV4Y2VsJyxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBFQ1NUYWJsZVRyYW5zbGF0ZVBpcGUsXHJcbiAgICBEaWFsb2dNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIEJ1dHRvbk1vZHVsZSxcclxuICAgIFNlbGVjdEJ1dHRvbk1vZHVsZSxcclxuICAgIElucHV0VGV4dE1vZHVsZSxcclxuICAgIFRvb2x0aXBNb2R1bGUsXHJcbiAgICBDaGVja2JveE1vZHVsZVxyXG4gIF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZXhwb3J0LWV4Y2VsLmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFeHBvcnRFeGNlbCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gaW5qZWN0KEVDU1ByaW1lbmdUYWJsZUkxOG5TZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZWRPcHRpb25TZXRzID0gbmV3IFdlYWtNYXA8XHJcbiAgICB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIHwgbnVtYmVyIH1bXSxcclxuICAgIHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfCBudW1iZXIgfVtdXHJcbiAgPigpO1xyXG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSByb3dDaGVja2JveFNlbGVjdG9yQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZXhjZWxSZXBvcnRUaXRsZTogc3RyaW5nID0gXCJcIjtcclxuICBpbmNsdWRlVGltZUluVGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGV4cG9ydFVzZUljb25zSW5Cb29sczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFsbG93VGl0bGVVc2VyRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBleHBvcnRUb0V4Y2VsID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBhbGxDb2x1bW5zOiBib29sZWFuLFxyXG4gICAgYXBwbHlGaWx0ZXJzOiBib29sZWFuLFxyXG4gICAgYXBwbHlTb3J0czogYm9vbGVhbixcclxuICAgIHNlbGVjdGVkUm93czogbnVtYmVyLFxyXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcclxuICAgIHVzZUljb25JbkJvb2xzOiBib29sZWFuXHJcbiAgfT4oKTtcclxuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcml2Y2U6IEVDU1ByaW1lbmdUYWJsZU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV4cG9ydEV4Y2VsU2VydmljZTogRXhwb3J0RXhjZWxTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBvcHRpb25fZXhwb3J0Q29sdW1uc19zZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9wdGlvbl9leHBvcnRDb2x1bW5zOiBhbnlbXSA9IFtcclxuICAgIHsgbGFiZWw6ICdPbmx5IHZpc2libGUnLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICdBbGwgY29sdW1ucycsIHZhbHVlOiB0cnVlIH1cclxuICBdO1xyXG5cclxuICBvcHRpb25fYXBwbHlDdXJyZW50RmlsdGVyc19zZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9wdGlvbl9hcHBseUN1cnJlbnRGaWx0ZXJzOiBhbnlbXSA9IFtcclxuICAgIHsgbGFiZWw6ICdObyBmaWx0ZXJzJywgdmFsdWU6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAnQXBwbHkgY3VycmVudCBmaWx0ZXJzJywgdmFsdWU6IHRydWUgfVxyXG4gIF07XHJcblxyXG4gIG9wdGlvbl9hcHBseUN1cnJlbnRTb3J0c19zZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9wdGlvbl9hcHBseUN1cnJlbnRTb3J0czogYW55W10gPSBbXHJcbiAgICB7IGxhYmVsOiAnTm8gc29ydHMnLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICdBcHBseSBjdXJyZW50IHNvcnRzJywgdmFsdWU6IHRydWUgfVxyXG4gIF07XHJcblxyXG4gIG9wdGlvbl9zZWxlY3RlZFJvd3NFeHBvcnRfc2VsZWN0ZWQ6IG51bWJlciA9IDA7XHJcbiAgb3B0aW9uX3NlbGVjdGVkUm93c0V4cG9ydDogYW55W10gPSBbXHJcbiAgICB7IGxhYmVsOiAnQWxsIHJvd3MnLCB2YWx1ZTogMCB9LFxyXG4gICAgeyBsYWJlbDogJ1NlbGVjdGVkIHJvd3MnLCB2YWx1ZTogMSB9LFxyXG4gICAgeyBsYWJlbDogJ05vdCBzZWxlY3RlZCByb3dzJywgdmFsdWU6IDIgfVxyXG4gIF07XHJcbiAgXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgLy8gSWYgdmlzaWJsZSBjaGFuZ2VzIGZyb20gZmFsc2UgdG8gdHJ1ZSwgcmVzZXQgdmFsdWVzXHJcbiAgICBpZiAoY2hhbmdlc1sndmlzaWJsZSddICYmIGNoYW5nZXNbJ3Zpc2libGUnXS5jdXJyZW50VmFsdWUgPT09IHRydWUgJiYgY2hhbmdlc1sndmlzaWJsZSddLnByZXZpb3VzVmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMucmVzZXRWYWx1ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRWYWx1ZXMoKSB7XHJcbiAgICB0aGlzLmluY2x1ZGVUaW1lSW5UaXRsZSA9IHRydWU7XHJcbiAgICB0aGlzLmV4cG9ydFVzZUljb25zSW5Cb29scyA9IGZhbHNlO1xyXG4gICAgdGhpcy5vcHRpb25fZXhwb3J0Q29sdW1uc19zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5vcHRpb25fYXBwbHlDdXJyZW50RmlsdGVyc19zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5vcHRpb25fYXBwbHlDdXJyZW50U29ydHNfc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMub3B0aW9uX3NlbGVjdGVkUm93c0V4cG9ydF9zZWxlY3RlZCA9IDA7XHJcbiAgfVxyXG4gIFxyXG4gIGdldEV4Y2VsUmVwb3J0KCl7XHJcbiAgICBsZXQgZXhjZWxSZXBvcnRGaW5hbFRpdGxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgdGhpcy5leGNlbFJlcG9ydFRpdGxlPXRoaXMuZXhjZWxSZXBvcnRUaXRsZT8udHJpbSgpO1xyXG4gICAgaWYgKCF0aGlzLmV4Y2VsUmVwb3J0VGl0bGUgfHwgdGhpcy5leGNlbFJlcG9ydFRpdGxlLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VyaXZjZS5jbGVhclRvYXN0cygpO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcml2Y2Uuc2hvd1RvYXN0KFwiZXJyb3JcIiwgdGhpcy5pMThuLnRleHQoXCJSRVBPUlQgTkFNRSBOT1QgVkFMSURcIiksIHRoaXMuaTE4bi50ZXh0KFwiVGhlIHJlcG9ydCBuYW1lIGlzIG5vdCB2YWxpZFwiKSk7XHJcbiAgICAgIHJldHVybjsgXHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9eW0EtWmEtejAtOSBfLV0qJC87XHJcbiAgICBpZiAoIWFsbG93ZWRQYXR0ZXJuLnRlc3QodGhpcy5leGNlbFJlcG9ydFRpdGxlKSkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcml2Y2UuY2xlYXJUb2FzdHMoKTtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJpdmNlLnNob3dUb2FzdChcImVycm9yXCIsIHRoaXMuaTE4bi50ZXh0KFwiSU5WQUxJRCBDSEFSQUNURVJTIElOIFJFUE9SVCBOQU1FXCIpLCB0aGlzLmkxOG4udGV4dChcIlRoZSByZXBvcnQgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuXCIpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pbmNsdWRlVGltZUluVGl0bGUpe1xyXG4gICAgICBleGNlbFJlcG9ydEZpbmFsVGl0bGUgPSB0aGlzLmV4Y2VsUmVwb3J0VGl0bGUgKyB0aGlzLmV4cG9ydEV4Y2VsU2VydmljZS5nZXRDdXJyZW50VGltZVN0cmluZygpICsgXCIueGxzeFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZXhjZWxSZXBvcnRGaW5hbFRpdGxlID0gdGhpcy5leGNlbFJlcG9ydFRpdGxlICsgXCIueGxzeFwiO1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHBvcnRUb0V4Y2VsLmVtaXQoe1xyXG4gICAgICBhbGxDb2x1bW5zOiB0aGlzLm9wdGlvbl9leHBvcnRDb2x1bW5zX3NlbGVjdGVkLFxyXG4gICAgICBhcHBseUZpbHRlcnM6IHRoaXMub3B0aW9uX2FwcGx5Q3VycmVudEZpbHRlcnNfc2VsZWN0ZWQsXHJcbiAgICAgIGFwcGx5U29ydHM6IHRoaXMub3B0aW9uX2FwcGx5Q3VycmVudFNvcnRzX3NlbGVjdGVkLFxyXG4gICAgICBzZWxlY3RlZFJvd3M6IHRoaXMub3B0aW9uX3NlbGVjdGVkUm93c0V4cG9ydF9zZWxlY3RlZCxcclxuICAgICAgZmlsZW5hbWU6IGV4Y2VsUmVwb3J0RmluYWxUaXRsZSxcclxuICAgICAgdXNlSWNvbkluQm9vbHM6IHRoaXMuZXhwb3J0VXNlSWNvbnNJbkJvb2xzXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZWRPcHRpb25zKG9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfCBudW1iZXIgfVtdKSB7XHJcbiAgICBjb25zdCBsYWJlbHMgPSBvcHRpb25zLm1hcChvcHRpb24gPT4gdGhpcy5pMThuLnRleHQob3B0aW9uLmxhYmVsKSk7XHJcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zbGF0ZWRPcHRpb25TZXRzLmdldChvcHRpb25zKTtcclxuICAgIGlmIChjYWNoZWQ/Lmxlbmd0aCA9PT0gb3B0aW9ucy5sZW5ndGggJiYgY2FjaGVkLmV2ZXJ5KChvcHRpb24sIGluZGV4KSA9PlxyXG4gICAgICBvcHRpb24ubGFiZWwgPT09IGxhYmVsc1tpbmRleF0gJiYgb3B0aW9uLnZhbHVlID09PSBvcHRpb25zW2luZGV4XS52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIGNhY2hlZDtcclxuICAgIH1cclxuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBvcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4gKHsgLi4ub3B0aW9uLCBsYWJlbDogbGFiZWxzW2luZGV4XSB9KSk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZWRPcHRpb25TZXRzLnNldChvcHRpb25zLCB0cmFuc2xhdGVkKTtcclxuICAgIHJldHVybiB0cmFuc2xhdGVkO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyU2VsZWN0b3JEaXNhYmxlZCgpOiBib29sZWFue1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9uX3NlbGVjdGVkUm93c0V4cG9ydF9zZWxlY3RlZCA+PSAxO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VFeHBvcnRSb3dzKGV2ZW50OiB7IHZhbHVlOiBudW1iZXIgfSk6IHZvaWR7XHJcbiAgICBpZihldmVudC52YWx1ZT49MSl7XHJcbiAgICAgIHRoaXMub3B0aW9uX2FwcGx5Q3VycmVudEZpbHRlcnNfc2VsZWN0ZWQ9dHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTW9kYWwoKXtcclxuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcclxuICB9XHJcbn0iLCI8cC1kaWFsb2cgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCIgW21vZGFsXT1cInRydWVcIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiXHJcbiAgICBbY2xvc2FibGVdPVwiZmFsc2VcIiBbY2xvc2VPbkVzY2FwZV09XCJmYWxzZVwiIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiIFtzdHlsZV09XCJ7J21pbi13aWR0aCc6ICc3MHZ3JywgJ21heC13aWR0aCc6ICc3MHZ3J31cIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtZGlhbG9nLXRpdGxlXCI+e3sgJ0V4cG9ydCBkYXRhIHRvIEV4Y2VsJyB8IGVjc1RyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0ZnIgOGZyOyBnYXA6IDFyZW07IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi10b3A6IDEwcHg7XCI+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImp1c3RpZnktc2VsZjogZW5kO1wiPlxyXG4gICAgICAgICAgICB7eyAnUmVwb3J0IGZpbGVuYW1lJyB8IGVjc1RyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IHN0cmV0Y2g7IHdpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBpZD1cInJlcG9ydFRpdGxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVwb3J0IGZpbGVuYW1lJyB8IGVjc1RyYW5zbGF0ZVwiIFsobmdNb2RlbCldPVwiZXhjZWxSZXBvcnRUaXRsZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgW2Rpc2FibGVkXT1cIiFhbGxvd1RpdGxlVXNlckVkaXRcIiBtYXhsZW5ndGg9XCIxMDBcIi8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IGVuZDtcIj5cclxuICAgICAgICAgICAgPGkgW3BUb29sdGlwXT1cIidBY3RpdmF0aW5nIHRoaXMgb3B0aW9uIHdpbGwgYWRkIHRoZSBjdXJyZW50IDxiPlxcJ197eWVhcn17bW9udGh9e2RheX1fe2hvdXJzfXttaW51dGVzfXtzZWNvbmRzfV9VVENcXCc8L2I+IGF0IHRoZSBlbmQgb2YgeW91ciBmaWxlbmFtZS4nIHwgZWNzVHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICBbZXNjYXBlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj5cclxuICAgICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICB7eyAnSW5jbHVkZSB0aW1lIGluIHJlcG9ydCBmaWxlbmFtZT8nIHwgZWNzVHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImp1c3RpZnktc2VsZjogc3RyZXRjaDsgd2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgIDxwLWNoZWNrYm94IFtiaW5hcnldPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwiaW5jbHVkZVRpbWVJblRpdGxlXCI+PC9wLWNoZWNrYm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwianVzdGlmeS1zZWxmOiBlbmQ7XCI+XHJcbiAgICAgICAgICAgIDxpIFtwVG9vbHRpcF09XCInQWN0aXZhdGluZyB0aGlzIG9wdGlvbiB3aWxsIG1ha2UgYm9vbGVhbiB2YWx1ZXMgYmUgc2hvd24gYXMgaWNvbnMgaW4gdGhlIEV4Y2VsIHJlcG9ydDo8YnI+VHJ1ZSDihpIgPHNwYW4gY2xhc3M9XFwnYm9vbC1pY29uIGJvb2wtdHJ1ZVxcJz7inJQ8L3NwYW4+PGJyPkZhbHNlIOKGkiA8c3BhbiBjbGFzcz1cXCdib29sLWljb24gYm9vbC1mYWxzZVxcJz7inJg8L3NwYW4+JyB8IGVjc1RyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFN0eWxlQ2xhc3M9XCJleGNlbC1leHBvcnQtdG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICBbZXNjYXBlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj5cclxuICAgICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICB7eyAnVXNlIGljb25zIGluIGJvb2xlYW4gZmllbGRzPycgfCBlY3NUcmFuc2xhdGUgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwianVzdGlmeS1zZWxmOiBzdHJldGNoOyB3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgICAgPHAtY2hlY2tib3ggW2JpbmFyeV09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJleHBvcnRVc2VJY29uc0luQm9vbHNcIj48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IGVuZDtcIj5cclxuICAgICAgICAgICAge3sgJ0V4cG9ydCBjb2x1bW5zJyB8IGVjc1RyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IHN0YXJ0O1wiPlxyXG4gICAgICAgICAgICA8cC1zZWxlY3RCdXR0b24gWyhuZ01vZGVsKV09XCJvcHRpb25fZXhwb3J0Q29sdW1uc19zZWxlY3RlZFwiIFtvcHRpb25zXT1cInRyYW5zbGF0ZWRPcHRpb25zKG9wdGlvbl9leHBvcnRDb2x1bW5zKVwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgYWxsb3dFbXB0eT1cImZhbHNlXCI+PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtb3B0aW9uPnt7IG9wdGlvbi5sYWJlbCB8IGVjc1RyYW5zbGF0ZSB9fTwvbmctdGVtcGxhdGU+PC9wLXNlbGVjdEJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImp1c3RpZnktc2VsZjogZW5kO1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyU2VsZWN0b3JEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBbcFRvb2x0aXBdPVwiJ1NvcnRzIGFyZSBhY3RpdmUgYmVjYXVzZSB5b3Ugd2FudCB0byBleHBvcnQgc2VsZWN0ZWQgcm93cyBmb2xsb3dpbmcgYSBmaWx0ZXIgY3JpdGVyaWEnIHwgZWNzVHJhbnNsYXRlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIHt7ICdGaWx0ZXJzIHRvIGFwcGx5JyB8IGVjc1RyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IHN0YXJ0O1wiPlxyXG4gICAgICAgICAgICA8cC1zZWxlY3RCdXR0b24gWyhuZ01vZGVsKV09XCJvcHRpb25fYXBwbHlDdXJyZW50RmlsdGVyc19zZWxlY3RlZFwiIFtvcHRpb25zXT1cInRyYW5zbGF0ZWRPcHRpb25zKG9wdGlvbl9hcHBseUN1cnJlbnRGaWx0ZXJzKVwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgYWxsb3dFbXB0eT1cImZhbHNlXCIgW2Rpc2FibGVkXT1cImZpbHRlclNlbGVjdG9yRGlzYWJsZWQoKVwiPjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW9wdGlvbj57eyBvcHRpb24ubGFiZWwgfCBlY3NUcmFuc2xhdGUgfX08L25nLXRlbXBsYXRlPjwvcC1zZWxlY3RCdXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IGVuZDtcIj5cclxuICAgICAgICAgICAge3sgJ1NvcnRzIHRvIGFwcGx5JyB8IGVjc1RyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IHN0YXJ0O1wiPlxyXG4gICAgICAgICAgICA8cC1zZWxlY3RCdXR0b24gWyhuZ01vZGVsKV09XCJvcHRpb25fYXBwbHlDdXJyZW50U29ydHNfc2VsZWN0ZWRcIiBbb3B0aW9uc109XCJ0cmFuc2xhdGVkT3B0aW9ucyhvcHRpb25fYXBwbHlDdXJyZW50U29ydHMpXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiBhbGxvd0VtcHR5PVwiZmFsc2VcIj48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1vcHRpb24+e3sgb3B0aW9uLmxhYmVsIHwgZWNzVHJhbnNsYXRlIH19PC9uZy10ZW1wbGF0ZT48L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93Q2hlY2tib3hTZWxlY3RvckFjdGl2ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwianVzdGlmeS1zZWxmOiBlbmQ7XCI+XHJcbiAgICAgICAgICAgICAgICB7eyAnU2VsZWN0ZWQgcm93cycgfCBlY3NUcmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJqdXN0aWZ5LXNlbGY6IHN0YXJ0O1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uIFsobmdNb2RlbCldPVwib3B0aW9uX3NlbGVjdGVkUm93c0V4cG9ydF9zZWxlY3RlZFwiIFtvcHRpb25zXT1cInRyYW5zbGF0ZWRPcHRpb25zKG9wdGlvbl9zZWxlY3RlZFJvd3NFeHBvcnQpXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiBhbGxvd0VtcHR5PVwiZmFsc2VcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFeHBvcnRSb3dzKCRldmVudClcIj48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1vcHRpb24+e3sgb3B0aW9uLmxhYmVsIHwgZWNzVHJhbnNsYXRlIH19PC9uZy10ZW1wbGF0ZT48L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxyXG4gICAgICAgIDxwLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCIgW2xhYmVsXT1cIidDYW5jZWwgZXhwb3J0JyB8IGVjc1RyYW5zbGF0ZVwiIG91dGxpbmVkPVwidHJ1ZVwiIFtzdHlsZV09XCJ7J21hcmdpbi10b3AnOiAnMjBweCd9XCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICA8cC1idXR0b24gKGNsaWNrKT1cImdldEV4Y2VsUmVwb3J0KClcIiBbbGFiZWxdPVwiJ0V4cG9ydCcgfCBlY3NUcmFuc2xhdGVcIiBbc3R5bGVdPVwieydtYXJnaW4tdG9wJzogJzIwcHgnfVwiPjwvcC1idXR0b24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L3AtZGlhbG9nPlxyXG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ExportExcelService {
|
|
4
|
+
getCurrentTimeString() {
|
|
5
|
+
const now = new Date();
|
|
6
|
+
const year = now.getUTCFullYear();
|
|
7
|
+
const month = String(now.getUTCMonth() + 1).padStart(2, '0');
|
|
8
|
+
const day = String(now.getUTCDate()).padStart(2, '0');
|
|
9
|
+
const hours = String(now.getUTCHours()).padStart(2, '0');
|
|
10
|
+
const minutes = String(now.getUTCMinutes()).padStart(2, '0');
|
|
11
|
+
const seconds = String(now.getUTCSeconds()).padStart(2, '0');
|
|
12
|
+
return `_${year}${month}${day}_${hours}${minutes}${seconds}_UTC`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
ExportExcelService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ExportExcelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
16
|
+
ExportExcelService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ExportExcelService, providedIn: 'root' });
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ExportExcelService, decorators: [{
|
|
18
|
+
type: Injectable,
|
|
19
|
+
args: [{
|
|
20
|
+
providedIn: 'root'
|
|
21
|
+
}]
|
|
22
|
+
}] });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LWV4Y2VsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY3MtcHJpbWVuZy10YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvZXhwb3J0LWV4Y2VsL2V4cG9ydC1leGNlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxrQkFBa0I7SUFDM0Isb0JBQW9CO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLE9BQU8sR0FBRyxPQUFPLE1BQU0sQ0FBQztJQUNyRSxDQUFDOztnSEFWUSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQUZqQixNQUFNOzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEV4cG9ydEV4Y2VsU2VydmljZSB7XHJcbiAgICBnZXRDdXJyZW50VGltZVN0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgY29uc3QgeWVhciA9IG5vdy5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKG5vdy5nZXRVVENNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICBjb25zdCBob3VycyA9IFN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICBjb25zdCBtaW51dGVzID0gU3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IFN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgIHJldHVybiBgXyR7eWVhcn0ke21vbnRofSR7ZGF5fV8ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9X1VUQ2A7XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ECSTableTranslatePipe } from '../../pipes/ui-translate.pipe';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { Component, Input } from '@angular/core';
|
|
4
|
+
import { ButtonModule } from 'primeng/button';
|
|
5
|
+
import { TooltipModule } from 'primeng/tooltip';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../ecs-primeng-table/ecs-primeng-table.service";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
import * as i3 from "primeng/button";
|
|
10
|
+
import * as i4 from "primeng/tooltip";
|
|
11
|
+
export class TableButton {
|
|
12
|
+
constructor(tableService) {
|
|
13
|
+
this.tableService = tableService;
|
|
14
|
+
this.isActionButton = false;
|
|
15
|
+
this.isLastActionButton = false;
|
|
16
|
+
}
|
|
17
|
+
handleClick(event) {
|
|
18
|
+
if (this.button?.action || this.overrideAction) { // If there is an action or an override, execute logic
|
|
19
|
+
if (this.overrideAction) { // If overrideAction exists, execute it first
|
|
20
|
+
this.overrideAction(event); // Call override action
|
|
21
|
+
}
|
|
22
|
+
else { // Otherwise execute the normal button action through the service
|
|
23
|
+
this.tableService.handleButtonsClick(this.button.action, this.rowData);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
getButtonStyle(button, isActionButton, isLastActionButton) {
|
|
28
|
+
const styles = {};
|
|
29
|
+
if (button.style) { // Add inline styles from button.style
|
|
30
|
+
button.style.split(';').forEach(part => {
|
|
31
|
+
const [prop, value] = part.split(':').map(x => x.trim());
|
|
32
|
+
if (prop && value)
|
|
33
|
+
styles[prop] = value;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (isActionButton && !isLastActionButton) { // Add margin-right for action buttons
|
|
37
|
+
styles['margin-right'] = '10px';
|
|
38
|
+
}
|
|
39
|
+
return styles;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
TableButton.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TableButton, deps: [{ token: i1.ECSPrimengTableService }], target: i0.ɵɵFactoryTarget.Component });
|
|
43
|
+
TableButton.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TableButton, isStandalone: true, selector: "ecs-table-button", inputs: { button: "button", rowData: "rowData", isActionButton: "isActionButton", isLastActionButton: "isLastActionButton", overrideAction: "overrideAction" }, ngImport: i0, template: "<ng-container *ngIf=\"button.visibleCondition?.(rowData) ?? true\"> <!--If 'visibleCondition' is true or not defined-->\r\n <ng-container *ngIf=\"(button.enabledCondition?.(rowData) ?? true) || !button.conditionFailHide\"> <!--Render button if 'enabledCondition' is true or undefined, OR if 'conditionFailHide' is false-->\r\n <p-button\r\n [ariaLabel]=\"(button.label || button.tooltip || '') | ecsTranslate\"\r\n [disabled]=\"!(button.enabledCondition?.(rowData) ?? true)\"\r\n [iconPos]=\"button.iconPos || 'left'\"\r\n [pTooltip]=\"(button.tooltip || '') | ecsTranslate\"\r\n [tooltipDisabled]=\"!button.tooltip || button.tooltip.length === 0\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\"\r\n [styleClass]=\"\r\n (isActionButton ? ' custom-small-btn' : '') +\r\n (button.rounded ? ' p-button-rounded' : '') +\r\n (button.raised ? ' p-button-raised' : '') +\r\n (button.variant === 'text' ? ' p-button-text' : '') +\r\n (button.variant === 'outlined' ? ' p-button-outlined' : '') +\r\n (button.class ? ' ' + button.class : '')\r\n \"\r\n [icon]=\"button.icon || ''\"\r\n [label]=\"(button.label || '') | ecsTranslate\"\r\n [ngStyle]=\"getButtonStyle(button, isActionButton, isLastActionButton)\"\r\n (onClick)=\"handleClick($event)\"></p-button>\r\n </ng-container>\r\n</ng-container>", styles: [":host ::ng-deep .custom-small-btn.p-button{height:28px!important;line-height:28px;padding-top:0;padding-bottom:0}\n"], dependencies: [{ kind: "pipe", type: ECSTableTranslatePipe, name: "ecsTranslate" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] });
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TableButton, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'ecs-table-button', imports: [
|
|
47
|
+
ECSTableTranslatePipe,
|
|
48
|
+
CommonModule,
|
|
49
|
+
ButtonModule,
|
|
50
|
+
TooltipModule
|
|
51
|
+
], standalone: true, template: "<ng-container *ngIf=\"button.visibleCondition?.(rowData) ?? true\"> <!--If 'visibleCondition' is true or not defined-->\r\n <ng-container *ngIf=\"(button.enabledCondition?.(rowData) ?? true) || !button.conditionFailHide\"> <!--Render button if 'enabledCondition' is true or undefined, OR if 'conditionFailHide' is false-->\r\n <p-button\r\n [ariaLabel]=\"(button.label || button.tooltip || '') | ecsTranslate\"\r\n [disabled]=\"!(button.enabledCondition?.(rowData) ?? true)\"\r\n [iconPos]=\"button.iconPos || 'left'\"\r\n [pTooltip]=\"(button.tooltip || '') | ecsTranslate\"\r\n [tooltipDisabled]=\"!button.tooltip || button.tooltip.length === 0\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\"\r\n [styleClass]=\"\r\n (isActionButton ? ' custom-small-btn' : '') +\r\n (button.rounded ? ' p-button-rounded' : '') +\r\n (button.raised ? ' p-button-raised' : '') +\r\n (button.variant === 'text' ? ' p-button-text' : '') +\r\n (button.variant === 'outlined' ? ' p-button-outlined' : '') +\r\n (button.class ? ' ' + button.class : '')\r\n \"\r\n [icon]=\"button.icon || ''\"\r\n [label]=\"(button.label || '') | ecsTranslate\"\r\n [ngStyle]=\"getButtonStyle(button, isActionButton, isLastActionButton)\"\r\n (onClick)=\"handleClick($event)\"></p-button>\r\n </ng-container>\r\n</ng-container>", styles: [":host ::ng-deep .custom-small-btn.p-button{height:28px!important;line-height:28px;padding-top:0;padding-bottom:0}\n"] }]
|
|
52
|
+
}], ctorParameters: function () { return [{ type: i1.ECSPrimengTableService }]; }, propDecorators: { button: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], rowData: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}], isActionButton: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}], isLastActionButton: [{
|
|
59
|
+
type: Input
|
|
60
|
+
}], overrideAction: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}] } });
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYnV0dG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWNzLXByaW1lbmctdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWJ1dHRvbi90YWJsZS1idXR0b24udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY3MtcHJpbWVuZy10YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUtYnV0dG9uL3RhYmxlLWJ1dHRvbi5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFnQmhELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLFlBQ1UsWUFBb0M7UUFBcEMsaUJBQVksR0FBWixZQUFZLENBQXdCO1FBSXJDLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztJQUoxQyxDQUFDO0lBT0osV0FBVyxDQUFDLEtBQVk7UUFDdEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsc0RBQXNEO1lBQ3RHLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZDQUE2QztnQkFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjthQUNwRDtpQkFBTSxFQUFFLGlFQUFpRTtnQkFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEU7U0FDRjtJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsTUFBb0IsRUFBRSxjQUF1QixFQUFFLGtCQUEyQjtRQUN2RixNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsc0NBQXNDO1lBQ3RELE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLElBQUksSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksY0FBYyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxzQ0FBc0M7WUFDL0UsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUNuQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O3lHQWhDVSxXQUFXOzZGQUFYLFdBQVcsNE9DcEJ4QixpNENBdUJlLHdLRFpYLHFCQUFxQixvREFDckIsWUFBWSx1TkFDWixZQUFZLHNSQUNaLGFBQWE7NEZBTUosV0FBVztrQkFadkIsU0FBUzsrQkFDRSxrQkFBa0IsV0FDbkI7d0JBQ1AscUJBQXFCO3dCQUNyQixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osYUFBYTtxQkFDZCxjQUNXLElBQUk7NkdBUVAsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRUNTVGFibGVUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvdWktdHJhbnNsYXRlLnBpcGUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XHJcbmltcG9ydCB7IEVDU1ByaW1lbmdUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi9lY3MtcHJpbWVuZy10YWJsZS9lY3MtcHJpbWVuZy10YWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSVRhYmxlQnV0dG9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Vjcy10YWJsZS1idXR0b24nLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIEVDU1RhYmxlVHJhbnNsYXRlUGlwZSxcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEJ1dHRvbk1vZHVsZSxcclxuICAgIFRvb2x0aXBNb2R1bGVcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWJ1dHRvbi5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1idXR0b24uc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUJ1dHRvbiB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRhYmxlU2VydmljZTogRUNTUHJpbWVuZ1RhYmxlU2VydmljZVxyXG4gICkge31cclxuICBASW5wdXQoKSBidXR0b246IGFueTtcclxuICBASW5wdXQoKSByb3dEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgaXNBY3Rpb25CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBpc0xhc3RBY3Rpb25CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBvdmVycmlkZUFjdGlvbj86ICgoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKTtcclxuICBcclxuICBoYW5kbGVDbGljayhldmVudDogRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmJ1dHRvbj8uYWN0aW9uIHx8IHRoaXMub3ZlcnJpZGVBY3Rpb24pIHsgLy8gSWYgdGhlcmUgaXMgYW4gYWN0aW9uIG9yIGFuIG92ZXJyaWRlLCBleGVjdXRlIGxvZ2ljXHJcbiAgICAgIGlmICh0aGlzLm92ZXJyaWRlQWN0aW9uKSB7IC8vIElmIG92ZXJyaWRlQWN0aW9uIGV4aXN0cywgZXhlY3V0ZSBpdCBmaXJzdFxyXG4gICAgICAgIHRoaXMub3ZlcnJpZGVBY3Rpb24oZXZlbnQpOyAvLyBDYWxsIG92ZXJyaWRlIGFjdGlvblxyXG4gICAgICB9IGVsc2UgeyAvLyBPdGhlcndpc2UgZXhlY3V0ZSB0aGUgbm9ybWFsIGJ1dHRvbiBhY3Rpb24gdGhyb3VnaCB0aGUgc2VydmljZVxyXG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmhhbmRsZUJ1dHRvbnNDbGljayh0aGlzLmJ1dHRvbi5hY3Rpb24sIHRoaXMucm93RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvblN0eWxlKGJ1dHRvbjogSVRhYmxlQnV0dG9uLCBpc0FjdGlvbkJ1dHRvbjogYm9vbGVhbiwgaXNMYXN0QWN0aW9uQnV0dG9uOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBzdHlsZXM6IGFueSA9IHt9O1xyXG4gICAgaWYgKGJ1dHRvbi5zdHlsZSkgeyAvLyBBZGQgaW5saW5lIHN0eWxlcyBmcm9tIGJ1dHRvbi5zdHlsZVxyXG4gICAgICAgIGJ1dHRvbi5zdHlsZS5zcGxpdCgnOycpLmZvckVhY2gocGFydCA9PiB7ICAvKiBQYXJzZSBpbmxpbmUgQ1NTOiBcInBhZGRpbmc6IDRweDsgY29sb3I6cmVkXCIgKi9cclxuICAgICAgICAgICAgY29uc3QgW3Byb3AsIHZhbHVlXSA9IHBhcnQuc3BsaXQoJzonKS5tYXAoeCA9PiB4LnRyaW0oKSk7XHJcbiAgICAgICAgICAgIGlmIChwcm9wICYmIHZhbHVlKSBzdHlsZXNbcHJvcF0gPSB2YWx1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChpc0FjdGlvbkJ1dHRvbiAmJiAhaXNMYXN0QWN0aW9uQnV0dG9uKSB7IC8vIEFkZCBtYXJnaW4tcmlnaHQgZm9yIGFjdGlvbiBidXR0b25zXHJcbiAgICAgICAgc3R5bGVzWydtYXJnaW4tcmlnaHQnXSA9ICcxMHB4JztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHlsZXM7XHJcbiAgfVxyXG59IiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImJ1dHRvbi52aXNpYmxlQ29uZGl0aW9uPy4ocm93RGF0YSkgPz8gdHJ1ZVwiPiA8IS0tSWYgJ3Zpc2libGVDb25kaXRpb24nIGlzIHRydWUgb3Igbm90IGRlZmluZWQtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGJ1dHRvbi5lbmFibGVkQ29uZGl0aW9uPy4ocm93RGF0YSkgPz8gdHJ1ZSkgfHwgIWJ1dHRvbi5jb25kaXRpb25GYWlsSGlkZVwiPiA8IS0tUmVuZGVyIGJ1dHRvbiBpZiAnZW5hYmxlZENvbmRpdGlvbicgaXMgdHJ1ZSBvciB1bmRlZmluZWQsIE9SIGlmICdjb25kaXRpb25GYWlsSGlkZScgaXMgZmFsc2UtLT5cclxuICAgIDxwLWJ1dHRvblxyXG4gICAgICBbYXJpYUxhYmVsXT1cIihidXR0b24ubGFiZWwgfHwgYnV0dG9uLnRvb2x0aXAgfHwgJycpIHwgZWNzVHJhbnNsYXRlXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIiEoYnV0dG9uLmVuYWJsZWRDb25kaXRpb24/Lihyb3dEYXRhKSA/PyB0cnVlKVwiXHJcbiAgICAgIFtpY29uUG9zXT1cImJ1dHRvbi5pY29uUG9zIHx8ICdsZWZ0J1wiXHJcbiAgICAgIFtwVG9vbHRpcF09XCIoYnV0dG9uLnRvb2x0aXAgfHwgJycpIHwgZWNzVHJhbnNsYXRlXCJcclxuICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhYnV0dG9uLnRvb2x0aXAgfHwgYnV0dG9uLnRvb2x0aXAubGVuZ3RoID09PSAwXCJcclxuICAgICAgW3Nob3dEZWxheV09XCI3MDBcIlxyXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICBbc3R5bGVDbGFzc109XCJcclxuICAgICAgICAoaXNBY3Rpb25CdXR0b24gPyAnIGN1c3RvbS1zbWFsbC1idG4nIDogJycpICtcclxuICAgICAgICAoYnV0dG9uLnJvdW5kZWQgPyAnIHAtYnV0dG9uLXJvdW5kZWQnIDogJycpICtcclxuICAgICAgICAoYnV0dG9uLnJhaXNlZCA/ICcgcC1idXR0b24tcmFpc2VkJyA6ICcnKSArXHJcbiAgICAgICAgKGJ1dHRvbi52YXJpYW50ID09PSAndGV4dCcgPyAnIHAtYnV0dG9uLXRleHQnIDogJycpICtcclxuICAgICAgICAoYnV0dG9uLnZhcmlhbnQgPT09ICdvdXRsaW5lZCcgPyAnIHAtYnV0dG9uLW91dGxpbmVkJyA6ICcnKSArXHJcbiAgICAgICAgKGJ1dHRvbi5jbGFzcyA/ICcgJyArIGJ1dHRvbi5jbGFzcyA6ICcnKVxyXG4gICAgICBcIlxyXG4gICAgICBbaWNvbl09XCJidXR0b24uaWNvbiB8fCAnJ1wiXHJcbiAgICAgIFtsYWJlbF09XCIoYnV0dG9uLmxhYmVsIHx8ICcnKSB8IGVjc1RyYW5zbGF0ZVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cImdldEJ1dHRvblN0eWxlKGJ1dHRvbiwgaXNBY3Rpb25CdXR0b24sIGlzTGFzdEFjdGlvbkJ1dHRvbilcIlxyXG4gICAgICAob25DbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCI+PC9wLWJ1dHRvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy1jb250YWluZXI+Il19
|