fantasy-ngzorro 1.3.29 → 1.3.31

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 (163) hide show
  1. package/bundles/fantasy-ngzorro.umd.js +6049 -6035
  2. package/bundles/fantasy-ngzorro.umd.js.map +1 -1
  3. package/bundles/fantasy-ngzorro.umd.min.js +1 -1
  4. package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
  5. package/esm2015/fantasy-ngzorro.js +39 -39
  6. package/esm2015/fantasy-ngzorro.module.js +18 -18
  7. package/esm2015/hd-button/hd-button.component.js +91 -91
  8. package/esm2015/hd-button/hd-button.module.js +22 -22
  9. package/esm2015/hd-button/hd-button.service.js +36 -36
  10. package/esm2015/hd-button-group/hd-button-group.component.js +32 -32
  11. package/esm2015/hd-button-group/hd-button-group.module.js +22 -22
  12. package/esm2015/hd-component.module.js +44 -44
  13. package/esm2015/hd-current-table/hd-current-table.component.js +224 -224
  14. package/esm2015/hd-current-table/hd-current-table.module.js +23 -23
  15. package/esm2015/hd-current-table/hd-current-table.service.js +34 -34
  16. package/esm2015/hd-detail-form/hd-detail-form.component.js +64 -64
  17. package/esm2015/hd-detail-form/hd-detail-form.module.js +20 -20
  18. package/esm2015/hd-detail-form/hd-detail-form.service.js +17 -17
  19. package/esm2015/hd-detail-lines/hd-detail-lines.component.js +266 -266
  20. package/esm2015/hd-detail-lines/hd-detail-lines.module.js +23 -23
  21. package/esm2015/hd-detail-lines/hd-detail-lines.service.js +18 -18
  22. package/esm2015/hd-detail-tip/hd-detail-tip.component.js +61 -61
  23. package/esm2015/hd-detail-tip/hd-detail-tip.module.js +22 -22
  24. package/esm2015/hd-filter/hd-filter.component.js +193 -193
  25. package/esm2015/hd-filter/hd-filter.module.js +25 -25
  26. package/esm2015/hd-filter/hd-filter.service.js +80 -70
  27. package/esm2015/hd-form/hd-form.component.js +369 -369
  28. package/esm2015/hd-form/hd-form.module.js +25 -25
  29. package/esm2015/hd-form/hd-form.service.js +129 -129
  30. package/esm2015/hd-form-lines/hd-form-lines.component.js +1537 -1537
  31. package/esm2015/hd-form-lines/hd-form-lines.module.js +29 -29
  32. package/esm2015/hd-form-lines/hd-form-lines.service.js +121 -121
  33. package/esm2015/hd-log/hd-log.component.js +30 -30
  34. package/esm2015/hd-log/hd-log.module.js +25 -25
  35. package/esm2015/hd-log/hd-log.service.js +47 -47
  36. package/esm2015/hd-popconfirm/hd-popconfirm.component.js +52 -52
  37. package/esm2015/hd-popconfirm/hd-popconfirm.module.js +27 -27
  38. package/esm2015/hd-space/hd-space.component.js +51 -51
  39. package/esm2015/hd-space/hd-space.module.js +23 -23
  40. package/esm2015/hd-space/hd-space.service.js +33 -33
  41. package/esm2015/hd-status/hd-status.component.js +50 -50
  42. package/esm2015/hd-status/hd-status.module.js +27 -27
  43. package/esm2015/hd-status/hd-status.service.js +33 -33
  44. package/esm2015/hd-table/hd-table.component.js +972 -972
  45. package/esm2015/hd-table/hd-table.module.js +43 -43
  46. package/esm2015/hd-table/hd-table.service.js +116 -116
  47. package/esm2015/hd-tip/hd-tip.component.js +37 -37
  48. package/esm2015/hd-tip/hd-tip.module.js +20 -20
  49. package/esm2015/index.js +7 -7
  50. package/esm2015/model/colWidth.js +36 -36
  51. package/esm2015/model/common-type.js +122 -122
  52. package/esm2015/model/staticConst.js +8 -8
  53. package/esm2015/public-api.js +20 -20
  54. package/esm2015/service/common-session.service.js +37 -37
  55. package/esm2015/utils.js +128 -128
  56. package/esm5/fantasy-ngzorro.js +39 -39
  57. package/esm5/fantasy-ngzorro.module.js +22 -22
  58. package/esm5/hd-button/hd-button.component.js +104 -104
  59. package/esm5/hd-button/hd-button.module.js +26 -26
  60. package/esm5/hd-button/hd-button.service.js +39 -39
  61. package/esm5/hd-button-group/hd-button-group.component.js +38 -38
  62. package/esm5/hd-button-group/hd-button-group.module.js +26 -26
  63. package/esm5/hd-component.module.js +48 -48
  64. package/esm5/hd-current-table/hd-current-table.component.js +260 -260
  65. package/esm5/hd-current-table/hd-current-table.module.js +27 -27
  66. package/esm5/hd-current-table/hd-current-table.service.js +46 -46
  67. package/esm5/hd-detail-form/hd-detail-form.component.js +77 -77
  68. package/esm5/hd-detail-form/hd-detail-form.module.js +24 -24
  69. package/esm5/hd-detail-form/hd-detail-form.service.js +20 -20
  70. package/esm5/hd-detail-lines/hd-detail-lines.component.js +314 -314
  71. package/esm5/hd-detail-lines/hd-detail-lines.module.js +27 -27
  72. package/esm5/hd-detail-lines/hd-detail-lines.service.js +22 -22
  73. package/esm5/hd-detail-tip/hd-detail-tip.component.js +72 -72
  74. package/esm5/hd-detail-tip/hd-detail-tip.module.js +26 -26
  75. package/esm5/hd-filter/hd-filter.component.js +232 -232
  76. package/esm5/hd-filter/hd-filter.module.js +29 -29
  77. package/esm5/hd-filter/hd-filter.service.js +92 -78
  78. package/esm5/hd-form/hd-form.component.js +424 -424
  79. package/esm5/hd-form/hd-form.module.js +29 -29
  80. package/esm5/hd-form/hd-form.service.js +141 -141
  81. package/esm5/hd-form-lines/hd-form-lines.component.js +1844 -1844
  82. package/esm5/hd-form-lines/hd-form-lines.module.js +33 -33
  83. package/esm5/hd-form-lines/hd-form-lines.service.js +137 -137
  84. package/esm5/hd-log/hd-log.component.js +35 -35
  85. package/esm5/hd-log/hd-log.module.js +29 -29
  86. package/esm5/hd-log/hd-log.service.js +50 -50
  87. package/esm5/hd-popconfirm/hd-popconfirm.component.js +65 -65
  88. package/esm5/hd-popconfirm/hd-popconfirm.module.js +31 -31
  89. package/esm5/hd-space/hd-space.component.js +56 -56
  90. package/esm5/hd-space/hd-space.module.js +27 -27
  91. package/esm5/hd-space/hd-space.service.js +40 -40
  92. package/esm5/hd-status/hd-status.component.js +62 -62
  93. package/esm5/hd-status/hd-status.module.js +31 -31
  94. package/esm5/hd-status/hd-status.service.js +35 -35
  95. package/esm5/hd-table/hd-table.component.js +1100 -1100
  96. package/esm5/hd-table/hd-table.module.js +47 -47
  97. package/esm5/hd-table/hd-table.service.js +136 -136
  98. package/esm5/hd-tip/hd-tip.component.js +42 -42
  99. package/esm5/hd-tip/hd-tip.module.js +24 -24
  100. package/esm5/index.js +7 -7
  101. package/esm5/model/colWidth.js +36 -36
  102. package/esm5/model/common-type.js +146 -146
  103. package/esm5/model/staticConst.js +8 -8
  104. package/esm5/public-api.js +20 -20
  105. package/esm5/service/common-session.service.js +54 -54
  106. package/esm5/utils.js +128 -128
  107. package/fantasy-ngzorro.d.ts +34 -34
  108. package/fantasy-ngzorro.metadata.json +1 -1
  109. package/fantasy-ngzorro.module.d.ts +2 -2
  110. package/fesm2015/fantasy-ngzorro.js +5234 -5224
  111. package/fesm2015/fantasy-ngzorro.js.map +1 -1
  112. package/fesm5/fantasy-ngzorro.js +6058 -6045
  113. package/fesm5/fantasy-ngzorro.js.map +1 -1
  114. package/hd-button/hd-button.component.d.ts +14 -14
  115. package/hd-button/hd-button.module.d.ts +2 -2
  116. package/hd-button/hd-button.service.d.ts +17 -17
  117. package/hd-button-group/hd-button-group.component.d.ts +7 -7
  118. package/hd-button-group/hd-button-group.module.d.ts +2 -2
  119. package/hd-component.module.d.ts +2 -2
  120. package/hd-current-table/hd-current-table.component.d.ts +43 -43
  121. package/hd-current-table/hd-current-table.module.d.ts +2 -2
  122. package/hd-current-table/hd-current-table.service.d.ts +13 -13
  123. package/hd-detail-form/hd-detail-form.component.d.ts +9 -9
  124. package/hd-detail-form/hd-detail-form.module.d.ts +2 -2
  125. package/hd-detail-form/hd-detail-form.service.d.ts +3 -3
  126. package/hd-detail-lines/hd-detail-lines.component.d.ts +48 -48
  127. package/hd-detail-lines/hd-detail-lines.module.d.ts +2 -2
  128. package/hd-detail-lines/hd-detail-lines.service.d.ts +7 -7
  129. package/hd-detail-tip/hd-detail-tip.component.d.ts +12 -12
  130. package/hd-detail-tip/hd-detail-tip.module.d.ts +2 -2
  131. package/hd-filter/hd-filter.component.d.ts +23 -23
  132. package/hd-filter/hd-filter.module.d.ts +2 -2
  133. package/hd-filter/hd-filter.service.d.ts +30 -25
  134. package/hd-form/hd-form.component.d.ts +25 -25
  135. package/hd-form/hd-form.module.d.ts +2 -2
  136. package/hd-form/hd-form.service.d.ts +51 -51
  137. package/hd-form-lines/hd-form-lines.component.d.ts +147 -147
  138. package/hd-form-lines/hd-form-lines.module.d.ts +2 -2
  139. package/hd-form-lines/hd-form-lines.service.d.ts +53 -53
  140. package/hd-log/hd-log.component.d.ts +6 -6
  141. package/hd-log/hd-log.module.d.ts +2 -2
  142. package/hd-log/hd-log.service.d.ts +6 -6
  143. package/hd-popconfirm/hd-popconfirm.component.d.ts +10 -10
  144. package/hd-popconfirm/hd-popconfirm.module.d.ts +2 -2
  145. package/hd-space/hd-space.component.d.ts +10 -10
  146. package/hd-space/hd-space.module.d.ts +2 -2
  147. package/hd-space/hd-space.service.d.ts +12 -12
  148. package/hd-status/hd-status.component.d.ts +9 -9
  149. package/hd-status/hd-status.module.d.ts +2 -2
  150. package/hd-status/hd-status.service.d.ts +11 -11
  151. package/hd-table/hd-table.component.d.ts +91 -91
  152. package/hd-table/hd-table.module.d.ts +2 -2
  153. package/hd-table/hd-table.service.d.ts +42 -42
  154. package/hd-tip/hd-tip.component.d.ts +8 -8
  155. package/hd-tip/hd-tip.module.d.ts +2 -2
  156. package/index.d.ts +2 -2
  157. package/model/colWidth.d.ts +17 -17
  158. package/model/common-type.d.ts +46 -46
  159. package/model/staticConst.d.ts +3 -3
  160. package/package.json +1 -1
  161. package/public-api.d.ts +15 -15
  162. package/service/common-session.service.d.ts +5 -5
  163. package/utils.d.ts +28 -28
