fantasy-ngzorro 1.3.29 → 1.3.30

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 (157) hide show
  1. package/bundles/fantasy-ngzorro.umd.js +6035 -6035
  2. package/esm2015/fantasy-ngzorro.js +38 -38
  3. package/esm2015/fantasy-ngzorro.module.js +18 -18
  4. package/esm2015/hd-button/hd-button.component.js +91 -91
  5. package/esm2015/hd-button/hd-button.module.js +22 -22
  6. package/esm2015/hd-button/hd-button.service.js +36 -36
  7. package/esm2015/hd-button-group/hd-button-group.component.js +32 -32
  8. package/esm2015/hd-button-group/hd-button-group.module.js +22 -22
  9. package/esm2015/hd-component.module.js +43 -43
  10. package/esm2015/hd-current-table/hd-current-table.component.js +224 -224
  11. package/esm2015/hd-current-table/hd-current-table.module.js +23 -23
  12. package/esm2015/hd-current-table/hd-current-table.service.js +34 -34
  13. package/esm2015/hd-detail-form/hd-detail-form.component.js +64 -64
  14. package/esm2015/hd-detail-form/hd-detail-form.module.js +20 -20
  15. package/esm2015/hd-detail-form/hd-detail-form.service.js +17 -17
  16. package/esm2015/hd-detail-lines/hd-detail-lines.component.js +266 -266
  17. package/esm2015/hd-detail-lines/hd-detail-lines.module.js +23 -23
  18. package/esm2015/hd-detail-lines/hd-detail-lines.service.js +18 -18
  19. package/esm2015/hd-detail-tip/hd-detail-tip.component.js +61 -61
  20. package/esm2015/hd-detail-tip/hd-detail-tip.module.js +22 -22
  21. package/esm2015/hd-filter/hd-filter.component.js +192 -192
  22. package/esm2015/hd-filter/hd-filter.module.js +25 -25
  23. package/esm2015/hd-filter/hd-filter.service.js +69 -69
  24. package/esm2015/hd-form/hd-form.component.js +369 -369
  25. package/esm2015/hd-form/hd-form.module.js +25 -25
  26. package/esm2015/hd-form/hd-form.service.js +129 -129
  27. package/esm2015/hd-form-lines/hd-form-lines.component.js +1537 -1537
  28. package/esm2015/hd-form-lines/hd-form-lines.module.js +29 -29
  29. package/esm2015/hd-form-lines/hd-form-lines.service.js +121 -121
  30. package/esm2015/hd-log/hd-log.component.js +30 -30
  31. package/esm2015/hd-log/hd-log.module.js +25 -25
  32. package/esm2015/hd-log/hd-log.service.js +47 -47
  33. package/esm2015/hd-popconfirm/hd-popconfirm.component.js +52 -52
  34. package/esm2015/hd-popconfirm/hd-popconfirm.module.js +27 -27
  35. package/esm2015/hd-space/hd-space.component.js +51 -51
  36. package/esm2015/hd-space/hd-space.module.js +23 -23
  37. package/esm2015/hd-space/hd-space.service.js +33 -33
  38. package/esm2015/hd-status/hd-status.component.js +50 -50
  39. package/esm2015/hd-status/hd-status.module.js +27 -27
  40. package/esm2015/hd-status/hd-status.service.js +33 -33
  41. package/esm2015/hd-table/hd-table.component.js +972 -972
  42. package/esm2015/hd-table/hd-table.module.js +43 -43
  43. package/esm2015/hd-table/hd-table.service.js +116 -116
  44. package/esm2015/hd-tip/hd-tip.component.js +37 -37
  45. package/esm2015/hd-tip/hd-tip.module.js +20 -20
  46. package/esm2015/index.js +6 -6
  47. package/esm2015/model/colWidth.js +36 -36
  48. package/esm2015/model/common-type.js +122 -122
  49. package/esm2015/model/staticConst.js +8 -8
  50. package/esm2015/public-api.js +19 -19
  51. package/esm2015/service/common-session.service.js +37 -37
  52. package/esm2015/utils.js +128 -128
  53. package/esm5/fantasy-ngzorro.js +38 -38
  54. package/esm5/fantasy-ngzorro.module.js +22 -22
  55. package/esm5/hd-button/hd-button.component.js +104 -104
  56. package/esm5/hd-button/hd-button.module.js +26 -26
  57. package/esm5/hd-button/hd-button.service.js +39 -39
  58. package/esm5/hd-button-group/hd-button-group.component.js +38 -38
  59. package/esm5/hd-button-group/hd-button-group.module.js +26 -26
  60. package/esm5/hd-component.module.js +47 -47
  61. package/esm5/hd-current-table/hd-current-table.component.js +260 -260
  62. package/esm5/hd-current-table/hd-current-table.module.js +27 -27
  63. package/esm5/hd-current-table/hd-current-table.service.js +46 -46
  64. package/esm5/hd-detail-form/hd-detail-form.component.js +77 -77
  65. package/esm5/hd-detail-form/hd-detail-form.module.js +24 -24
  66. package/esm5/hd-detail-form/hd-detail-form.service.js +20 -20
  67. package/esm5/hd-detail-lines/hd-detail-lines.component.js +314 -314
  68. package/esm5/hd-detail-lines/hd-detail-lines.module.js +27 -27
  69. package/esm5/hd-detail-lines/hd-detail-lines.service.js +22 -22
  70. package/esm5/hd-detail-tip/hd-detail-tip.component.js +72 -72
  71. package/esm5/hd-detail-tip/hd-detail-tip.module.js +26 -26
  72. package/esm5/hd-filter/hd-filter.component.js +231 -231
  73. package/esm5/hd-filter/hd-filter.module.js +29 -29
  74. package/esm5/hd-filter/hd-filter.service.js +77 -77
  75. package/esm5/hd-form/hd-form.component.js +424 -424
  76. package/esm5/hd-form/hd-form.module.js +29 -29
  77. package/esm5/hd-form/hd-form.service.js +141 -141
  78. package/esm5/hd-form-lines/hd-form-lines.component.js +1844 -1844
  79. package/esm5/hd-form-lines/hd-form-lines.module.js +33 -33
  80. package/esm5/hd-form-lines/hd-form-lines.service.js +137 -137
  81. package/esm5/hd-log/hd-log.component.js +35 -35
  82. package/esm5/hd-log/hd-log.module.js +29 -29
  83. package/esm5/hd-log/hd-log.service.js +50 -50
  84. package/esm5/hd-popconfirm/hd-popconfirm.component.js +65 -65
  85. package/esm5/hd-popconfirm/hd-popconfirm.module.js +31 -31
  86. package/esm5/hd-space/hd-space.component.js +56 -56
  87. package/esm5/hd-space/hd-space.module.js +27 -27
  88. package/esm5/hd-space/hd-space.service.js +40 -40
  89. package/esm5/hd-status/hd-status.component.js +62 -62
  90. package/esm5/hd-status/hd-status.module.js +31 -31
  91. package/esm5/hd-status/hd-status.service.js +35 -35
  92. package/esm5/hd-table/hd-table.component.js +1100 -1100
  93. package/esm5/hd-table/hd-table.module.js +47 -47
  94. package/esm5/hd-table/hd-table.service.js +136 -136
  95. package/esm5/hd-tip/hd-tip.component.js +42 -42
  96. package/esm5/hd-tip/hd-tip.module.js +24 -24
  97. package/esm5/index.js +6 -6
  98. package/esm5/model/colWidth.js +36 -36
  99. package/esm5/model/common-type.js +146 -146
  100. package/esm5/model/staticConst.js +8 -8
  101. package/esm5/public-api.js +19 -19
  102. package/esm5/service/common-session.service.js +54 -54
  103. package/esm5/utils.js +128 -128
  104. package/fantasy-ngzorro.d.ts +34 -34
  105. package/fantasy-ngzorro.module.d.ts +2 -2
  106. package/fesm2015/fantasy-ngzorro.js +5223 -5223
  107. package/fesm5/fantasy-ngzorro.js +6044 -6044
  108. package/hd-button/hd-button.component.d.ts +14 -14
  109. package/hd-button/hd-button.module.d.ts +2 -2
  110. package/hd-button/hd-button.service.d.ts +17 -17
  111. package/hd-button-group/hd-button-group.component.d.ts +7 -7
  112. package/hd-button-group/hd-button-group.module.d.ts +2 -2
  113. package/hd-component.module.d.ts +2 -2
  114. package/hd-current-table/hd-current-table.component.d.ts +43 -43
  115. package/hd-current-table/hd-current-table.module.d.ts +2 -2
  116. package/hd-current-table/hd-current-table.service.d.ts +13 -13
  117. package/hd-detail-form/hd-detail-form.component.d.ts +9 -9
  118. package/hd-detail-form/hd-detail-form.module.d.ts +2 -2
  119. package/hd-detail-form/hd-detail-form.service.d.ts +3 -3
  120. package/hd-detail-lines/hd-detail-lines.component.d.ts +48 -48
  121. package/hd-detail-lines/hd-detail-lines.module.d.ts +2 -2
  122. package/hd-detail-lines/hd-detail-lines.service.d.ts +7 -7
  123. package/hd-detail-tip/hd-detail-tip.component.d.ts +12 -12
  124. package/hd-detail-tip/hd-detail-tip.module.d.ts +2 -2
  125. package/hd-filter/hd-filter.component.d.ts +23 -23
  126. package/hd-filter/hd-filter.module.d.ts +2 -2
  127. package/hd-filter/hd-filter.service.d.ts +25 -25
  128. package/hd-form/hd-form.component.d.ts +25 -25
  129. package/hd-form/hd-form.module.d.ts +2 -2
  130. package/hd-form/hd-form.service.d.ts +51 -51
  131. package/hd-form-lines/hd-form-lines.component.d.ts +147 -147
  132. package/hd-form-lines/hd-form-lines.module.d.ts +2 -2
  133. package/hd-form-lines/hd-form-lines.service.d.ts +53 -53
  134. package/hd-log/hd-log.component.d.ts +6 -6
  135. package/hd-log/hd-log.module.d.ts +2 -2
  136. package/hd-log/hd-log.service.d.ts +6 -6
  137. package/hd-popconfirm/hd-popconfirm.component.d.ts +10 -10
  138. package/hd-popconfirm/hd-popconfirm.module.d.ts +2 -2
  139. package/hd-space/hd-space.component.d.ts +10 -10
  140. package/hd-space/hd-space.module.d.ts +2 -2
  141. package/hd-space/hd-space.service.d.ts +12 -12
  142. package/hd-status/hd-status.component.d.ts +9 -9
  143. package/hd-status/hd-status.module.d.ts +2 -2
  144. package/hd-status/hd-status.service.d.ts +11 -11
  145. package/hd-table/hd-table.component.d.ts +91 -91
  146. package/hd-table/hd-table.module.d.ts +2 -2
  147. package/hd-table/hd-table.service.d.ts +42 -42
  148. package/hd-tip/hd-tip.component.d.ts +8 -8
  149. package/hd-tip/hd-tip.module.d.ts +2 -2
  150. package/index.d.ts +2 -2
  151. package/model/colWidth.d.ts +17 -17
  152. package/model/common-type.d.ts +46 -46
  153. package/model/staticConst.d.ts +3 -3
  154. package/package.json +1 -1
  155. package/public-api.d.ts +15 -15
  156. package/service/common-session.service.d.ts +5 -5
  157. package/utils.d.ts +28 -28
