@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-cjs.js CHANGED
@@ -4703,10 +4703,16 @@ class TableRowElement extends BlockContainerElement {
4703
4703
  }
4704
4704
  }
4705
4705
  class TableRowRenderObject extends MuiltBlockLineRenderObject {
4706
+ //被截断的行是否需要重新计算高度
4707
+ remeasureState = true;
4708
+ //当前行是否存在合并单元格
4709
+ hasMergeCells = false;
4706
4710
  render(e) {
4707
4711
  }
4708
4712
  clone() {
4709
4713
  const cloneRender = new TableRowRenderObject(this.element);
4714
+ cloneRender.remeasureState = this.remeasureState;
4715
+ cloneRender.hasMergeCells = this.hasMergeCells;
4710
4716
  cloneRender.rect = ElementUtil.cloneRect(this.rect);
4711
4717
  for (let i = 0; i < this.length; i++) {
4712
4718
  cloneRender.addChild(this.getChild(i).clone());
@@ -11218,7 +11224,12 @@ class ElementUtil {
11218
11224
  if (render instanceof TableRenderObject) {
11219
11225
  //this.setTableAlign(render);
11220
11226
  this.remeasureTableMerge(render);
11221
- render.getItems().forEach(item => this.remeasure(item, false), null);
11227
+ render.getItems().forEach(item => {
11228
+ if (item.remeasureState) {
11229
+ this.remeasure(item, false);
11230
+ item.remeasureState = false;
11231
+ }
11232
+ }, null);
11222
11233
  }
11223
11234
  const innerRect = render.getInnerRect();
11224
11235
  innerRect.height = 0;
@@ -11234,7 +11245,7 @@ class ElementUtil {
11234
11245
  render.updateRenderHeight(innerRect);
11235
11246
  return innerRect.height;
11236
11247
  }
11237
- static remeasureTableRow(rowRender, foreceColIndex = -1) {
11248
+ static remeasureTableRow(rowRender, forceColIndex = -1) {
11238
11249
  const rowEle = rowRender.element;
11239
11250
  let maxCellHeight = rowEle.props.minHeight > 20 ? rowEle.props.minHeight : 20;
11240
11251
  //限制行最小高度
@@ -11243,7 +11254,7 @@ class ElementUtil {
11243
11254
  for (let i = 0; i < rowRender.length; i++) {
11244
11255
  const cellRender = rowRender.getChild(i);
11245
11256
  const { vMerge } = cellRender.element.props;
11246
- if (cellRender.rect.height > maxCellHeight && (vMerge !== 'restart' || i === foreceColIndex)) {
11257
+ if (cellRender.rect.height > maxCellHeight && (vMerge !== 'restart' || i === forceColIndex)) {
11247
11258
  maxCellHeight = cellRender.rect.height;
11248
11259
  }
11249
11260
  }
@@ -11252,7 +11263,7 @@ class ElementUtil {
11252
11263
  const cellRender = rowRender.getChild(i);
11253
11264
  const cellElement = cellRender.element;
11254
11265
  const { vMerge } = cellElement.props;
11255
- if ((vMerge !== 'restart' || i === foreceColIndex) || cellRender.rect.height < maxCellHeight) {
11266
+ if ((vMerge !== 'restart' || i === forceColIndex) || cellRender.rect.height < maxCellHeight) {
11256
11267
  cellRender.rect.height = maxCellHeight;
11257
11268
  }
11258
11269
  //处理单元格内容纵向居中
@@ -11347,11 +11358,16 @@ class ElementUtil {
11347
11358
  let needReCalc = false;
11348
11359
  for (let i = 0; i < tbRender.length; i++) {
11349
11360
  const row = tbRender.getChild(i);
11361
+ if (row.hasMergeCells === false) {
11362
+ continue;
11363
+ }
11364
+ row.hasMergeCells = false;
11350
11365
  for (let j = 0; j < row.length; j++) {
11351
11366
  const cellRender = row.getChild(j);
11352
11367
  const ele = cellRender.element;
11353
11368
  const { vMerge } = ele.props;
11354
11369
  if (vMerge === 'restart') {
11370
+ row.hasMergeCells = true;
11355
11371
  const eleIndex = ele.getIndex();
11356
11372
  const continueRows = this.getContinueVMergeRenderRows(tbRender, i, eleIndex);
11357
11373
  if (!continueRows.length) {
@@ -14966,29 +14982,23 @@ class DocumentArrange {
14966
14982
  while (currRow) {
14967
14983
  const rowContentHeight = this.getBlockLineHeight(currRow);
14968
14984
  if (rowContentHeight + sumHeight > limitHeight) {
14969
- if (currRow instanceof MuiltBlockLineRenderObject) {
14970
- //限制的外框尺寸
14971
- const availHeight = limitHeight - sumHeight;
14972
- //限制的内框尺寸
14973
- const limitRenderInnterHeight = ElementUtil.innerRectMaxHeight(tbRender, availHeight);
14974
- const cutRow = this.cutRowRenderItem(currRow, limitRenderInnterHeight);
14975
- if (cutRow) {
14976
- cloneTbRender.addChild(cutRow);
14977
- sumHeight += cutRow.rect.height;
14978
- if (currRow.getItems().some(item => item.length !== 0)) {
14979
- cutRows.push(currRow);
14980
- }
14981
- else {
14982
- tbRender.removeChild(currRow);
14983
- }
14984
- if (currRow === joinRow) {
14985
- break;
14986
- }
14987
- currRow = rows[++j];
14985
+ //限制的外框尺寸
14986
+ const availHeight = limitHeight - sumHeight;
14987
+ const limitRenderInnerHeight = ElementUtil.innerRectMaxHeight(tbRender, availHeight);
14988
+ const cutRow = this.cutRowRenderItem(currRow, limitRenderInnerHeight);
14989
+ if (cutRow) {
14990
+ cloneTbRender.addChild(cutRow);
14991
+ sumHeight += cutRow.rect.height;
14992
+ if (currRow.getItems().some(item => item.length !== 0)) {
14993
+ cutRows.push(currRow);
14988
14994
  }
14989
14995
  else {
14996
+ tbRender.removeChild(currRow);
14997
+ }
14998
+ if (currRow === joinRow) {
14990
14999
  break;
14991
15000
  }
15001
+ currRow = rows[++j];
14992
15002
  }
14993
15003
  else {
14994
15004
  break;
@@ -15020,6 +15030,7 @@ class DocumentArrange {
15020
15030
  // if (render.element.props.minHeight > 0 && render.rect.height < limitHeight) {
15021
15031
  // return null;
15022
15032
  // }
15033
+ render.remeasureState = true;
15023
15034
  const cloneRowRender = render.element.createRenderObject();
15024
15035
  cloneRowRender.rect.width = render.rect.width;
15025
15036
  //cloneRowRender.rect.maxWidth = render.rect.height;
@@ -15916,7 +15927,10 @@ class ElementRenderCut {
15916
15927
  documentRender.addChild(cloneFooterRender);
15917
15928
  //审阅模式,添加审阅窗口
15918
15929
  if (this.options.showReviewWindow && commentsRender) {
15919
- const commentsContainer = commentsRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15930
+ const commentsContainer = commentsRender.element.createRenderObject({
15931
+ options: this.options,
15932
+ renderCtx: this.renderContext
15933
+ });
15920
15934
  commentsContainer.padding.top = bodyMarginTop;
15921
15935
  commentsContainer.rect.height = documentRender.rect.height;
15922
15936
  documentRender.addChild(commentsContainer);
@@ -15927,13 +15941,19 @@ class ElementRenderCut {
15927
15941
  return docPages;
15928
15942
  }
15929
15943
  getDocInnerRect(documentRender) {
15930
- const render = documentRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15944
+ const render = documentRender.element.createRenderObject({
15945
+ options: this.options,
15946
+ renderCtx: this.renderContext
15947
+ });
15931
15948
  render.padding = documentRender.padding;
15932
15949
  return render.getInnerRect();
15933
15950
  }
15934
15951
  getFullViewDocRender(documentRender, documentElement) {
15935
15952
  const commentsRender = documentRender.getChild(3);
15936
- const commentsContainer = commentsRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15953
+ const commentsContainer = commentsRender.element.createRenderObject({
15954
+ options: this.options,
15955
+ renderCtx: this.renderContext
15956
+ });
15937
15957
  documentRender.rect.height -= commentsContainer.rect.height;
15938
15958
  const bodyRender = documentRender.getChild(1);
15939
15959
  if (this.options.showReviewWindow) {
@@ -15947,7 +15967,10 @@ class ElementRenderCut {
15947
15967
  return [documentRender];
15948
15968
  }
15949
15969
  createEmptyBodyRender(bodyRender, limitRect) {
15950
- const pageBodyRender = bodyRender.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15970
+ const pageBodyRender = bodyRender.element.createRenderObject({
15971
+ options: this.options,
15972
+ renderCtx: this.renderContext
15973
+ });
15951
15974
  pageBodyRender.rect.width = limitRect.width;
15952
15975
  const bodyInnerLimitRect = pageBodyRender.getInnerRect();
15953
15976
  if (this.options.fullPageView) {
@@ -15971,7 +15994,10 @@ class ElementRenderCut {
15971
15994
  if (render instanceof TableRenderObject) {
15972
15995
  return this.cutTable(render, limitHeight);
15973
15996
  }
15974
- const cloneRender = render.element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
15997
+ const cloneRender = render.element.createRenderObject({
15998
+ options: this.options,
15999
+ renderCtx: this.renderContext
16000
+ });
15975
16001
  cloneRender.setRenderWidth(render.rect.width);
15976
16002
  if (render instanceof MuiltBlockLineRenderObject) {
15977
16003
  let sumHeight = 0;
@@ -16106,16 +16132,16 @@ class ElementRenderCut {
16106
16132
  }
16107
16133
  const cloneRowRender = render.element.createRenderObject();
16108
16134
  cloneRowRender.rect.width = render.rect.width;
16135
+ render.remeasureState = true;
16109
16136
  //cloneRowRender.rect.maxWidth = render.rect.height;
16110
16137
  const cellRenders = [...render.getItems()];
16111
16138
  const cutCellRenders = [];
16112
16139
  for (let i = 0; i < cellRenders.length; i++) {
16113
16140
  const cellRender = cellRenders[i];
16141
+ this.markMergeRowRenderDirty(cellRender);
16114
16142
  if (cellRender.rect.height > limitHeight) {
16115
- //限制的外框尺寸
16116
- const availHeight = limitHeight;
16117
16143
  //限制的内框尺寸
16118
- const limitCellHeight = ElementUtil.innerRectMaxHeight(cellRender, availHeight);
16144
+ const limitCellHeight = ElementUtil.innerRectMaxHeight(cellRender, limitHeight);
16119
16145
  const cutCellRender = this.cutRenderItem(cellRender, limitCellHeight);
16120
16146
  if (cutCellRender) {
16121
16147
  cutCellRenders.push(cutCellRender);
@@ -16139,7 +16165,10 @@ class ElementRenderCut {
16139
16165
  for (let i = 0; i < cutCellRenders.length; i++) {
16140
16166
  let cellRender = cutCellRenders[i];
16141
16167
  if (!cellRender) {
16142
- cellRender = cellRenders[i].element.createRenderObject({ options: this.options, renderCtx: this.renderContext });
16168
+ cellRender = cellRenders[i].element.createRenderObject({
16169
+ options: this.options,
16170
+ renderCtx: this.renderContext
16171
+ });
16143
16172
  cellRender.rect = ElementUtil.cloneRect(cellRenders[i].rect);
16144
16173
  ElementUtil.remeasure(cellRender);
16145
16174
  }
@@ -16149,6 +16178,33 @@ class ElementRenderCut {
16149
16178
  return cloneRowRender;
16150
16179
  }
16151
16180
  }
16181
+ /**
16182
+ * 标记合并单元格所在行需要重新计算
16183
+ * @param cellRender
16184
+ * @private
16185
+ */
16186
+ markMergeRowRenderDirty(cellRender) {
16187
+ const cellEle = cellRender.element;
16188
+ if (cellEle.props.vMerge !== 'restart') {
16189
+ return;
16190
+ }
16191
+ const rowRender = cellRender.parent;
16192
+ rowRender.element;
16193
+ const tb = rowRender.parent;
16194
+ const cellYPos = cellRender.rect.y;
16195
+ for (let i = rowRender.getIndex() + 1; i < tb.length; i++) {
16196
+ const nextRowRender = tb.getChild(i);
16197
+ if (nextRowRender.rect.y <= cellYPos) {
16198
+ nextRowRender.remeasureState = true;
16199
+ nextRowRender.getItems().forEach(item => {
16200
+ this.markMergeRowRenderDirty(item);
16201
+ });
16202
+ }
16203
+ else {
16204
+ break;
16205
+ }
16206
+ }
16207
+ }
16152
16208
  /**
16153
16209
  * 修复->已经截断的合并单元格要向下移动到合适的位置
16154
16210
  * @param tbRender
@@ -27970,6 +28026,7 @@ class DocEditor {
27970
28026
  insertTable(rows, cols) {
27971
28027
  const tb = TableUtil.createTable(rows, cols, this.selectionState);
27972
28028
  this.documentChange.insertTable(tb);
28029
+ return tb;
27973
28030
  }
27974
28031
  /**
27975
28032
  * 插入软换行符
@@ -28834,7 +28891,7 @@ class DocEditor {
28834
28891
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
28835
28892
  }
28836
28893
  version() {
28837
- return "2.1.17";
28894
+ return "2.1.18";
28838
28895
  }
28839
28896
  switchPageHeaderEditor() {
28840
28897
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);