@hailin-zheng/editor-core 2.2.8 → 2.2.10

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
@@ -9,6 +9,9 @@
9
9
  .svg-container * {
10
10
  white-space: pre;
11
11
  }
12
+ .svg-container svg{
13
+ pointer-events: none;
14
+ }
12
15
 
13
16
  .drop-container {
14
17
  position: absolute;
package/index-cjs.js CHANGED
@@ -1537,12 +1537,19 @@ class BranchElement extends Element {
1537
1537
  }
1538
1538
  return len;
1539
1539
  }
1540
- treeFilter(predicate) {
1540
+ treeFilter(predicate, options) {
1541
+ if (!options) {
1542
+ options = { includeChildren: true };
1543
+ }
1541
1544
  const items = [];
1542
1545
  for (let i = 0; i < this.length; i++) {
1543
1546
  const item = this.getChild(i);
1544
1547
  if (predicate(item)) {
1545
1548
  items.push(item);
1549
+ //已经匹配节点,不需要匹配当前元素的子节点
1550
+ if (!options.includeChildren) {
1551
+ continue;
1552
+ }
1546
1553
  }
1547
1554
  if (item instanceof BranchElement) {
1548
1555
  items.push(...item.treeFilter(predicate));
@@ -2870,15 +2877,7 @@ class ValidateProps {
2870
2877
  return clone;
2871
2878
  }
2872
2879
  }
2873
- class DataElementGroupProps extends DataEleBaseProps {
2874
- clone(dest) {
2875
- const clone = dest ?? new DataElementGroupProps();
2876
- super.cloneBaseProps(clone);
2877
- }
2878
- getSerializeProps(options) {
2879
- const props = {};
2880
- return this.getBaseProps(props, options);
2881
- }
2880
+ class DataElementGroupProps extends DataEleBaseTextProps {
2882
2881
  }
2883
2882
  class DataElementBarcodeProps {
2884
2883
  type = 'code128';
@@ -8647,6 +8646,61 @@ class DataElementDateFactory extends DataElementBaseFactory {
8647
8646
  }
8648
8647
  }
8649
8648
 
8649
+ class BreakElement extends LeafElement {
8650
+ textProps;
8651
+ constructor() {
8652
+ super('br');
8653
+ this.textProps = new TextProps();
8654
+ this.textProps.fontSize = 14;
8655
+ this.textProps.fontName = '宋体';
8656
+ this.textProps.color = '#595959';
8657
+ }
8658
+ createRenderObject() {
8659
+ const symbol = new BreakRenderObject(this);
8660
+ symbol.rect.height = 14;
8661
+ symbol.rect.width = 7;
8662
+ return symbol;
8663
+ }
8664
+ serialize() {
8665
+ return {
8666
+ type: 'br',
8667
+ props: {}
8668
+ };
8669
+ }
8670
+ clone() {
8671
+ const clone = new BreakElement();
8672
+ cloneElementBase(this, clone);
8673
+ return clone;
8674
+ }
8675
+ }
8676
+ class BreakRenderObject extends LeafRenderObject {
8677
+ exportSVG(event) {
8678
+ if (!event.options.showEnterSymbol || event.mode === 'print') {
8679
+ return null;
8680
+ }
8681
+ return ElementUtil.createSvgText('↓', { 'dominant-baseline': 'hanging',
8682
+ 'font-family': 'Courier',
8683
+ 'font-size': this.rect.height,
8684
+ x: this.rect.x + 4,
8685
+ y: this.rect.y,
8686
+ fill: 'green' });
8687
+ }
8688
+ clone() {
8689
+ const render = new BreakRenderObject(this.element);
8690
+ render.rect = ElementUtil.cloneRect(this.rect);
8691
+ return render;
8692
+ }
8693
+ }
8694
+ class BreakFactory extends ElementFactory {
8695
+ match(type) {
8696
+ return type === 'br';
8697
+ }
8698
+ createElement(data) {
8699
+ const ele = new BreakElement();
8700
+ return ele;
8701
+ }
8702
+ }
8703
+
8650
8704
  class DataElementGroupElement extends InlineGroupInputElement {
8651
8705
  constructor() {
8652
8706
  super('data-group');
@@ -8660,6 +8714,37 @@ class DataElementGroupElement extends InlineGroupInputElement {
8660
8714
  this.refreshView();
8661
8715
  });
8662
8716
  }
8717
+ setValue(val) {
8718
+ if (val === null || val === undefined) {
8719
+ val = '';
8720
+ }
8721
+ if (this.getValue() === val) {
8722
+ return;
8723
+ }
8724
+ this.pubOnChange('self');
8725
+ this.clearInnerItems();
8726
+ if (typeof val !== 'string') {
8727
+ val += '';
8728
+ }
8729
+ if (val) {
8730
+ const items = val.split('<br/>');
8731
+ if (items.length) {
8732
+ items.forEach((item, index) => {
8733
+ const valueText = new TextGroupElement();
8734
+ this.props.valueTextProps.clone(valueText.props);
8735
+ valueText.text = item + '';
8736
+ this.addChild(valueText, this.length - 1);
8737
+ if (index < items.length - 1) {
8738
+ const brElement = new BreakElement();
8739
+ this.addChild(brElement, this.length - 1);
8740
+ }
8741
+ });
8742
+ }
8743
+ }
8744
+ }
8745
+ getValue() {
8746
+ return ElementSerialize.serializeString(this, { all: false });
8747
+ }
8663
8748
  clone(data) {
8664
8749
  return super.cloneSelf(data, DataElementGroupElement);
8665
8750
  }
@@ -8695,9 +8780,33 @@ class DataElementGroupFactory extends DataElementBaseFactory {
8695
8780
  createElement(data) {
8696
8781
  const props = data.props;
8697
8782
  const ele = new DataElementGroupElement();
8698
- ElementUtil.readEleBaseProps(ele.props, props);
8783
+ this.createDataEleProps(ele.props, props);
8699
8784
  return ele;
8700
8785
  }
8786
+ createDataEleProps(dest, props) {
8787
+ const dataEleProps = dest;
8788
+ ElementUtil.readEleBaseProps(dataEleProps, props);
8789
+ dataEleProps.nullText = props.nullText;
8790
+ dataEleProps.nullTextProps = ElementUtil.readTextProps(null, props.nullTextProps, this.options);
8791
+ dataEleProps.valueTextProps = ElementUtil.readTextProps(null, props.valueTextProps, this.options);
8792
+ dataEleProps.dataType = props.dataType;
8793
+ return dataEleProps;
8794
+ }
8795
+ }
8796
+ /**
8797
+ * 是否在数据组内部
8798
+ * @param control
8799
+ * @param offset
8800
+ */
8801
+ function IsInSideDataGroup(control, offset) {
8802
+ const mathEle = ElementUtil.getParent(control, (item) => item instanceof DataElementGroupElement);
8803
+ if (mathEle) {
8804
+ if ((control === mathEle.startDecorate && offset === 0) || (control === mathEle.endDecorate && offset === 1)) {
8805
+ return false;
8806
+ }
8807
+ return true;
8808
+ }
8809
+ return false;
8701
8810
  }
8702
8811
 
8703
8812
  class DataElementImage extends DataElementLeaf {
@@ -8939,61 +9048,6 @@ class DataElementListFactory extends DataElementBaseFactory {
8939
9048
  }
8940
9049
  }
8941
9050
 
8942
- class BreakElement extends LeafElement {
8943
- textProps;
8944
- constructor() {
8945
- super('br');
8946
- this.textProps = new TextProps();
8947
- this.textProps.fontSize = 14;
8948
- this.textProps.fontName = '宋体';
8949
- this.textProps.color = '#595959';
8950
- }
8951
- createRenderObject() {
8952
- const symbol = new BreakRenderObject(this);
8953
- symbol.rect.height = 14;
8954
- symbol.rect.width = 7;
8955
- return symbol;
8956
- }
8957
- serialize() {
8958
- return {
8959
- type: 'br',
8960
- props: {}
8961
- };
8962
- }
8963
- clone() {
8964
- const clone = new BreakElement();
8965
- cloneElementBase(this, clone);
8966
- return clone;
8967
- }
8968
- }
8969
- class BreakRenderObject extends LeafRenderObject {
8970
- exportSVG(event) {
8971
- if (!event.options.showEnterSymbol || event.mode === 'print') {
8972
- return null;
8973
- }
8974
- return ElementUtil.createSvgText('↓', { 'dominant-baseline': 'hanging',
8975
- 'font-family': 'Courier',
8976
- 'font-size': this.rect.height,
8977
- x: this.rect.x + 4,
8978
- y: this.rect.y,
8979
- fill: 'green' });
8980
- }
8981
- clone() {
8982
- const render = new BreakRenderObject(this.element);
8983
- render.rect = ElementUtil.cloneRect(this.rect);
8984
- return render;
8985
- }
8986
- }
8987
- class BreakFactory extends ElementFactory {
8988
- match(type) {
8989
- return type === 'br';
8990
- }
8991
- createElement(data) {
8992
- const ele = new BreakElement();
8993
- return ele;
8994
- }
8995
- }
8996
-
8997
9051
  class DataElementText extends DataElementInlineGroup {
8998
9052
  //props: DataEleBaseTextProps;
8999
9053
  constructor() {
@@ -12485,6 +12539,14 @@ class ElementUtil {
12485
12539
  static getDataElement(ele) {
12486
12540
  return this.getParent(ele, item => item instanceof DataElementInlineGroup);
12487
12541
  }
12542
+ /**
12543
+ * 向上查找类型为数据元的父级
12544
+ * @param ele
12545
+ * @returns
12546
+ */
12547
+ static getDataGroupElement(ele) {
12548
+ return this.getParent(ele, item => item instanceof DataElementGroupElement);
12549
+ }
12488
12550
  static getOSPlatform() {
12489
12551
  const userAgent = navigator.userAgent;
12490
12552
  if (userAgent.indexOf('Windows') > -1) {
@@ -12633,23 +12695,35 @@ class ElementUtil {
12633
12695
  if (startControl.paintRenders.length === 0) {
12634
12696
  return false;
12635
12697
  }
12698
+ if (!ElementUtil.verifyHitable(startControl)) {
12699
+ return false;
12700
+ }
12636
12701
  if (viewOptions.docMode === exports.DocMode.Design) {
12637
12702
  return true;
12638
12703
  }
12639
- //表单模式下,如果不在数据元素中,则不显示光标
12704
+ //表单模式下
12640
12705
  if (viewOptions.docMode === exports.DocMode.FormEdit) {
12641
- if (!IsInSideDataElement(startControl, startOffset)) {
12642
- return false;
12706
+ //如果光标在数据元素中,判断是否可编辑
12707
+ if (IsInSideDataElement(startControl, startOffset)) {
12708
+ const dataEle = ElementUtil.getDataElement(startControl);
12709
+ //数据元不可编辑
12710
+ if (dataEle && !dataEle.props.editable) {
12711
+ return false;
12712
+ }
12713
+ return true;
12643
12714
  }
12644
- }
12645
- if (!ElementUtil.verifyHitable(startControl)) {
12646
- return false;
12647
- }
12648
- //表单模式下,数据元不可编辑
12649
- if (viewOptions.docMode === exports.DocMode.FormEdit && IsInSideDataElement(startControl, startOffset)) {
12650
- const dataEle = ElementUtil.getDataElement(startControl);
12651
- if (dataEle && !dataEle.props.editable) {
12652
- return false;
12715
+ else {
12716
+ //不在数据元中,需要判断是否在数据组中
12717
+ if (IsInSideDataGroup(startControl, startOffset)) {
12718
+ const dataGroup = ElementUtil.getDataGroupElement(startControl);
12719
+ //数据元不可编辑
12720
+ if (dataGroup && !dataGroup.props.editable) {
12721
+ return false;
12722
+ }
12723
+ }
12724
+ else {
12725
+ return false;
12726
+ }
12653
12727
  }
12654
12728
  }
12655
12729
  return true;
@@ -13332,8 +13406,8 @@ class DocumentContext {
13332
13406
  const dataEleList = this.ctx.treeFilter(item => validateDataEle(item));
13333
13407
  return dataEleList.map(item => item.props.id);
13334
13408
  }
13335
- getControlInstanceList() {
13336
- return this.ctx.treeFilter(item => validateDataEle(item));
13409
+ getControlInstanceList(options) {
13410
+ return this.ctx.treeFilter(item => validateDataEle(item), options);
13337
13411
  }
13338
13412
  getControlById(id) {
13339
13413
  return this.ctx.treeFind(item => validateDataEle(item) && item['props']['id'] === id);
@@ -13356,8 +13430,9 @@ class DocumentContext {
13356
13430
  * 获取数据元结构以及get\set闭包调用函数
13357
13431
  * @returns
13358
13432
  */
13359
- getDataElementModelList() {
13360
- const dataEleList = this.ctx.treeFilter(item => validateDataEle(item) || item instanceof DataElementInlineGroup);
13433
+ getDataElementModelList(options) {
13434
+ const dataEleList = this.ctx.treeFilter(item => validateDataEle(item), options);
13435
+ //数据元、数据组
13361
13436
  const dataInlineGroups = dataEleList.filter(item => item instanceof DataElementInlineGroup);
13362
13437
  const dataLeafs = dataEleList.filter(item => item instanceof DataElementLeaf);
13363
13438
  //复选框数据元
@@ -13366,7 +13441,7 @@ class DocumentContext {
13366
13441
  const dataOtherLeafValues = CommonUtil.removeUnionSet(dataLeafs, dataCheckList).map(item => ({
13367
13442
  id: item.props.id,
13368
13443
  name: item.props.name,
13369
- fieldName: item.props.field,
13444
+ fieldName: item.props.fieldName,
13370
13445
  item,
13371
13446
  getValue: () => {
13372
13447
  return item.getValue();
@@ -17490,8 +17565,12 @@ class DocumentChange {
17490
17565
  * @private
17491
17566
  */
17492
17567
  canDeleteInlineGroup(dataEle) {
17568
+ //当前编辑模式为表单模式,单独的数据元不可删除
17569
+ //存在于数据组内的数据元可以删除
17493
17570
  if (this.viewOptions.docMode === exports.DocMode.FormEdit) {
17494
- return false;
17571
+ if (dataEle.parent.type !== 'data-group') {
17572
+ return false;
17573
+ }
17495
17574
  }
17496
17575
  return dataEle.length === 2;
17497
17576
  }
@@ -18421,9 +18500,13 @@ class DocumentChange {
18421
18500
  }
18422
18501
  getCursorElementByDeleteAction(control) {
18423
18502
  if (this.viewOptions.docMode === exports.DocMode.FormEdit) {
18424
- if (control.parent instanceof DataElementInlineGroup) {
18503
+ //是否属于数据元或者数据组区域
18504
+ const isInDataAre = (ele) => {
18505
+ return ele.parent instanceof DataElementInlineGroup || ele.parent instanceof DataElementGroupElement;
18506
+ };
18507
+ if (isInDataAre(control)) {
18425
18508
  const prevLeafElementInPara = ElementUtil.getRecursionPrevSiblingElement(control, true, true, this.viewOptions);
18426
- if (prevLeafElementInPara && ElementUtil.getParent(prevLeafElementInPara, item => item instanceof DataElementInlineGroup)) {
18509
+ if (prevLeafElementInPara && isInDataAre(prevLeafElementInPara)) {
18427
18510
  return {
18428
18511
  ele: prevLeafElementInPara,
18429
18512
  offset: ElementUtil.getElementEndOffset(prevLeafElementInPara)
@@ -18431,7 +18514,7 @@ class DocumentChange {
18431
18514
  }
18432
18515
  else {
18433
18516
  return {
18434
- ele: control.parent.startDecorate,
18517
+ ele: (control.parent).startDecorate,
18435
18518
  offset: 1
18436
18519
  };
18437
18520
  }
@@ -20904,7 +20987,7 @@ class DocEditor {
20904
20987
  this.onDblClickEvent.next(evt);
20905
20988
  }
20906
20989
  /**
20907
- * 获取当前光标所在的数据元
20990
+ * 获取当前光标所在的数据元或者数据组
20908
20991
  * @returns
20909
20992
  */
20910
20993
  getCurrentDataElement() {
@@ -21943,7 +22026,7 @@ class DocEditor {
21943
22026
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
21944
22027
  }
21945
22028
  version() {
21946
- return "2.2.8";
22029
+ return "2.2.10";
21947
22030
  }
21948
22031
  switchPageHeaderEditor() {
21949
22032
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
@@ -27798,6 +27881,7 @@ exports.InlineGroupRenderObject = InlineGroupRenderObject;
27798
27881
  exports.InlineMuiltBlockLineRenderObject = InlineMuiltBlockLineRenderObject;
27799
27882
  exports.InputElementEvent = InputElementEvent;
27800
27883
  exports.IsInSideDataElement = IsInSideDataElement;
27884
+ exports.IsInSideDataGroup = IsInSideDataGroup;
27801
27885
  exports.IsInSideInlineGroupInputElement = IsInSideInlineGroupInputElement;
27802
27886
  exports.KeyboradElementEvent = KeyboradElementEvent;
27803
27887
  exports.LeafElement = LeafElement;