@@ -1,370 +1,370 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Component, EventEmitter, Input, Output } from '@angular/core';
6
- import { FormBuilder, Validators } from '@angular/forms';
7
- import { Subject } from 'rxjs';
8
- import { debounceTime } from 'rxjs/operators';
9
- // import * as moment from 'moment';
10
- export class HdFormComponent {
11
- /**
12
- * @param {?} fb
13
- */
14
- constructor(fb) {
15
- this.fb = fb;
16
- this.changeEvent = new EventEmitter();
17
- this.searchSubject = new Subject();
18
- this.debounceTimeout = 0; // 默认防抖时间
19
- this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
20
- * @param {?} __0
21
- * @return {?}
22
- */
23
- ({ fn, event }) => this.triggerEvent(fn, event)));
24
- }
25
- /**
26
- * @return {?}
27
- */
28
- ngOnInit() {
29
- if (!this.formList || this.formList.length === 0) {
30
- return;
31
- }
32
- this.init();
33
- }
34
- /**
35
- * @param {?} changes
36
- * @return {?}
37
- */
38
- ngOnChanges(changes) {
39
- if (changes['formList'] && JSON.stringify(changes['formList'].currentValue) !== JSON.stringify(changes['formList'].previousValue)) {
40
- if (!this.formList || this.formList.length === 0) {
41
- return;
42
- }
43
- this.init();
44
- }
45
- }
46
- /**
47
- * @param {?} fn
48
- * @param {?} event
49
- * @param {?} onSearchEventDebounceTime
50
- * @return {?}
51
- */
52
- onSearchEvent(fn, event, onSearchEventDebounceTime) {
53
- if (onSearchEventDebounceTime) {
54
- // 更新防抖时间
55
- this.debounceTimeout = onSearchEventDebounceTime;
56
- // 取消之前的订阅
57
- if (this.searchSubscription) {
58
- this.searchSubscription.unsubscribe();
59
- }
60
- // 创建新的订阅
61
- this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
62
- * @param {?} __0
63
- * @return {?}
64
- */
65
- ({ fn, event }) => this.triggerEvent(fn, event)));
66
- // 发送事件
67
- this.searchSubject.next({ fn, event });
68
- }
69
- else {
70
- this.triggerEvent(fn, event);
71
- }
72
- }
73
- /**
74
- * @param {?} fn
75
- * @param {?} event
76
- * @return {?}
77
- */
78
- triggerEvent(fn, event) {
79
- if (fn) {
80
- fn(event);
81
- }
82
- }
83
- /**
84
- * @private
85
- * @return {?}
86
- */
87
- init() {
88
- // 异常捕获
89
- if (!this.checkList(this.formList)) {
90
- throw 'form组件数据格式不规范';
91
- }
92
- // 对表单数据做初始化,用row隔离每行数据item
93
- this.dealRow();
94
- // 首先根据定义的组件数组 去初始化表单
95
- /** @type {?} */
96
- let formGroupList = {};
97
- this.formList.forEach((/**
98
- * @param {?} item
99
- * @param {?} index
100
- * @return {?}
101
- */
102
- (item, index) => {
103
- // 日期相关的控件做特殊处理
104
- if (item.type === 2 && item.value) {
105
- const [year, month, day] = item.value.toString().split('-').map((/**
106
- * @param {?} str
107
- * @return {?}
108
- */
109
- str => parseInt(str)));
110
- /** @type {?} */
111
- const newDateStr = new Date(year, month - 1, day)
112
- .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
113
- .replace(/\//g, '-');
114
- if (item.validator) {
115
- formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);
116
- }
117
- else {
118
- formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);
119
- }
120
- }
121
- else if (item.type === 3 && item.value) {
122
- /** @type {?} */
123
- let formItemDate = JSON.parse(JSON.stringify(item.value));
124
- if (formItemDate && formItemDate instanceof Array) {
125
- formItemDate = formItemDate.map((/**
126
- * @param {?} item
127
- * @return {?}
128
- */
129
- (item) => {
130
- const [year, month, day] = item.split('-').map((/**
131
- * @param {?} str
132
- * @return {?}
133
- */
134
- str => parseInt(str)));
135
- /** @type {?} */
136
- const newDateStr = new Date(year, month - 1, day)
137
- .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
138
- .replace(/\//g, '-');
139
- item = new Date(newDateStr);
140
- }));
141
- if (item.validator) {
142
- formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);
143
- }
144
- else {
145
- formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);
146
- }
147
- }
148
- else {
149
- throw 'form组件中DateRange控件value值格式不规范,正确示例[\'2020-01-22\', \'2020-01-23\']';
150
- }
151
- }
152
- else {
153
- if (item.validator) {
154
- formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);
155
- }
156
- else {
157
- formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);
158
- }
159
- }
160
- }));
161
- this.validateHdForm = this.fb.group(formGroupList);
162
- this.formList.forEach((/**
163
- * @param {?} item
164
- * @return {?}
165
- */
166
- (item) => {
167
- if (item.onChangeEvent) {
168
- if (item.onChangeEvent) {
169
- if (item.onChangeEventDebounceTime) {
170
- this.validateHdForm.get(item.name).valueChanges
171
- .pipe(debounceTime(item.onChangeEventDebounceTime))
172
- .subscribe((/**
173
- * @param {?} value
174
- * @return {?}
175
- */
176
- value => this.triggerEvent(item.onChangeEvent, value)));
177
- }
178
- else {
179
- this.validateHdForm.get(item.name).valueChanges.subscribe((/**
180
- * @param {?} value
181
- * @return {?}
182
- */
183
- value => this.triggerEvent(item.onChangeEvent, value)));
184
- }
185
- }
186
- }
187
- }));
188
- this.validateHdForm.valueChanges.subscribe((/**
189
- * @param {?} data
190
- * @return {?}
191
- */
192
- data => this.onHdFormValueChanged(data)));
193
- this.onHdFormValueChanged();
194
- }
195
- /**
196
- * @private
197
- * @return {?}
198
- */
199
- dealRow() {
200
- // 一阶段 遍历数据计算相关数据
201
- /** @type {?} */
202
- const formListLength = this.formList.length;
203
- /** @type {?} */
204
- let step = 0;
205
- for (let i = 0; i < formListLength; i++) {
206
- if (!this.formList[i].hide) {
207
- if (i === 0) {
208
- this.formList[i].totalWidth = this.formList[i].width || 1;
209
- this.formList[i].isRowFirst = 1;
210
- step = step + 4;
211
- }
212
- else {
213
- // 去找到前一个非hide的控件
214
- for (let j = i - 1; j >= 0; j--) {
215
- if (this.formList[j].totalWidth) {
216
- this.formList[i].totalWidth = this.formList[j].totalWidth + (this.formList[i].width || 1);
217
- if ((this.formList[j].totalWidth + (this.formList[i].width || 1)) > step && this.formList[j].totalWidth <= step) {
218
- step = step + 4;
219
- this.formList[i].isRowFirst = 1;
220
- }
221
- else {
222
- this.formList[i].isRowFirst = 0;
223
- }
224
- break;
225
- }
226
- }
227
- }
228
- }
229
- }
230
- // 二阶段 isRowFirst的数组项增加子节点
231
- for (let m = 0; m < formListLength; m++) {
232
- if (this.formList[m].isRowFirst === 1) {
233
- this.formList[m].columnItems = [];
234
- /** @type {?} */
235
- let space = 0;
236
- for (let n = 1; n < formListLength - m; n++) {
237
- if (space === 4 || this.formList[m + n].isRowFirst === 1) {
238
- break;
239
- }
240
- if (!this.formList[m + n].hide && this.formList[m + n] && this.formList[m + n].isRowFirst === 0) {
241
- this.formList[m].columnItems.push(this.formList[m + n]);
242
- space++;
243
- }
244
- }
245
- }
246
- }
247
- }
248
- /**
249
- * @private
250
- * @param {?=} data
251
- * @return {?}
252
- */
253
- onHdFormValueChanged(data) {
254
- this.changeEvent.emit(this.validateHdForm);
255
- }
256
- /**
257
- * @private
258
- * @param {?} list
259
- * @return {?}
260
- */
261
- checkList(list) {
262
- if (!list || (list && list.length === 0)) {
263
- return false;
264
- }
265
- /** @type {?} */
266
- let nameList = [];
267
- list.forEach((/**
268
- * @param {?} item
269
- * @return {?}
270
- */
271
- (item) => {
272
- // 校验单项选择器
273
- // if (item.type === FormListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {
274
- // throw 'form组件数据格式不规范,存在单项选择器没有传入选项!'
275
- // }
276
- nameList.push(item.name);
277
- }));
278
- // 校验name是否重复
279
- if ([...new Set(nameList)].length !== list.length) {
280
- throw 'form组件数据格式不规范,存在重复name值!';
281
- }
282
- // ...more check
283
- return true;
284
- }
285
- /**
286
- * @return {?}
287
- */
288
- submitForm() {
289
- Object.values(this.validateHdForm.controls).forEach((/**
290
- * @param {?} control
291
- * @return {?}
292
- */
293
- control => {
294
- control.markAsDirty();
295
- control.updateValueAndValidity();
296
- }));
297
- this.changeEvent.emit(this.validateHdForm.getRawValue());
298
- }
299
- /**
300
- * @return {?}
301
- */
302
- resetForm() {
303
- this.validateHdForm.reset();
304
- Object.values(this.validateHdForm.controls).forEach((/**
305
- * @param {?} control
306
- * @return {?}
307
- */
308
- control => {
309
- control.markAsDirty();
310
- control.updateValueAndValidity();
311
- }));
312
- this.changeEvent.emit(this.validateHdForm.getRawValue());
313
- }
314
- /**
315
- * @param {?} filter
316
- * @return {?}
317
- */
318
- inputClean(filter) {
319
- /** @type {?} */
320
- const patchObject = {};
321
- patchObject[filter.name] = null;
322
- this.validateHdForm.patchValue(patchObject);
323
- }
324
- }
325
- HdFormComponent.decorators = [
326
- { type: Component, args: [{
327
- selector: 'hd-form',
328
- template: "<form nz-form [formGroup]=\"validateHdForm\" class=\"ant-advanced-search-form hd-formItem-container\">\n <!-- \u6574\u4F53\u7ED3\u6784 -->\n <div nz-row [nzGutter]=\"24\">\n <!-- \u5BF9\u7EC4\u4EF6\u5217\u8868\u5FAA\u73AF\u5904\u7406 -->\n <ng-container *ngFor=\"let formItem of formList;index as i\">\n <div nz-row *ngIf=\"formItem.isRowFirst && formItem.isRowFirst === 1\">\n <div nz-col *ngIf=\"!formItem.hide\" [nzSpan]=\"formItem.width? formItem.width * 6 : 6\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-formItem-label\" [nzNoColon]=\"true\">\n <div class=\"hd-formItem-label-flex\">\n <span>\n <span class=\"hd-formItem-label-require\" *ngIf=\"formItem.require\">*</span>\n <span\n [ngStyle]=\"{'color': formItem?.labelColor ? formItem.labelColor : null}\">{{ formItem.label }}</span>\n </span>\n <ng-container *ngIf=\"formItem.explain\">\n <span class=\"hd-formItem-label-explain\">{{ formItem.explain }}</span>\n </ng-container>\n </div>\n </nz-form-label>\n <nz-form-control class=\"hd-formItem-control\" [nzErrorTip]=\"formItemErrorTpl\">\n <ng-template #formItemErrorTpl let-control>\n <ng-container *ngFor=\"let validatorKey of formItem.validatorKeys;index as i\">\n <ng-container *ngIf=\"control.hasError(validatorKey.key)\">\n {{ validatorKey.label }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"control.hasError('required')\">\n {{ formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A' }}\n </ng-container>\n </ng-template>\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [ngStyle]=\"{'color': formItem?.color ? formItem.color : null}\"\n [maxlength]=\"formItem.maxLength || null\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\"\n *ngIf=\"validateHdForm.get(formItem.name).value && !formItem.disabled && !validateHdForm.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <nz-option *ngIf=\"formItem.defaultLabel\" [nzLabel]=\"formItem.defaultLabel\"\n [nzValue]=\"formItem.value\" nzHide></nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && validateHdForm.get(formItem.name) && validateHdForm.get(formItem.selectOption.label)?.value && validateHdForm.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.hdShowItemCode) ? ('['+ validateHdForm.get(formItem.selectOption.value).value + ']' + validateHdForm.get(formItem.selectOption.label).value) : validateHdForm.get(formItem.selectOption.label).value\"\n [nzValue]=\"validateHdForm.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"!formItem.showTime\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"formItem.showTime\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"4\">\n <textarea [ngStyle]=\"{'color': formItem?.color ? formItem.color : null}\"\n [rows]=\"formItem.textAreaRows ? formItem.textAreaRows : 1\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n rows=\"1\"\n nz-input [maxlength]=\"formItem.maxLength || null\"\n [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-input-number [ngStyle]=\"{'color': formItem?.color ? formItem.color : null}\"\n [formControlName]=\"formItem.name\" [nzMin]=\"formItem?.inputNumber?.min || 0\"\n [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + formItem.label\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 4\">\n </nz-input-number>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"6\">\n <nz-select [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container *ngIf=\"formItem.defaultLabel\">\n <nz-option *ngFor=\"let option of formItem.defaultLabel;index as i\" [nzLabel]=\"option\"\n [nzValue]=\"formItem.value[i]\" nzHide></nz-option>\n </ng-container>\n <ng-container\n *ngIf=\"formItem.selectOption.label && validateHdForm.get(formItem.name) && validateHdForm.get(formItem.selectOption.label)?.value && validateHdForm.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of validateHdForm.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"validateHdForm.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\"\n nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <span>{{ formItem.value || validateHdForm.get(formItem.name).value }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"8\">\n <nz-switch [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"9\">\n <nz-time-picker [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n <!-- \u5FAA\u73AF\u6700\u591A\u56DB\u6B21 -->\n <ng-container *ngFor=\"let columnItem of formItem.columnItems;index as columnItemIndex\">\n <div nz-col *ngIf=\"!columnItem.hide\" [nzSpan]=\"columnItem.width? columnItem.width * 6 : 6\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-formItem-label\" [nzNoColon]=\"true\">\n <div class=\"hd-formItem-label-flex\">\n <span>\n <span class=\"hd-formItem-label-require\" *ngIf=\"columnItem.require\">*</span>\n <span\n [ngStyle]=\"{'color': columnItem?.labelColor ? columnItem.labelColor : null}\">{{ columnItem.label }}</span>\n </span>\n <ng-container *ngIf=\"columnItem.explain\">\n <span class=\"hd-formItem-label-explain\">{{ columnItem.explain }}</span>\n </ng-container>\n </div>\n </nz-form-label>\n <nz-form-control class=\"hd-formItem-control\" [nzErrorTip]=\"columnItemErrorTpl\">\n <ng-template #columnItemErrorTpl let-control>\n <ng-container *ngFor=\"let validatorKey of columnItem.validatorKeys;index as i\">\n <ng-container *ngIf=\"control.hasError(validatorKey.key)\">\n {{ validatorKey.label }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"control.hasError('required')\">\n {{ columnItem.label + '\u4E0D\u80FD\u4E3A\u7A7A' }}\n </ng-container>\n </ng-template>\n <ng-container [ngSwitch]=\"columnItem.type\">\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input *ngIf=\"columnItem.disabled === true;else inputTemplate\" nz-input\n [ngStyle]=\"{'color': columnItem?.color ? columnItem.color : null}\" [disabled]=\"true\"\n [attr.disabled]=\"true\" [maxlength]=\"columnItem.maxLength || null\"\n [placeholder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [formControlName]=\"columnItem.name\"/>\n <ng-template #inputTemplate>\n <input nz-input [ngStyle]=\"{'color': columnItem?.color ? formItem.color : null}\"\n [maxlength]=\"columnItem.maxLength || null\"\n [placeholder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [formControlName]=\"columnItem.name\"/>\n </ng-template>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\"\n *ngIf=\"validateHdForm.get(columnItem.name).value && !columnItem.disabled && !validateHdForm.get(formItem.name).disabled\"\n (click)=\"inputClean(columnItem)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select [nzServerSearch]=\"columnItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"columnItem.selectOption.hdDropdownMatchSelectWidth ? columnItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"columnItem.selectOption.hdShowSearch != null ? columnItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"columnItem.selectOption.hdAllowClear != null ? columnItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\"\n (nzOnSearch)=\"onSearchEvent(columnItem.onSearchEvent || null, $event, columnItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of columnItem.selectOption.selectList\"\n [nzValue]=\"selectItem[columnItem.selectOption.value]\" [nzLabel]=\"columnItem.selectOption.showLabelAndValue ? '['+ selectItem[columnItem.selectOption.value] +']' +\n selectItem[columnItem.selectOption.label] : selectItem[columnItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"columnItem.selectOption.label && validateHdForm.get(columnItem.name) && validateHdForm.get(columnItem.selectOption.label)?.value && validateHdForm.get(columnItem.selectOption.value)?.value\"\n [nzLabel]=\"(columnItem.selectOption.showLabelAndValue || columnItem.selectOption.hdShowItemCode) ? ('['+ validateHdForm.get(columnItem.selectOption.value).value + ']' + validateHdForm.get(columnItem.selectOption.label).value) : validateHdForm.get(columnItem.selectOption.label).value\"\n [nzValue]=\"validateHdForm.get(columnItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"columnItem.showTime\" [nzDisabledDate]=\"columnItem.hdDisabledDate\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\" nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!columnItem.showTime\" [nzDisabledDate]=\"columnItem.hdDisabledDate\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [formControlName]=\"columnItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"4\">\n <textarea [ngStyle]=\"{'color': columnItem?.color ? columnItem.color : null}\"\n [rows]=\"columnItem.textAreaRows ? columnItem.textAreaRows : 1\" rows=\"1\" nz-input\n [placeholder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [maxlength]=\"columnItem.maxLength || null\" [formControlName]=\"columnItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-input-number [ngStyle]=\"{'color': columnItem?.color ? columnItem.color : null}\"\n [formControlName]=\"columnItem.name\" [nzMin]=\"columnItem?.inputNumber?.min || 0\"\n [nzMax]=\"columnItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"columnItem?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [nzPrecision]=\"columnItem?.inputNumber?.precision != null ? columnItem.inputNumber.precision : 4\">\n </nz-input-number>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"6\">\n <nz-select [nzServerSearch]=\"columnItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"columnItem.selectOption.hdDropdownMatchSelectWidth ? columnItem.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"columnItem.selectOption.hdShowSearch != null ? columnItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"columnItem.selectOption.hdAllowClear != null ? columnItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\"\n (nzOnSearch)=\"onSearchEvent(columnItem.onSearchEvent || null, $event, columnItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of columnItem.selectOption.selectList\"\n [nzValue]=\"selectItem[columnItem.selectOption.value]\" [nzLabel]=\"columnItem.selectOption.showLabelAndValue ? '['+ selectItem[columnItem.selectOption.value] +']' +\n selectItem[columnItem.selectOption.label] : selectItem[columnItem.selectOption.label]\">\n </nz-option>\n <ng-container *ngIf=\"columnItem.defaultLabel\">\n <nz-option *ngFor=\"let option of columnItem.defaultLabel;index as i\" [nzLabel]=\"option\"\n [nzValue]=\"columnItem.value[i]\" nzHide></nz-option>\n </ng-container>\n <ng-container\n *ngIf=\"columnItem.selectOption.label && validateHdForm.get(columnItem.name) && validateHdForm.get(columnItem.selectOption.label)?.value && validateHdForm.get(columnItem.selectOption.value)?.value\">\n <nz-option\n *ngFor=\"let option of validateHdForm.get(columnItem.selectOption.value).value;index as i\"\n [nzLabel]=\"validateHdForm.get(columnItem.selectOption.label).value[i]\" [nzValue]=\"option\"\n nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <span>{{ columnItem.value || validateHdForm.get(columnItem.name).value }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"8\">\n <nz-switch [formControlName]=\"columnItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"9\">\n <nz-time-picker [formControlName]=\"columnItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n</form>\n",
329
- 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}::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}.hd-formItem-container .hd-formItem-label{width:108px;word-break:break-all;text-align:right}.hd-formItem-container .hd-formItem-control{width:calc(100% - 108px)}.hd-formItem-container .ant-input-number{width:100%}.hd-formItem-container .hd-formItem-label-flex{display:inline-flex;flex-direction:column}.hd-formItem-container .hd-formItem-label-flex span{display:inline-block}.hd-formItem-container .hd-formItem-label-flex .hd-formItem-label-require{margin-right:4px;color:#f5222d;font-size:12px;font-family:SimSun,sans-serif}.hd-formItem-container .hd-formItem-label-flex .hd-formItem-label-explain{margin-top:-13px;color:#f5222d}.hd-formItem-container textarea{margin-top:8px}"]
330
- }] }
331
- ];
332
- /** @nocollapse */
333
- HdFormComponent.ctorParameters = () => [
334
- { type: FormBuilder }
335
- ];
336
- HdFormComponent.propDecorators = {
337
- formList: [{ type: Input }],
338
- changeEvent: [{ type: Output }]
339
- };
340
- if (false) {
341
- /** @type {?} */
342
- HdFormComponent.prototype.formList;
343
- /** @type {?} */
344
- HdFormComponent.prototype.changeEvent;
345
- /** @type {?} */
346
- HdFormComponent.prototype.validateHdForm;
347
- /** @type {?} */
348
- HdFormComponent.prototype.inputValue;
349
- /**
350
- * @type {?}
351
- * @private
352
- */
353
- HdFormComponent.prototype.searchSubject;
354
- /**
355
- * @type {?}
356
- * @private
357
- */
358
- HdFormComponent.prototype.debounceTimeout;
359
- /**
360
- * @type {?}
361
- * @private
362
- */
363
- HdFormComponent.prototype.searchSubscription;
364
- /**
365
- * @type {?}
366
- * @private
367
- */
368
- HdFormComponent.prototype.fb;
369
- }
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
6
+ import { FormBuilder, Validators } from '@angular/forms';
7
+ import { Subject } from 'rxjs';
8
+ import { debounceTime } from 'rxjs/operators';
9
+ // import * as moment from 'moment';
10
+ export class HdFormComponent {
11
+ /**
12
+ * @param {?} fb
13
+ */
14
+ constructor(fb) {
15
+ this.fb = fb;
16
+ this.changeEvent = new EventEmitter();
17
+ this.searchSubject = new Subject();
18
+ this.debounceTimeout = 0; // 默认防抖时间
19
+ this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
20
+ * @param {?} __0
21
+ * @return {?}
22
+ */
23
+ ({ fn, event }) => this.triggerEvent(fn, event)));
24
+ }
25
+ /**
26
+ * @return {?}
27
+ */
28
+ ngOnInit() {
29
+ if (!this.formList || this.formList.length === 0) {
30
+ return;
31
+ }
32
+ this.init();
33
+ }
34
+ /**
35
+ * @param {?} changes
36
+ * @return {?}
37
+ */
38
+ ngOnChanges(changes) {
39
+ if (changes['formList'] && JSON.stringify(changes['formList'].currentValue) !== JSON.stringify(changes['formList'].previousValue)) {
40
+ if (!this.formList || this.formList.length === 0) {
41
+ return;
42
+ }
43
+ this.init();
44
+ }
45
+ }
46
+ /**
47
+ * @param {?} fn
48
+ * @param {?} event
49
+ * @param {?} onSearchEventDebounceTime
50
+ * @return {?}
51
+ */
52
+ onSearchEvent(fn, event, onSearchEventDebounceTime) {
53
+ if (onSearchEventDebounceTime) {
54
+ // 更新防抖时间
55
+ this.debounceTimeout = onSearchEventDebounceTime;
56
+ // 取消之前的订阅
57
+ if (this.searchSubscription) {
58
+ this.searchSubscription.unsubscribe();
59
+ }
60
+ // 创建新的订阅
61
+ this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
62
+ * @param {?} __0
63
+ * @return {?}
64
+ */
65
+ ({ fn, event }) => this.triggerEvent(fn, event)));
66
+ // 发送事件
67
+ this.searchSubject.next({ fn, event });
68
+ }
69
+ else {
70
+ this.triggerEvent(fn, event);
71
+ }
72
+ }
73
+ /**
74
+ * @param {?} fn
75
+ * @param {?} event
76
+ * @return {?}
77
+ */
78
+ triggerEvent(fn, event) {
79
+ if (fn) {
80
+ fn(event);
81
+ }
82
+ }
83
+ /**
84
+ * @private
85
+ * @return {?}
86
+ */
87
+ init() {
88
+ // 异常捕获
89
+ if (!this.checkList(this.formList)) {
90
+ throw 'form组件数据格式不规范';
91
+ }
92
+ // 对表单数据做初始化,用row隔离每行数据item
93
+ this.dealRow();
94
+ // 首先根据定义的组件数组 去初始化表单
95
+ /** @type {?} */
96
+ let formGroupList = {};
97
+ this.formList.forEach((/**
98
+ * @param {?} item
99
+ * @param {?} index
100
+ * @return {?}
101
+ */
102
+ (item, index) => {
103
+ // 日期相关的控件做特殊处理
104
+ if (item.type === 2 && item.value) {
105
+ const [year, month, day] = item.value.toString().split('-').map((/**
106
+ * @param {?} str
107
+ * @return {?}
108
+ */
109
+ str => parseInt(str)));
110
+ /** @type {?} */
111
+ const newDateStr = new Date(year, month - 1, day)
112
+ .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
113
+ .replace(/\//g, '-');
114
+ if (item.validator) {
115
+ formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);
116
+ }
117
+ else {
118
+ formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);
119
+ }
120
+ }
121
+ else if (item.type === 3 && item.value) {
122
+ /** @type {?} */
123
+ let formItemDate = JSON.parse(JSON.stringify(item.value));
124
+ if (formItemDate && formItemDate instanceof Array) {
125
+ formItemDate = formItemDate.map((/**
126
+ * @param {?} item
127
+ * @return {?}
128
+ */
129
+ (item) => {
130
+ const [year, month, day] = item.split('-').map((/**
131
+ * @param {?} str
132
+ * @return {?}
133
+ */
134
+ str => parseInt(str)));
135
+ /** @type {?} */
136
+ const newDateStr = new Date(year, month - 1, day)
137
+ .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
138
+ .replace(/\//g, '-');
139
+ item = new Date(newDateStr);
140
+ }));
141
+ if (item.validator) {
142
+ formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);
143
+ }
144
+ else {
145
+ formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);
146
+ }
147
+ }
148
+ else {
149
+ throw 'form组件中DateRange控件value值格式不规范,正确示例[\'2020-01-22\', \'2020-01-23\']';
150
+ }
151
+ }
152
+ else {
153
+ if (item.validator) {
154
+ formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);
155
+ }
156
+ else {
157
+ formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);
158
+ }
159
+ }
160
+ }));
161
+ this.validateHdForm = this.fb.group(formGroupList);
162
+ this.formList.forEach((/**
163
+ * @param {?} item
164
+ * @return {?}
165
+ */
166
+ (item) => {
167
+ if (item.onChangeEvent) {
168
+ if (item.onChangeEvent) {
169
+ if (item.onChangeEventDebounceTime) {
170
+ this.validateHdForm.get(item.name).valueChanges
171
+ .pipe(debounceTime(item.onChangeEventDebounceTime))
172
+ .subscribe((/**
173
+ * @param {?} value
174
+ * @return {?}
175
+ */
176
+ value => this.triggerEvent(item.onChangeEvent, value)));
177
+ }
178
+ else {
179
+ this.validateHdForm.get(item.name).valueChanges.subscribe((/**
180
+ * @param {?} value
181
+ * @return {?}
182
+ */
183
+ value => this.triggerEvent(item.onChangeEvent, value)));
184
+ }
185
+ }
186
+ }
187
+ }));
188
+ this.validateHdForm.valueChanges.subscribe((/**
189
+ * @param {?} data
190
+ * @return {?}
191
+ */
192
+ data => this.onHdFormValueChanged(data)));
193
+ this.onHdFormValueChanged();
194
+ }
195
+ /**
196
+ * @private
197
+ * @return {?}
198
+ */
199
+ dealRow() {
200
+ // 一阶段 遍历数据计算相关数据
201
+ /** @type {?} */
202
+ const formListLength = this.formList.length;
203
+ /** @type {?} */
204
+ let step = 0;
205
+ for (let i = 0; i < formListLength; i++) {
206
+ if (!this.formList[i].hide) {
207
+ if (i === 0) {
208
+ this.formList[i].totalWidth = this.formList[i].width || 1;
209
+ this.formList[i].isRowFirst = 1;
210
+ step = step + 4;
211
+ }
212
+ else {
213
+ // 去找到前一个非hide的控件
214
+ for (let j = i - 1; j >= 0; j--) {
215
+ if (this.formList[j].totalWidth) {
216
+ this.formList[i].totalWidth = this.formList[j].totalWidth + (this.formList[i].width || 1);
217
+ if ((this.formList[j].totalWidth + (this.formList[i].width || 1)) > step && this.formList[j].totalWidth <= step) {
218
+ step = step + 4;
219
+ this.formList[i].isRowFirst = 1;
220
+ }
221
+ else {
222
+ this.formList[i].isRowFirst = 0;
223
+ }
224
+ break;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+ // 二阶段 isRowFirst的数组项增加子节点
231
+ for (let m = 0; m < formListLength; m++) {
232
+ if (this.formList[m].isRowFirst === 1) {
233
+ this.formList[m].columnItems = [];
234
+ /** @type {?} */
235
+ let space = 0;
236
+ for (let n = 1; n < formListLength - m; n++) {
237
+ if (space === 4 || this.formList[m + n].isRowFirst === 1) {
238
+ break;
239
+ }
240
+ if (!this.formList[m + n].hide && this.formList[m + n] && this.formList[m + n].isRowFirst === 0) {
241
+ this.formList[m].columnItems.push(this.formList[m + n]);
242
+ space++;
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * @private
250
+ * @param {?=} data
251
+ * @return {?}
252
+ */
253
+ onHdFormValueChanged(data) {
254
+ this.changeEvent.emit(this.validateHdForm);
255
+ }
256
+ /**
257
+ * @private
258
+ * @param {?} list
259
+ * @return {?}
260
+ */
261
+ checkList(list) {
262
+ if (!list || (list && list.length === 0)) {
263
+ return false;
264
+ }
265
+ /** @type {?} */
266
+ let nameList = [];
267
+ list.forEach((/**
268
+ * @param {?} item
269
+ * @return {?}
270
+ */
271
+ (item) => {
272
+ // 校验单项选择器
273
+ // if (item.type === FormListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {
274
+ // throw 'form组件数据格式不规范,存在单项选择器没有传入选项!'
275
+ // }
276
+ nameList.push(item.name);
277
+ }));
278
+ // 校验name是否重复
279
+ if ([...new Set(nameList)].length !== list.length) {
280
+ throw 'form组件数据格式不规范,存在重复name值!';
281
+ }
282
+ // ...more check
283
+ return true;
284
+ }
285
+ /**
286
+ * @return {?}
287
+ */
288
+ submitForm() {
289
+ Object.values(this.validateHdForm.controls).forEach((/**
290
+ * @param {?} control
291
+ * @return {?}
292
+ */
293
+ control => {
294
+ control.markAsDirty();
295
+ control.updateValueAndValidity();
296
+ }));
297
+ this.changeEvent.emit(this.validateHdForm.getRawValue());
298
+ }
299
+ /**
300
+ * @return {?}
301
+ */
302
+ resetForm() {
303
+ this.validateHdForm.reset();
304
+ Object.values(this.validateHdForm.controls).forEach((/**
305
+ * @param {?} control
306
+ * @return {?}
307
+ */
308
+ control => {
309
+ control.markAsDirty();
310
+ control.updateValueAndValidity();
311
+ }));
312
+ this.changeEvent.emit(this.validateHdForm.getRawValue());
313
+ }
314
+ /**
315
+ * @param {?} filter
316
+ * @return {?}
317
+ */
318
+ inputClean(filter) {
319
+ /** @type {?} */
320
+ const patchObject = {};
321
+ patchObject[filter.name] = null;
322
+ this.validateHdForm.patchValue(patchObject);
323
+ }
324
+ }
325
+ HdFormComponent.decorators = [
326
+ { type: Component, args: [{
327
+ selector: 'hd-form',
328
+ template: "<form nz-form [formGroup]=\"validateHdForm\" class=\"ant-advanced-search-form hd-formItem-container\">\n <!-- \u6574\u4F53\u7ED3\u6784 -->\n <div nz-row [nzGutter]=\"24\">\n <!-- \u5BF9\u7EC4\u4EF6\u5217\u8868\u5FAA\u73AF\u5904\u7406 -->\n <ng-container *ngFor=\"let formItem of formList;index as i\">\n <div nz-row *ngIf=\"formItem.isRowFirst && formItem.isRowFirst === 1\">\n <div nz-col *ngIf=\"!formItem.hide\" [nzSpan]=\"formItem.width? formItem.width * 6 : 6\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-formItem-label\" [nzNoColon]=\"true\">\n <div class=\"hd-formItem-label-flex\">\n <span>\n <span class=\"hd-formItem-label-require\" *ngIf=\"formItem.require\">*</span>\n <span\n [ngStyle]=\"{'color': formItem?.labelColor ? formItem.labelColor : null}\">{{ formItem.label }}</span>\n </span>\n <ng-container *ngIf=\"formItem.explain\">\n <span class=\"hd-formItem-label-explain\">{{ formItem.explain }}</span>\n </ng-container>\n </div>\n </nz-form-label>\n <nz-form-control class=\"hd-formItem-control\" [nzErrorTip]=\"formItemErrorTpl\">\n <ng-template #formItemErrorTpl let-control>\n <ng-container *ngFor=\"let validatorKey of formItem.validatorKeys;index as i\">\n <ng-container *ngIf=\"control.hasError(validatorKey.key)\">\n {{ validatorKey.label }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"control.hasError('required')\">\n {{ formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A' }}\n </ng-container>\n </ng-template>\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [ngStyle]=\"{'color': formItem?.color ? formItem.color : null}\"\n [maxlength]=\"formItem.maxLength || null\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\"\n *ngIf=\"validateHdForm.get(formItem.name).value && !formItem.disabled && !validateHdForm.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <nz-option *ngIf=\"formItem.defaultLabel\" [nzLabel]=\"formItem.defaultLabel\"\n [nzValue]=\"formItem.value\" nzHide></nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && validateHdForm.get(formItem.name) && validateHdForm.get(formItem.selectOption.label)?.value && validateHdForm.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.hdShowItemCode) ? ('['+ validateHdForm.get(formItem.selectOption.value).value + ']' + validateHdForm.get(formItem.selectOption.label).value) : validateHdForm.get(formItem.selectOption.label).value\"\n [nzValue]=\"validateHdForm.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"!formItem.showTime\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"formItem.showTime\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"4\">\n <textarea [ngStyle]=\"{'color': formItem?.color ? formItem.color : null}\"\n [rows]=\"formItem.textAreaRows ? formItem.textAreaRows : 1\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n rows=\"1\"\n nz-input [maxlength]=\"formItem.maxLength || null\"\n [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-input-number [ngStyle]=\"{'color': formItem?.color ? formItem.color : null}\"\n [formControlName]=\"formItem.name\" [nzMin]=\"formItem?.inputNumber?.min || 0\"\n [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + formItem.label\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 4\">\n </nz-input-number>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"6\">\n <nz-select [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container *ngIf=\"formItem.defaultLabel\">\n <nz-option *ngFor=\"let option of formItem.defaultLabel;index as i\" [nzLabel]=\"option\"\n [nzValue]=\"formItem.value[i]\" nzHide></nz-option>\n </ng-container>\n <ng-container\n *ngIf=\"formItem.selectOption.label && validateHdForm.get(formItem.name) && validateHdForm.get(formItem.selectOption.label)?.value && validateHdForm.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of validateHdForm.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"validateHdForm.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\"\n nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <span>{{ formItem.value || validateHdForm.get(formItem.name).value }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"8\">\n <nz-switch [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"9\">\n <nz-time-picker [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n <!-- \u5FAA\u73AF\u6700\u591A\u56DB\u6B21 -->\n <ng-container *ngFor=\"let columnItem of formItem.columnItems;index as columnItemIndex\">\n <div nz-col *ngIf=\"!columnItem.hide\" [nzSpan]=\"columnItem.width? columnItem.width * 6 : 6\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-formItem-label\" [nzNoColon]=\"true\">\n <div class=\"hd-formItem-label-flex\">\n <span>\n <span class=\"hd-formItem-label-require\" *ngIf=\"columnItem.require\">*</span>\n <span\n [ngStyle]=\"{'color': columnItem?.labelColor ? columnItem.labelColor : null}\">{{ columnItem.label }}</span>\n </span>\n <ng-container *ngIf=\"columnItem.explain\">\n <span class=\"hd-formItem-label-explain\">{{ columnItem.explain }}</span>\n </ng-container>\n </div>\n </nz-form-label>\n <nz-form-control class=\"hd-formItem-control\" [nzErrorTip]=\"columnItemErrorTpl\">\n <ng-template #columnItemErrorTpl let-control>\n <ng-container *ngFor=\"let validatorKey of columnItem.validatorKeys;index as i\">\n <ng-container *ngIf=\"control.hasError(validatorKey.key)\">\n {{ validatorKey.label }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"control.hasError('required')\">\n {{ columnItem.label + '\u4E0D\u80FD\u4E3A\u7A7A' }}\n </ng-container>\n </ng-template>\n <ng-container [ngSwitch]=\"columnItem.type\">\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input *ngIf=\"columnItem.disabled === true;else inputTemplate\" nz-input\n [ngStyle]=\"{'color': columnItem?.color ? columnItem.color : null}\" [disabled]=\"true\"\n [attr.disabled]=\"true\" [maxlength]=\"columnItem.maxLength || null\"\n [placeholder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [formControlName]=\"columnItem.name\"/>\n <ng-template #inputTemplate>\n <input nz-input [ngStyle]=\"{'color': columnItem?.color ? formItem.color : null}\"\n [maxlength]=\"columnItem.maxLength || null\"\n [placeholder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [formControlName]=\"columnItem.name\"/>\n </ng-template>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\"\n *ngIf=\"validateHdForm.get(columnItem.name).value && !columnItem.disabled && !validateHdForm.get(formItem.name).disabled\"\n (click)=\"inputClean(columnItem)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select [nzServerSearch]=\"columnItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"columnItem.selectOption.hdDropdownMatchSelectWidth ? columnItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"columnItem.selectOption.hdShowSearch != null ? columnItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"columnItem.selectOption.hdAllowClear != null ? columnItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\"\n (nzOnSearch)=\"onSearchEvent(columnItem.onSearchEvent || null, $event, columnItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of columnItem.selectOption.selectList\"\n [nzValue]=\"selectItem[columnItem.selectOption.value]\" [nzLabel]=\"columnItem.selectOption.showLabelAndValue ? '['+ selectItem[columnItem.selectOption.value] +']' +\n selectItem[columnItem.selectOption.label] : selectItem[columnItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"columnItem.selectOption.label && validateHdForm.get(columnItem.name) && validateHdForm.get(columnItem.selectOption.label)?.value && validateHdForm.get(columnItem.selectOption.value)?.value\"\n [nzLabel]=\"(columnItem.selectOption.showLabelAndValue || columnItem.selectOption.hdShowItemCode) ? ('['+ validateHdForm.get(columnItem.selectOption.value).value + ']' + validateHdForm.get(columnItem.selectOption.label).value) : validateHdForm.get(columnItem.selectOption.label).value\"\n [nzValue]=\"validateHdForm.get(columnItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"columnItem.showTime\" [nzDisabledDate]=\"columnItem.hdDisabledDate\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\" nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!columnItem.showTime\" [nzDisabledDate]=\"columnItem.hdDisabledDate\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [formControlName]=\"columnItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"4\">\n <textarea [ngStyle]=\"{'color': columnItem?.color ? columnItem.color : null}\"\n [rows]=\"columnItem.textAreaRows ? columnItem.textAreaRows : 1\" rows=\"1\" nz-input\n [placeholder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [maxlength]=\"columnItem.maxLength || null\" [formControlName]=\"columnItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-input-number [ngStyle]=\"{'color': columnItem?.color ? columnItem.color : null}\"\n [formControlName]=\"columnItem.name\" [nzMin]=\"columnItem?.inputNumber?.min || 0\"\n [nzMax]=\"columnItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"columnItem?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u8F93\u5165' + columnItem.label\"\n [nzPrecision]=\"columnItem?.inputNumber?.precision != null ? columnItem.inputNumber.precision : 4\">\n </nz-input-number>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"6\">\n <nz-select [nzServerSearch]=\"columnItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"columnItem.selectOption.hdDropdownMatchSelectWidth ? columnItem.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"columnItem.selectOption.hdShowSearch != null ? columnItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"columnItem.selectOption.hdAllowClear != null ? columnItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"columnItem.placeholder ? columnItem.placeholder : '\u8BF7\u9009\u62E9' + columnItem.label\"\n [formControlName]=\"columnItem.name\"\n (nzOnSearch)=\"onSearchEvent(columnItem.onSearchEvent || null, $event, columnItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of columnItem.selectOption.selectList\"\n [nzValue]=\"selectItem[columnItem.selectOption.value]\" [nzLabel]=\"columnItem.selectOption.showLabelAndValue ? '['+ selectItem[columnItem.selectOption.value] +']' +\n selectItem[columnItem.selectOption.label] : selectItem[columnItem.selectOption.label]\">\n </nz-option>\n <ng-container *ngIf=\"columnItem.defaultLabel\">\n <nz-option *ngFor=\"let option of columnItem.defaultLabel;index as i\" [nzLabel]=\"option\"\n [nzValue]=\"columnItem.value[i]\" nzHide></nz-option>\n </ng-container>\n <ng-container\n *ngIf=\"columnItem.selectOption.label && validateHdForm.get(columnItem.name) && validateHdForm.get(columnItem.selectOption.label)?.value && validateHdForm.get(columnItem.selectOption.value)?.value\">\n <nz-option\n *ngFor=\"let option of validateHdForm.get(columnItem.selectOption.value).value;index as i\"\n [nzLabel]=\"validateHdForm.get(columnItem.selectOption.label).value[i]\" [nzValue]=\"option\"\n nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <span>{{ columnItem.value || validateHdForm.get(columnItem.name).value }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"8\">\n <nz-switch [formControlName]=\"columnItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"9\">\n <nz-time-picker [formControlName]=\"columnItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n</form>\n",
329
+ 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}::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}.hd-formItem-container .hd-formItem-label{width:108px;word-break:break-all;text-align:right}.hd-formItem-container .hd-formItem-control{width:calc(100% - 108px)}.hd-formItem-container .ant-input-number{width:100%}.hd-formItem-container .hd-formItem-label-flex{display:inline-flex;flex-direction:column}.hd-formItem-container .hd-formItem-label-flex span{display:inline-block}.hd-formItem-container .hd-formItem-label-flex .hd-formItem-label-require{margin-right:4px;color:#f5222d;font-size:12px;font-family:SimSun,sans-serif}.hd-formItem-container .hd-formItem-label-flex .hd-formItem-label-explain{margin-top:-13px;color:#f5222d}.hd-formItem-container textarea{margin-top:8px}"]
330
+ }] }
331
+ ];
332
+ /** @nocollapse */
333
+ HdFormComponent.ctorParameters = () => [
334
+ { type: FormBuilder }
335
+ ];
336
+ HdFormComponent.propDecorators = {
337
+ formList: [{ type: Input }],
338
+ changeEvent: [{ type: Output }]
339
+ };
340
+ if (false) {
341
+ /** @type {?} */
342
+ HdFormComponent.prototype.formList;
343
+ /** @type {?} */
344
+ HdFormComponent.prototype.changeEvent;
345
+ /** @type {?} */
346
+ HdFormComponent.prototype.validateHdForm;
347
+ /** @type {?} */
348
+ HdFormComponent.prototype.inputValue;
349
+ /**
350
+ * @type {?}
351
+ * @private
352
+ */
353
+ HdFormComponent.prototype.searchSubject;
354
+ /**
355
+ * @type {?}
356
+ * @private
357
+ */
358
+ HdFormComponent.prototype.debounceTimeout;
359
+ /**
360
+ * @type {?}
361
+ * @private
362
+ */
363
+ HdFormComponent.prototype.searchSubscription;
364
+ /**
365
+ * @type {?}
366
+ * @private
367
+ */
368
+ HdFormComponent.prototype.fb;
369
+ }
370
370
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtL2hkLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFROUMsTUFBTSxPQUFPLGVBQWU7Ozs7SUFXMUIsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFSekIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSW5DLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQTRCLENBQUM7UUFDeEQsb0JBQWUsR0FBVyxDQUFDLENBQUMsQ0FBRSxTQUFTO1FBSTdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDbkMsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUMvRCxDQUFDOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFD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RSxDQUFDLENBQUM7SUFDM0QsQ0FBQzs7Ozs7SUFFTSxVQUFVLENBQUMsTUFBZ0I7O2NBQzFCLFdBQVcsR0FBRyxFQUFFO1FBQ3RCLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7OztZQW5PRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLHlvckJBQXVDOzthQUV4Qzs7OztZQVRRLFdBQVc7Ozt1QkFZakIsS0FBSzswQkFDTCxNQUFNOzs7O0lBRFAsbUNBQW1DOztJQUNuQyxzQ0FBMkM7O0lBQzNDLHlDQUEwQjs7SUFDMUIscUNBQW1COzs7OztJQUVuQix3Q0FBZ0U7Ozs7O0lBQ2hFLDBDQUFvQzs7Ozs7SUFFcEMsNkNBQXFEOzs7OztJQUN6Qyw2QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtSXRlbSB9IGZyb20gJy4vaGQtZm9ybS5zZXJ2aWNlJztcbi8vIGltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGQtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9oZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGQtZm9ybS5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEhkRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgZm9ybUxpc3Q6IEFycmF5PEZvcm1JdGVtPjtcbiAgQE91dHB1dCgpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB2YWxpZGF0ZUhkRm9ybTogRm9ybUdyb3VwO1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55LCBldmVudDogYW55OyB9PigpO1xuICBwcml2YXRlIGRlYm91bmNlVGltZW91dDogbnVtYmVyID0gMDsgIC8vIOm7mOiupOmYsuaKluaXtumXtFxuXG4gIHByaXZhdGUgc2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICApLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQgfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50KSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybUxpc3QgfHwgdGhpcy5mb3JtTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snZm9ybUxpc3QnXSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydmb3JtTGlzdCddLmN1cnJlbnRWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ2Zvcm1MaXN0J10ucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgIGlmICghdGhpcy5mb3JtTGlzdCB8fCB0aGlzLmZvcm1MaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWU6IGFueSkge1xuICAgIGlmIChvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lKSB7XG4gICAgICAvLyDmm7TmlrDpmLLmipbml7bpl7RcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lb3V0ID0gb25TZWFyY2hFdmVudERlYm91bmNlVGltZTtcblxuICAgICAgLy8g5Y+W5raI5LmL5YmN55qE6K6i6ZiFXG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgLy8g5Yib5bu65paw55qE6K6i6ZiFXG4gICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpXG4gICAgICApLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQgfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50KSk7XG5cbiAgICAgIC8vIOWPkemAgeS6i+S7tlxuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCk7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgLy8g5byC5bi45o2V6I63XG4gICAgaWYgKCF0aGlzLmNoZWNrTGlzdCh0aGlzLmZvcm1MaXN0KSkge1xuICAgICAgdGhyb3cgJ2Zvcm3nu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIMnO1xuICAgIH1cbiAgICAvLyDlr7nooajljZXmlbDmja7lgZrliJ3lp4vljJbvvIznlKhyb3fpmpTnprvmr4/ooYzmlbDmja5pdGVtXG4gICAgdGhpcy5kZWFsUm93KCk7XG4gICAgLy8g6aaW5YWI5qC55o2u5a6a5LmJ55qE57uE5Lu25pWw57uEICDljrvliJ3lp4vljJbooajljZVcbiAgICBsZXQgZm9ybUdyb3VwTGlzdCA9IHt9O1xuICAgIHRoaXMuZm9ybUxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIC8vIOaXpeacn+ebuOWFs+eahOaOp+S7tuWBmueJueauiuWkhOeQhlxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gMiAmJiBpdGVtLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGl0ZW0udmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLScpLm1hcChzdHIgPT4gcGFyc2VJbnQoc3RyKSk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGVTdHIgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSlcbiAgICAgICAgICAudG9Mb2NhbGVEYXRlU3RyaW5nKCd6aC1IYW5zLUNOJywgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnMi1kaWdpdCcsIGRheTogJzItZGlnaXQnIH0pXG4gICAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnLScpO1xuICAgICAgICBpZiAoaXRlbS52YWxpZGF0b3IpIHtcbiAgICAgICAgICBmb3JtR3JvdXBMaXN0W2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woeyB2YWx1ZTogbmV3IERhdGUobmV3RGF0ZVN0ciksIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sIGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlID8gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGl0ZW0udmFsaWRhdG9yXSA6IFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtR3JvdXBMaXN0W2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woeyB2YWx1ZTogbmV3IERhdGUobmV3RGF0ZVN0ciksIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sIGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdIDogW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gMyAmJiBpdGVtLnZhbHVlKSB7XG4gICAgICAgIGxldCBmb3JtSXRlbURhdGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0udmFsdWUpKTtcbiAgICAgICAgaWYgKGZvcm1JdGVtRGF0ZSAmJiBmb3JtSXRlbURhdGUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGZvcm1JdGVtRGF0ZSA9IGZvcm1JdGVtRGF0ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGl0ZW0uc3BsaXQoJy0nKS5tYXAoc3RyID0+IHBhcnNlSW50KHN0cikpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZVN0ciA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KVxuICAgICAgICAgICAgICAudG9Mb2NhbGVEYXRlU3RyaW5nKCd6aC1IYW5zLUNOJywgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnMi1kaWdpdCcsIGRheTogJzItZGlnaXQnIH0pXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJy0nKTtcbiAgICAgICAgICAgIGl0ZW0gPSBuZXcgRGF0ZShuZXdEYXRlU3RyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXRlbS52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cExpc3RbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbCh7IHZhbHVlOiBmb3JtSXRlbURhdGUsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sIGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlID8gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGl0ZW0udmFsaWRhdG9yXSA6IFtdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybUdyb3VwTGlzdFtpdGVtLm5hbWVdID0gdGhpcy5mYi5jb250cm9sKHsgdmFsdWU6IGZvcm1JdGVtRGF0ZSwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfSwgaXRlbS5yZXF1aXJlICYmICFpdGVtLmhpZGUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93ICdmb3Jt57uE5Lu25LitRGF0ZVJhbmdl5o6n5Lu2dmFsdWXlgLzmoLzlvI/kuI3op4TojIPvvIzmraPnoa7npLrkvotbXFwnMjAyMC0wMS0yMlxcJywgXFwnMjAyMC0wMS0yM1xcJ10nO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXRlbS52YWxpZGF0b3IpIHtcbiAgICAgICAgICBmb3JtR3JvdXBMaXN0W2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woeyB2YWx1ZTogaXRlbS52YWx1ZSwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfSwgaXRlbS5yZXF1aXJlICYmICFpdGVtLmhpZGUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgaXRlbS52YWxpZGF0b3JdIDogW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1Hcm91cExpc3RbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbCh7IHZhbHVlOiBpdGVtLnZhbHVlLCBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCB9LCBpdGVtLnJlcXVpcmUgJiYgIWl0ZW0uaGlkZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwTGlzdCk7XG5cbiAgICB0aGlzLmZvcm1MaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVIZEZvcm0uZ2V0KGl0ZW0ubmFtZSkudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZShpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVIZEZvcm0uZ2V0KGl0ZW0ubmFtZSkudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhKSk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWFsUm93KCkge1xuICAgIC8vIOS4gOmYtuautSDpgY3ljobmlbDmja7orqHnrpfnm7jlhbPmlbDmja5cbiAgICBjb25zdCBmb3JtTGlzdExlbmd0aCA9IHRoaXMuZm9ybUxpc3QubGVuZ3RoO1xuICAgIGxldCBzdGVwID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1MaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5mb3JtTGlzdFtpXS5oaWRlKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtTGlzdFtpXS50b3RhbFdpZHRoID0gdGhpcy5mb3JtTGlzdFtpXS53aWR0aCB8fCAxO1xuICAgICAgICAgIHRoaXMuZm9ybUxpc3RbaV0uaXNSb3dGaXJzdCA9IDE7XG4gICAgICAgICAgc3RlcCA9IHN0ZXAgKyA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOWOu+aJvuWIsOWJjeS4gOS4qumdnmhpZGXnmoTmjqfku7ZcbiAgICAgICAgICBmb3IgKGxldCBqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTGlzdFtqXS50b3RhbFdpZHRoKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpc3RbaV0udG90YWxXaWR0aCA9IHRoaXMuZm9ybUxpc3Rbal0udG90YWxXaWR0aCArICh0aGlzLmZvcm1MaXN0W2ldLndpZHRoIHx8IDEpO1xuICAgICAgICAgICAgICBpZiAoKHRoaXMuZm9ybUxpc3Rbal0udG90YWxXaWR0aCArICh0aGlzLmZvcm1MaXN0W2ldLndpZHRoIHx8IDEpKSA+IHN0ZXAgJiYgdGhpcy5mb3JtTGlzdFtqXS50b3RhbFdpZHRoIDw9IHN0ZXApIHtcbiAgICAgICAgICAgICAgICBzdGVwID0gc3RlcCArIDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTGlzdFtpXS5pc1Jvd0ZpcnN0ID0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1MaXN0W2ldLmlzUm93Rmlyc3QgPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOS6jOmYtuautSBpc1Jvd0ZpcnN055qE5pWw57uE6aG55aKe5Yqg5a2Q6IqC54K5XG4gICAgZm9yIChsZXQgbSA9IDA7IG0gPCBmb3JtTGlzdExlbmd0aDsgbSsrKSB7XG4gICAgICBpZiAodGhpcy5mb3JtTGlzdFttXS5pc1Jvd0ZpcnN0ID09PSAxKSB7XG4gICAgICAgIHRoaXMuZm9ybUxpc3RbbV0uY29sdW1uSXRlbXMgPSBbXTtcbiAgICAgICAgbGV0IHNwYWNlID0gMDtcbiAgICAgICAgZm9yIChsZXQgbiA9IDE7IG4gPCBmb3JtTGlzdExlbmd0aCAtIG07IG4rKykge1xuICAgICAgICAgIGlmIChzcGFjZSA9PT0gNCB8fCB0aGlzLmZvcm1MaXN0W20gKyBuXS5pc1Jvd0ZpcnN0ID09PSAxKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmZvcm1MaXN0W20gKyBuXS5oaWRlICYmIHRoaXMuZm9ybUxpc3RbbSArIG5dICYmIHRoaXMuZm9ybUxpc3RbbSArIG5dLmlzUm93Rmlyc3QgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUxpc3RbbV0uY29sdW1uSXRlbXMucHVzaCh0aGlzLmZvcm1MaXN0W20gKyBuXSk7XG4gICAgICAgICAgICBzcGFjZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25IZEZvcm1WYWx1ZUNoYW5nZWQoZGF0YT86IGFueSkge1xuICAgIHRoaXMuY2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlSGRGb3JtKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMaXN0KGxpc3Q6IEFycmF5PEZvcm1JdGVtPik6IGJvb2xlYW4ge1xuICAgIGlmICghbGlzdCB8fCAobGlzdCAmJiBsaXN0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5hbWVMaXN0ID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDmoKHpqozljZXpobnpgInmi6nlmahcbiAgICAgIC8vIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaXN0VHlwZS5TZWxlY3QgJiYgKCFpdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0IHx8IChpdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0ICYmIGl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgIC8vICAgdGhyb3cgJ2Zvcm3nu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjljZXpobnpgInmi6nlmajmsqHmnInkvKDlhaXpgInpobkhJ1xuICAgICAgLy8gfVxuICAgICAgbmFtZUxpc3QucHVzaChpdGVtLm5hbWUpO1xuICAgIH0pO1xuICAgIC8vIOagoemqjG5hbWXmmK/lkKbph43lpI1cbiAgICBpZiAoWy4uLm5ldyBTZXQobmFtZUxpc3QpXS5sZW5ndGggIT09IGxpc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyAnZm9ybee7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOmHjeWkjW5hbWXlgLwhJztcbiAgICB9XG4gICAgLy8gLi4ubW9yZSBjaGVja1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZvcm0oKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZhbGlkYXRlSGRGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVIZEZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVIZEZvcm0ucmVzZXQoKTtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmFsaWRhdGVIZEZvcm0uY29udHJvbHMpLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBpbnB1dENsZWFuKGZpbHRlcjogRm9ybUl0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCBwYXRjaE9iamVjdCA9IHt9O1xuICAgIHBhdGNoT2JqZWN0W2ZpbHRlci5uYW1lXSA9IG51bGw7XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybS5wYXRjaFZhbHVlKHBhdGNoT2JqZWN0KTtcbiAgfVxufVxuIl19