fantasy-ngzorro 2.1.64 → 2.1.65

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.
package/README.md CHANGED
@@ -42,6 +42,7 @@
42
42
  | — | 2026-9-22 | `hd-tip` 支持右侧展开/收起(`showCollapse` / `[(expanded)]`),暴露 `expand` / `collapse` / `toggle` 供父组件控制其它区块 |
43
43
  | — | 2026-9-22 | `hd-form-lines` 勾选提示改为 `tableTotal` 插槽(同 hd-table),组件内不再默认渲染已选中块 |
44
44
  | — | 2026-9-22 | `hd-table` / `hd-detail-form` 字段值后支持编辑笔图标(`editable` + `edit` 回调,图标对齐 Figma) |
45
+ | — | 2026-9-24 | `hd-detail-lines`:补 `scroll.y` 后重建表格并同步表头横滚,修复列头不跟随左右滚动 |
45
46
  | — | 2026-9-24 | `hd-detail-lines` / `hd-detail-lines-page`:自动或仅传 `scroll.x` 时补 `scroll.y`,修复窄屏下无法纵向滚动 |
46
47
  | — | 2026-9-22 | `hd-table` 支持 `pagination` / `frontPagination`:全量 `content` 可「不分页展示」或「前端切片分页」,列表默认仍为服务端分页 |
47
48
  | — | 2026-9-21 | hd-table 列 `color` 支持函数,按行给某一个字段标红 |
@@ -1553,6 +1553,12 @@
1553
1553
  */
1554
1554
  this.isFilterData = false;
1555
1555
  this.storeFormLinesData = []; // 缓存的总的列表数据
1556
+ // 缓存的总的列表数据
1557
+ /**
1558
+ * 控制 nz-table 重建:scroll.y 从无到有时必须重建,否则表头不跟横滚
1559
+ */
1560
+ this.showTable = true;
1561
+ this.bodyScrollListener = null;
1556
1562
  }
1557
1563
  Object.defineProperty(HdDetailLinesComponent.prototype, "effectiveScroll", {
1558
1564
  get: /**
@@ -1594,6 +1600,15 @@
1594
1600
  function () {
1595
1601
  this.scheduleSyncHorizontalScroll();
1596
1602
  };
1603
+ /**
1604
+ * @return {?}
1605
+ */
1606
+ HdDetailLinesComponent.prototype.ngOnDestroy = /**
1607
+ * @return {?}
1608
+ */
1609
+ function () {
1610
+ this.unbindHeaderBodyScrollSync();
1611
+ };
1597
1612
  /**
1598
1613
  * @param {?} changes
1599
1614
  * @return {?}
@@ -1633,6 +1648,11 @@
1633
1648
  var _this = this;
1634
1649
  if (retry === void 0) { retry = 0; }
1635
1650
  if (this.scroll != null) {
1651
+ // 外部传了 scroll:首屏就带 y 时仍需绑一次兜底同步
1652
+ setTimeout((/**
1653
+ * @return {?}
1654
+ */
1655
+ function () { return _this.bindHeaderBodyScrollSync(); }));
1636
1656
  return;
1637
1657
  }
1638
1658
  /** @type {?} */
@@ -1683,6 +1703,7 @@
1683
1703
  * @return {?}
1684
1704
  */
