@hailin-zheng/editor-core 2.1.17 → 2.1.18

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/index.js CHANGED
@@ -4674,10 +4674,16 @@ class TableRowElement extends BlockContainerElement {
4674
4674
  }
4675
4675
  }
4676
4676
  class TableRowRenderObject extends MuiltBlockLineRenderObject {
4677
+ //被截断的行是否需要重新计算高度
4678
+ remeasureState = true;
4679
+ //当前行是否存在合并单元格
4680
+ hasMergeCells = false;
4677
4681
  render(e) {
4678
4682
  }
4679
4683
  clone() {
4680
4684
  const cloneRender = new TableRowRenderObject(this.element);
4685
+ cloneRender.remeasureState = this.remeasureState;
4686
+ cloneRender.hasMergeCells = this.hasMergeCells;
4681
4687
  cloneRender.rect = ElementUtil.cloneRect(this.rect);
4682
4688
  for (let i = 0; i < this.length; i++) {
4683
4689
  cloneRender.addChild(this.getChild(i).clone());
@@ -11189,7 +11195,12 @@ class ElementUtil {
11189
11195
  if (render instanceof TableRenderObject) {
11190
11196
  //this.setTableAlign(render);
11191
11197
  this.remeasureTableMerge(render);
11192
- render.getItems().forEach(item => this.remeasure(item, false), null);
11198
+ render.getItems().forEach(item => {
11199
+ if (item.remeasureState) {
11200
+ this.remeasure(item, false);
11201
+ item.remeasureState = false;
11202
+ }
11203
+ }, null);
11193
11204
  }
11194
11205
  const innerRect = render.getInnerRect();
11195
11206
  innerRect.height = 0;
@@ -11205,7 +11216,7 @@ class ElementUtil {
11205
11216
  render.updateRenderHeight(innerRect);
11206
11217
  return innerRect.height;
11207
11218
  }
11208
- static remeasureTableRow(rowRender, foreceColIndex = -1) {
11219
+ static remeasureTableRow(rowRender, forceColIndex = -1) {
11209
11220
  const rowEle = rowRender.element;
11210
11221
  let maxCellHeight = rowEle.props.minHeight > 20 ? rowEle.props.minHeight : 20;
11211
11222
  //限制行最小高度
@@ -11214,7 +11225,7 @@ class ElementUtil {
11214
11225
  for (let i = 0; i < rowRender.length; i++) {
11215
11226
  const cellRender = rowRender.getChild(i);
11216
11227
  const { vMerge } = cellRender.element.props;
11217
- if (cellRender.rect.height > maxCellHeight && (vMerge !== 'restart' || i === foreceColIndex)) {
11228
+ if (cellRender.rect.height > maxCellHeight && (vMerge !== 'restart' || i === forceColIndex)) {
11218
11229
  maxCellHeight = cellRender.rect.height;
11219
11230
  }
11220
11231
  }
@@ -11223,7 +11234,7 @@ class ElementUtil {
11223
11234
  const cellRender = rowRender.getChild(i);
11224
11235
  const cellElement = cellRender.element;
11225
11236
  const { vMerge } = cellElement.props;
11226
- if ((vMerge !== 'restart' || i === foreceColIndex) || cellRender.rect.height < maxCellHeight) {
11237
+ if ((vMerge !== 'restart' || i === forceColIndex) || cellRender.rect.height < maxCellHeight) {
11227
11238
  cellRender.rect.height = maxCellHeight;
11228
11239
  }
11229
11240
  //处理单元格内容纵向居中
@@ -11318,11 +11329,16 @@ class ElementUtil {
11318
11329
  let needReCalc = false;
11319
11330
  for (let i = 0; i < tbRender.length; i++) {
11320
11331
  const row = tbRender.getChild(i);
11332
+ if (row.hasMergeCells === false) {
11333
+ continue;
11334
+ }
11335
+ row.hasMergeCells = false;
11321
11336
  for (let j = 0; j < row.length; j++) {
11322
11337
  const cellRender = row.getChild(j);
11323
11338
  const ele = cellRender.element;
11324
11339
  const { vMerge } = ele.props;
11325
11340
  if (vMerge === 'restart') {
11341
+ row.hasMergeCells = true;
11326
11342
  const eleIndex = ele.getIndex();
11327
11343
  const continueRows = this.getContinueVMergeRenderRows(tbRender, i, eleIndex);
11328
11344
  if (!continueRows.length) {
@@ -14937,29 +14953,23 @@ class DocumentArrange {
14937
14953
  while (currRow) {
14938
14954
  const rowContentHeight = this.getBlockLineHeight(currRow);
14939
14955
  if (rowContentHeight + sumHeight > limitHeight) {
14940
- if (currRow instanceof MuiltBlockLineRenderObject) {
14941
- //限制的外框尺寸
14942
- const availHeight = limitHeight - sumHeight;
14943
- //限制的内框尺寸
14944
- const limitRenderInnterHeight = ElementUtil.innerRectMaxHeight(tbRender, availHeight);
14945
- const cutRow = this.cutRowRenderItem(currRow, limitRenderInnterHeight);
14946
- if (cutRow) {
14947
- cloneTbRender.addChild(cutRow);
14948
- sumHeight += cutRow.rect.height;
14949
- if (currRow.getItems().some(item => item.length !== 0)) {
14950
- cutRows.push(currRow);
14951
- }
14952
- else {
14953
- tbRender.removeChild(currRow);
14954
- }
14955
- if (currRow === joinRow) {
14956
- break;
14957
- }
14958
- currRow = rows[++j];
14956
+ //限制的外框尺寸
14957
+ const availHeight = limitHeight - sumHeight;
14958
+ const limitRenderInnerHeight = ElementUtil.innerRectMaxHeight(tbRender, availHeight);
14959
+ const cutRow = this.cutRowRenderItem(currRow, limitRenderInnerHeight);
14960
+ if (cutRow) {
14961
+ cloneTbRender.addChild(cutRow);
14962
+ sumHeight += cutRow.rect.height;
14963
+ if (currRow.getItems().some(item => item.length !== 0)) {
14964
+ cutRows.push(currRow);
14959
14965
  }
14960
14966
  else {
14967
+ tbRender.removeChild(currRow);
14968
+ }
14969
+ if (currRow === joinRow) {
14961
14970
  break;
14962
14971
  }
14972
+ currRow = rows[++j];
14963
14973
  }
14964
14974
  else {
14965
14975
  break;
@@ -14991,6 +15001,7 @@ class DocumentArrange {
14991
15001
  // if (render.element.props.minHeight > 0 && render.rect.height < limitHeight) {
14992
15002
  // return null;
14993
15003
  // }
15004
+ render.remeasureState = true;
14994
15005
  const cloneRowRender = render.element.createRenderObject();
14995
15006
  cloneRowRender.rect.width = render.rect.width;
14996
15007
  //cloneRowRender.rect.maxWidth = render.rect.height;
@@ -15887,7 +15898,10 @@ class ElementRenderCut {
15887
15898
  documentRender.addChild(cloneFooterRender);
15888
15899
  //审阅模式,添加审阅窗口
15889
15900
  if (this.options.showReviewWindow && commentsRender) {
15890
- const commentsContainer = commentsRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15901
+ const commentsContainer = commentsRender.element.createRenderObject({
15902
+ options: this.options,
15903
+ renderCtx: this.renderContext
15904
+ });
15891
15905
  commentsContainer.padding.top = bodyMarginTop;
15892
15906
  commentsContainer.rect.height = documentRender.rect.height;
15893
15907
  documentRender.addChild(commentsContainer);
@@ -15898,13 +15912,19 @@ class ElementRenderCut {
15898
15912
  return docPages;
15899
15913
  }
15900
15914
  getDocInnerRect(documentRender) {
15901
- const render = documentRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15915
+ const render = documentRender.element.createRenderObject({
15916
+ options: this.options,
15917
+ renderCtx: this.renderContext
15918
+ });
15902
15919
  render.padding = documentRender.padding;
15903
15920
  return render.getInnerRect();
15904
15921
  }
15905
15922
  getFullViewDocRender(documentRender, documentElement) {
15906
15923
  const commentsRender = documentRender.getChild(3);
15907
- const commentsContainer = commentsRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15924
+ const commentsContainer = commentsRender.element.createRenderObject({
15925
+ options: this.options,
15926
+ renderCtx: this.renderContext
15927
+ });
15908
15928
  documentRender.rect.height -= commentsContainer.rect.height;
15909
15929
  const bodyRender = documentRender.getChild(1);
15910
15930
  if (this.options.showReviewWindow) {
@@ -15918,7 +15938,10 @@ class ElementRenderCut {
15918
15938
  return [documentRender];
15919
15939
  }
15920
15940
  createEmptyBodyRender(bodyRender, limitRect) {
15921
- const pageBodyRender = bodyRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15941
+ const pageBodyRender = bodyRender.element.createRenderObject({
15942
+ options: this.options,
15943
+ renderCtx: this.renderContext
15944
+ });
15922
15945
  pageBodyRender.rect.width = limitRect.width;
15923
15946
  const bodyInnerLimitRect = pageBodyRender.getInnerRect();
15924
15947
  if (this.options.fullPageView) {
@@ -15942,7 +15965,10 @@ class ElementRenderCut {
15942
15965
  if (render instanceof TableRenderObject) {
15943
15966
  return this.cutTable(render, limitHeight);
15944
15967
  }
15945
- const cloneRender = render.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15968
+ const cloneRender = render.element.createRenderObject({
15969
+ options: this.options,
15970
+ renderCtx: this.renderContext
15971
+ });
15946
15972
  cloneRender.setRenderWidth(render.rect.width);
15947
15973
  if (render instanceof MuiltBlockLineRenderObject) {
15948
15974
  let sumHeight = 0;
@@ -16077,16 +16103,16 @@ class ElementRenderCut {
16077
16103
  }
16078
16104
  const cloneRowRender = render.element.createRenderObject();
16079
16105
  cloneRowRender.rect.width = render.rect.width;
16106
+ render.remeasureState = true;
16080
16107
  //cloneRowRender.rect.maxWidth = render.rect.height;
16081
16108
  const cellRenders = [...render.getItems()];
16082
16109
  const cutCellRenders = [];
16083
16110
  for (let i = 0; i < cellRenders.length; i++) {
16084
16111
  const cellRender = cellRenders[i];
16112
+ this.markMergeRowRenderDirty(cellRender);
16085
16113
  if (cellRender.rect.height > limitHeight) {
16086
- //限制的外框尺寸
16087
- const availHeight = limitHeight;
16088
16114
  //限制的内框尺寸
16089
- const limitCellHeight = ElementUtil.innerRectMaxHeight(cellRender, availHeight);
16115
+ const limitCellHeight = ElementUtil.innerRectMaxHeight(cellRender, limitHeight);
16090
16116
  const cutCellRender = this.cutRenderItem(cellRender, limitCellHeight);
16091
16117
  if (cutCellRender) {
16092
16118
  cutCellRenders.push(cutCellRender);
@@ -16110,7 +16136,10 @@ class ElementRenderCut {
16110
16136
  for (let i = 0; i < cutCellRenders.length; i++) {
16111
16137
  let cellRender = cutCellRenders[i];
16112
16138
  if (!cellRender) {
16113
- cellRender = cellRenders[i].element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
16139
+ cellRender = cellRenders[i].element.createRenderObject({
16140
+ options: this.options,
16141
+ renderCtx: this.renderContext
16142
+ });
16114
16143
  cellRender.rect = ElementUtil.cloneRect(cellRenders[i].rect);
16115
16144
  ElementUtil.remeasure(cellRender);
16116
16145
  }
@@ -16120,6 +16149,33 @@ class ElementRenderCut {
16120
16149
  return cloneRowRender;
16121
16150
  }
16122
16151
  }
16152
+ /**
16153
+ * 标记合并单元格所在行需要重新计算
16154
+ * @param cellRender
16155
+ * @private
16156
+ */
16157
+ markMergeRowRenderDirty(cellRender) {
16158
+ const cellEle = cellRender.element;
16159
+ if (cellEle.props.vMerge !== 'restart') {
16160
+ return;
16161
+ }
16162
+ const rowRender = cellRender.parent;
16163
+ rowRender.element;
16164
+ const tb = rowRender.parent;
16165
+ const cellYPos = cellRender.rect.y;
16166
+ for (let i = rowRender.getIndex() + 1; i < tb.length; i++) {
16167
+ const nextRowRender = tb.getChild(i);
16168
+ if (nextRowRender.rect.y <= cellYPos) {
16169
+ nextRowRender.remeasureState = true;
16170
+ nextRowRender.getItems().forEach(item => {
16171
+ this.markMergeRowRenderDirty(item);
16172
+ });
16173
+ }
16174
+ else {
16175
+ break;
16176
+ }
16177
+ }
16178
+ }
16123
16179
  /**
16124
16180
  * 修复->已经截断的合并单元格要向下移动到合适的位置
16125
16181
  * @param tbRender
@@ -27941,6 +27997,7 @@ class DocEditor {
27941
27997
  insertTable(rows, cols) {
27942
27998
  const tb = TableUtil.createTable(rows, cols, this.selectionState);
27943
27999
  this.documentChange.insertTable(tb);
28000
+ return tb;
27944
28001
  }
27945
28002
  /**
27946
28003
  * 插入软换行符
@@ -28805,7 +28862,7 @@ class DocEditor {
28805
28862
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
28806
28863
  }
28807
28864
  version() {
28808
- return "2.1.17";
28865
+ return "2.1.18";
28809
28866
  }
28810
28867
  switchPageHeaderEditor() {
28811
28868
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);