@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.
Files changed (96) hide show
  1. package/README.md +279 -3
  2. package/esm2020/competer-primeng-table.mjs +5 -0
  3. package/esm2020/lib/components/column-selector/column-selector.mjs +147 -0
  4. package/esm2020/lib/components/ecs-primeng-table/ecs-primeng-table.mjs +1411 -0
  5. package/esm2020/lib/components/ecs-primeng-table/ecs-primeng-table.service.mjs +222 -0
  6. package/esm2020/lib/components/export-excel/export-excel.mjs +153 -0
  7. package/esm2020/lib/components/export-excel/export-excel.service.mjs +23 -0
  8. package/esm2020/lib/components/table-button/table-button.mjs +63 -0
  9. package/esm2020/lib/components/table-cell/table-cell.mjs +159 -0
  10. package/esm2020/lib/components/table-predefined-filters/table-predefined-filters.mjs +94 -0
  11. package/esm2020/lib/components/views-management/views-management.mjs +117 -0
  12. package/esm2020/lib/enums/cell-display.enum.mjs +7 -0
  13. package/esm2020/lib/enums/cell-overflow-behaviour.enum.mjs +14 -0
  14. package/esm2020/lib/enums/data-align-horizontal.enum.mjs +16 -0
  15. package/esm2020/lib/enums/data-align-vertical.enum.mjs +16 -0
  16. package/esm2020/lib/enums/data-type.enum.enum.mjs +21 -0
  17. package/esm2020/lib/enums/device-type.enum.mjs +8 -0
  18. package/esm2020/lib/enums/frozen-column-align.enum.mjs +17 -0
  19. package/esm2020/lib/enums/index.mjs +9 -0
  20. package/esm2020/lib/enums/table-view-save-mode.enum.mjs +19 -0
  21. package/esm2020/lib/interfaces/columns-metadata.interface.mjs +2 -0
  22. package/esm2020/lib/interfaces/excel-export-request.interface.mjs +2 -0
  23. package/esm2020/lib/interfaces/index.mjs +11 -0
  24. package/esm2020/lib/interfaces/predefined-filter.interface.mjs +2 -0
  25. package/esm2020/lib/interfaces/table-button.interface.mjs +2 -0
  26. package/esm2020/lib/interfaces/table-configuration.interface.mjs +2 -0
  27. package/esm2020/lib/interfaces/table-options.interface.mjs +107 -0
  28. package/esm2020/lib/interfaces/table-paged-response.interface.mjs +2 -0
  29. package/esm2020/lib/interfaces/table-query-request.interface.mjs +2 -0
  30. package/esm2020/lib/interfaces/table-view-data.interface.mjs +2 -0
  31. package/esm2020/lib/interfaces/table-view.interface.mjs +2 -0
  32. package/esm2020/lib/pipes/ui-translate.pipe.mjs +21 -0
  33. package/esm2020/lib/services/http.service.mjs +18 -0
  34. package/esm2020/lib/services/i18n.service.mjs +61 -0
  35. package/esm2020/lib/services/index.mjs +5 -0
  36. package/esm2020/lib/services/notification.service.mjs +17 -0
  37. package/esm2020/lib/services/table-state.service.mjs +38 -0
  38. package/esm2020/lib/utils/create-table-options.mjs +37 -0
  39. package/esm2020/lib/utils/data-align-horizontal-as-text.mjs +23 -0
  40. package/esm2020/lib/utils/data-align-vertical-as-text.mjs +23 -0
  41. package/esm2020/lib/utils/data-type-as-text.mjs +25 -0
  42. package/esm2020/lib/utils/frozen-column-align-as-text.mjs +21 -0
  43. package/esm2020/lib/utils/highlight-text.mjs +36 -0
  44. package/esm2020/lib/utils/index.mjs +7 -0
  45. package/esm2020/lib/utils/tree-table-state.mjs +239 -0
  46. package/esm2020/public-api.mjs +19 -0
  47. package/fesm2015/competer-primeng-table.mjs +3119 -0
  48. package/fesm2015/competer-primeng-table.mjs.map +1 -0
  49. package/fesm2020/competer-primeng-table.mjs +3049 -0
  50. package/fesm2020/competer-primeng-table.mjs.map +1 -0
  51. package/index.d.ts +5 -0
  52. package/lib/components/column-selector/column-selector.d.ts +55 -0
  53. package/lib/components/ecs-primeng-table/ecs-primeng-table.d.ts +256 -0
  54. package/lib/components/ecs-primeng-table/ecs-primeng-table.service.d.ts +52 -0
  55. package/lib/components/export-excel/export-excel.d.ts +51 -0
  56. package/lib/components/export-excel/export-excel.service.d.ts +6 -0
  57. package/lib/components/table-button/table-button.d.ts +16 -0
  58. package/lib/components/table-cell/table-cell.d.ts +69 -0
  59. package/lib/components/table-predefined-filters/table-predefined-filters.d.ts +39 -0
  60. package/lib/components/views-management/views-management.d.ts +34 -0
  61. package/lib/enums/cell-display.enum.d.ts +5 -0
  62. package/lib/enums/cell-overflow-behaviour.enum.d.ts +12 -0
  63. package/lib/enums/data-align-horizontal.enum.d.ts +14 -0
  64. package/lib/enums/data-align-vertical.enum.d.ts +14 -0
  65. package/lib/enums/data-type.enum.enum.d.ts +19 -0
  66. package/lib/enums/device-type.enum.d.ts +6 -0
  67. package/lib/enums/frozen-column-align.enum.d.ts +15 -0
  68. package/lib/enums/index.d.ts +8 -0
  69. package/lib/enums/table-view-save-mode.enum.d.ts +17 -0
  70. package/lib/interfaces/columns-metadata.interface.d.ts +66 -0
  71. package/lib/interfaces/excel-export-request.interface.d.ts +20 -0
  72. package/lib/interfaces/index.d.ts +10 -0
  73. package/lib/interfaces/predefined-filter.interface.d.ts +101 -0
  74. package/lib/interfaces/table-button.interface.d.ts +75 -0
  75. package/lib/interfaces/table-configuration.interface.d.ts +23 -0
  76. package/lib/interfaces/table-options.interface.d.ts +604 -0
  77. package/lib/interfaces/table-paged-response.interface.d.ts +16 -0
  78. package/lib/interfaces/table-query-request.interface.d.ts +28 -0
  79. package/lib/interfaces/table-view-data.interface.d.ts +28 -0
  80. package/lib/interfaces/table-view.interface.d.ts +15 -0
  81. package/lib/pipes/ui-translate.pipe.d.ts +13 -0
  82. package/lib/services/http.service.d.ts +34 -0
  83. package/lib/services/i18n.service.d.ts +20 -0
  84. package/lib/services/index.d.ts +4 -0
  85. package/lib/services/notification.service.d.ts +23 -0
  86. package/lib/services/table-state.service.d.ts +31 -0
  87. package/lib/utils/create-table-options.d.ts +5 -0
  88. package/lib/utils/data-align-horizontal-as-text.d.ts +11 -0
  89. package/lib/utils/data-align-vertical-as-text.d.ts +11 -0
  90. package/lib/utils/data-type-as-text.d.ts +11 -0
  91. package/lib/utils/frozen-column-align-as-text.d.ts +11 -0
  92. package/lib/utils/highlight-text.d.ts +17 -0
  93. package/lib/utils/index.d.ts +6 -0
  94. package/lib/utils/tree-table-state.d.ts +66 -0
  95. package/package.json +58 -3
  96. 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