@hailin-zheng/editor-core 2.2.0 → 2.2.1

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/editor.css CHANGED
@@ -219,6 +219,7 @@
219
219
  background: #fff;
220
220
  cursor: default;
221
221
  user-select: none;
222
+ font-size: 12px;
222
223
  }
223
224
 
224
225
  .editor-calendar-header {
@@ -522,7 +523,7 @@
522
523
  }
523
524
  .editor-input-cursor{
524
525
  position: absolute;
525
- width: 2px;
526
+ width: 1.6px;
526
527
  padding: 0;
527
528
  border: none;
528
529
  outline: none;
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,
@@ -2409,7 +2402,6 @@ class DataEleBaseProps extends INotifyPropertyChanged {
2409
2402
  printable;
2410
2403
  secretBrowse;
2411
2404
  editable = true;
2412
- deleteable;
2413
2405
  minLength;
2414
2406
  underline;
2415
2407
  expression;
@@ -2425,7 +2417,6 @@ class DataEleBaseProps extends INotifyPropertyChanged {
2425
2417
  target.fieldName = source.fieldName;
2426
2418
  target.required = source.required;
2427
2419
  target.editable = source.editable;
2428
- target.deleteable = source.deleteable;
2429
2420
  target.secretBrowse = source.secretBrowse;
2430
2421
  target.printable = source.printable;
2431
2422
  target.minLength = source.minLength;
@@ -2455,9 +2446,6 @@ class DataEleBaseProps extends INotifyPropertyChanged {
2455
2446
  if (!this.editable) {
2456
2447
  props['editable'] = this.editable;
2457
2448
  }
2458
- if (this.deleteable) {
2459
- props["deleteable"] = this.deleteable;
2460
- }
2461
2449
  if (this.minLength) {
2462
2450
  props["minLength"] = this.minLength;
2463
2451
  }
@@ -3681,7 +3669,8 @@ class DocumentRenderObject extends BlockContainerRenderObject {
3681
3669
  width: this.rect.width,
3682
3670
  height: this.rect.height - 1,
3683
3671
  viewBox: `0 0 ${this.rect.width} ${this.rect.height - 1}`,
3684
- overflow: "hidden"
3672
+ overflow: "hidden",
3673
+ "shape-rendering": "optimizeSpeed"
3685
3674
  },
3686
3675
  },
3687
3676
  children: [
@@ -3973,6 +3962,7 @@ class DataElementRenderObject extends InlineGroupRenderObject {
3973
3962
  }
3974
3963
  });
3975
3964
  }
3965
+ renderErrorTip(event, this);
3976
3966
  return node;
3977
3967
  }
3978
3968
  }
@@ -4028,6 +4018,11 @@ class DataElementBaseFactory extends ElementFactory {
4028
4018
  }
4029
4019
  }
4030
4020
  }
4021
+ /**
4022
+ * 渲染数据元背景修饰
4023
+ * @param event
4024
+ * @param r
4025
+ */
4031
4026
  function exportDecoratorHTML(event, r) {
4032
4027
  const canPaint = r.element.isMouseenter || r.element.isFocused;
4033
4028
  if (!canPaint) {
@@ -4072,10 +4067,12 @@ function exportDecoratorHTML(event, r) {
4072
4067
  const sharpPoints1 = CommonUtil.resharpPoints(rightPoints);
4073
4068
  const sharpPoints = CommonUtil.resharpPoints([...leftPoints.reverse()]);
4074
4069
  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,
4070
+ event.highlights.push(ElementUtil.createSvgPath({
4071
+ d: path,
4076
4072
  stroke: color,
4077
4073
  fill: 'none',
4078
- 'stroke-width': 1 }));
4074
+ 'stroke-width': 1
4075
+ }));
4079
4076
  return;
4080
4077
  }
4081
4078
  }
@@ -4090,6 +4087,110 @@ function exportDecoratorHTML(event, r) {
4090
4087
  }
4091
4088
  }
4092
4089
  }
