fantasy-ngzorro 2.1.3 → 2.1.5

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.
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/forms'), require('ng-zorro-antd'), require('@angular/cdk/drag-drop'), require('ng-zorro-antd/table'), require('lodash'), require('ng-zorro-antd/core'), require('rxjs'), require('rxjs/operators'), require('ng-zorro-antd/modal'), require('ng-zorro-antd/dropdown'), require('ng-zorro-antd/icon'), require('ng-zorro-antd/popconfirm'), require('ng-zorro-antd/resizable'), require('ng-zorro-antd/tooltip'), require('ng-zorro-antd/tree'), require('localforage')) :
3
- typeof define === 'function' && define.amd ? define('fantasy-ngzorro', ['exports', '@angular/core', '@angular/common', '@angular/forms', 'ng-zorro-antd', '@angular/cdk/drag-drop', 'ng-zorro-antd/table', 'lodash', 'ng-zorro-antd/core', 'rxjs', 'rxjs/operators', 'ng-zorro-antd/modal', 'ng-zorro-antd/dropdown', 'ng-zorro-antd/icon', 'ng-zorro-antd/popconfirm', 'ng-zorro-antd/resizable', 'ng-zorro-antd/tooltip', 'ng-zorro-antd/tree', 'localforage'], factory) :
4
- (global = global || self, factory(global['fantasy-ngzorro'] = {}, global.ng.core, global.ng.common, global.ng.forms, global.ngZorroAntd, global.ng.cdk['drag-drop'], global.table, global.lodash, global.core$1, global.rxjs, global.rxjs.operators, global.modal, global.dropdown, global.icon, global.popconfirm, global.resizable, global.tooltip, global.tree, global.localforage));
5
- }(this, (function (exports, core, common, forms, ngZorroAntd, dragDrop, table, lodash, core$1, rxjs, operators, modal, dropdown, icon, popconfirm, resizable, tooltip, tree, localforage) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/forms'), require('ng-zorro-antd'), require('@angular/cdk/drag-drop'), require('ng-zorro-antd/table'), require('lodash'), require('ng-zorro-antd/core'), require('rxjs'), require('rxjs/operators'), require('ng-zorro-antd/modal'), require('ng-zorro-antd/dropdown'), require('ng-zorro-antd/icon'), require('ng-zorro-antd/popconfirm'), require('ng-zorro-antd/resizable'), require('ng-zorro-antd/tooltip'), require('ng-zorro-antd/tree'), require('localforage'), require('@angular/router')) :
3
+ typeof define === 'function' && define.amd ? define('fantasy-ngzorro', ['exports', '@angular/core', '@angular/common', '@angular/forms', 'ng-zorro-antd', '@angular/cdk/drag-drop', 'ng-zorro-antd/table', 'lodash', 'ng-zorro-antd/core', 'rxjs', 'rxjs/operators', 'ng-zorro-antd/modal', 'ng-zorro-antd/dropdown', 'ng-zorro-antd/icon', 'ng-zorro-antd/popconfirm', 'ng-zorro-antd/resizable', 'ng-zorro-antd/tooltip', 'ng-zorro-antd/tree', 'localforage', '@angular/router'], factory) :
4
+ (global = global || self, factory(global['fantasy-ngzorro'] = {}, global.ng.core, global.ng.common, global.ng.forms, global.ngZorroAntd, global.ng.cdk['drag-drop'], global.table, global.lodash, global.core$1, global.rxjs, global.rxjs.operators, global.modal, global.dropdown, global.icon, global.popconfirm, global.resizable, global.tooltip, global.tree, global.localforage, global.ng.router));
5
+ }(this, (function (exports, core, common, forms, ngZorroAntd, dragDrop, table, lodash, core$1, rxjs, operators, modal, dropdown, icon, popconfirm, resizable, tooltip, tree, localforage, router) { 'use strict';
6
6
 
7
7
  /*! *****************************************************************************
8
8
  Copyright (c) Microsoft Corporation.
@@ -2228,7 +2228,7 @@
2228
2228
  { type: core.Component, args: [{
2229
2229
  selector: 'hd-filter',
2230
2230
  template: "<form nz-form [formGroup]=\"validateFilterForm\" class=\"ant-advanced-search-form hd-filter-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 filter of filterList\">\n <div nz-col [nzSpan]=\"6\" [hidden]=\"!filter.show\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-filter-label\" [nzNoColon]=\"true\"><span class=\"hd-red\" *ngIf=\"filter.require\">*</span>{{ filter.label }}\n </nz-form-label>\n <nz-form-control class=\"hd-filter-control\">\n <ng-container [ngSwitch]=\"filter.type\">\n <!-- \u8FD9\u91CC\u6570\u5B57\u5BF9\u5E94\u679A\u4E3E\u7C7B\u578B\uFF0C\u53EF\u5728hd-filter.service.ts\u6587\u4EF6\u4E2D\u67E5\u770B\u5BF9\u5E94\u5173\u7CFB -->\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [placeholder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u8F93\u5165' + filter.label\"\n [formControlName]=\"filter.name\"\n (blur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\" *ngIf=\"validateFilterForm.get(filter.name).value\"\n (click)=\"inputClean(filter)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"filter.selectOption.hdAllowClear != null ? filter.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\">\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']\" [nzDisabledDate]=\"filter.hdDisabledDate\" [formControlName]=\"filter.name\">\n </nz-range-picker>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"4\">\n <nz-select\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"filter.selectOption.hdAllowClear != null ? filter.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-cascader [nzOptions]=\"filter.cascaderOption.options\" [formControlName]=\"filter.name\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\">\n </nz-cascader>\n </ng-container>\n <ng-container *ngSwitchCase=\"6\">\n <nz-month-picker [formControlName]=\"filter.name\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"></nz-month-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <nz-input-number [formControlName]=\"filter.name\" [nzMin]=\"filter?.inputNumber?.min || 0\"\n [nzMax]=\"filter?.inputNumber?.max || 99999999\" [nzStep]=\"filter?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + filter.label\"\n [nzPrecision]=\"filter?.inputNumber?.precision != null ? filter.inputNumber.precision : 4\"\n (nzBlur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\">\n </nz-input-number>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n\n <div class=\"hd-filter-btn\" nz-col [nzSpan]=\"6\" [nzOffset]=\"computeOffset()\">\n <a *ngIf=\"filterList.length > 7\" class=\"hd-filter-more\" (click)=\"showMore()\">\n {{ isShowMore ? '\u5C55\u5F00' : '\u6536\u8D77' }}\n <i nz-icon [nzType]=\"isShowMore ? 'down' : 'up'\"></i>\n </a>\n <hd-button type=\"primary\" (click)=\"submitForm()\">\u67E5\u8BE2</hd-button>\n <hd-button type=\"reset\" (click)=\"resetForm()\">\u91CD\u7F6E</hd-button>\n </div>\n </div>\n</form>\n",
2231
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!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;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!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:14px;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:14px;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-filter-container{padding:20px 23px;background:#fff;box-shadow:0 0 12px 0 rgba(93,114,103,.08);border-radius:4px;margin-bottom:8px!important;font-size:14px}.hd-filter-container .ant-row{display:flex;flex-wrap:wrap;align-items:flex-start;row-gap:4px;margin-right:0!important;margin-left:0!important}.hd-filter-container .ant-row::after,.hd-filter-container .ant-row::before{display:none}.hd-filter-container .ant-col-6{float:none;padding-left:0!important;padding-right:0!important}.hd-filter-container .hd-filter-label{width:124px;word-break:break-all;font-size:14px}.hd-filter-container .hd-filter-label ::ng-deep label{font-size:14px}.hd-filter-container .hd-filter-control{width:calc(100% - 124px)}.hd-filter-container ::ng-deep .ant-calendar-picker{width:100%}.hd-filter-container .hd-filter-more{color:#20b95d}.hd-filter-container .hd-filter-btn{height:40px;display:inline-flex;align-items:center;justify-content:flex-end}.hd-filter-container hd-button{margin-left:12px}.hd-filter-container ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}.hd-filter-container ::ng-deep .ant-select-selection--single{height:32px!important}.hd-filter-container ::ng-deep .ant-input{height:32px!important}.hd-filter-container ::ng-deep .ant-calendar-range-picker-input{text-align:left!important}.hd-filter-container .ant-input-number{width:100%}.hd-filter-container .hd-red{color:#f5222d}"]
2231
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!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;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!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:14px;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:14px;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-filter-container{padding:20px 23px;background:#fff;border-radius:4px;margin-bottom:8px!important;font-size:14px}.hd-filter-container .ant-row{display:flex;flex-wrap:wrap;align-items:flex-start;row-gap:4px;margin-right:0!important;margin-left:0!important}.hd-filter-container .ant-row::after,.hd-filter-container .ant-row::before{display:none}.hd-filter-container .ant-col-6{float:none;padding-left:0!important;padding-right:0!important}.hd-filter-container .hd-filter-label{width:124px;word-break:break-all;font-size:14px}.hd-filter-container .hd-filter-label ::ng-deep label{font-size:14px}.hd-filter-container .hd-filter-control{width:calc(100% - 124px)}.hd-filter-container ::ng-deep .ant-calendar-picker{width:100%}.hd-filter-container .hd-filter-more{color:#20b95d}.hd-filter-container .hd-filter-btn{height:40px;display:inline-flex;align-items:center;justify-content:flex-end}.hd-filter-container hd-button{margin-left:12px}.hd-filter-container ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}.hd-filter-container ::ng-deep .ant-select-selection--single{height:32px!important}.hd-filter-container ::ng-deep .ant-input{height:32px!important}.hd-filter-container ::ng-deep .ant-calendar-range-picker-input{text-align:left!important}.hd-filter-container .ant-input-number{width:100%}.hd-filter-container .hd-red{color:#f5222d}"]
2232
2232
  }] }
2233
2233
  ];
2234
2234
  /** @nocollapse */
@@ -2461,9 +2461,18 @@
2461
2461
  this.showKeyboardOperateTip = false;
2462
2462
  this.tableLoading = false;
2463
2463
  this.showSearch = false;
2464
- this.operateButtons = ["add", "delete"];
2464
+ /**
2465
+ * 是否展示行勾选列,用于外部批量操作勾选行
2466
+ */
2467
+ this.showCheckbox = false;
2468
+ this.operateButtons = ["add", "delete"]; // 操作列按钮:add / delete / copy
2469
+ // 操作列按钮:add / delete / copy
2465
2470
  this.scroll = { x: "1px" };
2466
2471
  this.changeEvent = new core.EventEmitter();
2472
+ /**
2473
+ * 勾选变化时抛出当前勾选行 FormGroup 列表
2474
+ */
2475
+ this.selectionChange = new core.EventEmitter();
2467
2476
  this.showDeleteConfirm = false;
2468
2477
  this.paginationPageIndex = 1;
2469
2478
  this.paginationPageSize = 10;
@@ -2483,6 +2492,10 @@
2483
2492
  // 是否是已经筛选过的数据
2484
2493
  this.formValid = false; // 表单当前的状态
2485
2494
  // 表单当前的状态
2495
+ /**
2496
+ * 勾选的行 id(跨页、搜索重建后仍保留)
2497
+ */
2498
+ this.selectedRowIds = new Set();
2486
2499
  this.searchSubject = new rxjs.Subject();
2487
2500
  this.debounceTimeout = 0; // 默认防抖时间
2488
2501
  this.openChangeSubject = new rxjs.Subject();
@@ -2573,6 +2586,510 @@
2573
2586
  enumerable: true,
2574
2587
  configurable: true
2575
2588
  });
2589
+ Object.defineProperty(HdFormLinesComponent.prototype, "operateColWidth", {
2590
+ get: /**
2591
+ * @return {?}
2592
+ */
2593
+ function () {
2594
+ /** @type {?} */
2595
+ var count = (this.operateButtons || []).filter((/**
2596
+ * @param {?} btn
2597
+ * @return {?}
2598
+ */
2599
+ function (btn) {
2600
+ return ["add", "copy", "delete"].includes(btn);
2601
+ })).length;
2602
+ return Math.max(count * 40, 80);
2603
+ },
2604
+ enumerable: true,
2605
+ configurable: true
2606
+ });
2607
+ Object.defineProperty(HdFormLinesComponent.prototype, "lineNumberLeft", {
2608
+ /** 勾选列固定时,序号列的 left 偏移 */
2609
+ get: /**
2610
+ * 勾选列固定时,序号列的 left 偏移
2611
+ * @return {?}
2612
+ */
2613
+ function () {
2614
+ return this.showCheckbox ? "40px" : "0px";
2615
+ },
2616
+ enumerable: true,
2617
+ configurable: true
2618
+ });
2619
+ /**
2620
+ * @private
2621
+ * @return {?}
2622
+ */
2623
+ HdFormLinesComponent.prototype.generateRowId = /**
2624
+ * @private
2625
+ * @return {?}
2626
+ */
2627
+ function () {
2628
+ return "hd_row_" + Date.now() + "_" + Math.random().toString(36).slice(2, 9);
2629
+ };
2630
+ /**
2631
+ * @private
2632
+ * @param {?} line
2633
+ * @return {?}
2634
+ */
2635
+ HdFormLinesComponent.prototype.getRowId = /**
2636
+ * @private
2637
+ * @param {?} line
2638
+ * @return {?}
2639
+ */
2640
+ function (line) {
2641
+ if (!line || !line.get("_hdRowId")) {
2642
+ return null;
2643
+ }
2644
+ return line.get("_hdRowId").value;
2645
+ };
2646
+ /** 当前页的行(用于表头全选,仅作用于当前页,跨页勾选仍保留) */
2647
+ /**
2648
+ * 当前页的行(用于表头全选,仅作用于当前页,跨页勾选仍保留)
2649
+ * @private
2650
+ * @return {?}
2651
+ */
2652
+ HdFormLinesComponent.prototype.getCurrentPageLines = /**
2653
+ * 当前页的行(用于表头全选,仅作用于当前页,跨页勾选仍保留)
2654
+ * @private
2655
+ * @return {?}
2656
+ */
2657
+ function () {
2658
+ /** @type {?} */
2659
+ var start = (this.paginationPageIndex - 1) * this.paginationPageSize;
2660
+ /** @type {?} */
2661
+ var end = start + this.paginationPageSize;
2662
+ return ((/** @type {?} */ (this.linesFormArray.controls))).slice(start, end);
2663
+ };
2664
+ /**
2665
+ * @param {?} line
2666
+ * @return {?}
2667
+ */
2668
+ HdFormLinesComponent.prototype.isLineChecked = /**
2669
+ * @param {?} line
2670
+ * @return {?}
2671
+ */
2672
+ function (line) {
2673
+ /** @type {?} */
2674
+ var id = this.getRowId(line);
2675
+ return !!id && this.selectedRowIds.has(id);
2676
+ };
2677
+ /**
2678
+ * @return {?}
2679
+ */
2680
+ HdFormLinesComponent.prototype.isAllChecked = /**
2681
+ * @return {?}
2682
+ */
2683
+ function () {
2684
+ var _this = this;
2685
+ /** @type {?} */
2686
+ var pageLines = this.getCurrentPageLines();
2687
+ return pageLines.length > 0 && pageLines.every((/**
2688
+ * @param {?} line
2689
+ * @return {?}
2690
+ */
2691
+ function (line) { return _this.isLineChecked(line); }));
2692
+ };
2693
+ /**
2694
+ * @return {?}
2695
+ */
2696
+ HdFormLinesComponent.prototype.isIndeterminate = /**
2697
+ * @return {?}
2698
+ */
2699
+ function () {
2700
+ var _this = this;
2701
+ /** @type {?} */
2702
+ var pageLines = this.getCurrentPageLines();
2703
+ /** @type {?} */
2704
+ var checkedCount = pageLines.filter((/**
2705
+ * @param {?} line
2706
+ * @return {?}
2707
+ */
2708
+ function (line) { return _this.isLineChecked(line); })).length;
2709
+ return checkedCount > 0 && checkedCount < pageLines.length;
2710
+ };
2711
+ /**
2712
+ * @param {?} checked
2713
+ * @return {?}
2714
+ */
2715
+ HdFormLinesComponent.prototype.onAllChecked = /**
2716
+ * @param {?} checked
2717
+ * @return {?}
2718
+ */
2719
+ function (checked) {
2720
+ var _this = this;
2721
+ this.getCurrentPageLines().forEach((/**
2722
+ * @param {?} line
2723
+ * @return {?}
2724
+ */
2725
+ function (line) {
2726
+ /** @type {?} */
2727
+ var id = _this.getRowId(line);
2728
+ if (!id) {
2729
+ return;
2730
+ }
2731
+ if (checked) {
2732
+ _this.selectedRowIds.add(id);
2733
+ }
2734
+ else {
2735
+ _this.selectedRowIds.delete(id);
2736
+ }
2737
+ }));
2738
+ this.emitSelectionChange();
2739
+ };
2740
+ /**
2741
+ * @param {?} line
2742
+ * @param {?} checked
2743
+ * @return {?}
2744
+ */
2745
+ HdFormLinesComponent.prototype.onLineCheckedChange = /**
2746
+ * @param {?} line
2747
+ * @param {?} checked
2748
+ * @return {?}
2749
+ */
2750
+ function (line, checked) {
2751
+ /** @type {?} */
2752
+ var id = this.getRowId(line);
2753
+ if (!id) {
2754
+ return;
2755
+ }
2756
+ if (checked) {
2757
+ this.selectedRowIds.add(id);
2758
+ }
2759
+ else {
2760
+ this.selectedRowIds.delete(id);
2761
+ }
2762
+ this.emitSelectionChange();
2763
+ };
2764
+ /**
2765
+ * @private
2766
+ * @return {?}
2767
+ */
2768
+ HdFormLinesComponent.prototype.emitSelectionChange = /**
2769
+ * @private
2770
+ * @return {?}
2771
+ */
2772
+ function () {
2773
+ this.selectionChange.emit(this.getSelectedLines());
2774
+ this.cdr.markForCheck();
2775
+ };
2776
+ /**
2777
+ * @private
2778
+ * @param {?} line
2779
+ * @return {?}
2780
+ */
2781
+ HdFormLinesComponent.prototype.removeLineFromSelection = /**
2782
+ * @private
2783
+ * @param {?} line
2784
+ * @return {?}
2785
+ */
2786
+ function (line) {
2787
+ /** @type {?} */
2788
+ var id = this.getRowId(line);
2789
+ if (id && this.selectedRowIds.has(id)) {
2790
+ this.selectedRowIds.delete(id);
2791
+ this.emitSelectionChange();
2792
+ }
2793
+ };
2794
+ /**
2795
+ * @private
2796
+ * @param {?} line
2797
+ * @param {?} values
2798
+ * @param {?} emitEvent
2799
+ * @return {?}
2800
+ */
2801
+ HdFormLinesComponent.prototype.applyValuesToLine = /**
2802
+ * @private
2803
+ * @param {?} line
2804
+ * @param {?} values
2805
+ * @param {?} emitEvent
2806
+ * @return {?}
2807
+ */
2808
+ function (line, values, emitEvent) {
2809
+ var _this = this;
2810
+ Object.keys(values).forEach((/**
2811
+ * @param {?} key
2812
+ * @return {?}
2813
+ */
2814
+ function (key) {
2815
+ /** @type {?} */
2816
+ var control = line.get(key);
2817
+ if (!control) {
2818
+ line.addControl(key, _this.fb.control(values[key]));
2819
+ control = line.get(key);
2820
+ }
2821
+ // 静默赋值,避免 valueChanges / DOM maxlength 回写把校验态打乱
2822
+ control.setValue(values[key], { emitEvent: false });
2823
+ control.markAsPristine({ onlySelf: true });
2824
+ control.markAsUntouched({ onlySelf: true });
2825
+ control.updateValueAndValidity({ emitEvent: false });
2826
+ if (emitEvent) {
2827
+ /** @type {?} */
2828
+ var formItem = _this.formLines.find((/**
2829
+ * @param {?} item
2830
+ * @return {?}
2831
+ */
2832
+ function (item) { return item.name === key; }));
2833
+ if (formItem && formItem.onChangeEvent) {
2834
+ _this.triggerEvent(formItem.onChangeEvent, values[key], line);
2835
+ }
2836
+ }
2837
+ }));
2838
+ this.cdr.detectChanges();
2839
+ };
2840
+ /**
2841
+ * 仅在用户交互后、且当前值确实为空的 required 错误时展示红框,
2842
+ * 避免批量赋值时 ng-zorro 残留「不能为空」提示
2843
+ */
2844
+ /**
2845
+ * 仅在用户交互后、且当前值确实为空的 required 错误时展示红框,
2846
+ * 避免批量赋值时 ng-zorro 残留「不能为空」提示
2847
+ * @param {?} line
2848
+ * @param {?} formItem
2849
+ * @return {?}
2850
+ */
2851
+ HdFormLinesComponent.prototype.getControlValidateStatus = /**
2852
+ * 仅在用户交互后、且当前值确实为空的 required 错误时展示红框,
2853
+ * 避免批量赋值时 ng-zorro 残留「不能为空」提示
2854
+ * @param {?} line
2855
+ * @param {?} formItem
2856
+ * @return {?}
2857
+ */
2858
+ function (line, formItem) {
2859
+ /** @type {?} */
2860
+ var control = line.get(formItem.name);
2861
+ if (!control || control.disabled) {
2862
+ return "";
2863
+ }
2864
+ /** @type {?} */
2865
+ var empty = control.value === null ||
2866
+ control.value === undefined ||
2867
+ control.value === "";
2868
+ if ((control.dirty || control.touched) && empty && control.hasError("required")) {
2869
+ return "error";
2870
+ }
2871
+ return "";
2872
+ };
2873
+ /** 用户输入时按 maxLength 截断(不使用原生 maxlength,避免干扰程序化赋值) */
2874
+ /**
2875
+ * 用户输入时按 maxLength 截断(不使用原生 maxlength,避免干扰程序化赋值)
2876
+ * @param {?} event
2877
+ * @param {?} line
2878
+ * @param {?} formItem
2879
+ * @return {?}
2880
+ */
2881
+ HdFormLinesComponent.prototype.limitInputLength = /**
2882
+ * 用户输入时按 maxLength 截断(不使用原生 maxlength,避免干扰程序化赋值)
2883
+ * @param {?} event
2884
+ * @param {?} line
2885
+ * @param {?} formItem
2886
+ * @return {?}
2887
+ */
2888
+ function (event, line, formItem) {
2889
+ if (!formItem || !formItem.maxLength) {
2890
+ return;
2891
+ }
2892
+ /** @type {?} */
2893
+ var input = (/** @type {?} */ (event.target));
2894
+ if (input && input.value && input.value.length > formItem.maxLength) {
2895
+ /** @type {?} */
2896
+ var next = input.value.slice(0, formItem.maxLength);
2897
+ input.value = next;
2898
+ /** @type {?} */
2899
+ var control = line.get(formItem.name);
2900
+ if (control) {
2901
+ control.setValue(next);
2902
+ }
2903
+ }
2904
+ };
2905
+ /** 获取当前勾选且已挂载的行 FormGroup(当前筛选结果内) */
2906
+ /**
2907
+ * 获取当前勾选且已挂载的行 FormGroup(当前筛选结果内)
2908
+ * @return {?}
2909
+ */
2910
+ HdFormLinesComponent.prototype.getSelectedLines = /**
2911
+ * 获取当前勾选且已挂载的行 FormGroup(当前筛选结果内)
2912
+ * @return {?}
2913
+ */
2914
+ function () {
2915
+ var _this = this;
2916
+ return ((/** @type {?} */ (this.linesFormArray.controls))).filter((/**
2917
+ * @param {?} line
2918
+ * @return {?}
2919
+ */
2920
+ function (line) {
2921
+ return _this.isLineChecked(line);
2922
+ }));
2923
+ };
2924
+ /**
2925
+ * 获取全部勾选行数据(含跨页、搜索后未展示但仍勾选的行)
2926
+ */
2927
+ /**
2928
+ * 获取全部勾选行数据(含跨页、搜索后未展示但仍勾选的行)
2929
+ * @return {?}
2930
+ */
2931
+ HdFormLinesComponent.prototype.getSelectedLinesData = /**
2932
+ * 获取全部勾选行数据(含跨页、搜索后未展示但仍勾选的行)
2933
+ * @return {?}
2934
+ */
2935
+ function () {
2936
+ var _this = this;
2937
+ /** @type {?} */
2938
+ var result = [];
2939
+ /** @type {?} */
2940
+ var mountedById = new Map();
2941
+ ((/** @type {?} */ (this.linesFormArray.controls))).forEach((/**
2942
+ * @param {?} line
2943
+ * @return {?}
2944
+ */
2945
+ function (line) {
2946
+ /** @type {?} */
2947
+ var id = _this.getRowId(line);
2948
+ if (id && _this.selectedRowIds.has(id)) {
2949
+ mountedById.set(id, line.getRawValue());
2950
+ }
2951
+ }));
2952
+ (this.storeFormLinesData || []).forEach((/**
2953
+ * @param {?} data
2954
+ * @return {?}
2955
+ */
2956
+ function (data) {
2957
+ /** @type {?} */
2958
+ var id = data && data._hdRowId;
2959
+ if (id && _this.selectedRowIds.has(id)) {
2960
+ result.push(mountedById.has(id) ? mountedById.get(id) : __assign({}, data));
2961
+ }
2962
+ }));
2963
+ // 兜底:刚新增、尚未进 store 的勾选行
2964
+ this.selectedRowIds.forEach((/**
2965
+ * @param {?} id
2966
+ * @return {?}
2967
+ */
2968
+ function (id) {
2969
+ if (!result.some((/**
2970
+ * @param {?} item
2971
+ * @return {?}
2972
+ */
2973
+ function (item) { return item && item._hdRowId === id; })) && mountedById.has(id)) {
2974
+ result.push(mountedById.get(id));
2975
+ }
2976
+ }));
2977
+ return result;
2978
+ };
2979
+ /**
2980
+ * 批量填充勾选行字段(支持跨页、搜索后未展示但仍勾选的行)
2981
+ * @param values 要写入的字段,如 { remark: '批量备注', price: 10 }
2982
+ * @param emitEvent 是否触发 valueChanges / onChangeEvent,默认 true
2983
+ * @returns 实际填充的行数
2984
+ */
2985
+ /**
2986
+ * 批量填充勾选行字段(支持跨页、搜索后未展示但仍勾选的行)
2987
+ * @param {?} values 要写入的字段,如 { remark: '批量备注', price: 10 }
2988
+ * @param {?=} emitEvent 是否触发 valueChanges / onChangeEvent,默认 true
2989
+ * @return {?} 实际填充的行数
2990
+ */
2991
+ HdFormLinesComponent.prototype.batchFillSelected = /**
2992
+ * 批量填充勾选行字段(支持跨页、搜索后未展示但仍勾选的行)
2993
+ * @param {?} values 要写入的字段,如 { remark: '批量备注', price: 10 }
2994
+ * @param {?=} emitEvent 是否触发 valueChanges / onChangeEvent,默认 true
2995
+ * @return {?} 实际填充的行数
2996
+ */
2997
+ function (values, emitEvent) {
2998
+ var _this = this;
2999
+ if (emitEvent === void 0) { emitEvent = true; }
3000
+ if (!values || this.selectedRowIds.size === 0) {
3001
+ return 0;
3002
+ }
3003
+ /** @type {?} */
3004
+ var mountedById = new Map();
3005
+ ((/** @type {?} */ (this.linesFormArray.controls))).forEach((/**
3006
+ * @param {?} line
3007
+ * @return {?}
3008
+ */
3009
+ function (line) {
3010
+ /** @type {?} */
3011
+ var id = _this.getRowId(line);
3012
+ if (id) {
3013
+ mountedById.set(id, line);
3014
+ }
3015
+ }));
3016
+ /** @type {?} */
3017
+ var count = 0;
3018
+ this.selectedRowIds.forEach((/**
3019
+ * @param {?} id
3020
+ * @return {?}
3021
+ */
3022
+ function (id) {
3023
+ /** @type {?} */
3024
+ var line = mountedById.get(id);
3025
+ if (line) {
3026
+ _this.applyValuesToLine(line, values, emitEvent);
3027
+ count++;
3028
+ return;
3029
+ }
3030
+ // 当前筛选/页面未挂载:直接改总数据,退出搜索后可见
3031
+ /** @type {?} */
3032
+ var storeItem = (_this.storeFormLinesData || []).find((/**
3033
+ * @param {?} data
3034
+ * @return {?}
3035
+ */
3036
+ function (data) { return data && data._hdRowId === id; }));
3037
+ if (storeItem) {
3038
+ Object.keys(values).forEach((/**
3039
+ * @param {?} key
3040
+ * @return {?}
3041
+ */
3042
+ function (key) {
3043
+ storeItem[key] = values[key];
3044
+ }));
3045
+ count++;
3046
+ }
3047
+ }));
3048
+ return count;
3049
+ };
3050
+ /** 清空勾选 */
3051
+ /**
3052
+ * 清空勾选
3053
+ * @return {?}
3054
+ */
3055
+ HdFormLinesComponent.prototype.clearSelection = /**
3056
+ * 清空勾选
3057
+ * @return {?}
3058
+ */
3059
+ function () {
3060
+ if (this.selectedRowIds.size === 0) {
3061
+ return;
3062
+ }
3063
+ this.selectedRowIds.clear();
3064
+ this.emitSelectionChange();
3065
+ };
3066
+ /** 当前勾选数量(含跨页、搜索保留) */
3067
+ /**
3068
+ * 当前勾选数量(含跨页、搜索保留)
3069
+ * @return {?}
3070
+ */
3071
+ HdFormLinesComponent.prototype.getSelectedCount = /**
3072
+ * 当前勾选数量(含跨页、搜索保留)
3073
+ * @return {?}
3074
+ */
3075
+ function () {
3076
+ return this.selectedRowIds.size;
3077
+ };
3078
+ Object.defineProperty(HdFormLinesComponent.prototype, "showToolbar", {
3079
+ /** 是否展示顶部工具栏 */
3080
+ get: /**
3081
+ * 是否展示顶部工具栏
3082
+ * @return {?}
3083
+ */
3084
+ function () {
3085
+ return (!!this.showSearch ||
3086
+ !!this.showCheckbox ||
3087
+ !!this.formLinesLeftButton ||
3088
+ !!this.formLinesRightButton);
3089
+ },
3090
+ enumerable: true,
3091
+ configurable: true
3092
+ });
2576
3093
  /**
2577
3094
  * @param {?} value
2578
3095
  * @return {?}
@@ -3759,7 +4276,34 @@
3759
4276
  * @return {?}
3760
4277
  */
3761
4278
  function () {
4279
+ return this.createLineFromValues(null, true);
4280
+ };
4281
+ /**
4282
+ * 根据行数据创建 FormGroup(含隐藏字段、select 的 label 等附属字段)
4283
+ * @param formLinesDataItem 行数据,空行传 null
4284
+ * @param isEmptyLine 是否空行(影响必填校验规则,与历史逻辑保持一致)
4285
+ * @param regenerateRowId 是否强制生成新行 id(复制行时使用)
4286
+ */
4287
+ /**
4288
+ * 根据行数据创建 FormGroup(含隐藏字段、select 的 label 等附属字段)
4289
+ * @private
4290
+ * @param {?} formLinesDataItem 行数据,空行传 null
4291
+ * @param {?=} isEmptyLine 是否空行(影响必填校验规则,与历史逻辑保持一致)
4292
+ * @param {?=} regenerateRowId 是否强制生成新行 id(复制行时使用)
4293
+ * @return {?}
4294
+ */
4295
+ HdFormLinesComponent.prototype.createLineFromValues = /**
4296
+ * 根据行数据创建 FormGroup(含隐藏字段、select 的 label 等附属字段)
4297
+ * @private
4298
+ * @param {?} formLinesDataItem 行数据,空行传 null
4299
+ * @param {?=} isEmptyLine 是否空行(影响必填校验规则,与历史逻辑保持一致)
4300
+ * @param {?=} regenerateRowId 是否强制生成新行 id(复制行时使用)
4301
+ * @return {?}
4302
+ */
4303
+ function (formLinesDataItem, isEmptyLine, regenerateRowId) {
3762
4304
  var _this = this;
4305
+ if (isEmptyLine === void 0) { isEmptyLine = false; }
4306
+ if (regenerateRowId === void 0) { regenerateRowId = false; }
3763
4307
  /** @type {?} */
3764
4308
  var formGroupObj = {};
3765
4309
  this.formLines.forEach((/**
@@ -3767,25 +4311,56 @@
3767
4311
  * @return {?}
3768
4312
  */
3769
4313
  function (item) {
3770
- // 新增行 初始数据都为null
3771
4314
  formGroupObj[item.name] = _this.fb.control({
3772
- value: item.value,
4315
+ value: formLinesDataItem != null
4316
+ ? formLinesDataItem[item.name]
4317
+ : item.value,
3773
4318
  disabled: item.disabled,
3774
- } || null, item.require && !item.hide ? [forms.Validators.required] : []);
4319
+ }, isEmptyLine
4320
+ ? (item.require && !item.hide ? [forms.Validators.required] : [])
4321
+ : (item.require ? [forms.Validators.required] : []));
4322
+ if (item.selectOption && item.selectOption.label) {
4323
+ formGroupObj[item.selectOption.label] = _this.fb.control(formLinesDataItem != null
4324
+ ? (formLinesDataItem[item.selectOption.label] || null)
4325
+ : null, []);
4326
+ }
3775
4327
  }));
4328
+ // 稳定行 id:搜索重建表单后用于保留勾选
4329
+ /** @type {?} */
4330
+ var rowId = !regenerateRowId && formLinesDataItem && formLinesDataItem._hdRowId
4331
+ ? formLinesDataItem._hdRowId
4332
+ : this.generateRowId();
4333
+ formGroupObj._hdRowId = this.fb.control(rowId);
4334
+ if (formLinesDataItem && !formLinesDataItem._hdRowId) {
4335
+ formLinesDataItem._hdRowId = rowId;
4336
+ }
4337
+ // 复制源行上多余的字段(隐藏附属字段、selectListName 等)
4338
+ if (formLinesDataItem) {
4339
+ Object.keys(formLinesDataItem).forEach((/**
4340
+ * @param {?} key
4341
+ * @return {?}
4342
+ */
4343
+ function (key) {
4344
+ if (key === "lineIndex" ||
4345
+ key === "isHdFormLineSearchAdd" ||
4346
+ key === "_hdRowId") {
4347
+ return;
4348
+ }
4349
+ if (!formGroupObj[key]) {
4350
+ formGroupObj[key] = _this.fb.control(formLinesDataItem[key]);
4351
+ }
4352
+ }));
4353
+ }
3776
4354
  formGroupObj.lineIndex = this.fb.control(this.linesFormArray.controls.length, []);
3777
- // 用来标识是否是搜索状态下新增的行
3778
4355
  formGroupObj.isHdFormLineSearchAdd = this.fb.control(this.isFilterData, []);
3779
4356
  /** @type {?} */
3780
4357
  var formGroupSubmit = this.fb.group(formGroupObj);
3781
4358
  this.formLines.forEach((/**
3782
4359
  * @param {?} item
3783
- * @param {?} innerIndex
3784
4360
  * @return {?}
3785
4361
  */
3786
- function (item, innerIndex) {
4362
+ function (item) {
3787
4363
  if (item.onChangeEvent) {
3788
- // 父组件未配置时默认 500ms 防抖
3789
4364
  /** @type {?} */
3790
4365
  var debounceMs = item.onChangeEventDebounceTime != null ? item.onChangeEventDebounceTime : 500;
3791
4366
  formGroupSubmit
@@ -3838,57 +4413,10 @@
3838
4413
  var _this = this;
3839
4414
  this.formLinesData.forEach((/**
3840
4415
  * @param {?} formLinesDataItem
3841
- * @param {?} index
3842
4416
  * @return {?}
3843
4417
  */
3844
- function (formLinesDataItem, index) {
3845
- /** @type {?} */
3846
- var formGroupObj = {};
3847
- _this.formLines.forEach((/**
3848
- * @param {?} item
3849
- * @return {?}
3850
- */
3851
- function (item) {
3852
- // 新增行 初始数据都为null
3853
- formGroupObj[item.name] = _this.fb.control({
3854
- value: _this.judgeValueIsNotEmpty(formLinesDataItem[item.name])
3855
- ? formLinesDataItem[item.name]
3856
- : item.value || null,
3857
- disabled: item.disabled,
3858
- }, item.require ? [forms.Validators.required] : []);
3859
- if (item.selectOption && item.selectOption.label) {
3860
- formGroupObj[item.selectOption.label] = _this.fb.control(formLinesDataItem[item.selectOption.label] || null, []);
3861
- }
3862
- }));
3863
- formGroupObj.lineIndex = _this.fb.control(_this.linesFormArray.controls.length + 1, []);
3864
- /** @type {?} */
3865
- var formGroupTmp = _this.fb.group(formGroupObj);
3866
- _this.formLines.forEach((/**
3867
- * @param {?} item
3868
- * @param {?} innerIndex
3869
- * @return {?}
3870
- */
3871
- function (item, innerIndex) {
3872
- if (item.onChangeEvent) {
3873
- // 父组件未配置时默认 500ms 防抖
3874
- /** @type {?} */
3875
- var debounceMs = item.onChangeEventDebounceTime != null ? item.onChangeEventDebounceTime : 500;
3876
- formGroupTmp
3877
- .get(item.name)
3878
- .valueChanges.pipe(operators.debounceTime(debounceMs))
3879
- .subscribe((/**
3880
- * @param {?} value
3881
- * @return {?}
3882
- */
3883
- function (value) {
3884
- if (item.type === FormLineType.Select && value !== null) {
3885
- _this.delayJumpToNextInput();
3886
- }
3887
- _this.triggerEvent(item.onChangeEvent, value, formGroupTmp);
3888
- }));
3889
- }
3890
- }));
3891
- _this.linesFormArray.insert(_this.linesFormArray.controls.length, formGroupTmp);
4418
+ function (formLinesDataItem) {
4419
+ _this.linesFormArray.insert(_this.linesFormArray.controls.length, _this.createLineFromValues(formLinesDataItem));
3892
4420
  }));
3893
4421
  this.tableLoading = false;
3894
4422
  this.showForm = true;
@@ -3926,6 +4454,44 @@
3926
4454
  }
3927
4455
  }), 0);
3928
4456
  };
4457
+ /**
4458
+ * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)
4459
+ * @param index 当前行 lineIndex(从 1 开始)
4460
+ */
4461
+ /**
4462
+ * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)
4463
+ * @param {?} index 当前行 lineIndex(从 1 开始)
4464
+ * @return {?}
4465
+ */
4466
+ HdFormLinesComponent.prototype.copyFormLine = /**
4467
+ * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)
4468
+ * @param {?} index 当前行 lineIndex(从 1 开始)
4469
+ * @return {?}
4470
+ */
4471
+ function (index) {
4472
+ var _this = this;
4473
+ /** @type {?} */
4474
+ var sourceIndex = index - 1;
4475
+ /** @type {?} */
4476
+ var sourceLine = (/** @type {?} */ (this.linesFormArray.at(sourceIndex)));
4477
+ if (!sourceLine) {
4478
+ return;
4479
+ }
4480
+ // getRawValue 包含 disabled 字段;复制行使用新的 _hdRowId
4481
+ /** @type {?} */
4482
+ var sourceValues = sourceLine.getRawValue();
4483
+ this.linesFormArray.insert(index, this.createLineFromValues(sourceValues, false, true));
4484
+ this.calculateLineNumber();
4485
+ setTimeout((/**
4486
+ * @return {?}
4487
+ */
4488
+ function () {
4489
+ _this.collectDomData();
4490
+ _this.activeDomX = index;
4491
+ _this.activeDomY = 0;
4492
+ _this.focusDom(_this.activeDomX, _this.activeDomY);
4493
+ }), 0);
4494
+ };
3929
4495
  /**
3930
4496
  * @param {?} index
3931
4497
  * @return {?}
@@ -3944,7 +4510,10 @@
3944
4510
  }
3945
4511
  return;
3946
4512
  }
4513
+ /** @type {?} */
4514
+ var removedLine = (/** @type {?} */ (this.linesFormArray.at(index - 1)));
3947
4515
  this.linesFormArray.removeAt(index - 1);
4516
+ this.removeLineFromSelection(removedLine);
3948
4517
  if (!this.isFilterData &&
3949
4518
  this.linesFormArray.controls &&
3950
4519
  this.linesFormArray.controls.length === 0) {
@@ -4200,6 +4769,7 @@
4200
4769
  */
4201
4770
  function () {
4202
4771
  // 删除
4772
+ this.clearSelection();
4203
4773
  for (var i = this.linesFormArray.controls.length; i >= 0; i--) {
4204
4774
  this.deleteFormLine(i);
4205
4775
  }
@@ -4303,8 +4873,8 @@
4303
4873
  HdFormLinesComponent.decorators = [
4304
4874
  { type: core.Component, args: [{
4305
4875
  selector: "hd-form-lines",
4306
- template: "<hd-button-group *ngIf=\"showForm && showSearch\">\n <ng-template #buttonGroupLeft>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-template>\n</hd-button-group>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<hd-space *ngIf=\"showForm && showSearch\" background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200 ]\">\n <thead>\n <tr>\n <th nzWidth=\"58px\" nzLeft=\"0px\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"!item.hide\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th style=\"width: 80px\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"58px\" nzLeft=\"0px\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"!formItem.hide\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : 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>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\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 (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\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 (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\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\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, 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\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td style=\"width: 80px\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line.get('lineIndex').value)\">\u6DFB\u52A0</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, 2).toFixed(2)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
4307
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!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;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!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:14px;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:14px;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-formLines-container ::ng-deep td{padding:1.5px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container .ant-input-number{width:100%}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
4876
+ template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u641C\u7D22\u6846 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u81EA\u5B9A\u4E49\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u8303\u56F4\u518D\u5DE6\u53F3\u5206\u5F00 -->\n <div class=\"hd-formLines-toolbar-right\" *ngIf=\"showSearch\">\n <div class=\"hd-formLines-toolbar-right-left\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </div>\n <div class=\"hd-formLines-toolbar-right-right\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n </div>\n </div>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u53EA\u653E\u81EA\u5B9A\u4E49\u53F3\u4FA7\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<!-- \u52FE\u9009\u63D0\u793A\uFF1A\u5355\u72EC\u4E00\u884C\uFF0C\u653E\u5728\u8868\u5355\u4E0A\u65B9 -->\n<ng-container *ngIf=\"showForm && showCheckbox && getSelectedCount() > 0\">\n <nz-alert nzType=\"info\" [nzMessage]=\"selectionAlertTemplate\" nzShowIcon></nz-alert>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n<ng-template #selectionAlertTemplate>\n <span>\u5DF2\u9009\u62E9{{ getSelectedCount() }}\u6761\u6570\u636E</span>&nbsp;&nbsp;\n <span class=\"common-btn-group\">\n <a (click)=\"clearSelection()\">\u6E05\u7A7A</a>\n </span>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200 ]\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"!item.hide\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"!formItem.hide\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\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 (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\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 (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\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\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, 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\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line.get('lineIndex').value)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line.get('lineIndex').value)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, 2).toFixed(2)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
4877
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!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;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!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:14px;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:14px;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-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-right{flex:1;min-width:0;display:flex;justify-content:flex-end}.hd-formLines-toolbar-right{display:flex;align-items:center;justify-content:space-between;width:100%;margin-left:16px}.hd-formLines-toolbar-right-left,.hd-formLines-toolbar-right-right{display:flex;align-items:center}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
4308
4878
  }] }
4309
4879
  ];
4310
4880
  /** @nocollapse */
@@ -4320,16 +4890,20 @@
4320
4890
  showKeyboardOperateTip: [{ type: core.Input }],
4321
4891
  tableLoading: [{ type: core.Input }],
4322
4892
  showSearch: [{ type: core.Input }],
4893
+ showCheckbox: [{ type: core.Input }],
4323
4894
  formLines: [{ type: core.Input }],
4324
4895
  formLinesData: [{ type: core.Input }],
4325
4896
  operateButtons: [{ type: core.Input }],
4326
4897
  scroll: [{ type: core.Input }],
4327
4898
  changeEvent: [{ type: core.Output }],
4899
+ selectionChange: [{ type: core.Output }],
4328
4900
  showDeleteConfirm: [{ type: core.Input }],
4329
4901
  showTotal: [{ type: core.Input }],
4330
4902
  totalOption: [{ type: core.Input }],
4331
4903
  columnsNumber: [{ type: core.Input }],
4332
4904
  ViewDomRightTemplate: [{ type: core.ContentChild, args: ["ViewDomRightTemplate", { static: false },] }],
4905
+ formLinesLeftButton: [{ type: core.ContentChild, args: ["formLinesLeftButton", { static: false },] }],
4906
+ formLinesRightButton: [{ type: core.ContentChild, args: ["formLinesRightButton", { static: false },] }],
4333
4907
  deleteLineEvent: [{ type: core.Output }]
4334
4908
  };
4335
4909
  __decorate([
@@ -4352,6 +4926,10 @@
4352
4926
  ngZorroAntd.InputBoolean(),
4353
4927
  __metadata("design:type", Boolean)
4354
4928
  ], HdFormLinesComponent.prototype, "showSearch", void 0);
4929
+ __decorate([
4930
+ ngZorroAntd.InputBoolean(),
4931
+ __metadata("design:type", Boolean)
4932
+ ], HdFormLinesComponent.prototype, "showCheckbox", void 0);
4355
4933
  __decorate([
4356
4934
  ngZorroAntd.InputBoolean(),
4357
4935
  __metadata("design:type", Boolean)
@@ -4377,6 +4955,11 @@
4377
4955
  HdFormLinesComponent.prototype.tableLoading;
4378
4956
  /** @type {?} */
4379
4957
  HdFormLinesComponent.prototype.showSearch;
4958
+ /**
4959
+ * 是否展示行勾选列,用于外部批量操作勾选行
4960
+ * @type {?}
4961
+ */
4962
+ HdFormLinesComponent.prototype.showCheckbox;
4380
4963
  /** @type {?} */
4381
4964
  HdFormLinesComponent.prototype.formLines;
4382
4965
  /** @type {?} */
@@ -4387,6 +4970,11 @@
4387
4970
  HdFormLinesComponent.prototype.scroll;
4388
4971
  /** @type {?} */
4389
4972
  HdFormLinesComponent.prototype.changeEvent;
4973
+ /**
4974
+ * 勾选变化时抛出当前勾选行 FormGroup 列表
4975
+ * @type {?}
4976
+ */
4977
+ HdFormLinesComponent.prototype.selectionChange;
4390
4978
  /** @type {?} */
4391
4979
  HdFormLinesComponent.prototype.showDeleteConfirm;
4392
4980
  /** @type {?} */
@@ -4421,6 +5009,12 @@
4421
5009
  HdFormLinesComponent.prototype.isFilterData;
4422
5010
  /** @type {?} */
4423
5011
  HdFormLinesComponent.prototype.formValid;
5012
+ /**
5013
+ * 勾选的行 id(跨页、搜索重建后仍保留)
5014
+ * @type {?}
5015
+ * @private
5016
+ */
5017
+ HdFormLinesComponent.prototype.selectedRowIds;
4424
5018
  /**
4425
5019
  * @type {?}
4426
5020
  * @private
@@ -4468,6 +5062,16 @@
4468
5062
  HdFormLinesComponent.prototype.activeSelectedComponentOpen;
4469
5063
  /** @type {?} */
4470
5064
  HdFormLinesComponent.prototype.ViewDomRightTemplate;
5065
+ /**
5066
+ * 工具栏左侧自定义按钮,用法同 hd-table 的 tableLeftButton
5067
+ * @type {?}
5068
+ */
5069
+ HdFormLinesComponent.prototype.formLinesLeftButton;
5070
+ /**
5071
+ * 工具栏右侧自定义按钮,用法同 hd-table 的 tableRightButton
5072
+ * @type {?}
5073
+ */
5074
+ HdFormLinesComponent.prototype.formLinesRightButton;
4471
5075
  /** @type {?} */
4472
5076
  HdFormLinesComponent.prototype.deleteLineEvent;
4473
5077
  /**
@@ -7373,12 +7977,112 @@
7373
7977
  return HdTipModule;
7374
7978
  }());
7375
7979
 
7980
+ /**
7981
+ * @fileoverview added by tsickle
7982
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
7983
+ */
7984
+ /**
7985
+ * 全局清理 ng-zorro tooltip 残留 overlay。
7986
+ * 典型场景:hover 出 tooltip 后立刻点击跳转/打开详情,CDK overlay 未销毁,飘到下一页。
7987
+ *
7988
+ * 引入 FantasyNgzorroModule 后自动生效,也可手动注入调用 clearStuckTooltips()。
7989
+ */
7990
+ var HdOverlayCleanupService = /** @class */ (function () {
7991
+ function HdOverlayCleanupService(router) {
7992
+ this.router = router;
7993
+ this.started = false;
7994
+ this.start();
7995
+ }
7996
+ /** 启动全局监听(幂等) */
7997
+ /**
7998
+ * 启动全局监听(幂等)
7999
+ * @return {?}
8000
+ */
8001
+ HdOverlayCleanupService.prototype.start = /**
8002
+ * 启动全局监听(幂等)
8003
+ * @return {?}
8004
+ */
8005
+ function () {
8006
+ var _this = this;
8007
+ if (this.started || typeof document === "undefined") {
8008
+ return;
8009
+ }
8010
+ this.started = true;
8011
+ // 任意按下即清:覆盖跳路由、开抽屉/弹窗等不走 Navigation 的场景
8012
+ document.addEventListener("mousedown", (/**
8013
+ * @return {?}
8014
+ */
8015
+ function () { return _this.clearStuckTooltips(); }), true);
8016
+ if (this.router) {
8017
+ this.router.events
8018
+ .pipe(operators.filter((/**
8019
+ * @param {?} e
8020
+ * @return {?}
8021
+ */
8022
+ function (e) { return e instanceof router.NavigationStart; })))
8023
+ .subscribe((/**
8024
+ * @return {?}
8025
+ */
8026
+ function () { return _this.clearStuckTooltips(); }));
8027
+ }
8028
+ };
8029
+ /** 清理残留在 body 上的 ant-tooltip overlay */
8030
+ /**
8031
+ * 清理残留在 body 上的 ant-tooltip overlay
8032
+ * @return {?}
8033
+ */
8034
+ HdOverlayCleanupService.prototype.clearStuckTooltips = /**
8035
+ * 清理残留在 body 上的 ant-tooltip overlay
8036
+ * @return {?}
8037
+ */
8038
+ function () {
8039
+ if (typeof document === "undefined") {
8040
+ return;
8041
+ }
8042
+ /** @type {?} */
8043
+ var tooltips = document.querySelectorAll(".cdk-overlay-container .ant-tooltip");
8044
+ tooltips.forEach((/**
8045
+ * @param {?} el
8046
+ * @return {?}
8047
+ */
8048
+ function (el) {
8049
+ /** @type {?} */
8050
+ var pane = (/** @type {?} */ (el.closest(".cdk-overlay-pane")));
8051
+ if (pane && pane.parentNode) {
8052
+ pane.parentNode.removeChild(pane);
8053
+ }
8054
+ }));
8055
+ };
8056
+ HdOverlayCleanupService.decorators = [
8057
+ { type: core.Injectable, args: [{ providedIn: "root" },] }
8058
+ ];
8059
+ /** @nocollapse */
8060
+ HdOverlayCleanupService.ctorParameters = function () { return [
8061
+ { type: router.Router, decorators: [{ type: core.Optional }] }
8062
+ ]; };
8063
+ /** @nocollapse */ HdOverlayCleanupService.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function HdOverlayCleanupService_Factory() { return new HdOverlayCleanupService(core.ɵɵinject(router.Router, 8)); }, token: HdOverlayCleanupService, providedIn: "root" });
8064
+ return HdOverlayCleanupService;
8065
+ }());
8066
+ if (false) {
8067
+ /**
8068
+ * @type {?}
8069
+ * @private
8070
+ */
8071
+ HdOverlayCleanupService.prototype.started;
8072
+ /**
8073
+ * @type {?}
8074
+ * @private
8075
+ */
8076
+ HdOverlayCleanupService.prototype.router;
8077
+ }
8078
+
7376
8079
  /**
7377
8080
  * @fileoverview added by tsickle
7378
8081
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
7379
8082
  */
7380
8083
  var HdComponentModule = /** @class */ (function () {
7381
- function HdComponentModule() {
8084
+ // 单独引入 HdComponentModule 时也启动全局 tooltip 清理
8085
+ function HdComponentModule(_overlayCleanup) {
7382
8086
  }
7383
8087
  HdComponentModule.decorators = [
7384
8088
  { type: core.NgModule, args: [{
@@ -7402,6 +8106,10 @@
7402
8106
  ]
7403
8107
  },] }
7404
8108
  ];
8109
+ /** @nocollapse */
8110
+ HdComponentModule.ctorParameters = function () { return [
8111
+ { type: HdOverlayCleanupService }
8112
+ ]; };
7405
8113
  return HdComponentModule;
7406
8114
  }());
7407
8115
 
@@ -7410,7 +8118,8 @@
7410
8118
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
7411
8119
  */
7412
8120
  var FantasyNgzorroModule = /** @class */ (function () {
7413
- function FantasyNgzorroModule() {
8121
+ // 注入以启动全局 tooltip overlay 清理(providedIn: root,幂等)
8122
+ function FantasyNgzorroModule(_overlayCleanup) {
7414
8123
  }
7415
8124
  FantasyNgzorroModule.decorators = [
7416
8125
  { type: core.NgModule, args: [{
@@ -7420,6 +8129,10 @@
7420
8129
  entryComponents: [HdLogComponent]
7421
8130
  },] }
7422
8131
  ];
8132
+ /** @nocollapse */
8133
+ FantasyNgzorroModule.ctorParameters = function () { return [
8134
+ { type: HdOverlayCleanupService }
8135
+ ]; };
7423
8136
  return FantasyNgzorroModule;
7424
8137
  }());
7425
8138
 
@@ -7932,6 +8645,7 @@
7932
8645
  exports.HdLogComponent = HdLogComponent;
7933
8646
  exports.HdLogService = HdLogService;
7934
8647
  exports.HdOption = HdOption;
8648
+ exports.HdOverlayCleanupService = HdOverlayCleanupService;
7935
8649
  exports.HdTableColumn = HdTableColumn;
7936
8650
  exports.HdTableTotalOption = HdTableTotalOption;
7937
8651
  exports.InputNumber = InputNumber;