fantasy-ngzorro 2.1.4 → 2.1.6

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.
@@ -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 {?}
@@ -3455,7 +3972,7 @@
3455
3972
  formGroupObj[item.selectOption.label] = _this.fb.control(formLinesDataItem[item.selectOption.label] || null, []);
3456
3973
  }
3457
3974
  }));
3458
- formGroupObj.lineIndex = _this.fb.control(((/** @type {?} */ (tmpValidateHdFormLines.get("lines")))).controls.length, []);
3975
+ formGroupObj.lineIndex = _this.fb.control(((/** @type {?} */ (tmpValidateHdFormLines.get("lines")))).controls.length + 1, []);
3459
3976
  /** @type {?} */
3460
3977
  var formGroupTmp = _this.fb.group(formGroupObj);
3461
3978
  _this.formLines.forEach((/**
@@ -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
  }));
3776
- formGroupObj.lineIndex = this.fb.control(this.linesFormArray.controls.length, []);
3777
- // 用来标识是否是搜索状态下新增的行
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
+ }
4354
+ formGroupObj.lineIndex = this.fb.control(this.linesFormArray.controls.length + 1, []);
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,58 +4413,12 @@
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
  }));
4421
+ this.calculateLineNumber();
3893
4422
  this.tableLoading = false;
3894
4423
  this.showForm = true;
3895
4424
  };
@@ -3926,6 +4455,44 @@
3926
4455
  }
3927
4456
  }), 0);
3928
4457
  };
4458
+ /**
4459
+ * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)
4460
+ * @param index 当前行 lineIndex(从 1 开始)
4461
+ */
4462
+ /**
4463
+ * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)
4464
+ * @param {?} index 当前行 lineIndex(从 1 开始)
4465
+ * @return {?}
4466
+ */
4467
+ HdFormLinesComponent.prototype.copyFormLine = /**
4468
+ * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)
4469
+ * @param {?} index 当前行 lineIndex(从 1 开始)
4470
+ * @return {?}
4471
+ */
4472
+ function (index) {
4473
+ var _this = this;
4474
+ /** @type {?} */
4475
+ var sourceIndex = index - 1;
4476
+ /** @type {?} */
4477
+ var sourceLine = (/** @type {?} */ (this.linesFormArray.at(sourceIndex)));
4478
+ if (!sourceLine) {
4479
+ return;
4480
+ }
4481
+ // getRawValue 包含 disabled 字段;复制行使用新的 _hdRowId
4482
+ /** @type {?} */
4483
+ var sourceValues = sourceLine.getRawValue();
4484
+ this.linesFormArray.insert(index, this.createLineFromValues(sourceValues, false, true));
4485
+ this.calculateLineNumber();
4486
+ setTimeout((/**
4487
+ * @return {?}
4488
+ */
4489
+ function () {
4490
+ _this.collectDomData();
4491
+ _this.activeDomX = index;
4492
+ _this.activeDomY = 0;
4493
+ _this.focusDom(_this.activeDomX, _this.activeDomY);
4494
+ }), 0);
4495
+ };
3929
4496
  /**
3930
4497
  * @param {?} index
3931
4498
  * @return {?}
@@ -3944,7 +4511,10 @@
3944
4511
  }
3945
4512
  return;
3946
4513
  }
4514
+ /** @type {?} */
4515
+ var removedLine = (/** @type {?} */ (this.linesFormArray.at(index - 1)));
3947
4516
  this.linesFormArray.removeAt(index - 1);
4517
+ this.removeLineFromSelection(removedLine);
3948
4518
  if (!this.isFilterData &&
3949
4519
  this.linesFormArray.controls &&
3950
4520
  this.linesFormArray.controls.length === 0) {
@@ -4200,6 +4770,7 @@
4200
4770
  */
4201
4771
  function () {
4202
4772
  // 删除
4773
+ this.clearSelection();
4203
4774
  for (var i = this.linesFormArray.controls.length; i >= 0; i--) {
4204
4775
  this.deleteFormLine(i);
4205
4776
  }
@@ -4303,8 +4874,8 @@
4303
4874
  HdFormLinesComponent.decorators = [
4304
4875
  { type: core.Component, args: [{
4305
4876
  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: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}"]
4877
+ 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",
4878
+ 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
4879
  }] }
4309
4880
  ];
4310
4881
  /** @nocollapse */
@@ -4320,16 +4891,20 @@
4320
4891
  showKeyboardOperateTip: [{ type: core.Input }],
4321
4892
  tableLoading: [{ type: core.Input }],
4322
4893
  showSearch: [{ type: core.Input }],
4894
+ showCheckbox: [{ type: core.Input }],
4323
4895
  formLines: [{ type: core.Input }],
4324
4896
  formLinesData: [{ type: core.Input }],
4325
4897
  operateButtons: [{ type: core.Input }],
4326
4898
  scroll: [{ type: core.Input }],
4327
4899
  changeEvent: [{ type: core.Output }],
4900
+ selectionChange: [{ type: core.Output }],
4328
4901
  showDeleteConfirm: [{ type: core.Input }],
4329
4902
  showTotal: [{ type: core.Input }],
4330
4903
  totalOption: [{ type: core.Input }],
4331
4904
  columnsNumber: [{ type: core.Input }],
4332
4905
  ViewDomRightTemplate: [{ type: core.ContentChild, args: ["ViewDomRightTemplate", { static: false },] }],
4906
+ formLinesLeftButton: [{ type: core.ContentChild, args: ["formLinesLeftButton", { static: false },] }],
4907
+ formLinesRightButton: [{ type: core.ContentChild, args: ["formLinesRightButton", { static: false },] }],
4333
4908
  deleteLineEvent: [{ type: core.Output }]
4334
4909
  };
4335
4910
  __decorate([
@@ -4352,6 +4927,10 @@
4352
4927
  ngZorroAntd.InputBoolean(),
4353
4928
  __metadata("design:type", Boolean)
4354
4929
  ], HdFormLinesComponent.prototype, "showSearch", void 0);
4930
+ __decorate([
4931
+ ngZorroAntd.InputBoolean(),
4932
+ __metadata("design:type", Boolean)
4933
+ ], HdFormLinesComponent.prototype, "showCheckbox", void 0);
4355
4934
  __decorate([
4356
4935
  ngZorroAntd.InputBoolean(),
4357
4936
  __metadata("design:type", Boolean)
@@ -4377,6 +4956,11 @@
4377
4956
  HdFormLinesComponent.prototype.tableLoading;
4378
4957
  /** @type {?} */
4379
4958
  HdFormLinesComponent.prototype.showSearch;
4959
+ /**
4960
+ * 是否展示行勾选列,用于外部批量操作勾选行
4961
+ * @type {?}
4962
+ */
4963
+ HdFormLinesComponent.prototype.showCheckbox;
4380
4964
  /** @type {?} */
4381
4965
  HdFormLinesComponent.prototype.formLines;
4382
4966
  /** @type {?} */
@@ -4387,6 +4971,11 @@
4387
4971
  HdFormLinesComponent.prototype.scroll;
4388
4972
  /** @type {?} */
4389
4973
  HdFormLinesComponent.prototype.changeEvent;
4974
+ /**
4975
+ * 勾选变化时抛出当前勾选行 FormGroup 列表
4976
+ * @type {?}
4977
+ */
4978
+ HdFormLinesComponent.prototype.selectionChange;
4390
4979
  /** @type {?} */
4391
4980
  HdFormLinesComponent.prototype.showDeleteConfirm;
4392
4981
  /** @type {?} */
@@ -4421,6 +5010,12 @@
4421
5010
  HdFormLinesComponent.prototype.isFilterData;
4422
5011
  /** @type {?} */
4423
5012
  HdFormLinesComponent.prototype.formValid;
5013
+ /**
5014
+ * 勾选的行 id(跨页、搜索重建后仍保留)
5015
+ * @type {?}
5016
+ * @private
5017
+ */
5018
+ HdFormLinesComponent.prototype.selectedRowIds;
4424
5019
  /**
4425
5020
  * @type {?}
4426
5021
  * @private
@@ -4468,6 +5063,16 @@
4468
5063
  HdFormLinesComponent.prototype.activeSelectedComponentOpen;
4469
5064
  /** @type {?} */
4470
5065
  HdFormLinesComponent.prototype.ViewDomRightTemplate;
5066
+ /**
5067
+ * 工具栏左侧自定义按钮,用法同 hd-table 的 tableLeftButton
5068
+ * @type {?}
5069
+ */
5070
+ HdFormLinesComponent.prototype.formLinesLeftButton;
5071
+ /**
5072
+ * 工具栏右侧自定义按钮,用法同 hd-table 的 tableRightButton
5073
+ * @type {?}
5074
+ */
5075
+ HdFormLinesComponent.prototype.formLinesRightButton;
4471
5076
  /** @type {?} */
4472
5077
  HdFormLinesComponent.prototype.deleteLineEvent;
4473
5078
  /**
@@ -7373,12 +7978,112 @@
7373
7978
  return HdTipModule;
7374
7979
  }());
7375
7980
 
7981
+ /**
7982
+ * @fileoverview added by tsickle
7983
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
7984
+ */
7985
+ /**
7986
+ * 全局清理 ng-zorro tooltip 残留 overlay。
7987
+ * 典型场景:hover 出 tooltip 后立刻点击跳转/打开详情,CDK overlay 未销毁,飘到下一页。
7988
+ *
7989
+ * 引入 FantasyNgzorroModule 后自动生效,也可手动注入调用 clearStuckTooltips()。
7990
+ */
7991
+ var HdOverlayCleanupService = /** @class */ (function () {
7992
+ function HdOverlayCleanupService(router) {
7993
+ this.router = router;
7994
+ this.started = false;
7995
+ this.start();
7996
+ }
7997
+ /** 启动全局监听(幂等) */
7998
+ /**
7999
+ * 启动全局监听(幂等)
8000
+ * @return {?}
8001
+ */
8002
+ HdOverlayCleanupService.prototype.start = /**
8003
+ * 启动全局监听(幂等)
8004
+ * @return {?}
8005
+ */
8006
+ function () {
8007
+ var _this = this;
8008
+ if (this.started || typeof document === "undefined") {
8009
+ return;
8010
+ }
8011
+ this.started = true;
8012
+ // 任意按下即清:覆盖跳路由、开抽屉/弹窗等不走 Navigation 的场景
8013
+ document.addEventListener("mousedown", (/**
8014
+ * @return {?}
8015
+ */
8016
+ function () { return _this.clearStuckTooltips(); }), true);
8017
+ if (this.router) {
8018
+ this.router.events
8019
+ .pipe(operators.filter((/**
8020
+ * @param {?} e
8021
+ * @return {?}
8022
+ */
8023
+ function (e) { return e instanceof router.NavigationStart; })))
8024
+ .subscribe((/**
8025
+ * @return {?}
8026
+ */
8027
+ function () { return _this.clearStuckTooltips(); }));
8028
+ }
8029
+ };
8030
+ /** 清理残留在 body 上的 ant-tooltip overlay */
8031
+ /**
8032
+ * 清理残留在 body 上的 ant-tooltip overlay
8033
+ * @return {?}
8034
+ */
8035
+ HdOverlayCleanupService.prototype.clearStuckTooltips = /**
8036
+ * 清理残留在 body 上的 ant-tooltip overlay
8037
+ * @return {?}
8038
+ */
8039
+ function () {
8040
+ if (typeof document === "undefined") {
8041
+ return;
8042
+ }
8043
+ /** @type {?} */
8044
+ var tooltips = document.querySelectorAll(".cdk-overlay-container .ant-tooltip");
8045
+ tooltips.forEach((/**
8046
+ * @param {?} el
8047
+ * @return {?}
8048
+ */
8049
+ function (el) {
8050
+ /** @type {?} */
8051
+ var pane = (/** @type {?} */ (el.closest(".cdk-overlay-pane")));
8052
+ if (pane && pane.parentNode) {
8053
+ pane.parentNode.removeChild(pane);
8054
+ }
8055
+ }));
8056
+ };
8057
+ HdOverlayCleanupService.decorators = [
8058
+ { type: core.Injectable, args: [{ providedIn: "root" },] }
8059
+ ];
8060
+ /** @nocollapse */
8061
+ HdOverlayCleanupService.ctorParameters = function () { return [
8062
+ { type: router.Router, decorators: [{ type: core.Optional }] }
8063
+ ]; };
8064
+ /** @nocollapse */ HdOverlayCleanupService.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function HdOverlayCleanupService_Factory() { return new HdOverlayCleanupService(core.ɵɵinject(router.Router, 8)); }, token: HdOverlayCleanupService, providedIn: "root" });
8065
+ return HdOverlayCleanupService;
8066
+ }());
8067
+ if (false) {
8068
+ /**
8069
+ * @type {?}
8070
+ * @private
8071
+ */
8072
+ HdOverlayCleanupService.prototype.started;
8073
+ /**
8074
+ * @type {?}
8075
+ * @private
8076
+ */
8077
+ HdOverlayCleanupService.prototype.router;
8078
+ }
8079
+
7376
8080
  /**
7377
8081
  * @fileoverview added by tsickle
7378
8082
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
7379
8083
  */
7380
8084
  var HdComponentModule = /** @class */ (function () {
7381
- function HdComponentModule() {
8085
+ // 单独引入 HdComponentModule 时也启动全局 tooltip 清理
8086
+ function HdComponentModule(_overlayCleanup) {
7382
8087
  }
7383
8088
  HdComponentModule.decorators = [
7384
8089
  { type: core.NgModule, args: [{
@@ -7402,6 +8107,10 @@
7402
8107
  ]
7403
8108
  },] }
7404
8109
  ];
8110
+ /** @nocollapse */
8111
+ HdComponentModule.ctorParameters = function () { return [
8112
+ { type: HdOverlayCleanupService }
8113
+ ]; };
7405
8114
  return HdComponentModule;
7406
8115
  }());
7407
8116
 
@@ -7410,7 +8119,8 @@
7410
8119
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
7411
8120
  */
7412
8121
  var FantasyNgzorroModule = /** @class */ (function () {
7413
- function FantasyNgzorroModule() {
8122
+ // 注入以启动全局 tooltip overlay 清理(providedIn: root,幂等)
8123
+ function FantasyNgzorroModule(_overlayCleanup) {
7414
8124
  }
7415
8125
  FantasyNgzorroModule.decorators = [
7416
8126
  { type: core.NgModule, args: [{
@@ -7420,6 +8130,10 @@
7420
8130
  entryComponents: [HdLogComponent]
7421
8131
  },] }
7422
8132
  ];
8133
+ /** @nocollapse */
8134
+ FantasyNgzorroModule.ctorParameters = function () { return [
8135
+ { type: HdOverlayCleanupService }
8136
+ ]; };
7423
8137
  return FantasyNgzorroModule;
7424
8138
  }());
7425
8139
 
@@ -7932,6 +8646,7 @@
7932
8646
  exports.HdLogComponent = HdLogComponent;
7933
8647
  exports.HdLogService = HdLogService;
7934
8648
  exports.HdOption = HdOption;
8649
+ exports.HdOverlayCleanupService = HdOverlayCleanupService;
7935
8650
  exports.HdTableColumn = HdTableColumn;
7936
8651
  exports.HdTableTotalOption = HdTableTotalOption;
7937
8652
  exports.InputNumber = InputNumber;