4090
+ /**
4091
+ * 渲染数据源验证错误提示框
4092
+ */
4093
+ function renderErrorTip(event, r) {
4094
+ if (!event.options.enableDataEleInputValidate || event.mode === 'print') {
4095
+ return;
4096
+ }
4097
+ const ele = r.element;
4098
+ //元素调用内部验证
4099
+ ele.onChangedValidate();
4100
+ if (!ele.errorTip) {
4101
+ return;
4102
+ }
4103
+ //渲染底部波浪线
4104
+ renderUnderWavyLine(event, r, 'red');
4105
+ if (ele.paintRenders.indexOf(r) !== 0) {
4106
+ return;
4107
+ }
4108
+ const { x, y } = event.globalPos;
4109
+ const docRender = ElementUtil.getParentRender(r, DocumentRenderObject);
4110
+ const content = ele.errorTip;
4111
+ let left = ele.isFocused ? -10 : 5;
4112
+ //显示在文档的右测
4113
+ left += docRender.rect.x + docRender.rect.width + 20;
4114
+ let sel = 'div.tg-container';
4115
+ if (ele.isFocused) {
4116
+ sel += '.tg-container--selected';
4117
+ }
4118
+ const node = {
4119
+ sel,
4120
+ key: ele.props.id,
4121
+ data: {
4122
+ style: {
4123
+ left: `${left}px`,
4124
+ top: `${y}px`
4125
+ },
4126
+ dataset: {
4127
+ key: ele.key
4128
+ }
4129
+ },
4130
+ children: [{
4131
+ sel: 'div.header',
4132
+ data: {},
4133
+ children: [{
4134
+ sel: 'span.header-user',
4135
+ data: {},
4136
+ text: ele.props.caption,
4137
+ }]
4138
+ }, {
4139
+ sel: 'div.content',
4140
+ data: {},
4141
+ text: content
4142
+ }]
4143
+ };
4144
+ event.addChangeTips(node);
4145
+ const triangleTipX = x + r.rect.width / 2;
4146
+ const tipLineAWidth = docRender.rect.x + docRender.rect.width - triangleTipX;
4147
+ const tipLineA = {
4148
+ sel: 'div.doc-triangle-line',
4149
+ data: {
4150
+ style: {
4151
+ left: `${triangleTipX}px`,
4152
+ top: `${y + r.rect.height}px`,
4153
+ width: tipLineAWidth + 'px'
4154
+ }
4155
+ }
4156
+ };
4157
+ const tipLineB = {
4158
+ sel: 'div.doc-triangle-line',
4159
+ data: {
4160
+ style: {
4161
+ left: `${triangleTipX + tipLineAWidth}px`,
4162
+ top: `${y + r.rect.height}px`,
4163
+ width: 20 + 'px'
4164
+ },
4165
+ dataset: {
4166
+ key: ele.key
4167
+ }
4168
+ }
4169
+ };
4170
+ const triangleTip = {
4171
+ sel: `div.doc-triangle`,
4172
+ data: {
4173
+ style: {
4174
+ left: `${triangleTipX}px`,
4175
+ top: `${y + r.rect.height * 2 / 3}px`
4176
+ }
4177
+ }
4178
+ };
4179
+ event.addChangeTips(triangleTip);
4180
+ event.addChangeTips(tipLineA);
4181
+ event.addChangeTips(tipLineB);
4182
+ }
4183
+ /**
4184
+ * 渲染底部波浪线
4185
+ */
4186
+ function renderUnderWavyLine(event, r, color) {
4187
+ const { x, y } = event.relativePagePos;
4188
+ let d = `M ${x} ${y + r.rect.height - 2} q 1.5,2, `;
4189
+ const width = r.rect.width;
4190
+ d += Array(Math.ceil(width / 3)).fill("3,0").join(' t ');
4191
+ const path = ElementUtil.createSvgPath({ d, fill: 'none', stroke: color });
4192
+ event.highlights.push(path);
4193
+ }
4093
4194
  /**
4094
4195
  * 获取渲染元素相对稳当的位置
4095
4196
  * @param render
@@ -6860,6 +6961,9 @@ class CommentElement extends LeafElement {
6860
6961
  }
6861
6962
  class CommentRenderObject extends LeafRenderObject {
6862
6963
  exportSVG(event) {
6964
+ if (event.mode === 'print') {
6965
+ return;
6966
+ }
6863
6967
  const renderPos = { ...event.relativePagePos };
6864
6968
  const paraLinePos = ElementUtil.getParaLinePos(this, { x: renderPos.x, y: renderPos.y });
6865
6969
  const color = '#ff4d4f';
@@ -8366,9 +8470,6 @@ class DataElementDate extends DataElementInlineGroup {
8366
8470
  this.onChangedValidate();
8367
8471
  }
8368
8472
  isValid(val, format) {
8369
- if (!format) {
8370
- format = this.props.format ?? 'YYYY-MM-DD';
8371
- }
8372
8473
  const date = moment__default["default"](val, format);
8373
8474
  return date.isValid();
8374
8475
  }
@@ -8383,8 +8484,7 @@ class DataElementDate extends DataElementInlineGroup {
8383
8484
  if (res) {
8384
8485
  return res;
8385
8486
  }
8386
- const format = this.props.format ?? 'YYYY-MM-DD';
8387
- const date = moment__default["default"](this.getValue(), format, true);
8487
+ const date = moment__default["default"](this.getValue(), true);
8388
8488
  if (!date.isValid()) {
8389
8489
  return '日期格式不正确';
8390
8490
  }
@@ -10754,7 +10854,6 @@ class ElementUtil {
10754
10854
  dest.printable = props.printable ?? true;
10755
10855
  dest.required = props.required;
10756
10856
  dest.secretBrowse = props.secretBrowse;
10757
- dest.deleteable = props.deleteable;
10758
10857
  dest.underline = props.underline;
10759
10858
  dest.expression = props.expression;
10760
10859
  dest.hidden = props.hidden;
@@ -12902,7 +13001,8 @@ class EditorContext {
12902
13001
  docChange;
12903
13002
  clearPrevDocCb;
12904
13003
  //绘制结束之后回调函数
12905
- nextViewFn;
13004
+ //nextViewFn!: (() => void) | null;
13005
+ nextViewFns = [];
12906
13006
  constructor(selectionState, viewOptions) {
12907
13007
  this.selectionState = selectionState;
12908
13008
  this.viewOptions = viewOptions;
@@ -12913,7 +13013,12 @@ class EditorContext {
12913
13013
  });
12914
13014
  }
12915
13015
  onNextView(cb) {
12916
- this.nextViewFn = cb;
13016
+ if (!cb) {
13017
+ this.nextViewFns.length = 0;
13018
+ return;
13019
+ }
13020
+ //this.nextViewFn = cb;
13021
+ this.nextViewFns.push(cb);
12917
13022
  }
12918
13023
  get document() {
12919
13024
  return this._document;
@@ -18478,6 +18583,7 @@ class ElementTrackManage {
18478
18583
  */
