@hailin-zheng/editor-core 2.2.2 → 2.2.4

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
@@ -69,9 +69,9 @@ class ElementEvent {
69
69
  }
70
70
  }
71
71
  class ContentMenuItem {
72
- icon;
73
72
  caption;
74
- eventObj;
73
+ checked;
74
+ click = () => { };
75
75
  subItems = [];
76
76
  }
77
77
  /**
@@ -1002,6 +1002,12 @@ function generatePatch(doc, clear = true) {
1002
1002
  if ('insert' in op.ops) {
1003
1003
  insertOpsMap.set(ele, op);
1004
1004
  }
1005
+ //当前为新插入的元素
1006
+ if ('insText' in op.ops) {
1007
+ if (insertOpsMap.has(ele)) {
1008
+ continue;
1009
+ }
1010
+ }
1005
1011
  // if ('insert' in op.ops) {
1006
1012
  // op.ops.insert = ele.clone(true);
1007
1013
  // const log = getOpsLog(ele, op.ops);
@@ -1057,7 +1063,11 @@ class Subscription {
1057
1063
  class EventSourceCore {
1058
1064
  closed = false;
1059
1065
  subs = [];
1066
+ state = 'running';
1060
1067
  next(data) {
1068
+ if (this.state === 'pause') {
1069
+ return;
1070
+ }
1061
1071
  const subs = [...this.subs];
1062
1072
  subs.forEach((sub) => {
1063
1073
  sub.invoke(data);
@@ -1201,6 +1211,8 @@ class Rect {
1201
1211
  width = 0;
1202
1212
  height = 0;
1203
1213
  }
1214
+ // 定义文本占用高度系数
1215
+ const TEXT_HEIGHT_FACTOR = 1.4;
1204
1216
  /**
1205
1217
  * 修改标志
1206
1218
  */
@@ -1703,6 +1715,7 @@ class PageOptions {
1703
1715
  }
