@hailin-zheng/editor-core 2.2.0 → 2.2.2

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
@@ -833,28 +833,21 @@ function getDocCtx(ele) {
833
833
  if (!doc) {
834
834
  return null;
835
835
  }
836
- const options = doc['viewOptions'];
837
- if (!options || !options.enableTrackHistory) {
838
- return null;
839
- }
840
- return {
841
- doc,
842
- options: doc['viewOptions']
843
- };
836
+ return doc;
844
837
  }
845
838
  function insertEle(ele) {
846
839
  if (ele.type === 'psym') {
847
840
  return;
848
841
  }
849
- const options = getDocCtx(ele);
850
- if (!options) {
842
+ const docCtx = getDocCtx(ele);
843
+ if (!docCtx) {
851
844
  return;
852
845
  }
853
846
  // const serializeObj = getEleSerializeFunc(ele, options);
854
847
  // if (!serializeObj) {
855
848
  // return;
856
849
  // }
857
- appendToOps(options.doc, ele, {
850
+ appendToOps(docCtx, ele, {
858
851
  //如果当前插入的为单元格,由于新插入的单元格,内部的内容没有补足,导致后续计算索引会出现问题
859
852
  //之前为ele.clone(true);
860
853
  insert: ele
@@ -864,11 +857,11 @@ function removeEle(ele) {
864
857
  if (ele.type === 'psym') {
865
858
  return;
866
859
  }
867
- const options = getDocCtx(ele);
868
- if (!options) {
860
+ const docCtx = getDocCtx(ele);
861
+ if (!docCtx) {
869
862
  return;
870
863
  }
871
- appendToOps(options.doc, ele, {
864
+ appendToOps(docCtx, ele, {
872
865
  delete: ele.clone(true),
873
866
  });
874
867
  }
@@ -891,15 +884,15 @@ function getOpsLog(ele, ops) {
891
884
  };
892
885
  }
893
886
  function inputText(ele, startIndex, input) {
894
- const options = getDocCtx(ele);
895
- if (!options) {
887
+ const docCtx = getDocCtx(ele);
888
+ if (!docCtx) {
896
889
  return;
897
890
  }
898
891
  if (!input) {
899
892
  return;
900
893
  }
901
894
  //处理修复:如果当前的文字刚插入,这时候输入的文字内容已经被序列化到操作日志中了,就不需要生成操作日志
902
- let array = docOpsMap.get(options.doc);
895
+ let array = docOpsMap.get(docCtx);
903
896
  if (array) {
904
897
  const lastLog = array[array.length - 1];
905
898
  if (lastLog && 'insert' in lastLog.ops) {
@@ -908,7 +901,7 @@ function inputText(ele, startIndex, input) {
908
901
  }
909
902
  }
910
903
  }
911
- appendToOps(options.doc, ele, {
904
+ appendToOps(docCtx, ele, {
912
905
  insText: {
913
906
  index: startIndex,
914
907
  length: input.length
@@ -917,14 +910,14 @@ function inputText(ele, startIndex, input) {
917
910
  });
918
911
  }
919
912
  function removeText(ele, index, length, content) {
920
- const options = getDocCtx(ele);
921
- if (!options) {
913
+ const docCtx = getDocCtx(ele);
914
+ if (!docCtx) {
922
915
  return;
923
916
  }
924
917
  if (!length) {
925
918
  return;
926
919
  }
927
- appendToOps(options.doc, ele, {
920
+ appendToOps(docCtx, ele, {
928
921
  delText: {
929
922
  index,
930
923
  length
@@ -939,15 +932,15 @@ function removeText(ele, index, length, content) {
939
932
  * @returns
940
933
  */
941
934
  function formatEle(ele, props) {
942
- const options = getDocCtx(ele);
943
- if (!options) {
935
+ const docCtx = getDocCtx(ele);
936
+ if (!docCtx) {
944
937
  return;
945
938
  }
946
939
  const updateKeys = Object.keys(props);
947
940
  if (!updateKeys.length) {
948
941
  return;
949
942
  }
950
- appendToOps(options.doc, ele, {
943
+ appendToOps(docCtx, ele, {
951
944
  format: getExactDiffProps(ele.props, props)
952
945
  });
953
946
  }
@@ -959,11 +952,11 @@ function formatEle(ele, props) {
959
952
  * @param newValue
960
953
  */
961
954
  function logUpdateEleProps(ele, p, oldValue, newValue) {
962
- const options = getDocCtx(ele);
963
- if (!options) {
955
+ const docCtx = getDocCtx(ele);
956
+ if (!docCtx) {
964
957
  return;
965
958
  }
966
- appendToOps(options.doc, ele, {
959
+ appendToOps(docCtx, ele, {
967
960
  format: {
968
961
  [p]: {
969
962
  oldValue,
@@ -2142,7 +2135,6 @@ class DocumentProps extends INotifyPropertyChanged {
2142
2135
  createUserId;
2143
2136
  createUserName;
2144
2137
  createDate;
2145
- scripts;
2146
2138
  columns = 1;
2147
2139
  version;
2148
2140
  clone(dest) {
@@ -2153,7 +2145,6 @@ class DocumentProps extends INotifyPropertyChanged {
2153
2145
  clone.padding = this.padding.clone();
2154
2146
  clone.headerLine = this.headerLine;
2155
2147
  clone.footerLine = this.footerLine;
2156
- clone.scripts = this.scripts;
2157
2148
  clone.createUserId = this.createUserId;
2158
2149
  clone.createUserName = this.createUserName;
2159
2150
  clone.createDate = this.createDate;
@@ -2173,9 +2164,6 @@ class DocumentProps extends INotifyPropertyChanged {
2173
2164
  createUserName: this.createUserName,
2174
2165
  createUserId: this.createUserId,
2175
2166
  };
2176
- if (this.scripts) {
2177
- props['scripts'] = this.scripts;
2178
- }
2179
2167
  if (this.orient && this.orient !== 'portrait') {
2180
2168
  props['orient'] = this.orient;
2181
2169
  }
@@ -2409,7 +2397,6 @@ class DataEleBaseProps extends INotifyPropertyChanged {
2409
2397
  printable;
2410
2398
  secretBrowse;
2411
2399
  editable = true;
2412
- deleteable;
2413
2400
  minLength;
2414
2401
  underline;
2415
2402
  expression;
@@ -2425,7 +2412,6 @@ class DataEleBaseProps extends INotifyPropertyChanged {
2425
2412
  target.fieldName = source.fieldName;
2426
2413
  target.required = source.required;
2427
2414
  target.editable = source.editable;
2428
- target.deleteable = source.deleteable;
2429
2415
  target.secretBrowse = source.secretBrowse;
2430
2416
  target.printable = source.printable;
2431
2417
  target.minLength = source.minLength;
@@ -2455,9 +2441,6 @@ class DataEleBaseProps extends INotifyPropertyChanged {
2455
2441
  if (!this.editable) {
2456
2442
  props['editable'] = this.editable;
2457
2443
  }
2458
- if (this.deleteable) {
2459
- props["deleteable"] = this.deleteable;
2460
- }
2461
2444
  if (this.minLength) {
2462
2445
  props["minLength"] = this.minLength;
2463
2446
  }
@@ -3681,7 +3664,8 @@ class DocumentRenderObject extends BlockContainerRenderObject {
3681
3664
  width: this.rect.width,
3682
3665
  height: this.rect.height - 1,
3683
3666
  viewBox: `0 0 ${this.rect.width} ${this.rect.height - 1}`,
3684
- overflow: "hidden"
3667
+ overflow: "hidden",
3668
+ "shape-rendering": "optimizeSpeed"
3685
3669
  },
3686
3670
  },
3687
3671
  children: [
@@ -3731,7 +3715,6 @@ class DocumentFactory extends ElementFactory {
3731
3715
  docProps.padding = new PaddingProps(props.padding.top, props.padding.bottom, props.padding.left, props.padding.right);
3732
3716
  docProps.headerLine = props.headerLine ?? 12;
3733
3717
  docProps.footerLine = props.footerLine ?? 12;
3734
- docProps.scripts = props.scripts;
3735
3718
  docProps.createUserId = props.createUserId;
3736
3719
  docProps.createUserName = props.createUserName;
3737
3720
  docProps.createDate = props.createDate;
@@ -3973,6 +3956,7 @@ class DataElementRenderObject extends InlineGroupRenderObject {
3973
3956
  }
3974
3957
  });
3975
3958
  }
3959
+ renderErrorTip(event, this);
3976
3960
  return node;
3977
3961
  }
3978
3962
  }
@@ -4028,6 +4012,11 @@ class DataElementBaseFactory extends ElementFactory {
4028
4012
  }
4029
4013
  }
4030
4014
  }
4015
+ /**
4016
+ * 渲染数据元背景修饰
4017
+ * @param event
4018
+ * @param r
4019
+ */
4031
4020
  function exportDecoratorHTML(event, r) {
4032
4021
  const canPaint = r.element.isMouseenter || r.element.isFocused;
4033
4022
  if (!canPaint) {
@@ -4072,10 +4061,12 @@ function exportDecoratorHTML(event, r) {
4072
4061
  const sharpPoints1 = CommonUtil.resharpPoints(rightPoints);
4073
4062
  const sharpPoints = CommonUtil.resharpPoints([...leftPoints.reverse()]);
4074
4063
  const path = [...sharpPoints, ...sharpPoints1, sharpPoints[0]].map((item, index) => ((index === 0) ? 'M' : "L") + item.x + " " + item.y).join(" ");
4075
- event.highlights.push(ElementUtil.createSvgPath({ d: path,
4064
+ event.highlights.push(ElementUtil.createSvgPath({
4065
+ d: path,
4076
4066
  stroke: color,
4077
4067
  fill: 'none',
4078
- 'stroke-width': 1 }));
4068
+ 'stroke-width': 1
4069
+ }));
4079
4070
  return;
4080
4071
  }
4081
4072
  }
@@ -4090,6 +4081,110 @@ function exportDecoratorHTML(event, r) {
4090
4081
  }
4091
4082
  }
4092
4083
  }
4084
+ /**
4085
+ * 渲染数据源验证错误提示框
4086
+ */
4087
+ function renderErrorTip(event, r) {
4088
+ if (!event.options.enableDataEleInputValidate || event.mode === 'print') {
4089
+ return;
4090
+ }
4091
+ const ele = r.element;
4092
+ //元素调用内部验证
4093
+ ele.onChangedValidate();
4094
+ if (!ele.errorTip) {
4095
+ return;
4096
+ }
4097
+ //渲染底部波浪线
4098
+ renderUnderWavyLine(event, r, 'red');
4099
+ if (ele.paintRenders.indexOf(r) !== 0) {
4100
+ return;
4101
+ }
4102
+ const { x, y } = event.globalPos;
4103
+ const docRender = ElementUtil.getParentRender(r, DocumentRenderObject);
4104
+ const content = ele.errorTip;
4105
+ let left = ele.isFocused ? -10 : 5;
4106
+ //显示在文档的右测
4107
+ left += docRender.rect.x + docRender.rect.width + 20;
4108
+ let sel = 'div.tg-container';
4109
+ if (ele.isFocused) {
4110
+ sel += '.tg-container--selected';
4111
+ }
4112
+ const node = {
4113
+ sel,
4114
+ key: ele.props.id,
4115
+ data: {
4116
+ style: {
4117
+ left: `${left}px`,
4118
+ top: `${y}px`
4119
+ },
4120
+ dataset: {
4121
+ key: ele.key
4122
+ }
4123
+ },
4124
+ children: [{
4125
+ sel: 'div.header',
4126
+ data: {},
4127
+ children: [{
4128
+ sel: 'span.header-user',
4129
+ data: {},
4130
+ text: ele.props.caption,
4131
+ }]
4132
+ }, {
4133
+ sel: 'div.content',
4134
+ data: {},
4135
+ text: content
4136
+ }]
4137
+ };
4138
+ event.addChangeTips(node);
4139
+ const triangleTipX = x + r.rect.width / 2;
4140
+ const tipLineAWidth = docRender.rect.x + docRender.rect.width - triangleTipX;
4141
+ const tipLineA = {
4142
+ sel: 'div.doc-triangle-line',
4143
+ data: {
4144
+ style: {
4145
+ left: `${triangleTipX}px`,
4146
+ top: `${y + r.rect.height}px`,
4147
+ width: tipLineAWidth + 'px'
4148
+ }
4149
+ }
4150
+ };
4151
+ const tipLineB = {
4152
+ sel: 'div.doc-triangle-line',
4153
+ data: {
4154
+ style: {
4155
+ left: `${triangleTipX + tipLineAWidth}px`,
4156
+ top: `${y + r.rect.height}px`,
4157
+ width: 20 + 'px'
4158
+ },
4159
+ dataset: {
4160
+ key: ele.key
4161
+ }
4162
+ }
4163
+ };
4164
+ const triangleTip = {
4165
+ sel: `div.doc-triangle`,
4166
+ data: {
4167
+ style: {
4168
+ left: `${triangleTipX}px`,
4169
+ top: `${y + r.rect.height * 2 / 3}px`
4170
+ }
4171
+ }
4172
+ };
4173
+ event.addChangeTips(triangleTip);
4174
+ event.addChangeTips(tipLineA);
4175
+ event.addChangeTips(tipLineB);
4176
+ }
4177
+ /**
4178
+ * 渲染底部波浪线
4179
+ */
4180
+ function renderUnderWavyLine(event, r, color) {
4181
+ const { x, y } = event.relativePagePos;
4182
+ let d = `M ${x} ${y + r.rect.height - 2} q 1.5,2, `;
4183
+ const width = r.rect.width;
4184
+ d += Array(Math.ceil(width / 3)).fill("3,0").join(' t ');
4185
+ const path = ElementUtil.createSvgPath({ d, fill: 'none', stroke: color });
4186
+ event.highlights.push(path);
4187
+ }
4093
4188
  /**
4094
4189
  * 获取渲染元素相对稳当的位置
4095
4190
  * @param render
@@ -6830,7 +6925,7 @@ class CommentElement extends LeafElement {
6830
6925
  constructor() {
6831
6926
  super('comm');
6832
6927
  //this.isDecorate = true;
6833
- this.disableClick = true;
6928
+ //this.disableClick = true;
6834
6929
  this.props = new CommProps();
6835
6930
  this.color = CommonUtil.randomRgbColor(0.5);
6836
6931
  }
@@ -6860,6 +6955,9 @@ class CommentElement extends LeafElement {
6860
6955
  }
6861
6956
  class CommentRenderObject extends LeafRenderObject {
6862
6957
  exportSVG(event) {
6958
+ if (event.mode === 'print') {
6959
+ return;
6960
+ }
6863
6961
  const renderPos = { ...event.relativePagePos };
6864
6962
  const paraLinePos = ElementUtil.getParaLinePos(this, { x: renderPos.x, y: renderPos.y });
6865
6963
  const color = '#ff4d4f';
@@ -8366,9 +8464,6 @@ class DataElementDate extends DataElementInlineGroup {
8366
8464
  this.onChangedValidate();
8367
8465
  }
8368
8466
  isValid(val, format) {
8369
- if (!format) {
8370
- format = this.props.format ?? 'YYYY-MM-DD';
8371
- }
8372
8467
  const date = moment__default["default"](val, format);
8373
8468
  return date.isValid();
8374
8469
  }
@@ -8383,8 +8478,7 @@ class DataElementDate extends DataElementInlineGroup {
8383
8478
  if (res) {
8384
8479
  return res;
8385
8480
  }
8386
- const format = this.props.format ?? 'YYYY-MM-DD';
8387
- const date = moment__default["default"](this.getValue(), format, true);
8481
+ const date = moment__default["default"](this.getValue(), true);
8388
8482
  if (!date.isValid()) {
8389
8483
  return '日期格式不正确';
8390
8484
  }
@@ -10754,7 +10848,6 @@ class ElementUtil {
10754
10848
  dest.printable = props.printable ?? true;
10755
10849
  dest.required = props.required;
10756
10850
  dest.secretBrowse = props.secretBrowse;
10757
- dest.deleteable = props.deleteable;
10758
10851
  dest.underline = props.underline;
10759
10852
  dest.expression = props.expression;
10760
10853
  dest.hidden = props.hidden;
@@ -12840,54 +12933,6 @@ class PaintContent {
12840
12933
  }
12841
12934
  }
12842
12935
 
12843
- class DocumentEvalFunc {
12844
- docCtx;
12845
- constructor(docCtx) {
12846
- this.docCtx = docCtx;
12847
- }
12848
- scriptsFunc;
12849
- /**
12850
- * 实例化动态脚本
12851
- */
12852
- initScripts(scripts) {
12853
- this.destroyScripts();
12854
- if (scripts) {
12855
- try {
12856
- const func = new Function("docCtx", scripts);
12857
- this.scriptsFunc = func(this.docCtx);
12858
- }
12859
- catch (e) {
12860
- console.error("自定义标本解析错误", e);
12861
- }
12862
- }
12863
- // const func = (docCtx: DocumentContext) => {
12864
- // const sexELe = docCtx.getControlById('NqoYI')
12865
- // const dyEle = docCtx.getControlById('gTuBI');
12866
- // return () => {
12867
- // if (sexELe && dyEle) {
12868
- // const sexValue = sexELe.getValue();
12869
- // const dyValue = sexValue === '1' ? '男的吗' : sexValue === '2' ? '女的吗' : '难道是人妖吗';
12870
- // dyEle.setValue(dyValue);
12871
- // }
12872
- // };
12873
- // };
12874
- }
12875
- /**
12876
- * 销毁动态脚本实例
12877
- */
12878
- destroyScripts() {
12879
- if (this.scriptsFunc) {
12880
- this.scriptsFunc = null;
12881
- }
12882
- }
12883
- /**
12884
- * 触发动态脚本
12885
- */
12886
- invokedScripts() {
12887
- this.scriptsFunc?.();
12888
- }
12889
- }
12890
-
12891
12936
  /**
12892
12937
  * 当前打开的文档的上下文信息,当前文档所有的属性设置都暴露在上下文中
12893
12938
  */
@@ -12898,22 +12943,29 @@ class EditorContext {
12898
12943
  cursorRect;
12899
12944
  _document;
12900
12945
  syncRefresh;
12901
- dynamicFunc;
12902
12946
  docChange;
12903
12947
  clearPrevDocCb;
12904
12948
  //绘制结束之后回调函数
12905
- nextViewFn;
12949
+ nextViewFns = [];
12950
+ //批注元素存在的标志,用于判断文档空间进行布局
12951
+ commentFlag = false;
12952
+ //留痕元素存在的标志,用于判断文档空间进行布局
12953
+ trackFlag = false;
12906
12954
  constructor(selectionState, viewOptions) {
12907
12955
  this.selectionState = selectionState;
12908
12956
  this.viewOptions = viewOptions;
12909
- this.dynamicFunc = new DocumentEvalFunc(this);
12910
12957
  //this.imageLoader = new DocumentImagesLoader();
12911
12958
  this.selectionState.onChangedEvent.subscribe(() => {
12912
12959
  this.syncRefresh?.();
12913
12960
  });
12914
12961
  }
12915
12962
  onNextView(cb) {
12916
- this.nextViewFn = cb;
12963
+ if (!cb) {
12964
+ this.nextViewFns.length = 0;
12965
+ return;
12966
+ }
12967
+ //this.nextViewFn = cb;
12968
+ this.nextViewFns.push(cb);
12917
12969
  }
12918
12970
  get document() {
12919
12971
  return this._document;
@@ -12921,7 +12973,6 @@ class EditorContext {
12921
12973
  set document(value) {
12922
12974
  this.clearPrevDocCb?.();
12923
12975
  this._document = value;
12924
- this.initScripts();
12925
12976
  // this.refSub = this._document.refreshSubject.subscribe((data) => {
12926
12977
  // data = data ?? 'content';
12927
12978
  // this.isDirty = this.isDirty || data === 'content';
@@ -12949,8 +13000,6 @@ class EditorContext {
12949
13000
  }
12950
13001
  clear() {
12951
13002
  this.selectionState.clear();
12952
- //this.imageLoader.clear();
12953
- this.dynamicFunc.destroyScripts();
12954
13003
  this.isDirty = false;
12955
13004
  //this.clearEleDepMaps();
12956
13005
  }
@@ -13002,12 +13051,6 @@ class EditorContext {
13002
13051
  this.document.viewOptions.textRowLineMode = !this.document.viewOptions.textRowLineMode;
13003
13052
  this.syncRefresh();
13004
13053
  }
13005
- /**
13006
- * 实例化动态脚本
13007
- */
13008
- initScripts() {
13009
- this.dynamicFunc.initScripts(this.document.props.scripts);
13010
- }
13011
13054
  /**
13012
13055
  * 替换数据元
13013
13056
  */
@@ -13026,6 +13069,15 @@ class EditorContext {
13026
13069
  }
13027
13070
  return this._document.modifyFlag === exports.ModifyFlag.None ? 'appearance' : 'content';
13028
13071
  }
13072
+ adaptiveScale() {
13073
+ if (this.viewOptions.pageLayoutMode !== 'fit-page') {
13074
+ return this.viewOptions.scale;
13075
+ }
13076
+ const docWidth = this.viewOptions.contentWidth;
13077
+ const viewWidth = this.viewOptions.viewSettings.width;
13078
+ const availableWidth = viewWidth * 0.9;
13079
+ return Math.round(availableWidth * 100 / docWidth) / 100;
13080
+ }
13029
13081
  }
13030
13082
  /**
13031
13083
  * 文档上下文
@@ -14191,9 +14243,7 @@ class DocumentArrange {
14191
14243
  execute: this.execute,
14192
14244
  createParaFn: () => this.createDefaultPara()
14193
14245
  };
14194
- doc.clearMarkItems();
14195
- this.clearPaintCache(doc, data);
14196
- //this.docCtx.viewOptions.showReviewWindow = this.docCtx.document.commentsContainerElement.markPairs.length > 0;
14246
+ this.reset(data);
14197
14247
  const docRenders = this.arrangeDoc();
14198
14248
  this.setMeasureCompletedModifyFlag(doc);
14199
14249
  this.cacheDocRenders(docRenders);
@@ -14201,7 +14251,17 @@ class DocumentArrange {
14201
14251
  return docRenders;
14202
14252
  });
14203
14253
  }
14204
- //commentsRender!: CommsContainerRenderObject;
14254
+ /**
14255
+ * 重置文档测量的相关信息
14256
+ * @param data
14257
+ * @private
14258
+ */
14259
+ reset(data) {
14260
+ this.docCtx.document.clearMarkItems();
14261
+ this.docCtx.trackFlag = false;
14262
+ this.docCtx.commentFlag = false;
14263
+ this.clearPaintCache(data.doc, data);
14264
+ }
14205
14265
  arrangeDoc() {
14206
14266
  const doc = this.docCtx.document;
14207
14267
  const docRender = doc.createRenderObject();
@@ -14745,8 +14805,12 @@ class DocumentArrange {
14745
14805
  }
14746
14806
  identifyComment(ele) {
14747
14807
  if (ele instanceof CommentElement) {
14808
+ this.docCtx.commentFlag = true;
14748
14809
  this.docCtx.document.identifyCommMark(ele);
14749
14810
  }
14811
+ else if (ele instanceof TrackRunElement) {
14812
+ this.docCtx.trackFlag = true;
14813
+ }
14750
14814
  }
14751
14815
  cacheDoc;
14752
14816
  cacheDocRenders(docs) {
@@ -14827,8 +14891,31 @@ class DocumentPaginator {
14827
14891
  this.docContainer.rect.width = this.viewOptions.docPageSettings.width;
14828
14892
  const newMeasure = new DocumentArrange(this.docCtx, this.renderContext, this.seo);
14829
14893
  this.docPages = newMeasure.measureDoc();
14894
+ this.adjustTipLayoutWidth();
14830
14895
  this.layoutPages();
14831
14896
  }
14897
+ /**
14898
+ * 处理计算提示框布局宽度
14899
+ * @private
14900
+ */
14901
+ adjustTipLayoutWidth() {
14902
+ let layoutFlag = false;
14903
+ if (this.docCtx.trackFlag && this.docCtx.viewOptions.showTrackChangesTip || this.docCtx.commentFlag) {
14904
+ layoutFlag = true;
14905
+ }
14906
+ if (layoutFlag) {
14907
+ if (this.viewOptions.reviewWindowWidth === 0) {
14908
+ this.viewOptions.reviewWindowWidth = 250;
14909
+ this.viewOptions.scale = this.docCtx.adaptiveScale();
14910
+ }
14911
+ }
14912
+ else {
14913
+ if (this.viewOptions.reviewWindowWidth > 0) {
14914
+ this.viewOptions.reviewWindowWidth = 0;
14915
+ this.viewOptions.scale = this.docCtx.adaptiveScale();
14916
+ }
14917
+ }
14918
+ }
14832
14919
  /**
14833
14920
  * 文档页面显示布局
14834
14921
  */
@@ -16836,7 +16923,7 @@ class DocumentChange {
16836
16923
  if (res && res.isCancel) {
16837
16924
  return;
16838
16925
  }
16839
- this.docComment.syncUpdateComments();
16926
+ //this.docComment.syncUpdateComments();
16840
16927
  if (collapsed) {
16841
16928
  this.onBackspaceElement(startControl, startOffset);
16842
16929
  }
@@ -18478,6 +18565,7 @@ class ElementTrackManage {
18478
18565
  */
18479
18566
  generateTrack() {
18480
18567
  if (!this.docCtx.viewOptions.enableTrackHistory) {
18568
+ clearTraces(this.docCtx.document);
18481
18569
  return;
18482
18570
  }
18483
18571
  const ops = generatePatch(this.docCtx.document);
@@ -20255,8 +20343,6 @@ class DocEditor {
20255
20343
  trackChangeState = true;
20256
20344
  flushToSchedule() {
20257
20345
  if (this.docCtx.refreshType === 'content') {
20258
- //触发动态脚本
20259
- this.docCtx.dynamicFunc.invokedScripts();
20260
20346
  this.triggerDocChange();
20261
20347
  }
20262
20348
  if (this.flushTask) {
@@ -20267,10 +20353,11 @@ class DocEditor {
20267
20353
  this.readDocChangeLog();
20268
20354
  this.refreshDocument();
20269
20355
  this.flushTask = null;
20270
- let cb = this.docCtx.nextViewFn;
20271
- if (cb) {
20356
+ //回调
20357
+ let cbs = [...this.docCtx.nextViewFns];
20358
+ if (cbs.length) {
20272
20359
  this.docCtx.onNextView(null);
20273
- cb();
20360
+ cbs.forEach(cb => cb());
20274
20361
  return;
20275
20362
  }
20276
20363
  this.historyMange.generateTrack();
@@ -20431,7 +20518,7 @@ class DocEditor {
20431
20518
  this.editInput.style.left = position.x + 'px';
20432
20519
  this.editInput.style.top = position.y + 'px';
20433
20520
  this.editInput.style.height = position.height + 'px';
20434
- this.editInput.style.width = "2px";
20521
+ this.editInput.style.width = "1.6px";
20435
20522
  this.editInput.readOnly = false;
20436
20523
  this.setCursorVisibility(true);
20437
20524
  //判断光标位置是否被可见,如果不可见,需要将其设置到可见区域
@@ -20614,14 +20701,7 @@ class DocEditor {
20614
20701
  * @private
20615
20702
  */
20616
20703
  adaptiveScale() {
20617
- if (this.viewOptions.pageLayoutMode !== 'fit-page') {
20618
- return;
20619
- }
20620
- const docWidth = this.docCtx.viewOptions.docPageSettings.width;
20621
- const viewWidth = this.docCtx.viewOptions.viewSettings.width;
20622
- const availableWidth = viewWidth * 0.9;
20623
- const scale = Math.round(availableWidth * 100 / docWidth) / 100;
20624
- this.viewOptions.scale = scale;
20704
+ this.viewOptions.scale = this.docCtx.adaptiveScale();
20625
20705
  }
20626
20706
  /**
20627
20707
  * 缩放视图
@@ -21220,12 +21300,20 @@ class DocEditor {
21220
21300
  },
21221
21301
  children: []
21222
21302
  };
21303
+ const scaleFitContainer = {
21304
+ sel: 'div#scale-fit-container',
21305
+ data: {
21306
+ style: { overflow: 'hidden', height: '0px', }
21307
+ },
21308
+ children: [docContent]
21309
+ };
21223
21310
  if (!this.documentPaginator?.docContainer) {
21224
- return docContent;
21311
+ return scaleFitContainer;
21225
21312
  }
21226
21313
  const tipsContainer = this.createChangeTipContainer();
21227
21314
  this.tipContainer = tipsContainer;
21228
21315
  docContent.data.style.height = this.documentPaginator.getDocumentContainerHeight().height + 'px';
21316
+ scaleFitContainer.data.style['height'] = this.documentPaginator.getDocumentContainerHeight().height * this.viewOptions.scale + 'px';
21229
21317
  const docRenders = this.documentPaginator.docContainer.getItems();
21230
21318
  const svgGenerator = new DocumentSvg(this.viewOptions, this.selectionOverlays, this.renderContext);
21231
21319
  const vNode = svgGenerator.getHTMLVNode(docRenders);
@@ -21233,12 +21321,12 @@ class DocEditor {
21233
21321
  children.push(tipsContainer);
21234
21322
  children.push(...vNode);
21235
21323
  tipsContainer.children?.push(...svgGenerator.changeTips);
21236
- this.updateTipLayoutWidth();
21324
+ //this.updateTipLayoutWidth();
21237
21325
  const sub = this.afterNodePatch.subscribe(() => {
21238
21326
  this.updateTipLayoutAfterPatch();
21239
21327
  sub.unsubscribe();
21240
21328
  });
21241
- return docContent;
21329
+ return scaleFitContainer;
21242
21330
  }
21243
21331
  };
21244
21332
  }
@@ -21252,14 +21340,14 @@ class DocEditor {
21252
21340
  if (this.viewOptions.reviewWindowWidth > 0) {
21253
21341
  this.viewOptions.reviewWindowWidth = 0;
21254
21342
  //刷新页面
21255
- this.adjustPageLayout();
21343
+ this.docCtx.onNextView(() => { this.adjustPageLayout(); });
21256
21344
  }
21257
21345
  }
21258
21346
  else {
21259
21347
  if (this.viewOptions.reviewWindowWidth === 0) {
21260
21348
  this.viewOptions.reviewWindowWidth = 250;
21261
21349
  //刷新页面
21262
- this.adjustPageLayout();
21350
+ this.docCtx.onNextView(() => { this.adjustPageLayout(); });
21263
21351
  }
21264
21352
  }
21265
21353
  }
@@ -21347,30 +21435,21 @@ class DocEditor {
21347
21435
  };
21348
21436
  const itemsVNode = options.map(item => {
21349
21437
  const ckbVNode = {
21350
- sel: multiSelect ? 'input.magic-checkbox' : 'input.magic-radio',
21351
- data: {
21352
- attrs: {
21353
- type: 'checkbox',
21354
- name: 'data-list',
21355
- }
21356
- }
21438
+ sel: multiSelect ? 'div.editor-list-checkbox' : 'div.editor-list-radiobox',
21439
+ data: {}
21357
21440
  };
21358
21441
  if (item.checked) {
21359
- ckbVNode.data.attrs['checked'] = true;
21442
+ ckbVNode.sel += '.checked';
21443
+ //ckbVNode.data.attrs['checked'] = true;
21360
21444
  }
21361
21445
  return {
21362
- sel: 'div', data: {}, children: [ckbVNode, {
21446
+ sel: 'div', data: { on: {
21447
+ click: () => {
21448
+ onChangeHandler(item.code);
21449
+ }
21450
+ } }, children: [ckbVNode, {
21363
21451
  sel: 'label',
21364
- data: {
21365
- attrs: {
21366
- //for:"data-list-"+item.code,
21367
- },
21368
- on: {
21369
- click: (evt) => {
21370
- onChangeHandler(item.code);
21371
- }
21372
- }
21373
- },
21452
+ data: {},
21374
21453
  text: item.value
21375
21454
  }]
21376
21455
  };
@@ -21534,7 +21613,7 @@ class DocEditor {
21534
21613
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
21535
21614
  }
21536
21615
  version() {
21537
- return "2.2.0";
21616
+ return "2.2.2";
21538
21617
  }
21539
21618
  switchPageHeaderEditor() {
21540
21619
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
@@ -21684,6 +21763,54 @@ class DocumentCombine {
21684
21763
  }
21685
21764
  }
21686
21765
 
21766
+ class DocumentEvalFunc {
21767
+ docCtx;
21768
+ constructor(docCtx) {
21769
+ this.docCtx = docCtx;
21770
+ }
21771
+ scriptsFunc;
21772
+ /**
21773
+ * 实例化动态脚本
21774
+ */
21775
+ initScripts(scripts) {
21776
+ this.destroyScripts();
21777
+ if (scripts) {
21778
+ try {
21779
+ const func = new Function("docCtx", scripts);
21780
+ this.scriptsFunc = func(this.docCtx);
21781
+ }
21782
+ catch (e) {
21783
+ console.error("自定义标本解析错误", e);
21784
+ }
21785
+ }
21786
+ // const func = (docCtx: DocumentContext) => {
21787
+ // const sexELe = docCtx.getControlById('NqoYI')
21788
+ // const dyEle = docCtx.getControlById('gTuBI');
21789
+ // return () => {
21790
+ // if (sexELe && dyEle) {
21791
+ // const sexValue = sexELe.getValue();
21792
+ // const dyValue = sexValue === '1' ? '男的吗' : sexValue === '2' ? '女的吗' : '难道是人妖吗';
21793
+ // dyEle.setValue(dyValue);
21794
+ // }
21795
+ // };
21796
+ // };
21797
+ }
21798
+ /**
21799
+ * 销毁动态脚本实例
21800
+ */
21801
+ destroyScripts() {
21802
+ if (this.scriptsFunc) {
21803
+ this.scriptsFunc = null;
21804
+ }
21805
+ }
21806
+ /**
21807
+ * 触发动态脚本
21808
+ */
21809
+ invokedScripts() {
21810
+ this.scriptsFunc?.();
21811
+ }
21812
+ }
21813
+
21687
21814
  function createPrintTemplate({ width, height, orient }) {
21688
21815
  return `
21689
21816
  <!DOCTYPE html>
@@ -27272,6 +27399,8 @@ exports.parser = parser;
27272
27399
  exports.reactiveMap = reactiveMap;
27273
27400
  exports.removeEle = removeEle;
27274
27401
  exports.removeText = removeText;
27402
+ exports.renderErrorTip = renderErrorTip;
27403
+ exports.renderUnderWavyLine = renderUnderWavyLine;
27275
27404
  exports.runTextLineRender = runTextLineRender;
27276
27405
  exports.setChildrenModifyFlag = setChildrenModifyFlag;
27277
27406
  exports.setDataElementProps = setDataElementProps;