18479
18584
  generateTrack() {
18480
18585
  if (!this.docCtx.viewOptions.enableTrackHistory) {
18586
+ clearTraces(this.docCtx.document);
18481
18587
  return;
18482
18588
  }
18483
18589
  const ops = generatePatch(this.docCtx.document);
@@ -20267,10 +20373,11 @@ class DocEditor {
20267
20373
  this.readDocChangeLog();
20268
20374
  this.refreshDocument();
20269
20375
  this.flushTask = null;
20270
- let cb = this.docCtx.nextViewFn;
20271
- if (cb) {
20376
+ //回调
20377
+ let cbs = [...this.docCtx.nextViewFns];
20378
+ if (cbs.length) {
20272
20379
  this.docCtx.onNextView(null);
20273
- cb();
20380
+ cbs.forEach(cb => cb());
20274
20381
  return;
20275
20382
  }
20276
20383
  this.historyMange.generateTrack();
@@ -20431,7 +20538,7 @@ class DocEditor {
20431
20538
  this.editInput.style.left = position.x + 'px';
20432
20539
  this.editInput.style.top = position.y + 'px';
20433
20540
  this.editInput.style.height = position.height + 'px';
20434
- this.editInput.style.width = "2px";
20541
+ this.editInput.style.width = "1.6px";
20435
20542
  this.editInput.readOnly = false;
20436
20543
  this.setCursorVisibility(true);
20437
20544
  //判断光标位置是否被可见,如果不可见,需要将其设置到可见区域
@@ -21252,14 +21359,14 @@ class DocEditor {
21252
21359
  if (this.viewOptions.reviewWindowWidth > 0) {
21253
21360
  this.viewOptions.reviewWindowWidth = 0;
21254
21361
  //刷新页面
21255
- this.adjustPageLayout();
21362
+ this.docCtx.onNextView(() => { this.adjustPageLayout(); });
21256
21363
  }
21257
21364
  }
21258
21365
  else {
21259
21366
  if (this.viewOptions.reviewWindowWidth === 0) {
21260
21367
  this.viewOptions.reviewWindowWidth = 250;
21261
21368
  //刷新页面
21262
- this.adjustPageLayout();
21369
+ this.docCtx.onNextView(() => { this.adjustPageLayout(); });
21263
21370
  }
21264
21371
  }
21265
21372
  }
@@ -21534,7 +21641,7 @@ class DocEditor {
21534
21641
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
21535
21642
  }
21536
21643
  version() {
21537
- return "2.2.0";
21644
+ return "2.2.1";
21538
21645
  }
21539
21646
  switchPageHeaderEditor() {
21540
21647
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
@@ -27272,6 +27379,8 @@ exports.parser = parser;
27272
27379
  exports.reactiveMap = reactiveMap;
27273
27380
  exports.removeEle = removeEle;
27274
27381
  exports.removeText = removeText;
27382
+ exports.renderErrorTip = renderErrorTip;
27383
+ exports.renderUnderWavyLine = renderUnderWavyLine;
27275
27384
  exports.runTextLineRender = runTextLineRender;
27276
27385
  exports.setChildrenModifyFlag = setChildrenModifyFlag;
27277
27386
  exports.setDataElementProps = setDataElementProps;