1704
1716
  class ViewOptions {
1705
1717
  copyRightInfo;
1718
+ trialVersion = false;
1706
1719
  watermark;
1707
1720
  drawLineRectColor = "rgb(0,0,0)";
1708
1721
  drawCharRectColor = "rgb(0,0,0)";
@@ -1711,6 +1724,8 @@ class ViewOptions {
1711
1724
  editorVersion = '';
1712
1725
  defaultFontSize = 14;
1713
1726
  defaultColor = "#000000";
1727
+ currentFontSize = 14;
1728
+ currentFontName = '宋体';
1714
1729
  selectionOverlaysColor = 'rgb(131,175,155,0.5)';
1715
1730
  dataEleOverlaysColor = 'rgb(131,175,155,0.5)';
1716
1731
  dataEleFocusedBgColor = 'rgb(131,175,155,0.8)';
@@ -1761,6 +1776,7 @@ class ViewOptions {
1761
1776
  //显示段落回车符号
1762
1777
  showEnterSymbol = false;
1763
1778
  enableVisibleExpression = false;
1779
+ shapeRendering = 'auto';
1764
1780
  get fullPageView() {
1765
1781
  return this._fullPageView;
1766
1782
  }
@@ -1808,6 +1824,8 @@ class ViewOptions {
1808
1824
  _showTrackChanges = true;
1809
1825
  //是否显示审阅痕迹提示
1810
1826
  _showTrackChangesTip = true;
1827
+ //是否开启留痕
1828
+ enableTrackChanges = false;
1811
1829
  get showTrackChanges() {
1812
1830
  return this._showTrackChanges;
1813
1831
  }
@@ -1836,6 +1854,8 @@ class ViewOptions {
1836
1854
  onChange = new Subject();
1837
1855
  //打印模式,普通模式,续打模式
1838
1856
  printMode = 'normal';
1857
+ //是否开启候选词输入联想
1858
+ enableSuggestions = false;
1839
1859
  constructor() {
1840
1860
  }
1841
1861
  }
@@ -2918,7 +2938,7 @@ class DataDecorateElement extends LeafElement {
2918
2938
  createRenderObject() {
2919
2939
  const render = new DataDecorateRenderObject(this);
2920
2940
  //render.rect.width = this.dProps.size / 2;
2921
- render.rect.width = 3;
2941
+ render.rect.width = 1;
2922
2942
  render.rect.height = 14;
2923
2943
  return render;
2924
2944
  }
@@ -3655,6 +3675,7 @@ class DocumentRenderObject extends BlockContainerRenderObject {
3655
3675
  };
3656
3676
  const pageCorner = this.exportPageCornerHTML(event);
3657
3677
  const pageNum = this.exportPageNumHTML(event);
3678
+ const copyright = this.exportCopyRight(event);
3658
3679
  return {
3659
3680
  sel: "svg",
3660
3681
  isCompleted: true,
@@ -3665,11 +3686,11 @@ class DocumentRenderObject extends BlockContainerRenderObject {
3665
3686
  height: this.rect.height - 1,
3666
3687
  viewBox: `0 0 ${this.rect.width} ${this.rect.height - 1}`,
3667
3688
  overflow: "hidden",
3668
- "shape-rendering": "optimizeSpeed"
3689
+ "shape-rendering": event.options.shapeRendering
3669
3690
  },
3670
3691
  },
3671
3692
  children: [
3672
- pageCorner, highlight, ...CommonUtil.toArray(event.getChildNodes(this)), pageNum, selection
3693
+ pageCorner, copyright, highlight, ...CommonUtil.toArray(event.getChildNodes(this)), pageNum, selection
3673
3694
  ]
3674
3695
  };
3675
3696
  }
@@ -3701,6 +3722,41 @@ class DocumentRenderObject extends BlockContainerRenderObject {
3701
3722
  pageCorner.children?.push(ElementUtil.getStrokeSvgPath(`M ${paddingPos.x + lineWidth} ${paddingPos.y} L ${paddingPos.x} ${paddingPos.y} L ${paddingPos.x} ${paddingPos.y + lineWidth}`, "grey", drawLineWidth));
3702
3723
  return pageCorner;
3703
3724
  }
3725
+ exportCopyRight(event) {
3726
+ if (!event.options.trialVersion) {
3727
+ return null;
3728
+ }
3729
+ const str = "\u6f14\u793a\u7248\u672c";
3730
+ const textProps = new TextProps();
3731
+ textProps.color = "#000";
3732
+ textProps.fontName = '仿宋';
3733
+ textProps.fontSize = 80;
3734
+ textProps.fontStyle = 'italic';
3735
+ event.renderCtx.contentContext.measureText(str, textProps);
3736
+ const getTextRotationAngle = (width, height) => {
3737
+ return Math.atan(height / width) * 180 / Math.PI;
3738
+ };
3739
+ const angle = getTextRotationAngle(this.rect.width, this.rect.height);
3740
+ return {
3741
+ sel: 'text',
3742
+ text: str,
3743
+ data: {
3744
+ ns: "http://www.w3.org/2000/svg",
3745
+ attrs: {
3746
+ transform: `rotate(${360 - angle})`,
3747
+ 'transform-origin': 'center',
3748
+ 'dominant-baseline': 'Hanging',
3749
+ 'text-anchor': 'middle',
3750
+ 'font-family': textProps.fontName,
3751
+ 'font-size': textProps.fontSize,
3752
+ "stroke": textProps.color,
3753
+ 'fill': '#fff',
3754
+ x: this.rect.width / 2,
3755
+ y: this.rect.height / 2,
3756
+ }
3757
+ },
3758
+ };
3759
+ }
3704
3760
  }
3705
3761
  class DocumentFactory extends ElementFactory {
3706
3762
  match(type) {
@@ -4211,8 +4267,6 @@ function getCurrentParaGroupRenders(r) {
4211
4267
  }
4212
4268
 
4213
4269
  class DocumentBodyElement extends BlockContainerElement {
4214
- //当前区域内是否留痕
4215
- trackChanges = false;
4216
4270
  constructor() {
4217
4271
  super('body');
4218
4272
  //this.editMode = EditMode.Free;
@@ -4337,7 +4391,6 @@ class TableCellElement extends BlockContainerElement {
4337
4391
  //this.addPropValueChangedSub(this.props);
4338
4392
  }
4339
4393
  beginMeasure(data) {
4340
- //不被合并的单元格
4341
4394
  if (!this.length) {
4342
4395
  this.addChild(data.createParaFn());
4343
4396
  }
@@ -4707,7 +4760,7 @@ class TextGroupRenderObject extends LeafRenderObject {
4707
4760
  }
4708
4761
  measure() {
4709
4762
  this.rect.width = this.textMeasures.reduce((prev, curr) => prev + curr.actualSize, 0);
4710
- this.rect.height = Math.ceil(this.element.props.fontSize * 1.4);
4763
+ this.rect.height = Math.ceil(this.element.props.fontSize * TEXT_HEIGHT_FACTOR);
4711
4764
  // this.element.fontBoundingBox.fontBoundingBoxAscent + this.element.fontBoundingBox.fontBoundingBoxDescent;
4712
4765
  }
4713
4766
  exportSVG(event) {
@@ -6629,17 +6682,20 @@ class DocumentSelection {
6629
6682
  ss.endOffset = range.endOffset;
6630
6683
  ss.endControlIndex = ElementUtil.getControlIndex(range.endControl);
6631
6684
  ss.ancestorCommonControl = DocumentSelection.getAncestorCommonControl(ss.startControl, ss.endControl);
6632
- ss.enableTrackChanges = this.getEnableTrackChanges(range.startControl);
6633
6685
  ss.rangeDirty = false;
6634
6686
  return true;
6635
6687
  }
6636
- /**
6637
- * 获取当前选区区域内是否支持留痕
6638
- * @private
6639
- */
6640
- getEnableTrackChanges(ele) {
6641
- const body = ElementUtil.getParentByType(ele, DocumentBodyElement);
6642
- return body?.trackChanges || false;
6688
+ isSelectionChanged() {
6689
+ if (!this.snapshotSelectionState) {
6690
+ return true;
6691
+ }
6692
+ if (this.selectionState.startControl !== this.snapshotSelectionState.startControl || this.selectionState.startOffset !== this.snapshotSelectionState.startOffset) {
6693
+ return true;
6694
+ }
6695
+ if (this.selectionState.endControl !== this.snapshotSelectionState.endControl || this.selectionState.endOffset !== this.snapshotSelectionState.endOffset) {
6696
+ return true;
6697
+ }
6698
+ return false;
6643
6699
  }
6644
6700
  /**
6645
6701
  * 转换选区内容
@@ -6736,8 +6792,6 @@ class SelectionState {
6736
6792
  renderContainer;
6737
6793
  //光标所在的位置,当前位置时相对文档的位置,而非DOM页面中的位置
6738
6794
  cursorPos;
6739
- //当前选区的上下文是否支持留痕修改
6740
- enableTrackChanges = false;
6741
6795
  constructor() {
6742
6796
  this.clear();
6743
6797
  }
@@ -8445,7 +8499,10 @@ class DataElementDate extends DataElementInlineGroup {
8445
8499
  this.props.value = '';
8446
8500
  return;
8447
8501
  }
8448
- const format = this.props.format ?? 'YYYY-MM-DD';
8502
+ let format = 'YYYY-MM-DD';
8503
+ if (this.props.format) {
8504
+ format = this.props.format;
8505
+ }
8449
8506
  const date = moment__default["default"](val, format);
8450
8507
  if (!date.isValid()) {
8451
8508
  return;
@@ -8976,6 +9033,102 @@ class DataElementTextFactory extends DataElementBaseFactory {
8976
9033
  }
8977
9034
  }
8978
9035
 
9036
+ /**
9037
+ * 数据块容器,包裹多个段落
9038
+ */
9039
+ class DataContainerElement extends BlockContainerElement {
9040
+ constructor() {
9041
+ super('data-container');
9042
+ this.props = new DataContainerProps();
9043
+ this.addEvent('GotCursor', (evt) => {
9044
+ this.isFocused = true;
9045
+ this.refreshView();
9046
+ });
9047
+ this.addEvent('LostCursor', (evt) => {
9048
+ this.isFocused = false;
9049
+ this.refreshView();
9050
+ });
9051
+ }
9052
+ createRenderObject() {
9053
+ return new DataContainerRenderObject(this);
9054
+ }
9055
+ beginMeasure(data) {
9056
+ if (!this.length) {
9057
+ this.addChild(data.createParaFn());
9058
+ }
9059
+ super.beginMeasure(data);
9060
+ }
9061
+ serialize() {
9062
+ const p = {
9063
+ type: this.type,
9064
+ props: {}
9065
+ };
9066
+ if (this.props.id) {
9067
+ p['id'] = this.props.id;
9068
+ }
9069
+ if (this.props.name) {
9070
+ p['name'] = this.props.name;
9071
+ }
9072
+ if (this.props.caption) {
9073
+ p['caption'] = this.props.caption;
9074
+ }
9075
+ return p;
9076
+ }
9077
+ clone(data) {
9078
+ const clone = new DataContainerElement();
9079
+ clone.props.id = this.props.id;
9080
+ clone.props.name = this.props.name;
9081
+ clone.props.caption = this.props.caption;
9082
+ cloneElementBase(this, clone);
9083
+ cloneChildren(this, clone, data);
9084
+ return clone;
9085
+ }
9086
+ }
9087
+ class DataContainerRenderObject extends MuiltBlockLineRenderObject {
9088
+ clone(cloneData = true) {
9089
+ const cloneRender = new DataContainerRenderObject(this.element);
9090
+ cloneRender.rect = ElementUtil.cloneRect(this.rect);
9091
+ if (cloneData) {
9092
+ for (let i = 0; i < this.length; i++) {
9093
+ cloneRender.addChild(this.getChild(i).clone());
9094
+ }
9095
+ }
9096
+ return cloneRender;
9097
+ }
9098
+ exportSVG(event) {
9099
+ const t = super.exportSVG(event);
9100
+ if (event.mode === 'view') {
9101
+ const border = ElementUtil.getStrokeSvgPath(ElementUtil.getRectPath(0, 0, this.rect.width, this.rect.height), '#000', 0.5);
9102
+ t.children = [border];
9103
+ }
9104
+ return t;
9105
+ }
9106
+ }
9107
+ class DataContainerFactory extends ElementFactory {
9108
+ match(type) {
9109
+ return type === 'data-container';
9110
+ }
9111
+ createElement(data) {
9112
+ const element = new DataContainerElement();
9113
+ const props = data.props;
9114
+ if (props?.id) {
9115
+ element.props.id = props.id;
9116
+ }
9117
+ if (props?.name) {
9118
+ element.props.name = props.name;
9119
+ }
9120
+ if (props?.caption) {
9121
+ element.props.caption = props.caption;
9122
+ }
9123
+ return element;
9124
+ }
9125
+ }
9126
+ class DataContainerProps {
9127
+ caption;
9128
+ id;
9129
+ name;
9130
+ }
9131
+
8979
9132
  /**
8980
9133
  * 当前数据元内容长度小于最小长度时,需要当前元素撑开以达到最小长度
8981
9134
  */
@@ -12933,6 +13086,29 @@ class PaintContent {
12933
13086
  }
12934
13087
  }
12935
13088
 
13089
+ /**
13090
+ * 处理文档输入联想
13091
+ */
13092
+ class DocInputSuggestions {
13093
+ currentInputTextGroup;
13094
+ currentMatchedText = '';
13095
+ currentInputOffset = 0;
13096
+ suggestionsList = [];
13097
+ prepareSuggestions = [];
13098
+ selectedIndex = -1;
13099
+ clear() {
13100
+ this.prepareSuggestions.length = 0;
13101
+ this.currentInputTextGroup = undefined;
13102
+ this.selectedIndex = -1;
13103
+ this.currentInputOffset = 0;
13104
+ this.currentMatchedText = '';
13105
+ }
13106
+ destroy() {
13107
+ this.clear();
13108
+ this.suggestionsList.length = 0;
13109
+ }
13110
+ }
13111
+
12936
13112
  /**
12937
13113
  * 当前打开的文档的上下文信息,当前文档所有的属性设置都暴露在上下文中
12938
13114
  */
@@ -12951,6 +13127,10 @@ class EditorContext {
12951
13127
  commentFlag = false;
12952
13128
  //留痕元素存在的标志,用于判断文档空间进行布局
12953
13129
  trackFlag = false;
13130
+ //suggestionsList: Array<ISuggestionData> = [];
13131
+ //currentSuggestionsList: Array<ISuggestionData> = [];
13132
+ suggestions = new DocInputSuggestions();
13133
+ onKeyDownEvent = new Subject();
12954
13134
  constructor(selectionState, viewOptions) {
12955
13135
  this.selectionState = selectionState;
12956
13136
  this.viewOptions = viewOptions;
@@ -13001,6 +13181,7 @@ class EditorContext {
13001
13181
  clear() {
13002
13182
  this.selectionState.clear();
13003
13183
  this.isDirty = false;
13184
+ this.suggestions.clear();
13004
13185
  //this.clearEleDepMaps();
13005
13186
  }
13006
13187
  get defaultCtx() {
@@ -13043,6 +13224,7 @@ class EditorContext {
13043
13224
  //this.ele_types_handlers.length = 0;
13044
13225
  //this.imageLoader.clear();
13045
13226
  this._document = null;
13227
+ this.suggestions.destroy();
13046
13228
  }
13047
13229
  /**
13048
13230
  * 切换行打印模式
@@ -13063,6 +13245,7 @@ class EditorContext {
13063
13245
  //删除旧节点
13064
13246
  oldDataElement.remove();
13065
13247
  }
13248
+ currentRefreshType = null;
13066
13249
  get refreshType() {
13067
13250
  if (!this._document) {
13068
13251
  return null;
@@ -13520,6 +13703,10 @@ class ParagraphMeasure {
13520
13703
  child.rect.width = tab - currTabX;
13521
13704
  }
13522
13705
  }
13706
+ //如果当前段落行只包含当前换行元素或者段落元素,则根据当前输入设置,自动将行高度撑开到理想高度font-size*1.4
13707
+ if (this.lineLength() === 1 && child.element && (child.element.type === 'br' || child.element.type === 'psym')) {
13708
+ child.rect.height = Math.ceil(options.defaultFontSize * TEXT_HEIGHT_FACTOR);
13709
+ }
13523
13710
  this.arrange();
13524
13711
  this.updateHeight(child);
13525
13712
  },
@@ -15045,6 +15232,7 @@ class ElementReader {
15045
15232
  this.addFactory(TabFactory);
15046
15233
  this.addFactory(PermanentTeethFactory);
15047
15234
  this.addFactory(SVGFactory);
15235
+ this.addFactory(DataContainerFactory);
15048
15236
  // this.registerReadFunc<TrackRunProps>('ins-run', (data) => {
15049
15237
  // const props = new TrackRunProps(data.type);
15050
15238
  // props.userId = data.userId;
@@ -15203,26 +15391,37 @@ class DocumentEvent {
15203
15391
  };
15204
15392
  }
15205
15393
  bindEvent() {
15206
- this.documentInput.onLeftEvent.subscribe(() => {
15207
- this.moveCursorToLeft();
15208
- });
15209
- this.documentInput.onRightEvent.subscribe(() => {
15210
- this.moveCursorToRight();
15211
- });
15212
- this.documentInput.onSelectAllEvent.subscribe(() => {
15213
- this.selectAll();
15214
- });
15215
- this.documentInput.onHomeEvent.subscribe(() => {
15216
- this.moveCursorToLineStart();
15217
- });
15218
- this.documentInput.onEndEvent.subscribe(() => {
15219
- this.moveCursorToLineEnd();
15220
- });
15221
- this.documentInput.onUpEvent.subscribe(() => {
15222
- this.moveCursorToUpOrDown(true);
15223
- });
15224
- this.documentInput.onDownEvent.subscribe(() => {
15225
- this.moveCursorToUpOrDown(false);
15394
+ this.docCtx.onKeyDownEvent.subscribe(evt => {
15395
+ if (!this.docCtx.selectionState.editable) {
15396
+ return;
15397
+ }
15398
+ const os = ElementUtil.getOSPlatform();
15399
+ if (evt.keyCode === 37) {
15400
+ this.moveCursorToLeft();
15401
+ }
15402
+ else if (evt.keyCode === 39) {
15403
+ this.moveCursorToRight();
15404
+ }
15405
+ else if (evt.keyCode === 38) {
15406
+ this.moveCursorToUpOrDown(true);
15407
+ }
15408
+ else if (evt.keyCode === 40) {
15409
+ this.moveCursorToUpOrDown(false);
15410
+ }
15411
+ else if (evt.keyCode === 36) {
15412
+ this.moveCursorToLineStart();
15413
+ }
15414
+ else if (evt.keyCode === 35) {
15415
+ this.moveCursorToLineEnd();
15416
+ }
15417
+ else if (evt.ctrlKey && evt.keyCode === 65 && os !== 'Mac') {
15418
+ evt.preventDefault();
15419
+ this.selectAll();
15420
+ }
15421
+ else if (evt.metaKey && evt.keyCode === 65 && os === 'Mac') {
15422
+ evt.preventDefault();
15423
+ this.selectAll();
15424
+ }
15226
15425
  });
15227
15426
  }
15228
15427
  addSubEvent(sub) {
@@ -16412,15 +16611,15 @@ class DocumentInput {
16412
16611
  //输入内容事件
16413
16612
  onInputEvent = new Subject();
16414
16613
  //backspace 键盘事件
16415
- onBackspaceEvent = new Subject();
16614
+ //onBackspaceEvent: Subject<KeyboardEvent> = new Subject();
16416
16615
  //delete 键盘事件
16417
- onDeleteEvent = new Subject();
16616
+ //onDeleteEvent: Subject<KeyboardEvent> = new Subject();
16418
16617
  //enter 键盘事件
16419
- onEnterEvent = new Subject();
16618
+ //onEnterEvent: Subject<void> = new Subject();
16420
16619
  //左键
16421
- onLeftEvent = new Subject();
16620
+ //onLeftEvent: Subject<void> = new Subject();
16422
16621
  //右键
16423
- onRightEvent = new Subject();
16622
+ //onRightEvent: Subject<void> = new Subject();
16424
16623
  //复制
16425
16624
  onCopyEvent = new Subject();
16426
16625
  //剪切
@@ -16428,30 +16627,31 @@ class DocumentInput {
16428
16627
  //粘贴
16429
16628
  onPasteEvent = new Subject();
16430
16629
  //插入换行符
16431
- onInsertBr = new Subject();
16630
+ //onInsertBr: Subject<void> = new Subject();
16432
16631
  //ctrl+A 全选事件
16433
- onSelectAllEvent = new Subject();
16632
+ //onSelectAllEvent: Subject<void> = new Subject();
16434
16633
  //home 事件
16435
- onHomeEvent = new Subject();
16634
+ //onHomeEvent: Subject<void> = new Subject();
16436
16635
  //end 事件
16437
- onEndEvent = new Subject();
16438
- onUpEvent = new Subject();
16439
- onDownEvent = new Subject();
16440
- onTabKeyEvent = new Subject();
16636
+ //onEndEvent: Subject<void> = new Subject();
16637
+ //onUpEvent: Subject<void> = new Subject();
16638
+ //onDownEvent: Subject<void> = new Subject();
16639
+ //onTabKeyEvent: Subject<void> = new Subject();
16640
+ onKeyDownEvent = new Subject();
16441
16641
  constructor(docCtx) {
16442
16642
  this.docCtx = docCtx;
16443
16643
  }
16444
16644
  composition = false;
16445
16645
  inputTargetStrPosition = -1;
16446
- inputTargetStr = undefined;
16646
+ inputTargetStrLength = 0;
16447
16647
  inputEle;
16448
16648
  correctInputEle(ele, str, pos) {
16449
16649
  this.inputTargetStrPosition = pos;
16450
- this.inputTargetStr = str;
16650
+ this.inputTargetStrLength = str ? str.length : 0;
16451
16651
  this.inputEle = ele;
16452
16652
  }
16453
16653
  getEventListener() {
16454
- const os = ElementUtil.getOSPlatform();
16654
+ ElementUtil.getOSPlatform();
16455
16655
  return {
16456
16656
  input: (evt) => {
16457
16657
  const target = evt.target;
@@ -16469,7 +16669,7 @@ class DocumentInput {
16469
16669
  this.inputTargetStrPosition = startOffset;
16470
16670
  this.inputEle = startControl;
16471
16671
  if (startControl instanceof TextGroupElement) {
16472
- this.inputTargetStr = startControl.text;
16672
+ this.inputTargetStrLength = startControl.text.length;
16473
16673
  }
16474
16674
  },
16475
16675
  compositionupdate: (evt) => {
@@ -16489,60 +16689,48 @@ class DocumentInput {
16489
16689
  this.composition = false;
16490
16690
  this.inputEle = null;
16491
16691
  this.inputTargetStrPosition = -1;
16492
- this.inputTargetStr = undefined;
16692
+ this.inputTargetStrLength = 0;
16493
16693
  },
16494
16694
  keydown: (evt) => {
16695
+ this.onKeyDownEvent.next(evt);
16696
+ if (evt.defaultPrevented) {
16697
+ return;
16698
+ }
16495
16699
  const keyEvent = new KeyboradElementEvent(this.docCtx);
16496
16700
  keyEvent.sourceEvent = evt;
16497
16701
  if (DocumentEvent.invokeEvent('ElementKeyDown', this.docCtx.selectionState.startControl, keyEvent, 'All')) {
16498
16702
  return;
16499
16703
  }
16500
- if (!this.docCtx.selectionState.editable) {
16501
- return;
16502
- }
16503
- if (evt.keyCode === 8) {
16504
- this.onBackspaceEvent.next(evt);
16505
- }
16506
- else if (evt.keyCode === 13 && !evt.shiftKey) {
16507
- this.onEnterEvent.next();
16508
- }
16509
- else if (evt.keyCode === 37) {
16510
- this.onLeftEvent.next();
16511
- }
16512
- else if (evt.keyCode === 39) {
16513
- this.onRightEvent.next();
16514
- }
16515
- else if (evt.keyCode === 38) {
16516
- this.onUpEvent.next();
16517
- }
16518
- else if (evt.keyCode === 40) {
16519
- this.onDownEvent.next();
16520
- }
16521
- else if (evt.keyCode === 9) {
16522
- evt.preventDefault();
16523
- this.onTabKeyEvent.next();
16524
- }
16525
- else if (evt.keyCode === 13 && evt.shiftKey) {
16526
- evt.preventDefault();
16527
- this.onInsertBr.next();
16528
- }
16529
- else if (evt.keyCode === 46) {
16530
- this.onDeleteEvent.next(evt);
16531
- }
16532
- else if (evt.ctrlKey && evt.keyCode === 65 && os !== 'Mac') {
16533
- evt.preventDefault();
16534
- this.onSelectAllEvent.next();
16535
- }
16536
- else if (evt.metaKey && evt.keyCode === 65 && os === 'Mac') {
16537
- evt.preventDefault();
16538
- this.onSelectAllEvent.next();
16539
- }
16540
- else if (evt.keyCode === 36) {
16541
- this.onHomeEvent.next();
16542
- }
16543
- else if (evt.keyCode === 35) {
16544
- this.onEndEvent.next();
16545
- }
16704
+ // if (!this.docCtx.selectionState.editable) {
16705
+ // return;
16706
+ // }
16707
+ // if (evt.keyCode === 8) {
16708
+ // //this.onBackspaceEvent.next(evt);
16709
+ // } else if (evt.keyCode === 13 && !evt.shiftKey) {
16710
+ // //this.onEnterEvent.next();
16711
+ // } else if (evt.keyCode === 37) {
16712
+ // //this.onLeftEvent.next();
16713
+ // } else if (evt.keyCode === 39) {
16714
+ // //this.onRightEvent.next();
16715
+ // } else if (evt.keyCode === 9) {
16716
+ // // evt.preventDefault();
16717
+ // // this.onTabKeyEvent.next();
16718
+ // } else if (evt.keyCode === 13 && evt.shiftKey) {
16719
+ // // evt.preventDefault();
16720
+ // // this.onInsertBr.next();
16721
+ // } else if (evt.keyCode === 46) {
16722
+ // //this.onDeleteEvent.next(evt);
16723
+ // } else if (evt.ctrlKey && evt.keyCode === 65 && os !== 'Mac') {
16724
+ // // evt.preventDefault();
16725
+ // // this.onSelectAllEvent.next();
16726
+ // } else if (evt.metaKey && evt.keyCode === 65 && os === 'Mac') {
16727
+ // // evt.preventDefault();
16728
+ // // this.onSelectAllEvent.next();
16729
+ // } else if (evt.keyCode === 36) {
16730
+ // //this.onHomeEvent.next();
16731
+ // } else if (evt.keyCode === 35) {
16732
+ // //this.onEndEvent.next();
16733
+ // }
16546
16734
  },
16547
16735
  copy: (evt) => {
16548
16736
  const event = new CopyElementEvent(this.docCtx);
@@ -16569,7 +16757,7 @@ class DocumentInput {
16569
16757
  const { startControl, startOffset } = this.docCtx.selectionState;
16570
16758
  this.onInputEvent.next({
16571
16759
  data: data,
16572
- prevInputData: this.inputTargetStr,
16760
+ prevInputDataLength: this.inputTargetStrLength,
16573
16761
  composition: this.composition,
16574
16762
  compositionStartInfo: {
16575
16763
  element: startControl,
@@ -16599,12 +16787,34 @@ class DocumentChange {
16599
16787
  this.documentInput.onInputEvent.subscribe(data => {
16600
16788
  this.newInput(data);
16601
16789
  });
16602
- this.documentInput.onBackspaceEvent.subscribe((evt) => {
16603
- this.onBackspace(evt);
16604
- });
16605
- this.documentInput.onEnterEvent.subscribe(() => {
16606
- this.onEnter();
16790
+ this.docCtx.onKeyDownEvent.subscribe(evt => {
16791
+ if (!this.docCtx.selectionState.editable) {
16792
+ return;
16793
+ }
16794
+ if (evt.keyCode === 8) {
16795
+ this.onBackspace(evt);
16796
+ }
16797
+ else if (evt.keyCode === 13 && !evt.shiftKey) {
16798
+ this.onEnter();
16799
+ }
16800
+ if (evt.keyCode === 13 && evt.shiftKey) {
16801
+ evt.preventDefault();
16802
+ this.insertSoftBr();
16803
+ }
16804
+ else if (evt.keyCode === 46) {
16805
+ this.onDeleteKeyHandler(evt);
16806
+ }
16807
+ if (evt.keyCode === 9) {
16808
+ evt.preventDefault();
16809
+ this.insertTabElement();
16810
+ }
16607
16811
  });
16812
+ /* this.documentInput.onBackspaceEvent.subscribe((evt) => {
16813
+ this.onBackspace(evt)
16814
+ });*/
16815
+ // this.documentInput.onEnterEvent.subscribe(() => {
16816
+ // this.onEnter()
16817
+ // });
16608
16818
  this.documentInput.onCopyEvent.subscribe((evt) => {
16609
16819
  this.onCopy(evt);
16610
16820
  });
@@ -16614,21 +16824,10 @@ class DocumentChange {
16614
16824
  this.documentInput.onPasteEvent.subscribe((evt) => {
16615
16825
  this.onPaste(evt);
16616
16826
  });
16617
- this.documentInput.onInsertBr.subscribe(() => {
16618
- this.insertSoftBr();
16619
- });
16620
- this.documentInput.onDeleteEvent.subscribe((evt) => {
16621
- this.onDeleteKeyHandler(evt);
16622
- });
16623
- this.documentInput.onTabKeyEvent.subscribe(() => {
16624
- this.insertTabElement();
16625
- });
16626
16827
  }
16627
16828
  newInput(data) {
16628
- if (data.composition && data.data === '啊') {
16629
- debugger;
16630
- }
16631
- const { startControl, startOffset, collapsed, enableTrackChanges } = this.selectionState;
16829
+ const { startControl, startOffset, collapsed } = this.selectionState;
16830
+ const enableTrackChanges = this.viewOptions.enableTrackChanges;
16632
16831
  if (!collapsed) {
16633
16832
  this.onInputBySelectRange(data);
16634
16833
  return;
@@ -16647,12 +16846,7 @@ class DocumentChange {
16647
16846
  //当前输入节点是在留痕区域中,但是当前关闭了审阅模式,需要拆分留痕区域,创建新输入节点
16648
16847
  if (!enableTrackChanges && this.isInTrackBlock(startControl)) {
16649
16848
  const newInput = this.splitTrackElement(startControl, startOffset);
16650
- const comp = data.compositionStartInfo;
16651
- comp.element = newInput;
16652
- comp.offset = 0;
16653
- //修正数据
16654
- if (data.composition)
16655
- this.documentInput.correctInputEle(newInput, newInput.text, 0);
16849
+ this.correctInputEle(newInput, newInput.text, 0, data);
16656
16850
  this.inputTextGroup(newInput, data);
16657
16851
  return;
16658
16852
  }
@@ -16662,26 +16856,27 @@ class DocumentChange {
16662
16856
  }
16663
16857
  const siblingTextEle = startOffset === 1 ? ElementUtil.getNextSiblingElement(startControl) : ElementUtil.getPrevSiblingElement(startControl);
16664
16858
  if (siblingTextEle instanceof TextGroupElement) {
16665
- data.compositionStartInfo.offset = startOffset === 0 ? siblingTextEle.text.length : 0;
16666
- //修正数据
16667
- if (data.composition) {
16668
- this.documentInput.correctInputEle(siblingTextEle, siblingTextEle.text, data.compositionStartInfo.offset);
16669
- }
16859
+ const pos = startOffset === 0 ? siblingTextEle.text.length : 0;
16860
+ this.correctInputEle(siblingTextEle, siblingTextEle.text, pos, data);
16670
16861
  this.inputTextGroup(siblingTextEle, data);
16671
16862
  }
16672
16863
  else {
16673
16864
  const inputTextProps = this.getDefaultTextProps(startControl, startOffset);
16674
16865
  const newTextGroup = ElementUtil.getNewTextGroup(inputTextProps);
16675
16866
  startControl.parent.addChild(newTextGroup, startControl.getIndex() + startOffset);
16676
- if (data.composition) {
16677
- this.documentInput.correctInputEle(newTextGroup, '', 0);
16678
- }
16867
+ this.correctInputEle(newTextGroup, '', 0, data);
16679
16868
  this.inputTextGroup(newTextGroup, data);
16680
16869
  }
16681
16870
  return;
16682
16871
  }
16683
16872
  this.inputTextGroup(startControl, data);
16684
16873
  }
16874
+ correctInputEle(ele, str, pos, data) {
16875
+ this.documentInput.correctInputEle(ele, str, pos);
16876
+ data.compositionStartInfo.element = ele;
16877
+ data.compositionStartInfo.offset = pos;
16878
+ data.prevInputDataLength = str.length;
16879
+ }
16685
16880
  /**
16686
16881
  * 选中区域后进行输入
16687
16882
  * 需要处理将选中的区域删除后,进行输入的情况
@@ -16739,24 +16934,20 @@ class DocumentChange {
16739
16934
  */
16740
16935
  newInputTrackChanges(data, startControl, startOffset) {
16741
16936
  this.viewOptions.editUser.id;
16742
- const compInfo = data.compositionStartInfo;
16937
+ data.compositionStartInfo;
16743
16938
  if (this.isInCorrectTrackRegion(startControl, exports.TrackRunTypeEnum.Inserted)) {
16744
16939
  return;
16745
16940
  }
16746
16941
  if (this.isInTrackBlock(startControl)) {
16747
16942
  const newInput = this.createNewTrackInput(startControl, startOffset, exports.TrackRunTypeEnum.Inserted);
16748
- compInfo.offset = 0;
16749
- compInfo.element = newInput;
16750
- this.documentInput.correctInputEle(newInput, '', 0);
16943
+ this.correctInputEle(newInput, '', 0, data);
16751
16944
  this.inputTextGroup(newInput, data);
16752
16945
  return;
16753
16946
  }
16754
16947
  else {
16755
16948
  const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, null, exports.TrackRunTypeEnum.Inserted);
16756
16949
  this.insertElement(startControl, startOffset, [trackElement]);
16757
- compInfo.offset = 0;
16758
- compInfo.element = newTextGroup;
16759
- this.documentInput.correctInputEle(newTextGroup, '', 0);
16950
+ this.correctInputEle(newTextGroup, '', 0, data);
16760
16951
  this.inputTextGroup(newTextGroup, data);
16761
16952
  return;
16762
16953
  }
@@ -16799,24 +16990,23 @@ class DocumentChange {
16799
16990
  * @returns
16800
16991
  */
16801
16992
  getDefaultTextProps(startControl, offset) {
16802
- let textProps = this.getDefaultTextPropsByOptions();
16803
- if (startControl instanceof TextGroupElement) {
16804
- textProps = startControl.props;
16805
- }
16806
16993
  const dataEle = ElementUtil.getDataElement(startControl);
16807
16994
  if (dataEle && IsInSideDataElement(startControl, offset)) {
16808
16995
  return dataEle.props.valueTextProps;
16809
16996
  }
16810
- return textProps;
16997
+ else {
16998
+ return this.getDefaultTextPropsByOptions();
16999
+ }
16811
17000
  }
16812
17001
  /**
16813
17002
  * 根据选项配置返回创建文本的默认文本属性
16814
17003
  * @private
16815
17004
  */
16816
17005
  getDefaultTextPropsByOptions() {
17006
+ const { defaultFontSize, defaultFontName, currentFontSize, currentFontName } = this.viewOptions;
16817
17007
  const props = new TextProps();
16818
- props.fontName = this.viewOptions.defaultFontName;
16819
- props.fontSize = this.viewOptions.defaultFontSize;
17008
+ props.fontSize = currentFontSize > 0 ? currentFontSize : defaultFontSize;
17009
+ props.fontName = currentFontName ? currentFontName : defaultFontName;
16820
17010
  props.color = this.viewOptions.defaultColor;
16821
17011
  return props;
16822
17012
  }
@@ -16879,15 +17069,20 @@ class DocumentChange {
16879
17069
  return trackElement;
16880
17070
  }
16881
17071
  inputTextGroup(text, data) {
16882
- const prevInputData = data.prevInputData || '';
16883
- const prevInputDataLength = prevInputData.length;
16884
- if (!data.compositionStartInfo) {
16885
- throw new Error('compositionStartInfo is null');
16886
- }
17072
+ const prevInputDataLength = data.prevInputDataLength ?? 0;
16887
17073
  const { element, offset } = data.compositionStartInfo;
17074
+ //处理当前输入字体大小和名称;当前手动更改了字体信息,需要重新创建文本元素进行输入处理
17075
+ if (text.props.fontSize !== this.viewOptions.currentFontSize || text.props.fontName !== this.viewOptions.currentFontName) {
17076
+ //创建新输入项
17077
+ const newInput = this.createNewInputText();
17078
+ //插入到文档
17079
+ this.insertElement(element, offset, [newInput]);
17080
+ this.correctInputEle(newInput, '', 0, data);
17081
+ this.inputTextGroup(newInput, data);
17082
+ return;
17083
+ }
16888
17084
  let startInputOffset = offset;
16889
17085
  const deleteCount = data.composition ? text.textMeasures.length - prevInputDataLength : 0;
16890
- //startInputOffset -= prevInputDataLength;
16891
17086
  if (!(element instanceof TextGroupElement)) {
16892
17087
  //当前选中元素位于输入元素是起始还是结束位置,如果位于起始位置,则输入偏移量为0,否则为未变更之前的内容length
16893
17088
  if (ElementUtil.getNextSiblingElement(element) === text) {
@@ -17090,7 +17285,7 @@ class DocumentChange {
17090
17285
  const currPara = ElementUtil.getParentByType(control, ParagraphElement);
17091
17286
  //表明是紧挨着的两个段落,要进行段落合并
17092
17287
  if (ElementUtil.getPrevSiblingElement(currPara) === prevPara) {
17093
- if (this.selectionState.enableTrackChanges) {
17288
+ if (this.viewOptions.enableTrackChanges) {
17094
17289
  this.selectionState.resetRange(prevEle, -1);
17095
17290
  return;
17096
17291
  }
@@ -17181,7 +17376,7 @@ class DocumentChange {
17181
17376
  const currPara = ElementUtil.getParentByType(control, ParagraphElement);
17182
17377
  //表明是紧挨着的两个段落,要进行段落合并
17183
17378
  if (ElementUtil.getNextSiblingElement(currPara) === nextPara) {
17184
- if (this.selectionState.enableTrackChanges) {
17379
+ if (this.viewOptions.enableTrackChanges) {
17185
17380
  this.selectionState.resetRange(nextEle, 0);
17186
17381
  return;
17187
17382
  }
@@ -17243,7 +17438,7 @@ class DocumentChange {
17243
17438
  return dataEle.length === 2;
17244
17439
  }
17245
17440
  onDeleteText(text, offset, len) {
17246
- if (this.selectionState.enableTrackChanges) {
17441
+ if (this.viewOptions.enableTrackChanges) {
17247
17442
  this.updateDeletedTrackText(text, offset, len);
17248
17443
  }
17249
17444
  else {
@@ -17251,7 +17446,7 @@ class DocumentChange {
17251
17446
  }
17252
17447
  }
17253
17448
  onDeleteItem(item) {
17254
- if (this.selectionState.enableTrackChanges) {
17449
+ if (this.viewOptions.enableTrackChanges) {
17255
17450
  //删除符号不进行留痕
17256
17451
  if (item.type === 'psym') {
17257
17452
  return;
@@ -17342,6 +17537,16 @@ class DocumentChange {
17342
17537
  return newTextGroup;
17343
17538
  }
17344
17539
  }
17540
+ /**
17541
+ * 创建一个待输入的文本元素
17542
+ * @private
17543
+ */
17544
+ createNewInputText() {
17545
+ const { startControl, startOffset } = this.selectionState;
17546
+ const textProps = this.getDefaultTextProps(startControl, startOffset);
17547
+ const newInput = ElementUtil.getNewTextGroup(textProps);
17548
+ return newInput;
17549
+ }
17345
17550
  getNextTrackElement(target, trackType) {
17346
17551
  let trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id);
17347
17552
  if (!trackElement) {
@@ -17431,9 +17636,16 @@ class DocumentChange {
17431
17636
  * @returns
17432
17637
  */
17433
17638
  insertTable(tb) {
17639
+ this.insertLayoutContainer(tb);
17640
+ }
17641
+ /**
17642
+ * 插入布局容器,比如表格、数据容器等
17643
+ * @param ele
17644
+ */
17645
+ insertLayoutContainer(ele) {
17434
17646
  const breakPara = this.splitCurrentParagraph();
17435
- breakPara.parent.addChild(tb, breakPara.getIndex());
17436
- this.selectionState.resetRange(tb, 0);
17647
+ breakPara.parent.addChild(ele, breakPara.getIndex());
17648
+ this.selectionState.resetRange(ele, 0);
17437
17649
  }
17438
17650
  /**
17439
17651
  * 分割当前段落用于插入表格或者粘贴的内容
@@ -17495,7 +17707,7 @@ class DocumentChange {
17495
17707
  }
17496
17708
  else if (childTarget instanceof BranchElement) {
17497
17709
  //留痕模式
17498
- if (this.selectionState.enableTrackChanges) {
17710
+ if (this.viewOptions.enableTrackChanges) {
17499
17711
  this.deleteRange(childRange);
17500
17712
  }
17501
17713
  else {
@@ -18003,7 +18215,7 @@ class DocumentChange {
18003
18215
  data: text,
18004
18216
  compositionStartInfo: {
18005
18217
  element: startControl,
18006
- offset: startOffset
18218
+ offset: startOffset,
18007
18219
  }
18008
18220
  });
18009
18221
  }
@@ -18020,6 +18232,31 @@ class DocumentChange {
18020
18232
  this.selectionState.resetRange(breakPara, 0);
18021
18233
  }
18022
18234
  }
18235
+ /**
18236
+ * 向当前光标追加文本
18237
+ * @param appendStr
18238
+ * @param inputOffset
18239
+ * @param replaceLength
18240
+ * @private
18241
+ */
18242
+ appendText(appendStr, replaceText) {
18243
+ const { startControl, startOffset } = this.selectionState;
18244
+ if (startControl instanceof TextGroupElement) {
18245
+ const data = {
18246
+ data: appendStr,
18247
+ prevInputDataLength: startControl.text.length - replaceText.length,
18248
+ composition: true,
18249
+ compositionStartInfo: {
18250
+ element: startControl,
18251
+ offset: startOffset - replaceText.length
18252
+ }
18253
+ };
18254
+ this.inputTextGroup(startControl, data);
18255
+ }
18256
+ else {
18257
+ console.warn("当前光标所在的元素类型不正确,不能进行追加文本操作");
18258
+ }
18259
+ }
18023
18260
  /**
18024
18261
  * 设置当前段落项目符号类型
18025
18262
  */
@@ -18047,7 +18284,7 @@ class DocumentChange {
18047
18284
  /**
18048
18285
  * 插入批注
18049
18286
  */
18050
- insertComment() {
18287
+ insertComment(text) {
18051
18288
  const { startControl, startOffset, endControl, endOffset, collapsed } = this.selectionState;
18052
18289
  if (collapsed || !startControl || !endControl) {
18053
18290
  return;
@@ -18064,7 +18301,7 @@ class DocumentChange {
18064
18301
  endCommMark.props.markType = 'end';
18065
18302
  this.insertElement(endControl, endOffset, [endCommMark]);
18066
18303
  this.insertElement(startControl, startOffset, [startCommMark]);
18067
- startCommMark.props.text = '插入测试批注信息' + new Date();
18304
+ startCommMark.props.text = text;
18068
18305
  // const commContent = new CommContentElement();
18069
18306
  // commContent.props.id = id;
18070
18307
  // commContent.props.createId = this.viewOptions.editUser.id;
@@ -18669,13 +18906,19 @@ class ElementTrackManage {
18669
18906
  //前后是连续的操作
18670
18907
  const { format: currFormat } = currOp.ops;
18671
18908
  const { format: prevFormat } = prevOp.ops;
18909
+ //const applyProps = {};
18672
18910
  Object.keys(currFormat).forEach(key => {
18673
18911
  const currValue = currFormat[key].newValue;
18674
- const prevValue = prevFormat[key].newValue;
18675
- if (CommonUtil.isEqual(currValue, prevValue)) {
18912
+ if (prevFormat[key] && CommonUtil.isEqual(currValue, prevFormat[key])) {
18676
18913
  return;
18677
18914
  }
18678
- prevFormat[key].newValue = currValue;
18915
+ if (prevFormat[key]) {
18916
+ prevFormat[key].newValue = currValue;
18917
+ }
18918
+ else {
18919
+ prevFormat[key] = { oldValue: currFormat[key].oldValue, newValue: currValue };
18920
+ }
18921
+ //applyProps[key] = currValue;
18679
18922
  });
18680
18923
  return true;
18681
18924
  }
@@ -20118,7 +20361,8 @@ function calculateDistance(a, b) {
20118
20361
 
20119
20362
  class DocEditor {
20120
20363
  svgContainer;
20121
- //private docContent!: HTMLElement;
20364
+ //设置vue 不允许代理
20365
+ __v_skip = true;
20122
20366
  contentCtx;
20123
20367
  viewOptions;
20124
20368
  docCtx;
@@ -20152,10 +20396,18 @@ class DocEditor {
20152
20396
  onDestroy = new Subject();
20153
20397
  beforeNodePatch = new Subject();
20154
20398
  afterNodePatch = new Subject();
20399
+ //文档内容输入改变的时候,触发此事件(输入、删除文字),可以监听该事件,实现候选词、联想词等功能
20400
+ onTextChanged = new Subject();
20401
+ //联想词处理:文档处理之前
20402
+ onSuggestionsProcess = new Subject();
20155
20403
  //自定义事件传递消息
20156
20404
  eventBus;
20157
20405
  editInput;
20158
20406
  scrollContainer;
20407
+ // //输入候选建议词列表
20408
+ // private suggestions: Array<ISuggestionData> = [];
20409
+ //光标keydown事件
20410
+ onKeyDownEvent = new Subject();
20159
20411
  constructor(svgContainer) {
20160
20412
  this.svgContainer = svgContainer;
20161
20413
  this.createCanvasContext();
@@ -20210,6 +20462,17 @@ class DocEditor {
20210
20462
  });
20211
20463
  this.documentEvent.trackTipsChanged.subscribe(data => {
20212
20464
  });
20465
+ this.documentInput.onKeyDownEvent.subscribe((evt) => {
20466
+ this.onKeyDownEvent.next(evt);
20467
+ if (evt.defaultPrevented) {
20468
+ return;
20469
+ }
20470
+ this.processKeyDownEvent(evt);
20471
+ if (evt.defaultPrevented) {
20472
+ return;
20473
+ }
20474
+ this.docCtx.onKeyDownEvent.next(evt);
20475
+ });
20213
20476
  this.docCtx.docChange = this.documentChange;
20214
20477
  this.docCtx.syncRefresh = () => {
20215
20478
  this.flushToSchedule();
@@ -20226,14 +20489,19 @@ class DocEditor {
20226
20489
  const docPagesFunc = this.getVNode();
20227
20490
  const calendarFunc = this.renderCalendar();
20228
20491
  const menuFunc = this.renderContextmenu();
20492
+ const suggestionFunc = this.renderSuggestions();
20229
20493
  const ruleFunc = new DocRule(this.docCtx);
20230
20494
  const onSizeChange = () => {
20231
20495
  this.adjustPageLayout();
20232
20496
  };
20233
- window.addEventListener('resize', onSizeChange);
20497
+ // window.addEventListener('resize', onSizeChange);
20234
20498
  this.onDestroy.subscribe(() => {
20235
- window.removeEventListener('resize', onSizeChange);
20499
+ ro.unobserve(this.svgContainer);
20500
+ });
20501
+ const ro = new ResizeObserver(entries => {
20502
+ onSizeChange();
20236
20503
  });
20504
+ ro.observe(this.svgContainer);
20237
20505
  return {
20238
20506
  render: () => {
20239
20507
  const docContentVNode = docPagesFunc.render();
@@ -20262,7 +20530,7 @@ class DocEditor {
20262
20530
  'transform': `scale(${this.viewOptions.scale})`
20263
20531
  }
20264
20532
  },
20265
- children: [inputVNode, listVNode.render(), calendarFunc.render(), menuFunc.render()]
20533
+ children: [inputVNode, listVNode.render(), calendarFunc.render(), menuFunc.render(), suggestionFunc.render()]
20266
20534
  };
20267
20535
  return {
20268
20536
  sel: 'div.svg-container',
@@ -20273,8 +20541,14 @@ class DocEditor {
20273
20541
  hook: {
20274
20542
  insert: (vNode) => {
20275
20543
  this.svgContainer = vNode.elm;
20544
+ ro.observe(this.svgContainer);
20276
20545
  this.updateViewOption();
20277
20546
  }
20547
+ },
20548
+ on: {
20549
+ resize: () => {
20550
+ console.log('resize');
20551
+ }
20278
20552
  }
20279
20553
  },
20280
20554
  children: [
@@ -20284,7 +20558,7 @@ class DocEditor {
20284
20558
  style: {
20285
20559
  overflow: 'auto',
20286
20560
  position: 'relative',
20287
- height: this.viewOptions.viewSettings.height + 'px'
20561
+ height: "100%"
20288
20562
  },
20289
20563
  on: {
20290
20564
  scroll: (evt) => {
@@ -20292,6 +20566,9 @@ class DocEditor {
20292
20566
  this.viewOptions.pageOffset.x = target.scrollLeft;
20293
20567
  this.viewOptions.pageOffset.y = target.scrollTop;
20294
20568
  this.onChange();
20569
+ },
20570
+ resize: () => {
20571
+ console.log('resize');
20295
20572
  }
20296
20573
  },
20297
20574
  hook: {
@@ -20410,10 +20687,9 @@ class DocEditor {
20410
20687
  if (this.docCtx.refreshType === null) {
20411
20688
  return;
20412
20689
  }
20413
- let rePaint = this.docCtx.refreshType === 'content';
20414
- if (rePaint) {
20690
+ this.docCtx.currentRefreshType = this.docCtx.refreshType;
20691
+ if (this.docCtx.currentRefreshType) {
20415
20692
  this.onBeforeRefreshDocument.next();
20416
- this.documentSelection.clearSnapshot();
20417
20693
  this.docComment.readComments();
20418
20694
  suppressTracking(() => {
20419
20695
  this.documentPaginator.rePages();
@@ -20433,14 +20709,33 @@ class DocEditor {
20433
20709
  let ssChanged = false;
20434
20710
  try {
20435
20711
  //防止由于选区不正确导致的错误,导致后续的当前任务无法释放
20436
- ssChanged = this.documentSelection.updateSelectionState();
20712
+ this.documentSelection.updateSelectionState();
20713
+ ssChanged = this.documentSelection.isSelectionChanged();
20437
20714
  }
20438
20715
  catch (e) {
20439
20716
  console.error(e);
20440
20717
  }
20441
20718
  this.selectionOverlays.getSelectionTreeData();
20719
+ ssChanged && this.updateInputFont();
20442
20720
  ssChanged && this.selectionChanged.next(this.documentSelection.selectionState);
20443
20721
  ssChanged && this.documentEvent.invokeCursor(this.selectionState.startControl);
20722
+ this.documentSelection.clearSnapshot();
20723
+ this.documentSelection.takeSnapshot();
20724
+ }
20725
+ /**
20726
+ * 根据当前选区,更新待输入文本字体信息
20727
+ * @private
20728
+ */
20729
+ updateInputFont() {
20730
+ const { startControl } = this.selectionState;
20731
+ if (startControl instanceof TextGroupElement) {
20732
+ this.viewOptions.currentFontSize = startControl.props.fontSize;
20733
+ this.viewOptions.currentFontName = startControl.props.fontName;
20734
+ }
20735
+ else {
20736
+ this.viewOptions.currentFontSize = this.viewOptions.defaultFontSize;
20737
+ this.viewOptions.currentFontName = this.viewOptions.defaultFontName;
20738
+ }
20444
20739
  }
20445
20740
  hitInfoChanged(hitInfo) {
20446
20741
  this.documentSelection.setSelectionState(hitInfo);
@@ -20736,6 +21031,9 @@ class DocEditor {
20736
21031
  this.documentChange.insertTable(tb);
20737
21032
  return tb;
20738
21033
  }
21034
+ insertLayoutContainer(ele) {
21035
+ this.documentChange.insertLayoutContainer(ele);
21036
+ }
20739
21037
  /**
20740
21038
  * 插入软换行符
20741
21039
  */
@@ -20920,8 +21218,8 @@ class DocEditor {
20920
21218
  /**
20921
21219
  * 插入批注
20922
21220
  */
20923
- insertComment() {
20924
- this.documentChange.insertComment();
21221
+ insertComment(text) {
21222
+ this.documentChange.insertComment(text);
20925
21223
  }
20926
21224
  /**
20927
21225
  * 清除所有批注
@@ -20986,16 +21284,12 @@ class DocEditor {
20986
21284
  canRedo() {
20987
21285
  return this.historyMange.canRedo;
20988
21286
  }
20989
- switchTrackChanges(eleCtx = null) {
21287
+ /**
21288
+ * 切换文档留痕开关
21289
+ */
21290
+ switchTrackChanges() {
20990
21291
  this.selectionState.clear();
20991
- eleCtx = eleCtx || this.docCtx.document;
20992
- const body = eleCtx.treeFind(item => item instanceof DocumentBodyElement);
20993
- if (body) {
20994
- body.trackChanges = !body.trackChanges;
20995
- }
20996
- else {
20997
- throw new Error('未找到doc-body');
20998
- }
21292
+ this.viewOptions.enableTrackChanges = !this.viewOptions.enableTrackChanges;
20999
21293
  }
21000
21294
  get trackTipsChanged() {
21001
21295
  return this.documentEvent.trackTipsChanged;
@@ -21340,14 +21634,18 @@ class DocEditor {
21340
21634
  if (this.viewOptions.reviewWindowWidth > 0) {
21341
21635
  this.viewOptions.reviewWindowWidth = 0;
21342
21636
  //刷新页面
21343
- this.docCtx.onNextView(() => { this.adjustPageLayout(); });
21637
+ this.docCtx.onNextView(() => {
21638
+ this.adjustPageLayout();
21639
+ });
21344
21640
  }
21345
21641
  }
21346
21642
  else {
21347
21643
  if (this.viewOptions.reviewWindowWidth === 0) {
21348
21644
  this.viewOptions.reviewWindowWidth = 250;
21349
21645
  //刷新页面
21350
- this.docCtx.onNextView(() => { this.adjustPageLayout(); });
21646
+ this.docCtx.onNextView(() => {
21647
+ this.adjustPageLayout();
21648
+ });
21351
21649
  }
21352
21650
  }
21353
21651
  }
@@ -21443,11 +21741,13 @@ class DocEditor {
21443
21741
  //ckbVNode.data.attrs['checked'] = true;
21444
21742
  }
21445
21743
  return {
21446
- sel: 'div', data: { on: {
21744
+ sel: 'div', data: {
21745
+ on: {
21447
21746
  click: () => {
21448
21747
  onChangeHandler(item.code);
21449
21748
  }
21450
- } }, children: [ckbVNode, {
21749
+ }
21750
+ }, children: [ckbVNode, {
21451
21751
  sel: 'label',
21452
21752
  data: {},
21453
21753
  text: item.value
@@ -21455,18 +21755,12 @@ class DocEditor {
21455
21755
  };
21456
21756
  });
21457
21757
  return {
21458
- sel: 'div#data-list-container',
21758
+ sel: 'div.data-list-container',
21459
21759
  data: {
21460
21760
  style: {
21461
21761
  position: 'absolute',
21462
21762
  left: (position.x - 10) + 'px',
21463
21763
  top: position.y + 5 + position.height + 'px',
21464
- 'min-width': '100px',
21465
- 'background-color': 'white',
21466
- 'z-index': '1000',
21467
- 'border-radius': '5px',
21468
- 'box-shadow': '0 0 5px 0 rgba(0,0,0,0.2)',
21469
- 'user-select': 'none',
21470
21764
  },
21471
21765
  hook: {
21472
21766
  insert: (vnode) => {
@@ -21563,6 +21857,44 @@ class DocEditor {
21563
21857
  if (!editor.menusData) {
21564
21858
  return null;
21565
21859
  }
21860
+ const renderMenu = (menus) => {
21861
+ if (!menus) {
21862
+ return [];
21863
+ }
21864
+ return [
21865
+ {
21866
+ sel: 'ul.editor-overlays-menus',
21867
+ data: {},
21868
+ children: menus.map((menu) => renderMenuItem(menu))
21869
+ }
21870
+ ];
21871
+ };
21872
+ const renderSubItems = (menu) => {
21873
+ if (!menu.subItems)
21874
+ return [];
21875
+ return renderMenu(menu.subItems);
21876
+ };
21877
+ const renderMenuItem = (menu) => {
21878
+ return {
21879
+ sel: 'li' + (menu.subItems && menu.subItems.length ? '.sub' : ''),
21880
+ data: {
21881
+ on: {
21882
+ click: () => {
21883
+ menu.click?.();
21884
+ editor.menusData = null;
21885
+ editor.onChange();
21886
+ }
21887
+ }
21888
+ },
21889
+ children: [{
21890
+ sel: 'span',
21891
+ data: {},
21892
+ text: menu.caption
21893
+ },
21894
+ ...renderSubItems(menu)
21895
+ ]
21896
+ };
21897
+ };
21566
21898
  return {
21567
21899
  sel: 'div.editor-contextmenu',
21568
21900
  data: {
@@ -21571,27 +21903,7 @@ class DocEditor {
21571
21903
  top: editor.menusData.position.y + 'px',
21572
21904
  }
21573
21905
  },
21574
- children: [
21575
- {
21576
- sel: 'ul.editor-overlays-menus',
21577
- data: {},
21578
- children: editor.menusData.menus.map((menu) => {
21579
- return {
21580
- sel: 'li',
21581
- data: {
21582
- on: {
21583
- click: (evt) => {
21584
- menu.eventObj["onClick"]();
21585
- editor.menusData = null;
21586
- editor.onChange();
21587
- }
21588
- }
21589
- },
21590
- text: menu.caption
21591
- };
21592
- })
21593
- }
21594
- ]
21906
+ children: renderMenu(editor.menusData.menus)
21595
21907
  };
21596
21908
  }
21597
21909
  };
@@ -21613,7 +21925,7 @@ class DocEditor {
21613
21925
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
21614
21926
  }
21615
21927
  version() {
21616
- return "2.2.2";
21928
+ return "2.2.4";
21617
21929
  }
21618
21930
  switchPageHeaderEditor() {
21619
21931
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
@@ -21696,6 +22008,7 @@ class DocEditor {
21696
22008
  readDocChangeLog() {
21697
22009
  //获取文档的变更日志
21698
22010
  const ops = generatePatch(this.docCtx.document, false);
22011
+ //1.处理批注删除不对称的问题
21699
22012
  for (let i = 0; i < ops.length; i++) {
21700
22013
  const op = ops[i];
21701
22014
  if ('delete' in op.ops) {
@@ -21722,6 +22035,192 @@ class DocEditor {
21722
22035
  }
21723
22036
  }
21724
22037
  }
22038
+ //处理文字输入
22039
+ if (this.viewOptions.enableSuggestions && ops.length && ops.every(op => 'delText' in op.ops || 'insText' in op.ops || ('insert' in op.ops && op.ops.insert.type === 'text'))) {
22040
+ this.processSuggestionsHandle();
22041
+ }
22042
+ else {
22043
+ this.docCtx.suggestions.clear();
22044
+ }
22045
+ }
22046
+ /**
22047
+ * 处理候选词
22048
+ * @private
22049
+ */
22050
+ processSuggestionsHandle() {
22051
+ this.docCtx.suggestions.clear();
22052
+ //this.suggestionSelectIndex.value = -1;
22053
+ const sub = this.selectionChanged.subscribe(() => {
22054
+ this.createAutoCompleteOptions();
22055
+ });
22056
+ sub.once = true;
22057
+ }
22058
+ createAutoCompleteOptions() {
22059
+ if (!this.viewOptions.enableSuggestions || !this.selectionState.editable) {
22060
+ return;
22061
+ }
22062
+ if (this.selectionState.collapsed && this.selectionState.startControl instanceof TextGroupElement) {
22063
+ const { startControl, startOffset } = this.selectionState;
22064
+ const text = startControl.text;
22065
+ //根据标点符号分割文本
22066
+ let findText = text.substring(0, startOffset);
22067
+ //循环当前字符串,根据startOffset向前寻找,直到找到标点符号
22068
+ for (let i = startOffset; i >= 0; i--) {
22069
+ const char = text.charAt(i);
22070
+ if (char.match(/[\s,,。?!;:、]/)) {
22071
+ findText = text.substring(i + 1, startOffset);
22072
+ break;
22073
+ }
22074
+ }
22075
+ //结尾为标点符号
22076
+ if (!findText.length) {
22077
+ return;
22078
+ }
22079
+ const filterSuggestions = this.docCtx.suggestions.suggestionsList.filter(item => item.label.includes(findText));
22080
+ const data = {
22081
+ filterSuggestions,
22082
+ inputTextGroup: startControl,
22083
+ inputOffset: startOffset,
22084
+ findText
22085
+ };
22086
+ this.onSuggestionsProcess.next(data);
22087
+ this.docCtx.suggestions.prepareSuggestions.push(...data.filterSuggestions);
22088
+ this.docCtx.suggestions.currentInputTextGroup = data.inputTextGroup;
22089
+ this.docCtx.suggestions.currentInputOffset = data.inputOffset;
22090
+ this.docCtx.suggestions.currentMatchedText = data.findText;
22091
+ //this.suggestions.push('文本输入1', '文本输入2', '文本输入3');
22092
+ }
22093
+ }
22094
+ processKeyDownEvent(evt) {
22095
+ if (evt.keyCode === 38 || evt.keyCode === 40) {
22096
+ if (this.docCtx.suggestions.prepareSuggestions.length) {
22097
+ this.onSuggestionsKeydown(evt);
22098
+ }
22099
+ }
22100
+ else if (evt.keyCode === 27) {
22101
+ if (this.docCtx.suggestions.prepareSuggestions.length) {
22102
+ evt.preventDefault();
22103
+ this.docCtx.suggestions.clear();
22104
+ this.onPatchVNodeSubject.next();
22105
+ }
22106
+ }
22107
+ else if (evt.keyCode === 13) {
22108
+ if (this.docCtx.suggestions.prepareSuggestions.length) {
22109
+ evt.preventDefault();
22110
+ const suggestions = this.docCtx.suggestions;
22111
+ const suggestion = suggestions.prepareSuggestions[suggestions.selectedIndex];
22112
+ if (suggestion) {
22113
+ this.insertSuggestion(suggestion);
22114
+ suggestions.clear();
22115
+ this.onPatchVNodeSubject.next();
22116
+ }
22117
+ else {
22118
+ suggestions.clear();
22119
+ this.onPatchVNodeSubject.next();
22120
+ }
22121
+ }
22122
+ }
22123
+ }
22124
+ /**
22125
+ * 处理候选词,键盘选择定位
22126
+ * @private
22127
+ */
22128
+ onSuggestionsKeydown(evt) {
22129
+ evt.preventDefault();
22130
+ let index = this.docCtx.suggestions.selectedIndex;
22131
+ if (evt.keyCode === 38) {
22132
+ index--;
22133
+ }
22134
+ else {
22135
+ index++;
22136
+ }
22137
+ if (index < 0) {
22138
+ index = this.docCtx.suggestions.prepareSuggestions.length - 1;
22139
+ }
22140
+ else if (index >= this.docCtx.suggestions.prepareSuggestions.length) {
22141
+ index = 0;
22142
+ }
22143
+ this.docCtx.suggestions.selectedIndex = index;
22144
+ this.onPatchVNodeSubject.next();
22145
+ }
22146
+ /**
22147
+ * 渲染联想、候选词
22148
+ * @private
22149
+ */
22150
+ renderSuggestions() {
22151
+ const editor = this;
22152
+ return {
22153
+ render() {
22154
+ if (!editor.docCtx.suggestions.prepareSuggestions || !editor.viewOptions.enableSuggestions) {
22155
+ editor.docCtx.suggestions.clear();
22156
+ return null;
22157
+ }
22158
+ const cursorPos = editor.selectionState.cursorPos;
22159
+ if (!cursorPos) {
22160
+ return null;
22161
+ }
22162
+ const renderSuggestion = (suggestions) => {
22163
+ if (!suggestions || !suggestions.length) {
22164
+ return [];
22165
+ }
22166
+ return [
22167
+ {
22168
+ sel: 'ul.editor-suggestions',
22169
+ data: {
22170
+ hook: {
22171
+ insert: (vNode) => {
22172
+ const elm = vNode.elm;
22173
+ elm.focus();
22174
+ }
22175
+ },
22176
+ on: {
22177
+ keydown: (evt) => {
22178
+ console.log("ul.editor-suggestions", evt);
22179
+ }
22180
+ }
22181
+ },
22182
+ children: suggestions.map((suggestion, index) => renderSuggestionItem(suggestion, index))
22183
+ }
22184
+ ];
22185
+ };
22186
+ const renderSuggestionItem = (suggestion, index) => {
22187
+ return {
22188
+ sel: 'li' + (index === editor.docCtx.suggestions.selectedIndex ? '.hovered' : ''),
22189
+ data: {
22190
+ on: {
22191
+ click: () => {
22192
+ editor.insertSuggestion(suggestion);
22193
+ }
22194
+ }
22195
+ },
22196
+ children: [{
22197
+ sel: 'span',
22198
+ data: {},
22199
+ text: suggestion.label
22200
+ }]
22201
+ };
22202
+ };
22203
+ return {
22204
+ sel: 'div.editor-suggestions-container',
22205
+ data: {
22206
+ style: {
22207
+ left: cursorPos.x + 'px',
22208
+ top: cursorPos.y + cursorPos.height + 'px',
22209
+ }
22210
+ },
22211
+ children: renderSuggestion(editor.docCtx.suggestions.prepareSuggestions)
22212
+ };
22213
+ }
22214
+ };
22215
+ }
22216
+ insertSuggestion(suggestion) {
22217
+ if (suggestion.action) {
22218
+ suggestion.action(suggestion);
22219
+ }
22220
+ else {
22221
+ const text = suggestion.value ? suggestion.value : suggestion.label;
22222
+ this.documentChange.appendText(text, this.docCtx.suggestions.currentMatchedText);
22223
+ }
21725
22224
  }
21726
22225
  }
21727
22226
 
@@ -26874,7 +27373,7 @@ class DocumentPrintOffscreenBase {
26874
27373
  afterPrint = new Subject();
26875
27374
  constructor() {
26876
27375
  this.viewOptions = new ViewOptions();
26877
- this.viewOptions.copyRightInfo = '万达信息电子病历编辑器,www.wondersgroup.com';
27376
+ this.viewOptions.copyRightInfo = '';
26878
27377
  this.viewOptions.showCharRect = true;
26879
27378
  this.viewOptions.drawCharRectColor = 'green';
26880
27379
  this.viewOptions.showLineRect = true;
@@ -27033,27 +27532,25 @@ function runTextLineRender(ele, data) {
27033
27532
  const deleteCurrentParagraph = (evt) => {
27034
27533
  const { selectionState, ctx: { viewOptions }, currentElement } = evt;
27035
27534
  evt.menus.push({
27036
- icon: 'DeleteTable', caption: '删除段落', eventObj: {
27037
- onClick: (cevt) => {
27038
- selectionState.clear();
27039
- const psymbol = ElementUtil.getLastLeafElement(currentElement);
27040
- const nextFocusableEle = ElementUtil.getRecursionNextSiblingElement(psymbol, false, true, viewOptions);
27041
- const parentContainer = currentElement.parent;
27042
- if (nextFocusableEle) {
27043
- if (nextFocusableEle.parent === parentContainer) {
27044
- selectionState.resetRange(nextFocusableEle, 0);
27045
- }
27046
- else {
27047
- selectionState.resetRange(parentContainer, 0);
27048
- }
27535
+ caption: '删除段落', click: () => {
27536
+ selectionState.clear();
27537
+ const psymbol = ElementUtil.getLastLeafElement(currentElement);
27538
+ const nextFocusableEle = ElementUtil.getRecursionNextSiblingElement(psymbol, false, true, viewOptions);
27539
+ const parentContainer = currentElement.parent;
27540
+ if (nextFocusableEle) {
27541
+ if (nextFocusableEle.parent === parentContainer) {
27542
+ selectionState.resetRange(nextFocusableEle, 0);
27049
27543
  }
27050
27544
  else {
27051
27545
  selectionState.resetRange(parentContainer, 0);
27052
- //selectionState.clear();
27053
27546
  }
27054
- currentElement.remove();
27055
- currentElement.destroy();
27056
27547
  }
27548
+ else {
27549
+ selectionState.resetRange(parentContainer, 0);
27550
+ //selectionState.clear();
27551
+ }
27552
+ currentElement.remove();
27553
+ currentElement.destroy();
27057
27554
  }
27058
27555
  });
27059
27556
  };
@@ -27077,39 +27574,24 @@ const deleteCurrentParagraph = (evt) => {
27077
27574
  // }
27078
27575
  // });
27079
27576
  // };
27080
- const setDataElementProps = (evt) => {
27081
- evt.menus.push({
27082
- icon: 'Settings', caption: '内容控制设置', eventObj: {
27083
- onClick: (e) => {
27084
- console.log('点击了');
27085
- }
27086
- }
27087
- });
27088
- };
27089
27577
  const onTableContextmenu = (evt) => {
27090
27578
  const { selectionState, ctx: { viewOptions }, currentElement } = evt;
27091
27579
  if (TableUtil.canDeleteTable(selectionState)) {
27092
27580
  evt.menus.push({
27093
- icon: 'DeleteTable', caption: '删除表格', eventObj: {
27094
- onClick: (cevt) => {
27095
- selectionState.clear();
27096
- const prevEle = ElementUtil.getRecursionPrevSiblingElement(currentElement, false, true, viewOptions);
27097
- if (prevEle) {
27098
- selectionState.resetRange(prevEle, -1);
27099
- }
27100
- currentElement.remove();
27101
- currentElement.destroy();
27581
+ caption: '删除表格', click: () => {
27582
+ selectionState.clear();
27583
+ const prevEle = ElementUtil.getRecursionPrevSiblingElement(currentElement, false, true, viewOptions);
27584
+ if (prevEle) {
27585
+ selectionState.resetRange(prevEle, -1);
27102
27586
  }
27587
+ currentElement.remove();
27588
+ currentElement.destroy();
27103
27589
  }
27104
27590
  });
27105
27591
  }
27106
27592
  if (TableUtil.canMergeCells(selectionState)) {
27107
27593
  evt.menus.push({
27108
- icon: 'MergeDuplicate', caption: '合并单元格', eventObj: {
27109
- onClick: (cevt) => {
27110
- TableUtil.mergeCells(selectionState);
27111
- }
27112
- }
27594
+ caption: '合并单元格', click: () => { TableUtil.mergeCells(selectionState); }
27113
27595
  });
27114
27596
  }
27115
27597
  if (TableUtil.canSplitCell(selectionState)) {
@@ -27121,27 +27603,19 @@ const onTableContextmenu = (evt) => {
27121
27603
  // }
27122
27604
  // });
27123
27605
  evt.menus.push({
27124
- icon: 'Combine', caption: '合并单元格还原', eventObj: {
27125
- onClick: (cevt) => {
27126
- TableUtil.restoreCell(selectionState);
27127
- }
27128
- }
27606
+ caption: '拆分单元格', click: () => { TableUtil.restoreCell(selectionState); }
27129
27607
  });
27130
27608
  }
27131
27609
  evt.menus.push({
27132
- icon: "Insert", caption: '上方插入段落', eventObj: {
27133
- onClick: (cevt) => {
27134
- currentElement.parent.addChild(ParagraphElement.createElement(), currentElement.getIndex());
27135
- currentElement.refreshView();
27136
- }
27610
+ caption: '上方插入段落', click: () => {
27611
+ currentElement.parent.addChild(ParagraphElement.createElement(), currentElement.getIndex());
27612
+ currentElement.refreshView();
27137
27613
  }
27138
27614
  });
27139
27615
  evt.menus.push({
27140
- icon: "Insert", caption: '下方插入段落', eventObj: {
27141
- onClick: (cevt) => {
27142
- currentElement.parent.addChild(ParagraphElement.createElement(), currentElement.getIndex() + 1);
27143
- currentElement.refreshView();
27144
- }
27616
+ caption: '下方插入段落', click: () => {
27617
+ currentElement.parent.addChild(ParagraphElement.createElement(), currentElement.getIndex() + 1);
27618
+ currentElement.refreshView();
27145
27619
  }
27146
27620
  });
27147
27621
  evt.menus = removeDuplicatesEvent(evt.menus);
@@ -27193,6 +27667,10 @@ exports.ContextMenuElementEvent = ContextMenuElementEvent;
27193
27667
  exports.CopyElementEvent = CopyElementEvent;
27194
27668
  exports.DOMEventSource = DOMEventSource;
27195
27669
  exports.DOMSubscription = DOMSubscription;
27670
+ exports.DataContainerElement = DataContainerElement;
27671
+ exports.DataContainerFactory = DataContainerFactory;
27672
+ exports.DataContainerProps = DataContainerProps;
27673
+ exports.DataContainerRenderObject = DataContainerRenderObject;
27196
27674
  exports.DataDecorateElement = DataDecorateElement;
27197
27675
  exports.DataDecorateProps = DataDecorateProps;
27198
27676
  exports.DataDecorateRenderObject = DataDecorateRenderObject;
@@ -27234,6 +27712,7 @@ exports.DataElementTextRenderObject = DataElementTextRenderObject;
27234
27712
  exports.DataImageRenderObject = DataImageRenderObject;
27235
27713
  exports.DataRenderMH = DataRenderMH;
27236
27714
  exports.DocEditor = DocEditor;
27715
+ exports.DocInputSuggestions = DocInputSuggestions;
27237
27716
  exports.DocumentBodyElement = DocumentBodyElement;
27238
27717
  exports.DocumentBodyFactory = DocumentBodyFactory;
27239
27718
  exports.DocumentBodyPartElement = DocumentBodyPartElement;
@@ -27341,6 +27820,7 @@ exports.SelectionState = SelectionState;
27341
27820
  exports.Subject = Subject;
27342
27821
  exports.SubjectSubscription = SubjectSubscription;
27343
27822
  exports.Subscription = Subscription;
27823
+ exports.TEXT_HEIGHT_FACTOR = TEXT_HEIGHT_FACTOR;
27344
27824
  exports.TabElement = TabElement;
27345
27825
  exports.TabFactory = TabFactory;
27346
27826
  exports.TabRenderObject = TabRenderObject;
@@ -27403,7 +27883,6 @@ exports.renderErrorTip = renderErrorTip;
27403
27883
  exports.renderUnderWavyLine = renderUnderWavyLine;
27404
27884
  exports.runTextLineRender = runTextLineRender;
27405
27885
  exports.setChildrenModifyFlag = setChildrenModifyFlag;
27406
- exports.setDataElementProps = setDataElementProps;
27407
27886
  exports.setNotifyChangedCallback = setNotifyChangedCallback;
27408
27887
  exports.setTraceTrackingFlag = setTraceTrackingFlag;
27409
27888
  exports.suppressTracking = suppressTracking;