@hailin-zheng/editor-core 2.1.16 → 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());
@@ -8269,8 +8275,9 @@ class DataElementBarcode extends DataElementLeaf {
8269
8275
  }
8270
8276
  createRenderObject() {
8271
8277
  const render = new DataElementBarcodeRenderObject(this);
8272
- render.rect.width = this.props.width + 2;
8273
- render.rect.height = this.props.height + 2;
8278
+ const { width, height } = render.measureSize();
8279
+ render.rect.width = width + 2;
8280
+ render.rect.height = height + 2;
8274
8281
  return render;
8275
8282
  }
8276
8283
  serialize(options) {
@@ -8341,11 +8348,27 @@ class DataElementBarcodeRenderObject extends ResizeLeafRenderObject {
8341
8348
  else {
8342
8349
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
8343
8350
  JsBarcode(svg, this.element.props.text);
8351
+ const width = Number.parseInt(svg.getAttribute('width').replace('px', ''));
8352
+ const height = Number.parseInt(svg.getAttribute('height').replace('px', ''));
8353
+ svg.setAttribute('width', this.element.props.width + 'px');
8354
+ svg.setAttribute('height', height * (this.element.props.width / width) + 'px');
8344
8355
  const vNode = toVNode(svg);
8345
8356
  t.children = [vNode];
8346
8357
  }
8347
8358
  return t;
8348
8359
  }
8360
+ measureSize() {
8361
+ if (this.element.props.type === 'qrcode') {
8362
+ return { width: this.element.props.width, height: this.element.props.height };
8363
+ }
8364
+ else {
8365
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
8366
+ JsBarcode(svg, this.element.props.text);
8367
+ const width = Number.parseInt(svg.getAttribute('width').replace('px', ''));
8368
+ const height = Number.parseInt(svg.getAttribute('height').replace('px', ''));
8369
+ return { width: this.element.props.width, height: height * (this.element.props.width / width) };
8370
+ }
8371
+ }
8349
8372
  toSvgString(qr, border, lightColor, darkColor) {
8350
8373
  let parts = [];
8351
8374
  for (let y = 0; y < qr.size; y++) {
@@ -11172,7 +11195,12 @@ class ElementUtil {
11172
11195
  if (render instanceof TableRenderObject) {
11173
11196
  //this.setTableAlign(render);
11174
11197
  this.remeasureTableMerge(render);
11175
- 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);
11176
11204
  }
11177
11205
  const innerRect = render.getInnerRect();
11178
11206
  innerRect.height = 0;
@@ -11188,7 +11216,7 @@ class ElementUtil {
11188
11216
  render.updateRenderHeight(innerRect);
11189
11217
  return innerRect.height;
11190
11218
  }
11191
- static remeasureTableRow(rowRender, foreceColIndex = -1) {
11219
+ static remeasureTableRow(rowRender, forceColIndex = -1) {
11192
11220
  const rowEle = rowRender.element;
11193
11221
  let maxCellHeight = rowEle.props.minHeight > 20 ? rowEle.props.minHeight : 20;
11194
11222
  //限制行最小高度
@@ -11197,7 +11225,7 @@ class ElementUtil {
11197
11225
  for (let i = 0; i < rowRender.length; i++) {
11198
11226
  const cellRender = rowRender.getChild(i);
11199
11227
  const { vMerge } = cellRender.element.props;
11200
- if (cellRender.rect.height > maxCellHeight && (vMerge !== 'restart' || i === foreceColIndex)) {
11228
+ if (cellRender.rect.height > maxCellHeight && (vMerge !== 'restart' || i === forceColIndex)) {
11201
11229
  maxCellHeight = cellRender.rect.height;
11202
11230
  }
11203
11231
  }
@@ -11206,7 +11234,7 @@ class ElementUtil {
11206
11234
  const cellRender = rowRender.getChild(i);
11207
11235
  const cellElement = cellRender.element;
11208
11236
  const { vMerge } = cellElement.props;
11209
- if ((vMerge !== 'restart' || i === foreceColIndex) || cellRender.rect.height < maxCellHeight) {
11237
+ if ((vMerge !== 'restart' || i === forceColIndex) || cellRender.rect.height < maxCellHeight) {
11210
11238
  cellRender.rect.height = maxCellHeight;
11211
11239
  }
11212
11240
  //处理单元格内容纵向居中
@@ -11301,11 +11329,16 @@ class ElementUtil {
11301
11329
  let needReCalc = false;
11302
11330
  for (let i = 0; i < tbRender.length; i++) {
11303
11331
  const row = tbRender.getChild(i);
11332
+ if (row.hasMergeCells === false) {
11333
+ continue;
11334
+ }
11335
+ row.hasMergeCells = false;
11304
11336
  for (let j = 0; j < row.length; j++) {
11305
11337
  const cellRender = row.getChild(j);
11306
11338
  const ele = cellRender.element;
11307
11339
  const { vMerge } = ele.props;
11308
11340
  if (vMerge === 'restart') {
11341
+ row.hasMergeCells = true;
11309
11342
  const eleIndex = ele.getIndex();
11310
11343
  const continueRows = this.getContinueVMergeRenderRows(tbRender, i, eleIndex);
11311
11344
  if (!continueRows.length) {
@@ -14920,29 +14953,23 @@ class DocumentArrange {
14920
14953
  while (currRow) {
14921
14954
  const rowContentHeight = this.getBlockLineHeight(currRow);
14922
14955
  if (rowContentHeight + sumHeight > limitHeight) {
14923
- if (currRow instanceof MuiltBlockLineRenderObject) {
14924
- //限制的外框尺寸
14925
- const availHeight = limitHeight - sumHeight;
14926
- //限制的内框尺寸
14927
- const limitRenderInnterHeight = ElementUtil.innerRectMaxHeight(tbRender, availHeight);
14928
- const cutRow = this.cutRowRenderItem(currRow, limitRenderInnterHeight);
14929
- if (cutRow) {
14930
- cloneTbRender.addChild(cutRow);
14931
- sumHeight += cutRow.rect.height;
14932
- if (currRow.getItems().some(item => item.length !== 0)) {
14933
- cutRows.push(currRow);
14934
- }
14935
- else {
14936
- tbRender.removeChild(currRow);
14937
- }
14938
- if (currRow === joinRow) {
14939
- break;
14940
- }
14941
- 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);
14942
14965
  }
14943
14966
  else {
14967
+ tbRender.removeChild(currRow);
14968
+ }
14969
+ if (currRow === joinRow) {
14944
14970
  break;
14945
14971
  }
14972
+ currRow = rows[++j];
14946
14973
  }
14947
14974
  else {
14948
14975
  break;
@@ -14974,6 +15001,7 @@ class DocumentArrange {
14974
15001
  // if (render.element.props.minHeight > 0 && render.rect.height < limitHeight) {
14975
15002
  // return null;
14976
15003
  // }
15004
+ render.remeasureState = true;
14977
15005
  const cloneRowRender = render.element.createRenderObject();
14978
15006
  cloneRowRender.rect.width = render.rect.width;
14979
15007
  //cloneRowRender.rect.maxWidth = render.rect.height;
@@ -15870,7 +15898,10 @@ class ElementRenderCut {
15870
15898
  documentRender.addChild(cloneFooterRender);
15871
15899
  //审阅模式,添加审阅窗口
15872
15900
  if (this.options.showReviewWindow && commentsRender) {
15873
- 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
+ });
15874
15905
  commentsContainer.padding.top = bodyMarginTop;
15875
15906
  commentsContainer.rect.height = documentRender.rect.height;
15876
15907
  documentRender.addChild(commentsContainer);
@@ -15881,13 +15912,19 @@ class ElementRenderCut {
15881
15912
  return docPages;
15882
15913
  }
15883
15914
  getDocInnerRect(documentRender) {
15884
- 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
+ });
15885
15919
  render.padding = documentRender.padding;
15886
15920
  return render.getInnerRect();
15887
15921
  }
15888
15922
  getFullViewDocRender(documentRender, documentElement) {
15889
15923
  const commentsRender = documentRender.getChild(3);
15890
- 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
+ });
15891
15928
  documentRender.rect.height -= commentsContainer.rect.height;
15892
15929
  const bodyRender = documentRender.getChild(1);
15893
15930
  if (this.options.showReviewWindow) {
@@ -15901,7 +15938,10 @@ class ElementRenderCut {
15901
15938
  return [documentRender];
15902
15939
  }
15903
15940
  createEmptyBodyRender(bodyRender, limitRect) {
15904
- 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
+ });
15905
15945
  pageBodyRender.rect.width = limitRect.width;
15906
15946
  const bodyInnerLimitRect = pageBodyRender.getInnerRect();
15907
15947
  if (this.options.fullPageView) {
@@ -15925,7 +15965,10 @@ class ElementRenderCut {
15925
15965
  if (render instanceof TableRenderObject) {
15926
15966
  return this.cutTable(render, limitHeight);
15927
15967
  }
15928
- 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
+ });
15929
15972
  cloneRender.setRenderWidth(render.rect.width);
15930
15973
  if (render instanceof MuiltBlockLineRenderObject) {
15931
15974
  let sumHeight = 0;
@@ -16060,16 +16103,16 @@ class ElementRenderCut {
16060
16103
  }
16061
16104
  const cloneRowRender = render.element.createRenderObject();
16062
16105
  cloneRowRender.rect.width = render.rect.width;
16106
+ render.remeasureState = true;
16063
16107
  //cloneRowRender.rect.maxWidth = render.rect.height;
16064
16108
  const cellRenders = [...render.getItems()];
16065
16109
  const cutCellRenders = [];
16066
16110
  for (let i = 0; i < cellRenders.length; i++) {
16067
16111
  const cellRender = cellRenders[i];
16112
+ this.markMergeRowRenderDirty(cellRender);
16068
16113
  if (cellRender.rect.height > limitHeight) {
16069
- //限制的外框尺寸
16070
- const availHeight = limitHeight;
16071
16114
  //限制的内框尺寸
16072
- const limitCellHeight = ElementUtil.innerRectMaxHeight(cellRender, availHeight);
16115
+ const limitCellHeight = ElementUtil.innerRectMaxHeight(cellRender, limitHeight);
16073
16116
  const cutCellRender = this.cutRenderItem(cellRender, limitCellHeight);
16074
16117
  if (cutCellRender) {
16075
16118
  cutCellRenders.push(cutCellRender);
@@ -16093,7 +16136,10 @@ class ElementRenderCut {
16093
16136
  for (let i = 0; i < cutCellRenders.length; i++) {
16094
16137
  let cellRender = cutCellRenders[i];
16095
16138
  if (!cellRender) {
16096
- 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
+ });
16097
16143
  cellRender.rect = ElementUtil.cloneRect(cellRenders[i].rect);
16098
16144
  ElementUtil.remeasure(cellRender);
16099
16145
  }
@@ -16103,6 +16149,33 @@ class ElementRenderCut {
16103
16149
  return cloneRowRender;
16104
16150
  }
16105
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
+ }
16106
16179
  /**
16107
16180
  * 修复->已经截断的合并单元格要向下移动到合适的位置
16108
16181
  * @param tbRender
@@ -27924,6 +27997,7 @@ class DocEditor {
27924
27997
  insertTable(rows, cols) {
27925
27998
  const tb = TableUtil.createTable(rows, cols, this.selectionState);
27926
27999
  this.documentChange.insertTable(tb);
28000
+ return tb;
27927
28001
  }
27928
28002
  /**
27929
28003
  * 插入软换行符
@@ -28788,7 +28862,7 @@ class DocEditor {
28788
28862
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
28789
28863
  }
28790
28864
  version() {
28791
- return "2.1.16";
28865
+ return "2.1.18";
28792
28866
  }
28793
28867
  switchPageHeaderEditor() {
28794
28868
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);