1685
1705
  function () {
1706
+ var _this = this;
1686
1707
  if (this.scroll != null) {
1687
1708
  return;
1688
1709
  }
@@ -1695,6 +1716,10 @@
1695
1716
  // 有横向滚动时必须带 y,否则窄屏下无法纵向滚动
1696
1717
  /** @type {?} */
1697
1718
  var nextY = nextX ? this.getAutoScrollY() : null;
1719
+ /** @type {?} */
1720
+ var prevHasY = !!(this.tableScroll && this.tableScroll.y);
1721
+ /** @type {?} */
1722
+ var nextHasY = !!nextY;
1698
1723
  if (this.tableScroll &&
1699
1724
  this.tableScroll.x === nextX &&
1700
1725
  this.tableScroll.y === nextY) {
@@ -1703,7 +1728,107 @@
1703
1728
  this.tableScroll = nextX
1704
1729
  ? { x: nextX, y: nextY }
1705
1730
  : null;
1731
+ // ng-zorro 只在 AfterViewInit 绑一次 header/body 横滚同步;
1732
+ // 运行中从无 y 变为有 y 会丢监听,表现为列头不跟着横滚 → 必须重建表格
1733
+ if (prevHasY !== nextHasY) {
1734
+ this.remountTable();
1735
+ return;
1736
+ }
1706
1737
  this.cdr.markForCheck();
1738
+ setTimeout((/**
1739
+ * @return {?}
1740
+ */
1741
+ function () { return _this.bindHeaderBodyScrollSync(); }));
1742
+ };
1743
+ /** 重建 nz-table,让 header/body 滚动同步在 AfterViewInit 重新绑定 */
1744
+ /**
1745
+ * 重建 nz-table,让 header/body 滚动同步在 AfterViewInit 重新绑定
1746
+ * @private
1747
+ * @return {?}
1748
+ */
1749
+ HdDetailLinesComponent.prototype.remountTable = /**
1750
+ * 重建 nz-table,让 header/body 滚动同步在 AfterViewInit 重新绑定
1751
+ * @private
1752
+ * @return {?}
1753
+ */
1754
+ function () {
1755
+ var _this = this;
1756
+ this.unbindHeaderBodyScrollSync();
1757
+ setTimeout((/**
1758
+ * @return {?}
1759
+ */
1760
+ function () {
1761
+ _this.showTable = false;
1762
+ _this.cdr.markForCheck();
1763
+ setTimeout((/**
1764
+ * @return {?}
1765
+ */
1766
+ function () {
1767
+ _this.showTable = true;
1768
+ _this.cdr.markForCheck();
1769
+ setTimeout((/**
1770
+ * @return {?}
1771
+ */
1772
+ function () { return _this.bindHeaderBodyScrollSync(); }));
1773
+ }));
1774
+ }));
1775
+ };
1776
+ /** 表体横滚时同步表头(兜底 ng-zorro 监听丢失) */
1777
+ /**
1778
+ * 表体横滚时同步表头(兜底 ng-zorro 监听丢失)
1779
+ * @private
1780
+ * @return {?}
1781
+ */
1782
+ HdDetailLinesComponent.prototype.bindHeaderBodyScrollSync = /**
1783
+ * 表体横滚时同步表头(兜底 ng-zorro 监听丢失)
1784
+ * @private
1785
+ * @return {?}
1786
+ */
1787
+ function () {
1788
+ this.unbindHeaderBodyScrollSync();
1789
+ if (!this.nzTableComponent) {
1790
+ return;
1791
+ }
1792
+ /** @type {?} */
1793
+ var nzTable = (/** @type {?} */ (this.nzTableComponent));
1794
+ /** @type {?} */
1795
+ var header = (/** @type {?} */ (nzTable.tableHeaderNativeElement));
1796
+ /** @type {?} */
1797
+ var body = (/** @type {?} */ (nzTable.mixTableBodyNativeElement));
1798
+ if (!header || !body) {
1799
+ return;
1800
+ }
1801
+ this.bodyScrollListener = (/**
1802
+ * @return {?}
1803
+ */
1804
+ function () {
1805
+ if (header.scrollLeft !== body.scrollLeft) {
1806
+ header.scrollLeft = body.scrollLeft;
1807
+ }
1808
+ });
1809
+ body.addEventListener("scroll", this.bodyScrollListener);
1810
+ this.bodyScrollListener();
1811
+ };
1812
+ /**
1813
+ * @private
1814
+ * @return {?}
1815
+ */
1816
+ HdDetailLinesComponent.prototype.unbindHeaderBodyScrollSync = /**
1817
+ * @private
1818
+ * @return {?}
1819
+ */
1820
+ function () {
1821
+ if (!this.bodyScrollListener || !this.nzTableComponent) {
1822
+ this.bodyScrollListener = null;
1823
+ return;
1824
+ }
1825
+ /** @type {?} */
1826
+ var body = (/** @type {?} */ (((/** @type {?} */ (this.nzTableComponent)))
1827
+ .mixTableBodyNativeElement));
1828
+ if (body) {
1829
+ body.removeEventListener("scroll", this.bodyScrollListener);
1830
+ }
1831
+ this.bodyScrollListener = null;
1707
1832
  };
1708
1833
  /**
1709
1834
  * @private
@@ -2064,7 +2189,7 @@
2064
2189
  HdDetailLinesComponent.decorators = [
2065
2190
  { type: core.Component, args: [{
2066
2191
  selector: "hd-detail-lines",
2067
- template: "<ng-container>\n <hd-button-group *ngIf=\"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-space *ngIf=\"showSearch\" background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n\n <nz-table #hdTable [nzScroll]=\"effectiveScroll\" class=\"hd-table-container\" nzShowSizeChanger\n [nzFrontPagination]=\"hdFrontPagination\" [nzShowQuickJumper]=\"hdFrontPagination\" [nzShowTotal]=\"tableTotalTemplate\"\n nzSize=\"middle\" [nzData]=\"displayLines\" [nzLoading]=\"tableLoading\" [(nzPageSize)]=\"tablePageSize\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\">\n <thead>\n <tr>\n <th *ngIf=\"showSelected\" nzWidth=\"40px\" nzLeft=\"0px\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <ng-container *ngTemplateOutlet=\"detailLineHead\"></ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"!allowDrop;else allowDropTemplate\">\n <tr *ngFor=\"let data of hdTable.data;index as i\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <td *ngIf=\"showSelected\" nzWidth=\"40px\" nzLeft=\"0px\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngTemplateOutlet=\"detailLineBody;context:{$implicit: data, index: i}\"></ng-container>\n </tr>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showSelected\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td *ngIf=\"!totalOption.isHide\" [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, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : '' }} </td>\n </ng-container>\n </tr>\n </tbody>\n <ng-template #allowDropTemplate>\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <tr *ngFor=\"let data of hdTable.data;index as i\" cdkDrag [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <td *ngIf=\"showSelected\" nzWidth=\"40px\" nzLeft=\"0px\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngTemplateOutlet=\"detailLineBody;context:{$implicit: data, index: i}\"></ng-container>\n </tr>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showSelected\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td *ngIf=\"!totalOption.isHide\" [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, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : '' }} </td>\n </ng-container>\n </tr>\n </tbody>\n </ng-template>\n <ng-template #tableTotalTemplate>\n \u5171 {{displayLines.length}} \u6761\u6570\u636E\n </ng-template>\n </nz-table>\n</ng-container>\n",
2192
+ template: "<ng-container>\n <hd-button-group *ngIf=\"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-space *ngIf=\"showSearch\" background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n\n <nz-table *ngIf=\"showTable\" #hdTable [nzScroll]=\"effectiveScroll\" class=\"hd-table-container\" nzShowSizeChanger\n [nzFrontPagination]=\"hdFrontPagination\" [nzShowQuickJumper]=\"hdFrontPagination\" [nzShowTotal]=\"tableTotalTemplate\"\n nzSize=\"middle\" [nzData]=\"displayLines\" [nzLoading]=\"tableLoading\" [(nzPageSize)]=\"tablePageSize\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\">\n <thead>\n <tr>\n <th *ngIf=\"showSelected\" nzWidth=\"40px\" nzLeft=\"0px\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <ng-container *ngTemplateOutlet=\"detailLineHead\"></ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"!allowDrop;else allowDropTemplate\">\n <tr *ngFor=\"let data of hdTable.data;index as i\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <td *ngIf=\"showSelected\" nzWidth=\"40px\" nzLeft=\"0px\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngTemplateOutlet=\"detailLineBody;context:{$implicit: data, index: i}\"></ng-container>\n </tr>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showSelected\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td *ngIf=\"!totalOption.isHide\" [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, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : '' }} </td>\n </ng-container>\n </tr>\n </tbody>\n <ng-template #allowDropTemplate>\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <tr *ngFor=\"let data of hdTable.data;index as i\" cdkDrag [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <td *ngIf=\"showSelected\" nzWidth=\"40px\" nzLeft=\"0px\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <ng-container *ngTemplateOutlet=\"detailLineBody;context:{$implicit: data, index: i}\"></ng-container>\n </tr>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showSelected\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td *ngIf=\"!totalOption.isHide\" [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, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : '' }} </td>\n </ng-container>\n </tr>\n </tbody>\n </ng-template>\n <ng-template #tableTotalTemplate>\n \u5171 {{displayLines.length}} \u6761\u6570\u636E\n </ng-template>\n </nz-table>\n</ng-container>\n",
2068
2193
  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}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}: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-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-right-sticky{background:#f7f8fa!important;color:#868a9c!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a{color:#20b95d!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a:hover{color:#20bd62!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group .common-danger-btn:hover{color:#f05b24!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-table-cell-value>a,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td>a{color:#20b95d}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-billNumber>a{color:#3b77e3}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-status-text{color:#868a9c!important}.hd-table-container ::ng-deep .hd-table-total>td{border:0!important}"]
2069
2194
  }] }
2070
2195
  ];
@@ -2199,6 +2324,16 @@
2199
2324
  HdDetailLinesComponent.prototype.isFilterData;
2200
2325
  /** @type {?} */
2201
2326
  HdDetailLinesComponent.prototype.storeFormLinesData;
2327
+ /**
2328
+ * 控制 nz-table 重建:scroll.y 从无到有时必须重建,否则表头不跟横滚
2329
+ * @type {?}
2330
+ */
2331
+ HdDetailLinesComponent.prototype.showTable;
2332
+ /**
2333
+ * @type {?}
2334
+ * @private
2335
+ */
2336
+ HdDetailLinesComponent.prototype.bodyScrollListener;
2202
2337
  /**
2203
2338
  * @type {?}
2204
2339
  * @private
@@ -2625,6 +2760,10 @@
2625
2760
  var currentY = this.tableScroll ? this.tableScroll.y : null;
2626
2761
  /** @type {?} */
2627
2762
  var nextY = currentY || (nextX ? this.getAutoScrollY() : null);
2763
+ /** @type {?} */
2764
+ var prevHasY = !!(this.tableScroll && this.tableScroll.y);
2765
+ /** @type {?} */
2766
+ var nextHasY = !!nextY;
2628
2767
  if (this.tableScroll &&
2629
2768
  this.tableScroll.x === nextX &&
2630
2769
  this.tableScroll.y === nextY) {
@@ -2633,6 +2772,11 @@
2633
2772
  this.tableScroll = nextX || nextY
2634
2773
  ? { x: nextX, y: nextY }
2635
2774
  : null;
2775
+ // y 从无到有必须重建,否则表头不跟横滚
2776
+ if (prevHasY !== nextHasY) {
2777
+ this.applyTableScrollMode(true);
2778
+ return;
2779
+ }
2636
2780
  this.cdr.markForCheck();
2637
2781
  };
2638
2782
  Object.defineProperty(HdDetailLinesPageComponent.prototype, "displayLines", {