@@ -1,973 +1,973 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { ChangeDetectorRef, Component, ContentChild, EventEmitter, Input, Output, TemplateRef } from '@angular/core';
7
- import * as localforage from 'localforage';
8
- import { InputBoolean } from 'ng-zorro-antd/core';
9
- import { of } from 'rxjs';
10
- import { delay } from 'rxjs/operators';
11
- import { ColWidth } from '../model/colWidth';
12
- import { Page } from '../model/common-type';
13
- import { CommonSessionService } from '../service/common-session.service';
14
- import { TableCacheOption, TreeGrid } from './hd-table.service';
15
- export class HdTableComponent {
16
- /**
17
- * @param {?} cdr
18
- * @param {?} commonSessionService
19
- */
20
- constructor(cdr, commonSessionService) {
21
- this.cdr = cdr;
22
- this.commonSessionService = commonSessionService;
23
- this.tableCols = [];
24
- this.showSelected = false;
25
- this.showOperateColWarpButton = false;
26
- this.selectField = 'billNumber';
27
- // 合计区域
28
- this.showTableTotal = false;
29
- this.sortEvent = new EventEmitter();
30
- this.selectEvent = new EventEmitter();
31
- this.tableSearchEvent = new EventEmitter();
32
- this.tableLoading = false;
33
- // 表格分页参数
34
- this.tablePageIndex = 1;
35
- this.tablePageIndexChange = new EventEmitter();
36
- this.tablePageSizeChange = new EventEmitter();
37
- this.scroll = null;
38
- // 表格勾选参数
39
- this.isAllDisplayDataChecked = false;
40
- this.isIndeterminate = false;
41
- this.listOfDisplayData = [];
42
- this.listOfAllData = [];
43
- this.mapOfCheckedId = {};
44
- this.mapOfCheckList = {};
45
- // 合计参数
46
- this.tableTotalOptionList = [];
47
- this.textWidthCache = {};
48
- // 缓存信息
49
- this.tableCacheOption = new TableCacheOption();
50
- this.tableColsCache = [];
51
- this.showTable = false;
52
- this.selectColListNodes = [];
53
- this.selectColListNodesCache = [];
54
- this.showListNodes = false;
55
- this.isDropdownVisible = false;
56
- // 设置列的可见操作数组
57
- this.nowListNodes = [];
58
- // 设置列的不可见操作数组
59
- this.hideListNodes = [];
60
- // 点击时需要有临时数组存放两个tree,用于取消时候恢复调整前的状态
61
- this.cancelNowListNodes = [];
62
- this.cancelHideListNodes = [];
63
- this.showDetail = false;
64
- this.localforage = null;
65
- this.localtionTmp = '';
66
- // 拖拽操作
67
- this.beforeDrop = (/**
68
- * @param {?} arg
69
- * @return {?}
70
- */
71
- (arg) => {
72
- if (arg.node.origin.disabled || !arg.dragNode.origin.checked || arg.pos === 0) {
73
- return of(false);
74
- }
75
- else {
76
- /** @type {?} */
77
- let node = new TreeGrid();
78
- node.checked = arg.dragNode.origin.checked;
79
- node.disabled = arg.dragNode.origin.disabled;
80
- node.expanded = arg.dragNode.origin.expanded;
81
- node.isLeaf = arg.dragNode.origin.isLeaf;
82
- node.key = arg.dragNode.origin.key;
83
- node.selectable = arg.dragNode.origin.selectable;
84
- node.title = arg.dragNode.origin.title;
85
- // 拖拽元素下标
86
- /** @type {?} */
87
- let dragNodeIndex = this.nowListNodes.findIndex((/**
88
- * @param {?} item
89
- * @return {?}
90
- */
91
- item => { return item.title == arg.dragNode.origin.title; }));
92
- // 目标位置的下标
93
- /** @type {?} */
94
- let nodeIndex = this.nowListNodes.findIndex((/**
95
- * @param {?} item
96
- * @return {?}
97
- */
98
- item => { return item.title == arg.node.origin.title; })) + (arg.pos === -1 ? 0 : arg.pos);
99
- this.nowListNodes.splice(nodeIndex, 0, node);
100
- this.nowListNodes.splice(nodeIndex >= dragNodeIndex ? dragNodeIndex : dragNodeIndex + 1, 1);
101
- return of(true).pipe(delay(100));
102
- }
103
- });
104
- this.localforage = localforage.createInstance({
105
- driver: localforage.INDEXEDDB,
106
- name: 'hd-fscm',
107
- // 设置存储库的名称
108
- version: 1.0,
109
- // 设置存储库的版本
110
- storeName: 'hd-fscm-store',
111
- });
112
- }
113
- /**
114
- * @return {?}
115
- */
116
- ngOnInit() {
117
- this.localtionTmp = location.pathname;
118
- if (this.localtionTmp) {
119
- this.localtionTmp = this.localtionTmp.replace(/\//g, "_");
120
- }
121
- this.userSession = this.commonSessionService.getSession('__jy_authorization_session__');
122
- // 用于开发环境调试
123
- if (!this.userSession) {
124
- this.userSession = {
125
- userCode: 'dev'
126
- };
127
- }
128
- this.deleteHideItem();
129
- if (!this.tableCols || this.tableCols.length === 0) {
130
- return;
131
- }
132
- this.localforage.ready().then((/**
133
- * @return {?}
134
- */
135
- () => {
136
- this.getInitLocalforage();
137
- })).catch((/**
138
- * @param {?} e
139
- * @return {?}
140
- */
141
- function (e) {
142
- console.log('localforage加载异常step1', e);
143
- throw 'localforage加载异常';
144
- }));
145
- }
146
- /**
147
- * @param {?} changes
148
- * @return {?}
149
- */
150
- ngOnChanges(changes) {
151
- // 数据改变时,重置勾选状态
152
- if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {
153
- if (changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']
154
- || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']) {
155
- return;
156
- }
157
- this.resetStatus();
158
- }
159
- if (changes['tableCols'] && JSON.stringify(changes['tableCols'].currentValue) !== JSON.stringify(changes['tableCols'].previousValue)) {
160
- this.deleteHideItem();
161
- if (!this.tableCols || this.tableCols.length === 0) {
162
- return;
163
- }
164
- this.localforage.ready().then((/**
165
- * @return {?}
166
- */
167
- () => {
168
- this.getInitLocalforage();
169
- })).catch((/**
170
- * @param {?} e
171
- * @return {?}
172
- */
173
- function (e) {
174
- console.log('localforage加载异常step2', e);
175
- throw 'localforage加载异常';
176
- }));
177
- }
178
- }
179
- /**
180
- * @return {?}
181
- */
182
- deleteHideItem() {
183
- // 首先把isShow为false数据剔除掉
184
- this.tableCols = this.tableCols.filter((/**
185
- * @param {?} item
186
- * @return {?}
187
- */
188
- item => {
189
- // 如果对象没有 isShow 属性,则默认为 true,保留该对象
190
- if (!item.hasOwnProperty('isShow')) {
191
- return true;
192
- }
193
- // 如果对象有 isShow 属性,则检查其值是否为 true
194
- return item.isShow === true;
195
- }));
196
- }
197
- /**
198
- * @param {?} sort
199
- * @return {?}
200
- */
201
- sort(sort) {
202
- this.sortEvent.emit(sort);
203
- }
204
- /**
205
- * @return {?}
206
- */
207
- getInitLocalforage() {
208
- // 首先获取当前hd-table存储的数据 如果没有,则初始化下当前的数据
209
- this.localforage.getItem('hd-table_' + this.userSession.userCode + '_' + this.localtionTmp + '_' + this.uuid).then((/**
210
- * @param {?} value
211
- * @return {?}
212
- */
213
- (value) => {
214
- this.tableCacheOption = value;
215
- if (this.tableCacheOption.pageSize && this.tableCacheOption.pageSize > 10) {
216
- this.tablePageSize = this.tableCacheOption.pageSize;
217
- }
218
- else {
219
- this.tablePageSize = this.tableCacheOption.pageSize || 10;
220
- }
221
- if (!this.tableCacheOption.colWidths) {
222
- this.tableCacheOption.colWidths = new Map();
223
- }
224
- this.tablePageSizeChange.emit(this.tablePageSize);
225
- this.initTable();
226
- })).catch((/**
227
- * @param {?} err
228
- * @return {?}
229
- */
230
- (err) => {
231
- this.tableCacheOption = new TableCacheOption();
232
- this.tablePageSize = 10;
233
- this.tableCacheOption.pageSize = 10;
234
- this.tableCacheOption.colWidths = new Map();
235
- this.tablePageSizeChange.emit(this.tablePageSize);
236
- this.initTable();
237
- }));
238
- }
239
- /**
240
- * @return {?}
241
- */
242
- initTable() {
243
- this.showTable = false;
244
- if (!this.uuid) {
245
- throw 'hd-table缺失uuid参数,请使用编辑器插件生成并给hd-table赋予uuid属性';
246
- }
247
- if (this.judgeRepeatCols()) {
248
- this.dealCols();
249
- this.setCols();
250
- this.dealScroll();
251
- this.dealOperateBtn();
252
- this.showTable = true;
253
- }
254
- }
255
- // 设置列点击取消
256
- /**
257
- * @return {?}
258
- */
259
- cancelDropdown() {
260
- this.isDropdownVisible = false;
261
- this.hideListNodes = JSON.parse(JSON.stringify(this.cancelHideListNodes));
262
- this.nowListNodes = JSON.parse(JSON.stringify(this.cancelNowListNodes));
263
- }
264
- // 点击触发设置列
265
- /**
266
- * @return {?}
267
- */
268
- confirmDropdown() {
269
- // 临时存放下,取消的时候恢复原来的状态 深拷贝下对象数组
270
- this.cancelHideListNodes = JSON.parse(JSON.stringify(this.hideListNodes));
271
- this.cancelNowListNodes = JSON.parse(JSON.stringify(this.nowListNodes));
272
- this.isDropdownVisible = true;
273
- }
274
- /**
275
- * @return {?}
276
- */
277
- submitGrids() {
278
- this.tableCacheOption.cols = [];
279
- this.nowListNodes.forEach((/**
280
- * @param {?} item
281
- * @return {?}
282
- */
283
- item => {
284
- this.tableCacheOption.cols.push(item.title);
285
- }));
286
- this.saveTableCacheOption();
287
- this.initTable();
288
- this.isDropdownVisible = false;
289
- }
290
- // 从缓存设置列
291
- /**
292
- * @return {?}
293
- */
294
- setCols() {
295
- this.showListNodes = false;
296
- this.nowListNodes = [];
297
- this.hideListNodes = [];
298
- if (this.tableCacheOption.cols) {
299
- let { notIncols, incols } = this.tableColsCache.reduce((/**
300
- * @param {?} acc
301
- * @param {?} item
302
- * @return {?}
303
- */
304
- (acc, item) => {
305
- if (this.tableCacheOption.cols.includes(item.title)) {
306
- acc.incols.push(item);
307
- }
308
- else {
309
- acc.notIncols.push(item);
310
- }
311
- return acc;
312
- }), { notIncols: [], incols: [] });
313
- incols.sort((/**
314
- * @param {?} a
315
- * @param {?} b
316
- * @return {?}
317
- */
318
- (a, b) => {
319
- return this.tableCacheOption.cols.indexOf(a.title) - this.tableCacheOption.cols.indexOf(b.title);
320
- }));
321
- this.tableCols = incols.concat(notIncols);
322
- }
323
- this.tableCols.forEach((/**
324
- * @param {?} element
325
- * @param {?} index
326
- * @return {?}
327
- */
328
- (element, index) => {
329
- if (this.tableCacheOption.cols) {
330
- element.isShow = this.tableCacheOption.cols.includes(element.title) ? true : false;
331
- if (element.isShow) {
332
- this.nowListNodes.push({
333
- title: element.title,
334
- key: element.title,
335
- disabled: element.fixed ? true : false,
336
- // selectable: false,
337
- checked: this.tableCacheOption.cols.includes(element.title) ? true : false
338
- });
339
- }
340
- else {
341
- this.hideListNodes.push({
342
- title: element.title,
343
- key: element.title,
344
- disabled: element.fixed ? true : false,
345
- // selectable: false,
346
- checked: this.tableCacheOption.cols.includes(element.title) ? true : false
347
- });
348
- }
349
- }
350
- else {
351
- element.isShow = true;
352
- this.nowListNodes.push({
353
- title: element.title,
354
- key: element.title,
355
- checked: true,
356
- // selectable: false,
357
- disabled: element.fixed ? true : false
358
- });
359
- }
360
- }));
361
- // 调整列宽为缓存宽度
362
- if (this.tableCacheOption && this.tableCacheOption.colWidths && this.tableCacheOption.colWidths.size !== 0) {
363
- this.tableCols.forEach((/**
364
- * @param {?} col
365
- * @return {?}
366
- */
367
- (col) => {
368
- if (this.tableCacheOption.colWidths.has(col.title)) {
369
- col.width = this.tableCacheOption.colWidths.get(col.title);
370
- }
371
- }));
372
- }
373
- this.dealCols();
374
- setTimeout((/**
375
- * @return {?}
376
- */
377
- () => {
378
- this.showListNodes = true;
379
- }), 0);
380
- }
381
- /**
382
- * @param {?} arr
383
- * @param {?} elementToMoveTitle
384
- * @param {?} targetElementTitle
385
- * @param {?} pos
386
- * @return {?}
387
- */
388
- moveElementNearby(arr, elementToMoveTitle, targetElementTitle, pos) {
389
- /** @type {?} */
390
- const tmpArray = JSON.parse(JSON.stringify(arr));
391
- /** @type {?} */
392
- const targetIndex = tmpArray.findIndex((/**
393
- * @param {?} item
394
- * @return {?}
395
- */
396
- item => item.title === targetElementTitle));
397
- /** @type {?} */
398
- const elementIndex = tmpArray.findIndex((/**
399
- * @param {?} item
400
- * @return {?}
401
- */
402
- item => item.title === elementToMoveTitle));
403
- /** @type {?} */
404
- const newIndex = pos < 0 ? (targetIndex + pos) : targetIndex;
405
- // 移除目标元素,并插入到新的位置
406
- /** @type {?} */
407
- const removedElement = tmpArray.splice(elementIndex, 1);
408
- tmpArray.splice(newIndex + 1, 0, removedElement[0]);
409
- return tmpArray;
410
- }
411
- // 勾选操作
412
- /**
413
- * @param {?} event
414
- * @return {?}
415
- */
416
- checkAction(event) {
417
- // 勾选只有在hideListNodes,取消勾选只有在nowListNodes
418
- if (event.node.origin.checked) {
419
- /** @type {?} */
420
- let node = new TreeGrid();
421
- node = this.hideListNodes.find((/**
422
- * @param {?} item
423
- * @return {?}
424
- */
425
- (item) => {
426
- return item.title === event.node.origin.title;
427
- }));
428
- node.checked = true;
429
- // 找到第一个fixed属性为right的title,找到插入元素的位置
430
- /** @type {?} */
431
- let title = null;
432
- for (let i = this.tableColsCache.length - 1; i >= 0; i--) {
433
- if (this.tableColsCache[i].fixed === 'right') {
434
- title = this.tableColsCache[i].title;
435
- break;
436
- }
437
- }
438
- /** @type {?} */
439
- let temporaryNodeList = this.nowListNodes.slice(0);
440
- if (!title) {
441
- temporaryNodeList.push(node);
442
- }
443
- else {
444
- /** @type {?} */
445
- const index = this.nowListNodes.findIndex((/**
446
- * @param {?} node
447
- * @return {?}
448
- */
449
- node => node.title === title));
450
- temporaryNodeList.splice(index, 0, node);
451
- }
452
- this.nowListNodes = temporaryNodeList;
453
- this.hideListNodes = this.hideListNodes.filter((/**
454
- * @param {?} item
455
- * @return {?}
456
- */
457
- (item) => {
458
- return item.title !== event.node.origin.title;
459
- }));
460
- }
461
- else {
462
- // if (this.hideListNodes.length === 0 && this.tableCacheOption && this.tableCacheOption.cols) {
463
- // this.hideListNodes = this.getHideListNodes();
464
- // }
465
- /** @type {?} */
466
- let temporaryNodeList = this.hideListNodes.slice(0);
467
- this.nowListNodes.forEach((/**
468
- * @param {?} item
469
- * @return {?}
470
- */
471
- item => {
472
- if (item.title === event.node.origin.title) {
473
- /** @type {?} */
474
- const innerItem = JSON.parse(JSON.stringify(item));
475
- innerItem.checked = false;
476
- temporaryNodeList.push(innerItem);
477
- }
478
- }));
479
- this.hideListNodes = temporaryNodeList;
480
- // 为了防止未选择的数组顺序因为push方法而改变,通过初始数据获取显示的字段列表
481
- this.nowListNodes = this.nowListNodes.filter((/**
482
- * @param {?} item
483
- * @return {?}
484
- */
485
- (item) => {
486
- return item.title !== event.node.origin.title;
487
- }));
488
- }
489
- }
490
- // 防止未选择的数组顺序因为push方法而改变,从初始数据获取隐藏未显示的字段列表
491
- /**
492
- * @return {?}
493
- */
494
- getHideListNodes() {
495
- /** @type {?} */
496
- let temporaryNodeList = [];
497
- // 从tableColsCache里面找没有在storage里面出现的字段,组成hideList
498
- this.tableColsCache.forEach((/**
499
- * @param {?} item
500
- * @return {?}
501
- */
502
- (item) => {
503
- if (!this.tableCacheOption.cols.includes(item.title)) {
504
- /** @type {?} */
505
- let nodeItem = new TreeGrid();
506
- nodeItem.title = item.title;
507
- nodeItem.key = item.title;
508
- nodeItem.disabled = item.fixed ? true : false;
509
- nodeItem.checked = false;
510
- temporaryNodeList.push(nodeItem);
511
- }
512
- }));
513
- return temporaryNodeList;
514
- }
515
- /**
516
- * @return {?}
517
- */
518
- dealCols() {
519
- if (!this.tableCols[0].minWidth) {
520
- this.tableCols.forEach((/**
521
- * @param {?} item
522
- * @return {?}
523
- */
524
- item => {
525
- /** @type {?} */
526
- const span = document.createElement('span');
527
- span.style.visibility = 'hidden';
528
- span.style.position = 'absolute';
529
- span.style.whiteSpace = 'nowrap';
530
- span.style.fontSize = '12px';
531
- span.style.display = 'inline-block'; // 将样式修改为 inline-block
532
- span.innerText = item.title;
533
- document.body.appendChild(span);
534
- item.minWidth = span.offsetWidth + 16;
535
- span.style.display = 'none';
536
- document.body.removeChild(span);
537
- }));
538
- }
539
- // 处理左右吸附的数据在数组中的位置
540
- /** @type {?} */
541
- const leftFixedCols = this.tableCols.filter((/**
542
- * @param {?} col
543
- * @return {?}
544
- */
545
- col => col.fixed === 'left'));
546
- /** @type {?} */
547
- const rightFixedCols = this.tableCols.filter((/**
548
- * @param {?} col
549
- * @return {?}
550
- */
551
- col => col.fixed === 'right'));
552
- /** @type {?} */
553
- const normalCols = this.tableCols.filter((/**
554
- * @param {?} col
555
- * @return {?}
556
- */
557
- col => !col.fixed));
558
- /** @type {?} */
559
- const resultCols = leftFixedCols.concat(normalCols).concat(rightFixedCols);
560
- this.tableCols = resultCols;
561
- if (!this.tableColsCache || this.tableColsCache.length === 0) {
562
- // 缓存一下表格的数据
563
- this.tableColsCache = [...this.tableCols];
564
- }
565
- }
566
- /**
567
- * @return {?}
568
- */
569
- saveTableCacheOption() {
570
- this.localforage.setItem('hd-table_' + this.userSession.userCode + '_' + this.localtionTmp + '_' + this.uuid, this.tableCacheOption);
571
- }
572
- /**
573
- * @return {?}
574
- */
575
- judgeRepeatCols() {
576
- for (let i = 0; i < this.tableCols.length; i++) {
577
- for (let j = i + 1; j < this.tableCols.length; j++) {
578
- if (this.tableCols[i].title === this.tableCols[j].title) {
579
- throw `hd-table组件中列名 ${this.tableCols[i].title} 重复`;
580
- }
581
- }
582
- }
583
- return true;
584
- }
585
- /**
586
- * @param {?} __0
587
- * @param {?} col
588
- * @return {?}
589
- */
590
- onResize({ width }, col) {
591
- /** @type {?} */
592
- let tempWidth = 0;
593
- if (width > col.minWidth) {
594
- tempWidth = width;
595
- }
596
- else {
597
- tempWidth = col.minWidth;
598
- }
599
- this.tableCacheOption.colWidths.set(col.title, tempWidth);
600
- this.saveTableCacheOption();
601
- this.tableCols = this.tableCols.map((/**
602
- * @param {?} e
603
- * @return {?}
604
- */
605
- e => (e.title === col.title ? Object.assign({}, e, { width: tempWidth }) : e)));
606
- this.dealScroll();
607
- }
608
- /**
609
- * @return {?}
610
- */
611
- dealOperateBtn() {
612
- /** @type {?} */
613
- let operateCol = this.tableCols.find((/**
614
- * @param {?} col
615
- * @return {?}
616
- */
617
- col => col.title === '操作')) || null;
618
- if (operateCol) {
619
- /** @type {?} */
620
- let textStr = '';
621
- operateCol.btnList.forEach((/**
622
- * @param {?} btn
623
- * @return {?}
624
- */
625
- btn => {
626
- if (!btn.isRepeat) {
627
- textStr += btn.name;
628
- }
629
- }));
630
- /** @type {?} */
631
- const span = document.createElement('a');
632
- span.style.visibility = 'hidden';
633
- span.style.position = 'absolute';
634
- span.style.whiteSpace = 'nowrap';
635
- span.style.fontSize = '12px';
636
- span.style.display = 'inline-block'; // 将样式修改为 inline-block
637
- span.innerText = textStr;
638
- document.body.appendChild(span);
639
- operateCol.width = span.offsetWidth + (operateCol.btnList.filter((/**
640
- * @param {?} item
641
- * @return {?}
642
- */
643
- item => !item.isRepeat)).length - 1) * 4 + 16;
644
- span.style.display = 'none';
645
- document.body.removeChild(span);
646
- }
647
- }
648
- /**
649
- * @param {?} fn
650
- * @param {?} event
651
- * @return {?}
652
- */
653
- triggerEvent(fn, event) {
654
- if (fn) {
655
- fn(event);
656
- }
657
- }
658
- /**
659
- * @return {?}
660
- */
661
- dealScroll() {
662
- /** @type {?} */
663
- let colWidth = 0;
664
- if (this.showSelected) {
665
- colWidth += 40;
666
- }
667
- this.tableCols.forEach((/**
668
- * @param {?} item
669
- * @return {?}
670
- */
671
- item => {
672
- if (!item.width) {
673
- item.width = ColWidth.fixColWidth;
674
- }
675
- if (item.isShow) {
676
- item.fixedWidth = colWidth;
677
- colWidth += item.width;
678
- }
679
- }));
680
- if (this.tableTotal) {
681
- this.scroll = {
682
- x: '1px',
683
- y: 'calc(100vh - 180px)'
684
- };
685
- }
686
- else {
687
- this.scroll = {
688
- x: '1px',
689
- y: 'calc(100vh - 140px)'
690
- };
691
- }
692
- }
693
- /**
694
- * @param {?} text
695
- * @param {?} maxWidth
696
- * @return {?}
697
- */
698
- isTextOverflow(text, maxWidth) {
699
- /** @type {?} */
700
- const cachedWidth = this.textWidthCache[text];
701
- if (cachedWidth !== undefined) {
702
- return cachedWidth + 15 >= maxWidth;
703
- }
704
- /** @type {?} */
705
- const span = document.createElement('span');
706
- span.style.visibility = 'hidden';
707
- span.style.position = 'absolute';
708
- span.style.whiteSpace = 'nowrap';
709
- span.style.fontSize = '12px';
710
- span.style.display = 'inline-block'; // 将样式修改为 inline-block
711
- span.innerText = text;
712
- document.body.appendChild(span);
713
- /** @type {?} */
714
- const isOverflow = span.offsetWidth + 15 >= maxWidth;
715
- this.textWidthCache[text] = span.offsetWidth;
716
- span.style.display = 'none';
717
- document.body.removeChild(span);
718
- return isOverflow;
719
- }
720
- // 表格勾选逻辑
721
- /**
722
- * @param {?} $event
723
- * @return {?}
724
- */
725
- currentPageDataChange($event) {
726
- this.listOfDisplayData = $event;
727
- this.refreshStatus();
728
- this.resetStatus();
729
- }
730
- /**
731
- * @param {?} reset
732
- * @return {?}
733
- */
734
- search(reset) {
735
- this.tableCacheOption.pageSize = this.tablePageSize;
736
- this.saveTableCacheOption();
737
- if (reset) {
738
- this.tablePageSizeChange.emit(this.tablePageSize);
739
- }
740
- else {
741
- this.tablePageIndexChange.emit(this.tablePageIndex);
742
- // 触发父组件查询事件
743
- this.tableSearchEvent.emit(reset);
744
- }
745
- }
746
- /**
747
- * @return {?}
748
- */
749
- resetStatus() {
750
- this.isAllDisplayDataChecked = false;
751
- this.isIndeterminate = false;
752
- this.mapOfCheckedId = {};
753
- this.mapOfCheckList = {};
754
- this.selectEvent.emit([]);
755
- }
756
- /**
757
- * @param {?=} event
758
- * @param {?=} data
759
- * @return {?}
760
- */
761
- refreshStatus(event = false, data = null) {
762
- if (event && data) {
763
- !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);
764
- }
765
- else if (!event && data) {
766
- this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];
767
- }
768
- this.isAllDisplayDataChecked = this.listOfDisplayData.every((/**
769
- * @param {?} item
770
- * @return {?}
771
- */
772
- item => this.mapOfCheckedId[item[this.selectField]]));
773
- this.isIndeterminate =
774
- this.listOfDisplayData.some((/**
775
- * @param {?} item
776
- * @return {?}
777
- */
778
- item => this.mapOfCheckedId[item[this.selectField]])) && !this.isAllDisplayDataChecked;
779
- // 触发select事件
780
- if (this.selectEvent) {
781
- /** @type {?} */
782
- const selectedList = Object.values(this.mapOfCheckList);
783
- this.selectEvent.emit(selectedList);
784
- }
785
- // 如果数据为空,则清空勾选标识
786
- if (this.tableData.content.length === 0) {
787
- this.isAllDisplayDataChecked = false;
788
- }
789
- }
790
- /**
791
- * @param {?} value
792
- * @return {?}
793
- */
794
- checkAll(value) {
795
- this.listOfDisplayData.forEach((/**
796
- * @param {?} item
797
- * @return {?}
798
- */
799
- item => {
800
- if (value) {
801
- !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);
802
- }
803
- else {
804
- this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];
805
- }
806
- this.mapOfCheckedId[item[this.selectField]] = value;
807
- }));
808
- this.refreshStatus();
809
- }
810
- /**
811
- * @param {?} str
812
- * @return {?}
813
- */
814
- judgeColEmpty(str) {
815
- if (str || str === 0) {
816
- return str;
817
- }
818
- else {
819
- return '<空>';
820
- }
821
- }
822
- }
823
- HdTableComponent.decorators = [
824
- { type: Component, args: [{
825
- selector: 'hd-table',
826
- template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"showDetail = !showDetail\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <hd-button type=\"primary\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\" (clickAction)=\"confirmDropdown()\"\n [nzVisible]=\"isDropdownVisible\">\u8BBE\u7F6E\u5217</hd-button>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div style=\"max-height: 400px;overflow-y: scroll;\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div style=\"text-align: right;background: #fff;padding: 4px;\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </nz-dropdown-menu>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [nzScroll]=\"scroll\" nzShowSizeChanger\n nzShowSizeChanger nzShowQuickJumper nzFrontPagination=\"false\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"tableData.totalElements\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200 ]\" [(nzPageSize)]=\"tablePageSize\" (nzPageSizeChange)=\"search(true)\"\n (nzPageIndexChange)=\"search(false)\" (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\">\n {{ col.title }}\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of hdTable.data;index as i\">\n <td nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"mapOfCheckedId[data[selectField]]\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngFor=\"let col of tableCols\">\n <td *ngIf=\"col.isShow\" [ngStyle]=\"{'max-width': col.width + 'px'}\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!btn.showConfirm;else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ btn.name }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + btn.name + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n btn.name }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"col.name === 'state';else otherTemplate\">\n <hd-status [status]=\"data['state']\">{{ judgeColEmpty(col.render ? col.render(data) : data['state'])}}\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click;else noClickTemplate\">\n <ng-container\n *ngIf=\"!isTextOverflow(col.render ? col.render(data) : data[col.name], col.width);else overflowTemplate\">\n <a [ngStyle]=\"{'color': col?.color ? col.color : null}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ judgeColEmpty(col.render ? col.render(data) :\n data[col.name])}}</a>\n </ng-container>\n <ng-template #overflowTemplate>\n <a [ngStyle]=\"{'color': col?.color ? col.color : null}\" nz-tooltip\n [nzTooltipTitle]=\"col.render ? col.render(data) : data[col.name]\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ judgeColEmpty(col.render ? col.render(data) :\n data[col.name])}}</a>\n </ng-template>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(col.render ? col.render(data) : data[col.name], col.width);else overflowTemplate\">\n <span [ngStyle]=\"{'color': col?.color ? col.color : null}\">{{ judgeColEmpty(col.render ?\n col.render(data) :\n data[col.name])}}</span>\n </ng-container>\n <ng-template #overflowTemplate>\n <span [ngStyle]=\"{'color': col?.color ? col.color : null}\" nz-tooltip\n [nzTooltipTitle]=\"col.render ? col.render(data) : data[col.name]\">\n {{ judgeColEmpty(col.render ? col.render(data) : data[col.name])}}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n <!-- \u5408\u8BA1\u6240\u6709\u6570\u636E\u533A\u57DF \u9700\u8981\u540E\u7AEF\u63A5\u53E3\u914D\u5408 -->\n <tr *ngIf=\"showTableTotal\" class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let tableTotalOption of tableTotalOptionList\">\n <td>{{ tableTotalOption }}</td>\n </ng-container>\n </tr>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{tableData.totalElements}} \u6761\u6570\u636E\n </ng-template>\n </nz-table>\n</ng-container>",
827
- styles: ["::ng-deep .common-btn-group>a{font-size:12px;font-weight:400;color:#12a34f!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e}::ng-deep .ant-input-number-input{height:28px}::ng-deep .ant-input-number{height:28px}textarea.ant-input{height:auto;min-height:28px}::ng-deep .ant-select-selection--multiple{min-height:28px}::ng-deep .ant-select-selection__rendered>ul>li{height:22px!important;margin-top:3px!important;line-height:22px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:28px!important}::ng-deep .ant-input{height:28px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:28px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:12px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:12px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-time-picker{width:100%}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .hd-table-total>td{border:0!important}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}"]
828
- }] }
829
- ];
830
- /** @nocollapse */
831
- HdTableComponent.ctorParameters = () => [
832
- { type: ChangeDetectorRef },
833
- { type: CommonSessionService }
834
- ];
835
- HdTableComponent.propDecorators = {
836
- uuid: [{ type: Input }],
837
- tableCols: [{ type: Input }],
838
- tableData: [{ type: Input }],
839
- showSelected: [{ type: Input }],
840
- showOperateColWarpButton: [{ type: Input }],
841
- selectField: [{ type: Input }],
842
- showTableTotal: [{ type: Input }],
843
- tableTotalOption: [{ type: Input }],
844
- sortEvent: [{ type: Output }],
845
- selectEvent: [{ type: Output }],
846
- tableSearchEvent: [{ type: Output }],
847
- tableLoading: [{ type: Input }],
848
- tablePageIndex: [{ type: Input }],
849
- tablePageSize: [{ type: Input }],
850
- tablePageIndexChange: [{ type: Output }],
851
- tablePageSizeChange: [{ type: Output }],
852
- tableTotal: [{ type: ContentChild, args: ["tableTotal", { static: false },] }],
853
- tableLeftButton: [{ type: ContentChild, args: ["tableLeftButton", { static: false },] }],
854
- tableRightButton: [{ type: ContentChild, args: ["tableRightButton", { static: false },] }]
855
- };
856
- tslib_1.__decorate([
857
- InputBoolean(),
858
- tslib_1.__metadata("design:type", Boolean)
859
- ], HdTableComponent.prototype, "showSelected", void 0);
860
- tslib_1.__decorate([
861
- InputBoolean(),
862
- tslib_1.__metadata("design:type", Boolean)
863
- ], HdTableComponent.prototype, "showOperateColWarpButton", void 0);
864
- tslib_1.__decorate([
865
- InputBoolean(),
866
- tslib_1.__metadata("design:type", Boolean)
867
- ], HdTableComponent.prototype, "showTableTotal", void 0);
868
- if (false) {
869
- /** @type {?} */
870
- HdTableComponent.prototype.uuid;
871
- /** @type {?} */
872
- HdTableComponent.prototype.tableCols;
873
- /** @type {?} */
874
- HdTableComponent.prototype.tableData;
875
- /** @type {?} */
876
- HdTableComponent.prototype.showSelected;
877
- /** @type {?} */
878
- HdTableComponent.prototype.showOperateColWarpButton;
879
- /** @type {?} */
880
- HdTableComponent.prototype.selectField;
881
- /** @type {?} */
882
- HdTableComponent.prototype.showTableTotal;
883
- /** @type {?} */
884
- HdTableComponent.prototype.tableTotalOption;
885
- /** @type {?} */
886
- HdTableComponent.prototype.sortEvent;
887
- /** @type {?} */
888
- HdTableComponent.prototype.selectEvent;
889
- /** @type {?} */
890
- HdTableComponent.prototype.tableSearchEvent;
891
- /** @type {?} */
892
- HdTableComponent.prototype.tableLoading;
893
- /** @type {?} */
894
- HdTableComponent.prototype.tablePageIndex;
895
- /** @type {?} */
896
- HdTableComponent.prototype.tablePageSize;
897
- /** @type {?} */
898
- HdTableComponent.prototype.tablePageIndexChange;
899
- /** @type {?} */
900
- HdTableComponent.prototype.tablePageSizeChange;
901
- /** @type {?} */
902
- HdTableComponent.prototype.tableTotal;
903
- /** @type {?} */
904
- HdTableComponent.prototype.tableLeftButton;
905
- /** @type {?} */
906
- HdTableComponent.prototype.tableRightButton;
907
- /** @type {?} */
908
- HdTableComponent.prototype.scroll;
909
- /** @type {?} */
910
- HdTableComponent.prototype.isAllDisplayDataChecked;
911
- /** @type {?} */
912
- HdTableComponent.prototype.isIndeterminate;
913
- /** @type {?} */
914
- HdTableComponent.prototype.listOfDisplayData;
915
- /** @type {?} */
916
- HdTableComponent.prototype.listOfAllData;
917
- /** @type {?} */
918
- HdTableComponent.prototype.listOfSelection;
919
- /** @type {?} */
920
- HdTableComponent.prototype.mapOfCheckedId;
921
- /** @type {?} */
922
- HdTableComponent.prototype.mapOfCheckList;
923
- /** @type {?} */
924
- HdTableComponent.prototype.tableTotalOptionList;
925
- /**
926
- * @type {?}
927
- * @private
928
- */
929
- HdTableComponent.prototype.textWidthCache;
930
- /** @type {?} */
931
- HdTableComponent.prototype.tableCacheOption;
932
- /** @type {?} */
933
- HdTableComponent.prototype.userSession;
934
- /** @type {?} */
935
- HdTableComponent.prototype.tableColsCache;
936
- /** @type {?} */
937
- HdTableComponent.prototype.showTable;
938
- /** @type {?} */
939
- HdTableComponent.prototype.selectColListNodes;
940
- /** @type {?} */
941
- HdTableComponent.prototype.selectColListNodesCache;
942
- /** @type {?} */
943
- HdTableComponent.prototype.showListNodes;
944
- /** @type {?} */
945
- HdTableComponent.prototype.isDropdownVisible;
946
- /** @type {?} */
947
- HdTableComponent.prototype.nowListNodes;
948
- /** @type {?} */
949
- HdTableComponent.prototype.hideListNodes;
950
- /** @type {?} */
951
- HdTableComponent.prototype.cancelNowListNodes;
952
- /** @type {?} */
953
- HdTableComponent.prototype.cancelHideListNodes;
954
- /** @type {?} */
955
- HdTableComponent.prototype.showDetail;
956
- /** @type {?} */
957
- HdTableComponent.prototype.localforage;
958
- /** @type {?} */
959
- HdTableComponent.prototype.localtionTmp;
960
- /** @type {?} */
961
- HdTableComponent.prototype.beforeDrop;
962
- /**
963
- * @type {?}
964
- * @private
965
- */
966
- HdTableComponent.prototype.cdr;
967
- /**
968
- * @type {?}
969
- * @private
970
- */
971
- HdTableComponent.prototype.commonSessionService;
972
- }
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { ChangeDetectorRef, Component, ContentChild, EventEmitter, Input, Output, TemplateRef } from '@angular/core';
7
+ import * as localforage from 'localforage';
8
+ import { InputBoolean } from 'ng-zorro-antd/core';
9
+ import { of } from 'rxjs';
10
+ import { delay } from 'rxjs/operators';
11
+ import { ColWidth } from '../model/colWidth';
12
+ import { Page } from '../model/common-type';
13
+ import { CommonSessionService } from '../service/common-session.service';
14
+ import { TableCacheOption, TreeGrid } from './hd-table.service';
15
+ export class HdTableComponent {
16
+ /**
17
+ * @param {?} cdr
18
+ * @param {?} commonSessionService
19
+ */
20
+ constructor(cdr, commonSessionService) {
21
+ this.cdr = cdr;
22
+ this.commonSessionService = commonSessionService;
23
+ this.tableCols = [];
24
+ this.showSelected = false;
25
+ this.showOperateColWarpButton = false;
26
+ this.selectField = 'billNumber';
27
+ // 合计区域
28
+ this.showTableTotal = false;
29
+ this.sortEvent = new EventEmitter();
30
+ this.selectEvent = new EventEmitter();
31
+ this.tableSearchEvent = new EventEmitter();
32
+ this.tableLoading = false;
33
+ // 表格分页参数
34
+ this.tablePageIndex = 1;
35
+ this.tablePageIndexChange = new EventEmitter();
36
+ this.tablePageSizeChange = new EventEmitter();
37
+ this.scroll = null;
38
+ // 表格勾选参数
39
+ this.isAllDisplayDataChecked = false;
40
+ this.isIndeterminate = false;
41
+ this.listOfDisplayData = [];
42
+ this.listOfAllData = [];
43
+ this.mapOfCheckedId = {};
44
+ this.mapOfCheckList = {};
45
+ // 合计参数
46
+ this.tableTotalOptionList = [];
47
+ this.textWidthCache = {};
48
+ // 缓存信息
49
+ this.tableCacheOption = new TableCacheOption();
50
+ this.tableColsCache = [];
51
+ this.showTable = false;
52
+ this.selectColListNodes = [];
53
+ this.selectColListNodesCache = [];
54
+ this.showListNodes = false;
55
+ this.isDropdownVisible = false;
56
+ // 设置列的可见操作数组
57
+ this.nowListNodes = [];
58
+ // 设置列的不可见操作数组
59
+ this.hideListNodes = [];
60
+ // 点击时需要有临时数组存放两个tree,用于取消时候恢复调整前的状态
61
+ this.cancelNowListNodes = [];
62
+ this.cancelHideListNodes = [];
63
+ this.showDetail = false;
64
+ this.localforage = null;
65
+ this.localtionTmp = '';
66
+ // 拖拽操作
67
+ this.beforeDrop = (/**
68
+ * @param {?} arg
69
+ * @return {?}
70
+ */
71
+ (arg) => {
72
+ if (arg.node.origin.disabled || !arg.dragNode.origin.checked || arg.pos === 0) {
73
+ return of(false);
74
+ }
75
+ else {
76
+ /** @type {?} */
77
+ let node = new TreeGrid();
78
+ node.checked = arg.dragNode.origin.checked;
79
+ node.disabled = arg.dragNode.origin.disabled;
80
+ node.expanded = arg.dragNode.origin.expanded;
81
+ node.isLeaf = arg.dragNode.origin.isLeaf;
82
+ node.key = arg.dragNode.origin.key;
83
+ node.selectable = arg.dragNode.origin.selectable;
84
+ node.title = arg.dragNode.origin.title;
85
+ // 拖拽元素下标
86
+ /** @type {?} */
87
+ let dragNodeIndex = this.nowListNodes.findIndex((/**
88
+ * @param {?} item
89
+ * @return {?}
90
+ */
91
+ item => { return item.title == arg.dragNode.origin.title; }));
92
+ // 目标位置的下标
93
+ /** @type {?} */
94
+ let nodeIndex = this.nowListNodes.findIndex((/**
95
+ * @param {?} item
96
+ * @return {?}
97
+ */
98
+ item => { return item.title == arg.node.origin.title; })) + (arg.pos === -1 ? 0 : arg.pos);
99
+ this.nowListNodes.splice(nodeIndex, 0, node);
100
+ this.nowListNodes.splice(nodeIndex >= dragNodeIndex ? dragNodeIndex : dragNodeIndex + 1, 1);
101
+ return of(true).pipe(delay(100));
102
+ }
103
+ });
104
+ this.localforage = localforage.createInstance({
105
+ driver: localforage.INDEXEDDB,
106
+ name: 'hd-fscm',
107
+ // 设置存储库的名称
108
+ version: 1.0,
109
+ // 设置存储库的版本
110
+ storeName: 'hd-fscm-store',
111
+ });
112
+ }
113
+ /**
114
+ * @return {?}
115
+ */
116
+ ngOnInit() {
117
+ this.localtionTmp = location.pathname;
118
+ if (this.localtionTmp) {
119
+ this.localtionTmp = this.localtionTmp.replace(/\//g, "_");
120
+ }
121
+ this.userSession = this.commonSessionService.getSession('__jy_authorization_session__');
122
+ // 用于开发环境调试
123
+ if (!this.userSession) {
124
+ this.userSession = {
125
+ userCode: 'dev'
126
+ };
127
+ }
128
+ this.deleteHideItem();
129
+ if (!this.tableCols || this.tableCols.length === 0) {
130
+ return;
131
+ }
132
+ this.localforage.ready().then((/**
133
+ * @return {?}
134
+ */
135
+ () => {
136
+ this.getInitLocalforage();
137
+ })).catch((/**
138
+ * @param {?} e
139
+ * @return {?}
140
+ */
141
+ function (e) {
142
+ console.log('localforage加载异常step1', e);
143
+ throw 'localforage加载异常';
144
+ }));
145
+ }
146
+ /**
147
+ * @param {?} changes
148
+ * @return {?}
149
+ */
150
+ ngOnChanges(changes) {
151
+ // 数据改变时,重置勾选状态
152
+ if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {
153
+ if (changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']
154
+ || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']) {
155
+ return;
156
+ }
157
+ this.resetStatus();
158
+ }
159
+ if (changes['tableCols'] && JSON.stringify(changes['tableCols'].currentValue) !== JSON.stringify(changes['tableCols'].previousValue)) {
160
+ this.deleteHideItem();
161
+ if (!this.tableCols || this.tableCols.length === 0) {
162
+ return;
163
+ }
164
+ this.localforage.ready().then((/**
165
+ * @return {?}
166
+ */
167
+ () => {
168
+ this.getInitLocalforage();
169
+ })).catch((/**
170
+ * @param {?} e
171
+ * @return {?}
172
+ */
173
+ function (e) {
174
+ console.log('localforage加载异常step2', e);
175
+ throw 'localforage加载异常';
176
+ }));
177
+ }
178
+ }
179
+ /**
180
+ * @return {?}
181
+ */
182
+ deleteHideItem() {
183
+ // 首先把isShow为false数据剔除掉
184
+ this.tableCols = this.tableCols.filter((/**
185
+ * @param {?} item
186
+ * @return {?}
187
+ */
188
+ item => {
189
+ // 如果对象没有 isShow 属性,则默认为 true,保留该对象
190
+ if (!item.hasOwnProperty('isShow')) {
191
+ return true;
192
+ }
193
+ // 如果对象有 isShow 属性,则检查其值是否为 true
194
+ return item.isShow === true;
195
+ }));
196
+ }
197
+ /**
198
+ * @param {?} sort
199
+ * @return {?}
200
+ */
201
+ sort(sort) {
202
+ this.sortEvent.emit(sort);
203
+ }
204
+ /**
205
+ * @return {?}
206
+ */
207
+ getInitLocalforage() {
208
+ // 首先获取当前hd-table存储的数据 如果没有,则初始化下当前的数据
209
+ this.localforage.getItem('hd-table_' + this.userSession.userCode + '_' + this.localtionTmp + '_' + this.uuid).then((/**
210
+ * @param {?} value
211
+ * @return {?}
212
+ */
213
+ (value) => {
214
+ this.tableCacheOption = value;
215
+ if (this.tableCacheOption.pageSize && this.tableCacheOption.pageSize > 10) {
216
+ this.tablePageSize = this.tableCacheOption.pageSize;
217
+ }
218
+ else {
219
+ this.tablePageSize = this.tableCacheOption.pageSize || 10;
220
+ }
221
+ if (!this.tableCacheOption.colWidths) {
222
+ this.tableCacheOption.colWidths = new Map();
223
+ }
224
+ this.tablePageSizeChange.emit(this.tablePageSize);
225
+ this.initTable();
226
+ })).catch((/**
227
+ * @param {?} err
228
+ * @return {?}
229
+ */
230
+ (err) => {
231
+ this.tableCacheOption = new TableCacheOption();
232
+ this.tablePageSize = 10;
233
+ this.tableCacheOption.pageSize = 10;
234
+ this.tableCacheOption.colWidths = new Map();
235
+ this.tablePageSizeChange.emit(this.tablePageSize);
236
+ this.initTable();
237
+ }));
238
+ }
239
+ /**
240
+ * @return {?}
241
+ */
242
+ initTable() {
243
+ this.showTable = false;
244
+ if (!this.uuid) {
245
+ throw 'hd-table缺失uuid参数,请使用编辑器插件生成并给hd-table赋予uuid属性';
246
+ }
247
+ if (this.judgeRepeatCols()) {
248
+ this.dealCols();
249
+ this.setCols();
250
+ this.dealScroll();
251
+ this.dealOperateBtn();
252
+ this.showTable = true;
253
+ }
254
+ }
255
+ // 设置列点击取消
256
+ /**
257
+ * @return {?}
258
+ */
259
+ cancelDropdown() {
260
+ this.isDropdownVisible = false;
261
+ this.hideListNodes = JSON.parse(JSON.stringify(this.cancelHideListNodes));
262
+ this.nowListNodes = JSON.parse(JSON.stringify(this.cancelNowListNodes));
263
+ }
264
+ // 点击触发设置列
265
+ /**
266
+ * @return {?}
267
+ */
268
+ confirmDropdown() {
269
+ // 临时存放下,取消的时候恢复原来的状态 深拷贝下对象数组
270
+ this.cancelHideListNodes = JSON.parse(JSON.stringify(this.hideListNodes));
271
+ this.cancelNowListNodes = JSON.parse(JSON.stringify(this.nowListNodes));
272
+ this.isDropdownVisible = true;
273
+ }
274
+ /**
275
+ * @return {?}
276
+ */
277
+ submitGrids() {
278
+ this.tableCacheOption.cols = [];
279
+ this.nowListNodes.forEach((/**
280
+ * @param {?} item
281
+ * @return {?}
282
+ */
283
+ item => {
284
+ this.tableCacheOption.cols.push(item.title);
285
+ }));
286
+ this.saveTableCacheOption();
287
+ this.initTable();
288
+ this.isDropdownVisible = false;
289
+ }
290
+ // 从缓存设置列
291
+ /**
292
+ * @return {?}
293
+ */
294
+ setCols() {
295
+ this.showListNodes = false;
296
+ this.nowListNodes = [];
297
+ this.hideListNodes = [];
298
+ if (this.tableCacheOption.cols) {
299
+ let { notIncols, incols } = this.tableColsCache.reduce((/**
300
+ * @param {?} acc
301
+ * @param {?} item
302
+ * @return {?}
303
+ */
304
+ (acc, item) => {
305
+ if (this.tableCacheOption.cols.includes(item.title)) {
306
+ acc.incols.push(item);
307
+ }
308
+ else {
309
+ acc.notIncols.push(item);
310
+ }
311
+ return acc;
312
+ }), { notIncols: [], incols: [] });
313
+ incols.sort((/**
314
+ * @param {?} a
315
+ * @param {?} b
316
+ * @return {?}
317
+ */
318
+ (a, b) => {
319
+ return this.tableCacheOption.cols.indexOf(a.title) - this.tableCacheOption.cols.indexOf(b.title);
320
+ }));
321
+ this.tableCols = incols.concat(notIncols);
322
+ }
323
+ this.tableCols.forEach((/**
324
+ * @param {?} element
325
+ * @param {?} index
326
+ * @return {?}
327
+ */
328
+ (element, index) => {
329
+ if (this.tableCacheOption.cols) {
330
+ element.isShow = this.tableCacheOption.cols.includes(element.title) ? true : false;
331
+ if (element.isShow) {
332
+ this.nowListNodes.push({
333
+ title: element.title,
334
+ key: element.title,
335
+ disabled: element.fixed ? true : false,
336
+ // selectable: false,
337
+ checked: this.tableCacheOption.cols.includes(element.title) ? true : false
338
+ });
339
+ }
340
+ else {
341
+ this.hideListNodes.push({
342
+ title: element.title,
343
+ key: element.title,
344
+ disabled: element.fixed ? true : false,
345
+ // selectable: false,
346
+ checked: this.tableCacheOption.cols.includes(element.title) ? true : false
347
+ });
348
+ }
349
+ }
350
+ else {
351
+ element.isShow = true;
352
+ this.nowListNodes.push({
353
+ title: element.title,
354
+ key: element.title,
355
+ checked: true,
356
+ // selectable: false,
357
+ disabled: element.fixed ? true : false
358
+ });
359
+ }
360
+ }));
361
+ // 调整列宽为缓存宽度
362
+ if (this.tableCacheOption && this.tableCacheOption.colWidths && this.tableCacheOption.colWidths.size !== 0) {
363
+ this.tableCols.forEach((/**
364
+ * @param {?} col
365
+ * @return {?}
366
+ */
367
+ (col) => {
368
+ if (this.tableCacheOption.colWidths.has(col.title)) {
369
+ col.width = this.tableCacheOption.colWidths.get(col.title);
370
+ }
371
+ }));
372
+ }
373
+ this.dealCols();
374
+ setTimeout((/**
375
+ * @return {?}
376
+ */
377
+ () => {
378
+ this.showListNodes = true;
379
+ }), 0);
380
+ }
381
+ /**
382
+ * @param {?} arr
383
+ * @param {?} elementToMoveTitle
384
+ * @param {?} targetElementTitle
385
+ * @param {?} pos
386
+ * @return {?}
387
+ */
388
+ moveElementNearby(arr, elementToMoveTitle, targetElementTitle, pos) {
389
+ /** @type {?} */
390
+ const tmpArray = JSON.parse(JSON.stringify(arr));
391
+ /** @type {?} */
392
+ const targetIndex = tmpArray.findIndex((/**
393
+ * @param {?} item
394
+ * @return {?}
395
+ */
396
+ item => item.title === targetElementTitle));
397
+ /** @type {?} */
398
+ const elementIndex = tmpArray.findIndex((/**
399
+ * @param {?} item
400
+ * @return {?}
401
+ */
402
+ item => item.title === elementToMoveTitle));
403
+ /** @type {?} */
404
+ const newIndex = pos < 0 ? (targetIndex + pos) : targetIndex;
405
+ // 移除目标元素,并插入到新的位置
406
+ /** @type {?} */
407
+ const removedElement = tmpArray.splice(elementIndex, 1);
408
+ tmpArray.splice(newIndex + 1, 0, removedElement[0]);
409
+ return tmpArray;
410
+ }
411
+ // 勾选操作
412
+ /**
413
+ * @param {?} event
414
+ * @return {?}
415
+ */
416
+ checkAction(event) {
417
+ // 勾选只有在hideListNodes,取消勾选只有在nowListNodes
418
+ if (event.node.origin.checked) {
419
+ /** @type {?} */
420
+ let node = new TreeGrid();
421
+ node = this.hideListNodes.find((/**
422
+ * @param {?} item
423
+ * @return {?}
424
+ */
425
+ (item) => {
426
+ return item.title === event.node.origin.title;
427
+ }));
428
+ node.checked = true;
429
+ // 找到第一个fixed属性为right的title,找到插入元素的位置
430
+ /** @type {?} */
431
+ let title = null;
432
+ for (let i = this.tableColsCache.length - 1; i >= 0; i--) {
433
+ if (this.tableColsCache[i].fixed === 'right') {
434
+ title = this.tableColsCache[i].title;
435
+ break;
436
+ }
437
+ }
438
+ /** @type {?} */
439
+ let temporaryNodeList = this.nowListNodes.slice(0);
440
+ if (!title) {
441
+ temporaryNodeList.push(node);
442
+ }
443
+ else {
444
+ /** @type {?} */
445
+ const index = this.nowListNodes.findIndex((/**
446
+ * @param {?} node
447
+ * @return {?}
448
+ */
449
+ node => node.title === title));
450
+ temporaryNodeList.splice(index, 0, node);
451
+ }
452
+ this.nowListNodes = temporaryNodeList;
453
+ this.hideListNodes = this.hideListNodes.filter((/**
454
+ * @param {?} item
455
+ * @return {?}
456
+ */
457
+ (item) => {
458
+ return item.title !== event.node.origin.title;
459
+ }));
460
+ }
461
+ else {
462
+ // if (this.hideListNodes.length === 0 && this.tableCacheOption && this.tableCacheOption.cols) {
463
+ // this.hideListNodes = this.getHideListNodes();
464
+ // }
465
+ /** @type {?} */
466
+ let temporaryNodeList = this.hideListNodes.slice(0);
467
+ this.nowListNodes.forEach((/**
468
+ * @param {?} item
469
+ * @return {?}
470
+ */
471
+ item => {
472
+ if (item.title === event.node.origin.title) {
473
+ /** @type {?} */
474
+ const innerItem = JSON.parse(JSON.stringify(item));
475
+ innerItem.checked = false;
476
+ temporaryNodeList.push(innerItem);
477
+ }
478
+ }));
479
+ this.hideListNodes = temporaryNodeList;
480
+ // 为了防止未选择的数组顺序因为push方法而改变,通过初始数据获取显示的字段列表
481
+ this.nowListNodes = this.nowListNodes.filter((/**
482
+ * @param {?} item
483
+ * @return {?}
484
+ */
485
+ (item) => {
486
+ return item.title !== event.node.origin.title;
487
+ }));
488
+ }
489
+ }
490
+ // 防止未选择的数组顺序因为push方法而改变,从初始数据获取隐藏未显示的字段列表
491
+ /**
492
+ * @return {?}
493
+ */
494
+ getHideListNodes() {
495
+ /** @type {?} */
496
+ let temporaryNodeList = [];
497
+ // 从tableColsCache里面找没有在storage里面出现的字段,组成hideList
498
+ this.tableColsCache.forEach((/**
499
+ * @param {?} item
500
+ * @return {?}
501
+ */
502
+ (item) => {
503
+ if (!this.tableCacheOption.cols.includes(item.title)) {
504
+ /** @type {?} */
505
+ let nodeItem = new TreeGrid();
506
+ nodeItem.title = item.title;
507
+ nodeItem.key = item.title;
508
+ nodeItem.disabled = item.fixed ? true : false;
509
+ nodeItem.checked = false;
510
+ temporaryNodeList.push(nodeItem);
511
+ }
512
+ }));
513
+ return temporaryNodeList;
514
+ }
515
+ /**
516
+ * @return {?}
517
+ */
518
+ dealCols() {
519
+ if (!this.tableCols[0].minWidth) {
520
+ this.tableCols.forEach((/**
521
+ * @param {?} item
522
+ * @return {?}
523
+ */
524
+ item => {
525
+ /** @type {?} */
526
+ const span = document.createElement('span');
527
+ span.style.visibility = 'hidden';
528
+ span.style.position = 'absolute';
529
+ span.style.whiteSpace = 'nowrap';
530
+ span.style.fontSize = '12px';
531
+ span.style.display = 'inline-block'; // 将样式修改为 inline-block
532
+ span.innerText = item.title;
533
+ document.body.appendChild(span);
534
+ item.minWidth = span.offsetWidth + 16;
535
+ span.style.display = 'none';
536
+ document.body.removeChild(span);
537
+ }));
538
+ }
539
+ // 处理左右吸附的数据在数组中的位置
540
+ /** @type {?} */
541
+ const leftFixedCols = this.tableCols.filter((/**
542
+ * @param {?} col
543
+ * @return {?}
544
+ */
545
+ col => col.fixed === 'left'));
546
+ /** @type {?} */
547
+ const rightFixedCols = this.tableCols.filter((/**
548
+ * @param {?} col
549
+ * @return {?}
550
+ */
551
+ col => col.fixed === 'right'));
552
+ /** @type {?} */
553
+ const normalCols = this.tableCols.filter((/**
554
+ * @param {?} col
555
+ * @return {?}
556
+ */
557
+ col => !col.fixed));
558
+ /** @type {?} */
559
+ const resultCols = leftFixedCols.concat(normalCols).concat(rightFixedCols);
560
+ this.tableCols = resultCols;
561
+ if (!this.tableColsCache || this.tableColsCache.length === 0) {
562
+ // 缓存一下表格的数据
563
+ this.tableColsCache = [...this.tableCols];
564
+ }
565
+ }
566
+ /**
567
+ * @return {?}
568
+ */
569
+ saveTableCacheOption() {
570
+ this.localforage.setItem('hd-table_' + this.userSession.userCode + '_' + this.localtionTmp + '_' + this.uuid, this.tableCacheOption);
571
+ }
572
+ /**
573
+ * @return {?}
574
+ */
575
+ judgeRepeatCols() {
576
+ for (let i = 0; i < this.tableCols.length; i++) {
577
+ for (let j = i + 1; j < this.tableCols.length; j++) {
578
+ if (this.tableCols[i].title === this.tableCols[j].title) {
579
+ throw `hd-table组件中列名 ${this.tableCols[i].title} 重复`;
580
+ }
581
+ }
582
+ }
583
+ return true;
584
+ }
585
+ /**
586
+ * @param {?} __0
587
+ * @param {?} col
588
+ * @return {?}
589
+ */
590
+ onResize({ width }, col) {
591
+ /** @type {?} */
592
+ let tempWidth = 0;
593
+ if (width > col.minWidth) {
594
+ tempWidth = width;
595
+ }
596
+ else {
597
+ tempWidth = col.minWidth;
598
+ }
599
+ this.tableCacheOption.colWidths.set(col.title, tempWidth);
600
+ this.saveTableCacheOption();
601
+ this.tableCols = this.tableCols.map((/**
602
+ * @param {?} e
603
+ * @return {?}
604
+ */
605
+ e => (e.title === col.title ? Object.assign({}, e, { width: tempWidth }) : e)));
606
+ this.dealScroll();
607
+ }
608
+ /**
609
+ * @return {?}
610
+ */
611
+ dealOperateBtn() {
612
+ /** @type {?} */
613
+ let operateCol = this.tableCols.find((/**
614
+ * @param {?} col
615
+ * @return {?}
616
+ */
617
+ col => col.title === '操作')) || null;
618
+ if (operateCol) {
619
+ /** @type {?} */
620
+ let textStr = '';
621
+ operateCol.btnList.forEach((/**
622
+ * @param {?} btn
623
+ * @return {?}
624
+ */
625
+ btn => {
626
+ if (!btn.isRepeat) {
627
+ textStr += btn.name;
628
+ }
629
+ }));
630
+ /** @type {?} */
631
+ const span = document.createElement('a');
632
+ span.style.visibility = 'hidden';
633
+ span.style.position = 'absolute';
634
+ span.style.whiteSpace = 'nowrap';
635
+ span.style.fontSize = '12px';
636
+ span.style.display = 'inline-block'; // 将样式修改为 inline-block
637
+ span.innerText = textStr;
638
+ document.body.appendChild(span);
639
+ operateCol.width = span.offsetWidth + (operateCol.btnList.filter((/**
640
+ * @param {?} item
641
+ * @return {?}
642
+ */
643
+ item => !item.isRepeat)).length - 1) * 4 + 16;
644
+ span.style.display = 'none';
645
+ document.body.removeChild(span);
646
+ }
647
+ }
648
+ /**
649
+ * @param {?} fn
650
+ * @param {?} event
651
+ * @return {?}
652
+ */
653
+ triggerEvent(fn, event) {
654
+ if (fn) {
655
+ fn(event);
656
+ }
657
+ }
658
+ /**
659
+ * @return {?}
660
+ */
661
+ dealScroll() {
662
+ /** @type {?} */
663
+ let colWidth = 0;
664
+ if (this.showSelected) {
665
+ colWidth += 40;
666
+ }
667
+ this.tableCols.forEach((/**
668
+ * @param {?} item
669
+ * @return {?}
670
+ */
671
+ item => {
672
+ if (!item.width) {
673
+ item.width = ColWidth.fixColWidth;
674
+ }
675
+ if (item.isShow) {
676
+ item.fixedWidth = colWidth;
677
+ colWidth += item.width;
678
+ }
679
+ }));
680
+ if (this.tableTotal) {
681
+ this.scroll = {
682
+ x: '1px',
683
+ y: 'calc(100vh - 180px)'
684
+ };
685
+ }
686
+ else {
687
+ this.scroll = {
688
+ x: '1px',
689
+ y: 'calc(100vh - 140px)'
690
+ };
691
+ }
692
+ }
693
+ /**
694
+ * @param {?} text
695
+ * @param {?} maxWidth
696
+ * @return {?}
697
+ */
698
+ isTextOverflow(text, maxWidth) {
699
+ /** @type {?} */
700
+ const cachedWidth = this.textWidthCache[text];
701
+ if (cachedWidth !== undefined) {
702
+ return cachedWidth + 15 >= maxWidth;
703
+ }
704
+ /** @type {?} */
705
+ const span = document.createElement('span');
706
+ span.style.visibility = 'hidden';
707
+ span.style.position = 'absolute';
708
+ span.style.whiteSpace = 'nowrap';
709
+ span.style.fontSize = '12px';
710
+ span.style.display = 'inline-block'; // 将样式修改为 inline-block
711
+ span.innerText = text;
712
+ document.body.appendChild(span);
713
+ /** @type {?} */
714
+ const isOverflow = span.offsetWidth + 15 >= maxWidth;
715
+ this.textWidthCache[text] = span.offsetWidth;
716
+ span.style.display = 'none';
717
+ document.body.removeChild(span);
718
+ return isOverflow;
719
+ }
720
+ // 表格勾选逻辑
721
+ /**
722
+ * @param {?} $event
723
+ * @return {?}
724
+ */
725
+ currentPageDataChange($event) {
726
+ this.listOfDisplayData = $event;
727
+ this.refreshStatus();
728
+ this.resetStatus();
729
+ }
730
+ /**
731
+ * @param {?} reset
732
+ * @return {?}
733
+ */
734
+ search(reset) {
735
+ this.tableCacheOption.pageSize = this.tablePageSize;
736
+ this.saveTableCacheOption();
737
+ if (reset) {
738
+ this.tablePageSizeChange.emit(this.tablePageSize);
739
+ }
740
+ else {
741
+ this.tablePageIndexChange.emit(this.tablePageIndex);
742
+ // 触发父组件查询事件
743
+ this.tableSearchEvent.emit(reset);
744
+ }
745
+ }
746
+ /**
747
+ * @return {?}
748
+ */
749
+ resetStatus() {
750
+ this.isAllDisplayDataChecked = false;
751
+ this.isIndeterminate = false;
752
+ this.mapOfCheckedId = {};
753
+ this.mapOfCheckList = {};
754
+ this.selectEvent.emit([]);
755
+ }
756
+ /**
757
+ * @param {?=} event
758
+ * @param {?=} data
759
+ * @return {?}
760
+ */
761
+ refreshStatus(event = false, data = null) {
762
+ if (event && data) {
763
+ !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);
764
+ }
765
+ else if (!event && data) {
766
+ this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];
767
+ }
768
+ this.isAllDisplayDataChecked = this.listOfDisplayData.every((/**
769
+ * @param {?} item
770
+ * @return {?}
771
+ */
772
+ item => this.mapOfCheckedId[item[this.selectField]]));
773
+ this.isIndeterminate =
774
+ this.listOfDisplayData.some((/**
775
+ * @param {?} item
776
+ * @return {?}
777
+ */
778
+ item => this.mapOfCheckedId[item[this.selectField]])) && !this.isAllDisplayDataChecked;
779
+ // 触发select事件
780
+ if (this.selectEvent) {
781
+ /** @type {?} */
782
+ const selectedList = Object.values(this.mapOfCheckList);
783
+ this.selectEvent.emit(selectedList);
784
+ }
785
+ // 如果数据为空,则清空勾选标识
786
+ if (this.tableData.content.length === 0) {
787
+ this.isAllDisplayDataChecked = false;
788
+ }
789
+ }
790
+ /**
791
+ * @param {?} value
792
+ * @return {?}
793
+ */
794
+ checkAll(value) {
795
+ this.listOfDisplayData.forEach((/**
796
+ * @param {?} item
797
+ * @return {?}
798
+ */
799
+ item => {
800
+ if (value) {
801
+ !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);
802
+ }
803
+ else {
804
+ this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];
805
+ }
806
+ this.mapOfCheckedId[item[this.selectField]] = value;
807
+ }));
808
+ this.refreshStatus();
809
+ }
810
+ /**
811
+ * @param {?} str
812
+ * @return {?}
813
+ */
814
+ judgeColEmpty(str) {
815
+ if (str || str === 0) {
816
+ return str;
817
+ }
818
+ else {
819
+ return '<空>';
820
+ }
821
+ }
822
+ }
823
+ HdTableComponent.decorators = [
824
+ { type: Component, args: [{
825
+ selector: 'hd-table',
826
+ template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"showDetail = !showDetail\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <hd-button type=\"primary\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\" (clickAction)=\"confirmDropdown()\"\n [nzVisible]=\"isDropdownVisible\">\u8BBE\u7F6E\u5217</hd-button>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div style=\"max-height: 400px;overflow-y: scroll;\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div style=\"text-align: right;background: #fff;padding: 4px;\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </nz-dropdown-menu>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [nzScroll]=\"scroll\" nzShowSizeChanger\n nzShowSizeChanger nzShowQuickJumper nzFrontPagination=\"false\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"tableData.totalElements\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200 ]\" [(nzPageSize)]=\"tablePageSize\" (nzPageSizeChange)=\"search(true)\"\n (nzPageIndexChange)=\"search(false)\" (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\">\n {{ col.title }}\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of hdTable.data;index as i\">\n <td nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"mapOfCheckedId[data[selectField]]\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngFor=\"let col of tableCols\">\n <td *ngIf=\"col.isShow\" [ngStyle]=\"{'max-width': col.width + 'px'}\" [nzAlign]=\"col.align\"\n [nzLeft]=\"col.fixed === 'left' ? col.fixedWidth + 'px' : null\"\n [nzRight]=\"col.fixed === 'right' ? 0 + 'px' : null\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!btn.showConfirm;else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ btn.name }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"btn.name === '\u5220\u9664' ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + btn.name + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n btn.name }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"col.name === 'state';else otherTemplate\">\n <hd-status [status]=\"data['state']\">{{ judgeColEmpty(col.render ? col.render(data) : data['state'])}}\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click;else noClickTemplate\">\n <ng-container\n *ngIf=\"!isTextOverflow(col.render ? col.render(data) : data[col.name], col.width);else overflowTemplate\">\n <a [ngStyle]=\"{'color': col?.color ? col.color : null}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ judgeColEmpty(col.render ? col.render(data) :\n data[col.name])}}</a>\n </ng-container>\n <ng-template #overflowTemplate>\n <a [ngStyle]=\"{'color': col?.color ? col.color : null}\" nz-tooltip\n [nzTooltipTitle]=\"col.render ? col.render(data) : data[col.name]\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ judgeColEmpty(col.render ? col.render(data) :\n data[col.name])}}</a>\n </ng-template>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(col.render ? col.render(data) : data[col.name], col.width);else overflowTemplate\">\n <span [ngStyle]=\"{'color': col?.color ? col.color : null}\">{{ judgeColEmpty(col.render ?\n col.render(data) :\n data[col.name])}}</span>\n </ng-container>\n <ng-template #overflowTemplate>\n <span [ngStyle]=\"{'color': col?.color ? col.color : null}\" nz-tooltip\n [nzTooltipTitle]=\"col.render ? col.render(data) : data[col.name]\">\n {{ judgeColEmpty(col.render ? col.render(data) : data[col.name])}}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n <!-- \u5408\u8BA1\u6240\u6709\u6570\u636E\u533A\u57DF \u9700\u8981\u540E\u7AEF\u63A5\u53E3\u914D\u5408 -->\n <tr *ngIf=\"showTableTotal\" class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let tableTotalOption of tableTotalOptionList\">\n <td>{{ tableTotalOption }}</td>\n </ng-container>\n </tr>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{tableData.totalElements}} \u6761\u6570\u636E\n </ng-template>\n </nz-table>\n</ng-container>",
827
+ styles: ["::ng-deep .common-btn-group>a{font-size:12px;font-weight:400;color:#12a34f!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e}::ng-deep .ant-input-number-input{height:28px}::ng-deep .ant-input-number{height:28px}textarea.ant-input{height:auto;min-height:28px}::ng-deep .ant-select-selection--multiple{min-height:28px}::ng-deep .ant-select-selection__rendered>ul>li{height:22px!important;margin-top:3px!important;line-height:22px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:28px!important}::ng-deep .ant-input{height:28px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:28px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:12px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:12px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-time-picker{width:100%}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .hd-table-total>td{border:0!important}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}"]
828
+ }] }
829
+ ];
830
+ /** @nocollapse */
831
+ HdTableComponent.ctorParameters = () => [
832
+ { type: ChangeDetectorRef },
833
+ { type: CommonSessionService }
834
+ ];
835
+ HdTableComponent.propDecorators = {
836
+ uuid: [{ type: Input }],
837
+ tableCols: [{ type: Input }],
838
+ tableData: [{ type: Input }],
839
+ showSelected: [{ type: Input }],
840
+ showOperateColWarpButton: [{ type: Input }],
841
+ selectField: [{ type: Input }],
842
+ showTableTotal: [{ type: Input }],
843
+ tableTotalOption: [{ type: Input }],
844
+ sortEvent: [{ type: Output }],
845
+ selectEvent: [{ type: Output }],
846
+ tableSearchEvent: [{ type: Output }],
847
+ tableLoading: [{ type: Input }],
848
+ tablePageIndex: [{ type: Input }],
849
+ tablePageSize: [{ type: Input }],
850
+ tablePageIndexChange: [{ type: Output }],
851
+ tablePageSizeChange: [{ type: Output }],
852
+ tableTotal: [{ type: ContentChild, args: ["tableTotal", { static: false },] }],
853
+ tableLeftButton: [{ type: ContentChild, args: ["tableLeftButton", { static: false },] }],
854
+ tableRightButton: [{ type: ContentChild, args: ["tableRightButton", { static: false },] }]
855
+ };
856
+ tslib_1.__decorate([
857
+ InputBoolean(),
858
+ tslib_1.__metadata("design:type", Boolean)
859
+ ], HdTableComponent.prototype, "showSelected", void 0);
860
+ tslib_1.__decorate([
861
+ InputBoolean(),
862
+ tslib_1.__metadata("design:type", Boolean)
863
+ ], HdTableComponent.prototype, "showOperateColWarpButton", void 0);
864
+ tslib_1.__decorate([
865
+ InputBoolean(),
866
+ tslib_1.__metadata("design:type", Boolean)
867
+ ], HdTableComponent.prototype, "showTableTotal", void 0);
868
+ if (false) {
869
+ /** @type {?} */
870
+ HdTableComponent.prototype.uuid;
871
+ /** @type {?} */
872
+ HdTableComponent.prototype.tableCols;
873
+ /** @type {?} */
874
+ HdTableComponent.prototype.tableData;
875
+ /** @type {?} */
876
+ HdTableComponent.prototype.showSelected;
877
+ /** @type {?} */
878
+ HdTableComponent.prototype.showOperateColWarpButton;
879
+ /** @type {?} */
880
+ HdTableComponent.prototype.selectField;
881
+ /** @type {?} */
882
+ HdTableComponent.prototype.showTableTotal;
883
+ /** @type {?} */
884
+ HdTableComponent.prototype.tableTotalOption;
885
+ /** @type {?} */
886
+ HdTableComponent.prototype.sortEvent;
887
+ /** @type {?} */
888
+ HdTableComponent.prototype.selectEvent;
889
+ /** @type {?} */
890
+ HdTableComponent.prototype.tableSearchEvent;
891
+ /** @type {?} */
892
+ HdTableComponent.prototype.tableLoading;
893
+ /** @type {?} */
894
+ HdTableComponent.prototype.tablePageIndex;
895
+ /** @type {?} */
896
+ HdTableComponent.prototype.tablePageSize;
897
+ /** @type {?} */
898
+ HdTableComponent.prototype.tablePageIndexChange;
899
+ /** @type {?} */
900
+ HdTableComponent.prototype.tablePageSizeChange;
901
+ /** @type {?} */
902
+ HdTableComponent.prototype.tableTotal;
903
+ /** @type {?} */
904
+ HdTableComponent.prototype.tableLeftButton;
905
+ /** @type {?} */
906
+ HdTableComponent.prototype.tableRightButton;
907
+ /** @type {?} */
908
+ HdTableComponent.prototype.scroll;
909
+ /** @type {?} */
910
+ HdTableComponent.prototype.isAllDisplayDataChecked;
911
+ /** @type {?} */
912
+ HdTableComponent.prototype.isIndeterminate;
913
+ /** @type {?} */
914
+ HdTableComponent.prototype.listOfDisplayData;
915
+ /** @type {?} */
916
+ HdTableComponent.prototype.listOfAllData;
917
+ /** @type {?} */
918
+ HdTableComponent.prototype.listOfSelection;
919
+ /** @type {?} */
920
+ HdTableComponent.prototype.mapOfCheckedId;
921
+ /** @type {?} */
922
+ HdTableComponent.prototype.mapOfCheckList;
923
+ /** @type {?} */
924
+ HdTableComponent.prototype.tableTotalOptionList;
925
+ /**
926
+ * @type {?}
927
+ * @private
928
+ */
929
+ HdTableComponent.prototype.textWidthCache;
930
+ /** @type {?} */
931
+ HdTableComponent.prototype.tableCacheOption;
932
+ /** @type {?} */
933
+ HdTableComponent.prototype.userSession;
934
+ /** @type {?} */
935
+ HdTableComponent.prototype.tableColsCache;
936
+ /** @type {?} */
937
+ HdTableComponent.prototype.showTable;
938
+ /** @type {?} */
939
+ HdTableComponent.prototype.selectColListNodes;
940
+ /** @type {?} */
941
+ HdTableComponent.prototype.selectColListNodesCache;
942
+ /** @type {?} */
943
+ HdTableComponent.prototype.showListNodes;
944
+ /** @type {?} */
945
+ HdTableComponent.prototype.isDropdownVisible;
946
+ /** @type {?} */
947
+ HdTableComponent.prototype.nowListNodes;
948
+ /** @type {?} */
949
+ HdTableComponent.prototype.hideListNodes;
950
+ /** @type {?} */
951
+ HdTableComponent.prototype.cancelNowListNodes;
952
+ /** @type {?} */
953
+ HdTableComponent.prototype.cancelHideListNodes;
954
+ /** @type {?} */
955
+ HdTableComponent.prototype.showDetail;
956
+ /** @type {?} */
957
+ HdTableComponent.prototype.localforage;
958
+ /** @type {?} */
959
+ HdTableComponent.prototype.localtionTmp;
960
+ /** @type {?} */
961
+ HdTableComponent.prototype.beforeDrop;
962
+ /**
963
+ * @type {?}
964
+ * @private
965
+ */
966
+ HdTableComponent.prototype.cdr;
967
+ /**
968
+ * @type {?}
969
+ * @private
970
+ */
971
+ HdTableComponent.prototype.commonSessionService;
972
+ }
973
973
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWdCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSSxPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUE4QyxNQUFNLG9CQUFvQixDQUFDO0FBRTlGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1uRyxNQUFNLE9BQU8sZ0JBQWdCOzs7OztJQTBEM0IsWUFDVSxHQUFzQixFQUN0QixvQkFBMEM7UUFEMUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQTFEM0MsY0FBUyxHQUF5QixFQUFFLENBQUM7UUFFckIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsNkJBQXdCLEdBQVksS0FBSyxDQUFDO1FBQzFELGdCQUFXLEdBQVcsWUFBWSxDQUFDOztRQUVuQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUUvQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztR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RCxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOztBQWpCMUI7SUFBZixZQUFZLEVBQUU7O3NEQUErQjtBQUM5QjtJQUFmLFlBQVksRUFBRTs7a0VBQTJDO0FBRzFDO0lBQWYsWUFBWSxFQUFFOzt3REFBaUM7OztJQVB6RCxnQ0FBc0I7O0lBQ3RCLHFDQUE4Qzs7SUFDOUMscUNBQThCOztJQUM5Qix3Q0FBdUQ7O0lBQ3ZELG9EQUFtRTs7SUFDbkUsdUNBQTRDOztJQUU1QywwQ0FBeUQ7O0lBQ3pELDRDQUFxRDs7SUFDckQscUNBQXlDOztJQUN6Qyx1Q0FBMkM7O0lBQzNDLDRDQUFnRDs7SUFDaEQsd0NBQXVDOztJQUV2QywwQ0FBb0M7O0lBQ3BDLHlDQUErQjs7SUFDL0IsZ0RBQXlEOztJQUN6RCwrQ0FBd0Q7O0lBQ3hELHNDQUE0RTs7SUFDNUUsMkNBQXNGOztJQUN0Riw0Q0FBd0Y7O0lBQ3hGLGtDQUFjOztJQUdkLG1EQUFnQzs7SUFDaEMsMkNBQXdCOztJQUN4Qiw2Q0FBdUI7O0lBQ3ZCLHlDQUFtQjs7SUFDbkIsMkNBQWdEOztJQUNoRCwwQ0FBaUQ7O0lBQ2pELDBDQUE2Qzs7SUFFN0MsZ0RBQTBCOzs7OztJQUMxQiwwQ0FBd0Q7O0lBRXhELDRDQUE0RDs7SUFDNUQsdUNBQWlCOztJQUVqQiwwQ0FBMEM7O0lBQzFDLHFDQUEyQjs7SUFDM0IsOENBQXlDOztJQUN6QyxtREFBOEM7O0lBQzlDLHlDQUErQjs7SUFFL0IsNkNBQW1DOztJQUVuQyx3Q0FBbUM7O0lBRW5DLHlDQUFvQzs7SUFHcEMsOENBQXlDOztJQUN6QywrQ0FBMEM7O0lBQzFDLHNDQUE0Qjs7SUFDNUIsdUNBQXdCOztJQUN4Qix3Q0FBMEI7O0lBbU4xQixzQ0FvQkU7Ozs7O0lBcE9BLCtCQUE4Qjs7Ozs7SUFDOUIsZ0RBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbG9jYWxmb3JhZ2UgZnJvbSAnbG9jYWxmb3JhZ2UnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBOekZvcm1hdEJlZm9yZURyb3BFdmVudCwgTnpGb3JtYXRFbWl0RXZlbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUnO1xuaW1wb3J0IHsgTnpSZXNpemVFdmVudCB9IGZyb20gJ25nLXpvcnJvLWFudGQvcmVzaXphYmxlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbFdpZHRoIH0gZnJvbSAnLi4vbW9kZWwvY29sV2lkdGgnO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gJy4uL21vZGVsL2NvbW1vbi10eXBlJztcbmltcG9ydCB7IENvbW1vblNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEhkVGFibGVDb2x1bW4sIEhkVGFibGVUb3RhbE9wdGlvbiwgVGFibGVDYWNoZU9wdGlvbiwgVHJlZUdyaWQgfSBmcm9tICcuL2hkLXRhYmxlLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGQtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9oZC10YWJsZS5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEhkVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRhYmxlQ29sczogQXJyYXk8SGRUYWJsZUNvbHVtbj4gPSBbXTtcbiAgQElucHV0KCkgdGFibGVEYXRhOiBQYWdlPGFueT47XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dPcGVyYXRlQ29sV2FycEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3RGaWVsZDogc3RyaW5nID0gJ2JpbGxOdW1iZXInO1xuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PEhkVGFibGVUb3RhbE9wdGlvbj47XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRhYmxlU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHRhYmxlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDooajmoLzliIbpobXlj4LmlbBcbiAgQElucHV0KCkgdGFibGVQYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIHRhYmxlUGFnZVNpemU6IG51bWJlcjtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVRvdGFsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZVRvdGFsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZUxlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVJpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZVJpZ2h0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGwgPSBudWxsO1xuXG4gIC8vIOihqOagvOWLvumAieWPguaVsFxuICBpc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICBpc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgbGlzdE9mRGlzcGxheURhdGEgPSBbXTtcbiAgbGlzdE9mQWxsRGF0YSA9IFtdO1xuICBsaXN0T2ZTZWxlY3Rpb246IEFycmF5PGFueT4gfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgbWFwT2ZDaGVja2VkSWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbjsgfSA9IHt9O1xuICBtYXBPZkNoZWNrTGlzdDogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gPSB7fTtcbiAgLy8g5ZCI6K6h5Y+C5pWwXG4gIHRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gIHByaXZhdGUgdGV4dFdpZHRoQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyOyB9ID0ge307XG4gIC8vIOe8k+WtmOS/oeaBr1xuICB0YWJsZUNhY2hlT3B0aW9uOiBUYWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgdXNlclNlc3Npb246IGFueTtcblxuICB0YWJsZUNvbHNDYWNoZTogQXJyYXk8SGRUYWJsZUNvbHVtbj4gPSBbXTtcbiAgc2hvd1RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdENvbExpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNlbGVjdENvbExpc3ROb2Rlc0NhY2hlOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0xpc3ROb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzRHJvcGRvd25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOiuvue9ruWIl+eahOWPr+ingeaTjeS9nOaVsOe7hFxuICBub3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAvLyDorr7nva7liJfnmoTkuI3lj6/op4Hmk43kvZzmlbDnu4RcbiAgaGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG5cbiAgLy8g54K55Ye75pe26ZyA6KaB5pyJ5Li05pe25pWw57uE5a2Y5pS+5Lik5LiqdHJlZSznlKjkuo7lj5bmtojml7blgJnmgaLlpI3osIPmlbTliY3nmoTnirbmgIFcbiAgY2FuY2VsTm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsSGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbG9jYWxmb3JhZ2U6IGFueSA9IG51bGw7XG4gIGxvY2FsdGlvblRtcDogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY29tbW9uU2Vzc2lvblNlcnZpY2U6IENvbW1vblNlc3Npb25TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6ICdoZC1mc2NtJywgLy8g6K6+572u5a2Y5YKo5bqT55qE5ZCN56ewXG4gICAgICB2ZXJzaW9uOiAxLjAsIC8vIOiuvue9ruWtmOWCqOW6k+eahOeJiOacrFxuICAgICAgc3RvcmVOYW1lOiAnaGQtZnNjbS1zdG9yZScsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWtmOWCqOepuumXtOWQjeensFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbHRpb25UbXAgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodGhpcy5sb2NhbHRpb25UbXApIHtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wID0gdGhpcy5sb2NhbHRpb25UbXAucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcbiAgICB9XG4gICAgdGhpcy51c2VyU2Vzc2lvbiA9IHRoaXMuY29tbW9uU2Vzc2lvblNlcnZpY2UuZ2V0U2Vzc2lvbignX19qeV9hdXRob3JpemF0aW9uX3Nlc3Npb25fXycpO1xuICAgIC8vIOeUqOS6juW8gOWPkeeOr+Wig+iwg+ivlVxuICAgIGlmICghdGhpcy51c2VyU2Vzc2lvbikge1xuICAgICAgdGhpcy51c2VyU2Vzc2lvbiA9IHtcbiAgICAgICAgdXNlckNvZGU6ICdkZXYnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8IHRoaXMudGFibGVDb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9jYWxmb3JhZ2UucmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAxJywgZSk7XG4gICAgICB0aHJvdyAnbG9jYWxmb3JhZ2XliqDovb3lvILluLgnO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlKSB7XG4gICAgLy8g5pWw5o2u5pS55Y+Y5pe277yM6YeN572u5Yu+6YCJ54q25oCBXG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlc1sndGFibGVEYXRhJ10gJiYgY2hhbmdlc1sndGFibGVEYXRhJ11bJ2N1cnJlbnRWYWx1ZSddICYmIGNoYW5nZXNbJ3RhYmxlRGF0YSddWydwcmV2aW91c1ZhbHVlJ10pIHtcbiAgICAgIGlmIChjaGFuZ2VzWyd0YWJsZURhdGEnXVsnY3VycmVudFZhbHVlJ11bJ3BhZ2VTaXplJ10gIT09IGNoYW5nZXNbJ3RhYmxlRGF0YSddWydwcmV2aW91c1ZhbHVlJ11bJ3BhZ2VTaXplJ11cbiAgICAgICAgfHwgY2hhbmdlc1sndGFibGVEYXRhJ11bJ2N1cnJlbnRWYWx1ZSddWydwYWdlTnVtYmVyJ10gIT09IGNoYW5nZXNbJ3RhYmxlRGF0YSddWydwcmV2aW91c1ZhbHVlJ11bJ3BhZ2VOdW1iZXInXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3RhYmxlQ29scyddICYmIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3RhYmxlQ29scyddLmN1cnJlbnRWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3RhYmxlQ29scyddLnByZXZpb3VzVmFsdWUpKSB7XG4gICAgICB0aGlzLmRlbGV0ZUhpZGVJdGVtKCk7XG4gICAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8IHRoaXMudGFibGVDb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvY2FsZm9yYWdlLnJlYWR5KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnbG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMicsIGUpO1xuICAgICAgICB0aHJvdyAnbG9jYWxmb3JhZ2XliqDovb3lvILluLgnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIC8vIOWmguaenOWvueixoeayoeaciSBpc1Nob3cg5bGe5oCn77yM5YiZ6buY6K6k5Li6IHRydWXvvIzkv53nlZnor6Xlr7nosaFcbiAgICAgIGlmICghaXRlbS5oYXNPd25Qcm9wZXJ0eSgnaXNTaG93JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyDlpoLmnpzlr7nosaHmnIkgaXNTaG93IOWxnuaAp++8jOWImeajgOafpeWFtuWAvOaYr+WQpuS4uiB0cnVlXG4gICAgICByZXR1cm4gaXRlbS5pc1Nob3cgPT09IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBzb3J0KHNvcnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IH0pIHtcbiAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICB9XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2UuZ2V0SXRlbSgnaGQtdGFibGVfJyArIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgKyAnXycgKyB0aGlzLmxvY2FsdGlvblRtcCArICdfJyArIHRoaXMudXVpZCkudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPiAxMCkge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemUgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemUgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgfHwgMTA7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpIHtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplID0gMTA7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSAxMDtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0VGFibGUoKSB7XG4gICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhyb3cgJ2hkLXRhYmxl57y65aSxdXVpZOWPguaVsO+8jOivt+S9v+eUqOe8lui+keWZqOaPkuS7tueUn+aIkOW5tue7mWhkLXRhYmxl6LWL5LqIdXVpZOWxnuaApyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmp1ZGdlUmVwZWF0Q29scygpKSB7XG4gICAgICB0aGlzLmRlYWxDb2xzKCk7XG4gICAgICB0aGlzLnNldENvbHMoKTtcbiAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgdGhpcy5kZWFsT3BlcmF0ZUJ0bigpO1xuICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOiuvue9ruWIl+eCueWHu+WPlua2iFxuICBjYW5jZWxEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMpKTtcbiAgfVxuXG4gIC8vIOeCueWHu+inpuWPkeiuvue9ruWIl1xuICBjb25maXJtRHJvcGRvd24oKTogdm9pZCB7XG4gICAgLy8g5Li05pe25a2Y5pS+5LiL77yM5Y+W5raI55qE5pe25YCZ5oGi5aSN5Y6f5p2l55qE54q25oCBICAg5rex5ou36LSd5LiL5a+56LGh5pWw57uEXG4gICAgdGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ub3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIHN1Ym1pdEdyaWRzKCkge1xuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzID0gW107XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLnB1c2goaXRlbS50aXRsZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8g5LuO57yT5a2Y6K6+572u5YiXXG4gIHNldENvbHMoKSB7XG4gICAgdGhpcy5zaG93TGlzdE5vZGVzID0gZmFsc2U7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBbXTtcbiAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMpIHtcbiAgICAgIGxldCB7IG5vdEluY29scywgaW5jb2xzIH0gPSB0aGlzLnRhYmxlQ29sc0NhY2hlLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhpdGVtLnRpdGxlKSkge1xuICAgICAgICAgIGFjYy5pbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2Mubm90SW5jb2xzLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHsgbm90SW5jb2xzOiBbXSwgaW5jb2xzOiBbXSB9KTtcbiAgICAgIGluY29scy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGEudGl0bGUpIC0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5kZXhPZihiLnRpdGxlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNvbHMgPSBpbmNvbHMuY29uY2F0KG5vdEluY29scyk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scykge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5pc1Nob3cpIHtcbiAgICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSkgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOiwg+aVtOWIl+WuveS4uue8k+WtmOWuveW6plxuICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLnNpemUgIT09IDApIHtcbiAgICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5oYXMoY29sLnRpdGxlKSkge1xuICAgICAgICAgIGNvbC53aWR0aCA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuZ2V0KGNvbC50aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0xpc3ROb2RlcyA9IHRydWU7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyDmi5bmi73mk43kvZxcbiAgYmVmb3JlRHJvcCA9IChhcmc6IE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50KTogT2JzZXJ2YWJsZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKGFyZy5ub2RlLm9yaWdpbi5kaXNhYmxlZCB8fCAhYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkIHx8IGFyZy5wb3MgPT09IDApIHtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBub2RlOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgbm9kZS5jaGVja2VkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkO1xuICAgICAgbm9kZS5kaXNhYmxlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uZGlzYWJsZWQ7XG4gICAgICBub2RlLmV4cGFuZGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5leHBhbmRlZDtcbiAgICAgIG5vZGUuaXNMZWFmID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5pc0xlYWY7XG4gICAgICBub2RlLmtleSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4ua2V5O1xuICAgICAgbm9kZS5zZWxlY3RhYmxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5zZWxlY3RhYmxlO1xuICAgICAgbm9kZS50aXRsZSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICAvLyDmi5bmi73lhYPntKDkuIvmoIdcbiAgICAgIGxldCBkcmFnTm9kZUluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KGl0ZW0gPT4geyByZXR1cm4gaXRlbS50aXRsZSA9PSBhcmcuZHJhZ05vZGUub3JpZ2luLnRpdGxlOyB9KTtcbiAgICAgIC8vIOebruagh+S9jee9rueahOS4i+agh1xuICAgICAgbGV0IG5vZGVJbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleChpdGVtID0+IHsgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLm5vZGUub3JpZ2luLnRpdGxlOyB9KSArIChhcmcucG9zID09PSAtMSA/IDAgOiBhcmcucG9zKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShub2RlSW5kZXgsIDAsIG5vZGUpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuc3BsaWNlKG5vZGVJbmRleCA+PSBkcmFnTm9kZUluZGV4ID8gZHJhZ05vZGVJbmRleCA6IGRyYWdOb2RlSW5kZXggKyAxLCAxKTtcbiAgICAgIHJldHVybiBvZih0cnVlKS5waXBlKGRlbGF5KDEwMCkpO1xuICAgIH1cbiAgfTtcblxuICBtb3ZlRWxlbWVudE5lYXJieShhcnIsIGVsZW1lbnRUb01vdmVUaXRsZSwgdGFyZ2V0RWxlbWVudFRpdGxlLCBwb3MpIHtcbiAgICBjb25zdCB0bXBBcnJheSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0bXBBcnJheS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlID09PSB0YXJnZXRFbGVtZW50VGl0bGUpO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChpdGVtID0+IGl0ZW0udGl0bGUgPT09IGVsZW1lbnRUb01vdmVUaXRsZSk7XG4gICAgY29uc3QgbmV3SW5kZXggPSBwb3MgPCAwID8gKHRhcmdldEluZGV4ICsgcG9zKSA6IHRhcmdldEluZGV4O1xuICAgIC8vIOenu+mZpOebruagh+WFg+e0oO+8jOW5tuaPkuWFpeWIsOaWsOeahOS9jee9rlxuICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50ID0gdG1wQXJyYXkuc3BsaWNlKGVsZW1lbnRJbmRleCwgMSk7XG4gICAgdG1wQXJyYXkuc3BsaWNlKG5ld0luZGV4ICsgMSwgMCwgcmVtb3ZlZEVsZW1lbnRbMF0pO1xuICAgIHJldHVybiB0bXBBcnJheTtcbiAgfVxuXG4gIC8vIOWLvumAieaTjeS9nFxuICBjaGVja0FjdGlvbihldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICAvLyDli77pgInlj6rmnInlnKhoaWRlTGlzdE5vZGVzLOWPlua2iOWLvumAieWPquacieWcqG5vd0xpc3ROb2Rlc1xuICAgIGlmIChldmVudC5ub2RlLm9yaWdpbi5jaGVja2VkKSB7XG4gICAgICBsZXQgbm9kZTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgIG5vZGUgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICAvLyDmib7liLDnrKzkuIDkuKpmaXhlZOWxnuaAp+S4unJpZ2h055qEdGl0bGXvvIzmib7liLDmj5LlhaXlhYPntKDnmoTkvY3nva5cbiAgICAgIGxldCB0aXRsZSA9IG51bGw7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNDYWNoZVtpXS5maXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRpdGxlID0gdGhpcy50YWJsZUNvbHNDYWNoZVtpXS50aXRsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5ub3dMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleChub2RlID0+IG5vZGUudGl0bGUgPT09IHRpdGxlKTtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3Quc3BsaWNlKGluZGV4LCAwLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlICE9PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiAodGhpcy5oaWRlTGlzdE5vZGVzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMpIHtcbiAgICAgIC8vICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5nZXRIaWRlTGlzdE5vZGVzKCk7XG4gICAgICAvLyB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGUpIHtcbiAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgICAgICBpbm5lckl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2goaW5uZXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0ZW1wb3JhcnlOb2RlTGlzdDtcblxuICAgICAgLy8g5Li65LqG6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOmAmui/h+WIneWni+aVsOaNruiOt+WPluaYvuekuueahOWtl+auteWIl+ihqFxuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLm5vd0xpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgIT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8g6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOS7juWIneWni+aVsOaNruiOt+WPlumakOiXj+acquaYvuekuueahOWtl+auteWIl+ihqFxuICBnZXRIaWRlTGlzdE5vZGVzKCk6IEFycmF5PFRyZWVHcmlkPiB7XG4gICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0OiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgICAvLyDku450YWJsZUNvbHNDYWNoZemHjOmdouaJvuayoeacieWcqHN0b3JhZ2Xph4zpnaLlh7rnjrDnmoTlrZfmrrUs57uE5oiQaGlkZUxpc3RcbiAgICB0aGlzLnRhYmxlQ29sc0NhY2hlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgbGV0IG5vZGVJdGVtOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgICBub2RlSXRlbS50aXRsZSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmtleSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmRpc2FibGVkID0gaXRlbS5maXhlZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbm9kZUl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKG5vZGVJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gIH1cblxuICBkZWFsQ29scygpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzWzBdLm1pbldpZHRoKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gJzEycHgnO1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgICAgICBzcGFuLmlubmVyVGV4dCA9IGl0ZW0udGl0bGU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIGl0ZW0ubWluV2lkdGggPSBzcGFuLm9mZnNldFdpZHRoICsgMTY7XG4gICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDlpITnkIblt6blj7PlkLjpmYTnmoTmlbDmja7lnKjmlbDnu4TkuK3nmoTkvY3nva5cbiAgICBjb25zdCBsZWZ0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKGNvbCA9PiBjb2wuZml4ZWQgPT09ICdsZWZ0Jyk7XG4gICAgY29uc3QgcmlnaHRGaXhlZENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoY29sID0+IGNvbC5maXhlZCA9PT0gJ3JpZ2h0Jyk7XG4gICAgY29uc3Qgbm9ybWFsQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcihjb2wgPT4gIWNvbC5maXhlZCk7XG4gICAgY29uc3QgcmVzdWx0Q29scyA9IGxlZnRGaXhlZENvbHMuY29uY2F0KG5vcm1hbENvbHMpLmNvbmNhdChyaWdodEZpeGVkQ29scyk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSByZXN1bHRDb2xzO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHNDYWNoZSB8fCB0aGlzLnRhYmxlQ29sc0NhY2hlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8g57yT5a2Y5LiA5LiL6KGo5qC855qE5pWw5o2uXG4gICAgICB0aGlzLnRhYmxlQ29sc0NhY2hlID0gWy4uLnRoaXMudGFibGVDb2xzXTtcbiAgICB9XG4gIH1cblxuICBzYXZlVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlLnNldEl0ZW0oJ2hkLXRhYmxlXycgKyB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICsgJ18nICsgdGhpcy5sb2NhbHRpb25UbXAgKyAnXycgKyB0aGlzLnV1aWQsIHRoaXMudGFibGVDYWNoZU9wdGlvbik7XG4gIH1cblxuICBqdWRnZVJlcGVhdENvbHMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzW2ldLnRpdGxlID09PSB0aGlzLnRhYmxlQ29sc1tqXS50aXRsZSkge1xuICAgICAgICAgIHRocm93IGBoZC10YWJsZee7hOS7tuS4reWIl+WQjSAke3RoaXMudGFibGVDb2xzW2ldLnRpdGxlfSDph43lpI1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25SZXNpemUoeyB3aWR0aCB9OiBOelJlc2l6ZUV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICBsZXQgdGVtcFdpZHRoID0gMDtcbiAgICBpZiAod2lkdGggPiBjb2wubWluV2lkdGgpIHtcbiAgICAgIHRlbXBXaWR0aCA9IHdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wV2lkdGggPSBjb2wubWluV2lkdGg7XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2V0KGNvbC50aXRsZSwgdGVtcFdpZHRoKTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSB0aGlzLnRhYmxlQ29scy5tYXAoZSA9PiAoZS50aXRsZSA9PT0gY29sLnRpdGxlID8geyAuLi5lLCB3aWR0aDogdGVtcFdpZHRoIH0gOiBlKSk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gIH1cblxuICBkZWFsT3BlcmF0ZUJ0bigpIHtcbiAgICBsZXQgb3BlcmF0ZUNvbCA9IHRoaXMudGFibGVDb2xzLmZpbmQoY29sID0+IGNvbC50aXRsZSA9PT0gJ+aTjeS9nCcpIHx8IG51bGw7XG4gICAgaWYgKG9wZXJhdGVDb2wpIHtcbiAgICAgIGxldCB0ZXh0U3RyID0gJyc7XG4gICAgICBvcGVyYXRlQ29sLmJ0bkxpc3QuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBpZiAoIWJ0bi5pc1JlcGVhdCkge1xuICAgICAgICAgIHRleHRTdHIgKz0gYnRuLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JztcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRTdHI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgb3BlcmF0ZUNvbC53aWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGggKyAob3BlcmF0ZUNvbC5idG5MaXN0LmZpbHRlcihpdGVtID0+ICFpdGVtLmlzUmVwZWF0KS5sZW5ndGggLSAxKSAqIDQgKyAxNjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBkZWFsU2Nyb2xsKCkge1xuICAgIGxldCBjb2xXaWR0aCA9IDA7XG4gICAgaWYgKHRoaXMuc2hvd1NlbGVjdGVkKSB7XG4gICAgICBjb2xXaWR0aCArPSA0MDtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbS53aWR0aCkge1xuICAgICAgICBpdGVtLndpZHRoID0gQ29sV2lkdGguZml4Q29sV2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5pc1Nob3cpIHtcbiAgICAgICAgaXRlbS5maXhlZFdpZHRoID0gY29sV2lkdGg7XG4gICAgICAgIGNvbFdpZHRoICs9IGl0ZW0ud2lkdGg7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy50YWJsZVRvdGFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogJzFweCcsXG4gICAgICAgIHk6ICdjYWxjKDEwMHZoIC0gMTgwcHgpJ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICAgIHg6ICcxcHgnLFxuICAgICAgICB5OiAnY2FsYygxMDB2aCAtIDE0MHB4KSdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaXNUZXh0T3ZlcmZsb3codGV4dDogc3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2FjaGVkV2lkdGggPSB0aGlzLnRleHRXaWR0aENhY2hlW3RleHRdO1xuICAgIGlmIChjYWNoZWRXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2lkdGggKyAxNSA+PSBtYXhXaWR0aDtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSAnMTJweCc7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBjb25zdCBpc092ZXJmbG93ID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF0gPSBzcGFuLm9mZnNldFdpZHRoO1xuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIHJldHVybiBpc092ZXJmbG93O1xuICB9XG5cbiAgLy8g6KGo5qC85Yu+6YCJ6YC76L6RXG4gIGN1cnJlbnRQYWdlRGF0YUNoYW5nZSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEgPSAkZXZlbnQ7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgdGhpcy5yZXNldFN0YXR1cygpO1xuICB9XG5cbiAgc2VhcmNoKHJlc2V0OiBib29sZWFuKSB7XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIC8vIOinpuWPkeeItue7hOS7tuafpeivouS6i+S7tlxuICAgICAgdGhpcy50YWJsZVNlYXJjaEV2ZW50LmVtaXQocmVzZXQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0U3RhdHVzKCkge1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KFtdKTtcbiAgfVxuXG4gIHJlZnJlc2hTdGF0dXMoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgIGlmIChldmVudCAmJiBkYXRhKSB7XG4gICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJiAodGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSA9IGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoIWV2ZW50ICYmIGRhdGEpIHtcbiAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gJiYgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgfVxuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmV2ZXJ5KGl0ZW0gPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSk7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPVxuICAgICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5zb21lKGl0ZW0gPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSkgJiYgIXRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQ7XG4gICAgLy8g6Kem5Y+Rc2VsZWN05LqL5Lu2XG4gICAgaWYgKHRoaXMuc2VsZWN0RXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkTGlzdDogQXJyYXk8YW55PiA9IE9iamVjdC52YWx1ZXModGhpcy5tYXBPZkNoZWNrTGlzdCk7XG4gICAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoc2VsZWN0ZWRMaXN0KTtcbiAgICB9XG4gICAgLy8g5aaC5p6c5pWw5o2u5Li656m677yM5YiZ5riF56m65Yu+6YCJ5qCH6K+GXG4gICAgaWYgKHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tBbGwodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgIXRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiYgKHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiYgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgfVxuXG4gIGp1ZGdlQ29sRW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyIHx8IHN0ciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICc856m6Pic7XG4gICAgfVxuICB9XG59XG4iXX0=