@tmagic/stage 1.3.16 → 1.4.0-beta.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/README.md +2 -2
- package/dist/tmagic-stage.js +155 -103
- package/dist/tmagic-stage.umd.cjs +155 -103
- package/package.json +6 -6
- package/src/ActionManager.ts +57 -24
- package/src/DragResizeHelper.ts +12 -8
- package/src/MoveableActionsAble.ts +1 -1
- package/src/StageCore.ts +41 -25
- package/src/StageDragResize.ts +50 -23
- package/src/StageMask.ts +12 -1
- package/src/StageMultiDragResize.ts +18 -3
- package/src/StageRender.ts +22 -26
- package/src/TargetShadow.ts +1 -1
- package/src/const.ts +31 -0
- package/src/types.ts +73 -37
- package/src/util.ts +2 -2
- package/types/ActionManager.d.ts +10 -8
- package/types/DragResizeHelper.d.ts +2 -2
- package/types/StageCore.d.ts +9 -7
- package/types/StageDragResize.d.ts +8 -6
- package/types/StageMask.d.ts +3 -1
- package/types/StageMultiDragResize.d.ts +5 -2
- package/types/StageRender.d.ts +5 -3
- package/types/const.d.ts +27 -0
- package/types/types.d.ts +67 -33
- package/types/util.d.ts +2 -2
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ mask是一个盖在画布区域的一个蒙层,主要作用是隔离鼠标事
|
|
|
35
35
|
## ActionManager
|
|
36
36
|
- 负责监听鼠标和键盘事件,基于这些事件,形成单选、多选、高亮行为。主要监听的是蒙层上的鼠标事件,通过StageRender.getElementsFromPoint计算获得鼠标下方的组件,实现事件监听和实际组件的解构。
|
|
37
37
|
- 向上负责跟StageCore双向通信,提供接口供core调用,并向core抛出事件
|
|
38
|
-
- 向下管理StageDragResize、StageMultiDragResize、
|
|
38
|
+
- 向下管理StageDragResize、StageMultiDragResize、StageHighlight这三个单选、多选、高亮类,让它们协同工作
|
|
39
39
|
<br/><br/>
|
|
40
40
|
## StageDragResize
|
|
41
41
|
负责单选相关逻辑,拖拽、改变大小、旋转等行为是依赖于开源库Moveable实现的,这些行为并不是直接作用于组件本身,而是在蒙层上创建了一个跟组件同等大小的边框div,实际拖拽的是边框div,在拖拽过程中同步更新组件。
|
|
@@ -47,7 +47,7 @@ mask是一个盖在画布区域的一个蒙层,主要作用是隔离鼠标事
|
|
|
47
47
|
## StageMultiDragResize
|
|
48
48
|
功能跟StageDragResize类似,只是这个类是负责多选操作的,通过ctrl健选中多个组件,多选状态下不支持通过表单配置组件。
|
|
49
49
|
<br/><br/>
|
|
50
|
-
##
|
|
50
|
+
## StageHighlight
|
|
51
51
|
在鼠标经过画布中的组件、或者鼠标经过组件目录树中的组件时,会触发组件高亮,高亮也是通过moveable实现的,这个类主要负责初始化moveable并管理高亮状态。
|
|
52
52
|
<br/><br/>
|
|
53
53
|
## MoveableOptionsManager
|
package/dist/tmagic-stage.js
CHANGED
|
@@ -44,6 +44,27 @@ var AbleActionEventType = /* @__PURE__ */ ((AbleActionEventType2) => {
|
|
|
44
44
|
AbleActionEventType2["REMOVE"] = "remove";
|
|
45
45
|
return AbleActionEventType2;
|
|
46
46
|
})(AbleActionEventType || {});
|
|
47
|
+
var ContainerHighlightType = /* @__PURE__ */ ((ContainerHighlightType2) => {
|
|
48
|
+
ContainerHighlightType2["DEFAULT"] = "default";
|
|
49
|
+
ContainerHighlightType2["ALT"] = "alt";
|
|
50
|
+
return ContainerHighlightType2;
|
|
51
|
+
})(ContainerHighlightType || {});
|
|
52
|
+
var RenderType = /* @__PURE__ */ ((RenderType2) => {
|
|
53
|
+
RenderType2["IFRAME"] = "iframe";
|
|
54
|
+
RenderType2["NATIVE"] = "native";
|
|
55
|
+
return RenderType2;
|
|
56
|
+
})(RenderType || {});
|
|
57
|
+
var SelectStatus = /* @__PURE__ */ ((SelectStatus2) => {
|
|
58
|
+
SelectStatus2["SELECT"] = "select";
|
|
59
|
+
SelectStatus2["MULTI_SELECT"] = "multiSelect";
|
|
60
|
+
return SelectStatus2;
|
|
61
|
+
})(SelectStatus || {});
|
|
62
|
+
var StageDragStatus = /* @__PURE__ */ ((StageDragStatus2) => {
|
|
63
|
+
StageDragStatus2["START"] = "start";
|
|
64
|
+
StageDragStatus2["ING"] = "ing";
|
|
65
|
+
StageDragStatus2["END"] = "end";
|
|
66
|
+
return StageDragStatus2;
|
|
67
|
+
})(StageDragStatus || {});
|
|
47
68
|
|
|
48
69
|
const getParents = (el, relative) => {
|
|
49
70
|
let cur = el.parentElement;
|
|
@@ -302,7 +323,7 @@ class TargetShadow {
|
|
|
302
323
|
}
|
|
303
324
|
updateEl(target, src) {
|
|
304
325
|
const el = src || globalThis.document.createElement("div");
|
|
305
|
-
el.id = `${this.idPrefix}${target.id}`;
|
|
326
|
+
el.id = `${this.idPrefix}_${target.id}`;
|
|
306
327
|
el.style.cssText = getTargetElStyle(target, this.zIndex);
|
|
307
328
|
if (typeof this.updateDragEl === "function") {
|
|
308
329
|
this.updateDragEl(el, target, this.container);
|
|
@@ -478,6 +499,7 @@ class DragResizeHelper {
|
|
|
478
499
|
*/
|
|
479
500
|
onResizeGroup(e) {
|
|
480
501
|
const { events } = e;
|
|
502
|
+
this.moveableHelper.onResizeGroup(e);
|
|
481
503
|
events.forEach((ev) => {
|
|
482
504
|
const { width, height, beforeTranslate } = ev.drag;
|
|
483
505
|
const frameSnapShot = this.framesSnapShot.find(
|
|
@@ -499,23 +521,23 @@ class DragResizeHelper {
|
|
|
499
521
|
targeEl.style.width = `${width}px`;
|
|
500
522
|
targeEl.style.height = `${height}px`;
|
|
501
523
|
});
|
|
502
|
-
this.moveableHelper.onResizeGroup(e);
|
|
503
524
|
}
|
|
504
525
|
onDragGroupStart(e) {
|
|
505
|
-
const { events } = e;
|
|
506
526
|
this.moveableHelper.onDragGroupStart(e);
|
|
527
|
+
const { events } = e;
|
|
507
528
|
this.setFramesSnapShot(events);
|
|
508
529
|
}
|
|
509
530
|
onDragGroup(e) {
|
|
531
|
+
this.moveableHelper.onDragGroup(e);
|
|
510
532
|
const { events } = e;
|
|
511
533
|
events.forEach((ev) => {
|
|
512
534
|
const frameSnapShot = this.framesSnapShot.find(
|
|
513
|
-
(frameItem) =>
|
|
535
|
+
(frameItem) => ev.target.id.startsWith(DRAG_EL_ID_PREFIX) && ev.target.id.endsWith(frameItem.id)
|
|
514
536
|
);
|
|
515
537
|
if (!frameSnapShot)
|
|
516
538
|
return;
|
|
517
539
|
const targeEl = this.targetList.find(
|
|
518
|
-
(targetItem) =>
|
|
540
|
+
(targetItem) => ev.target.id.startsWith(DRAG_EL_ID_PREFIX) && ev.target.id.endsWith(targetItem.id)
|
|
519
541
|
);
|
|
520
542
|
if (!targeEl)
|
|
521
543
|
return;
|
|
@@ -526,7 +548,6 @@ class DragResizeHelper {
|
|
|
526
548
|
targeEl.style.top = `${frameSnapShot.top + ev.beforeTranslate[1] - marginTop}px`;
|
|
527
549
|
}
|
|
528
550
|
});
|
|
529
|
-
this.moveableHelper.onDragGroup(e);
|
|
530
551
|
}
|
|
531
552
|
getUpdatedElRect(el, parentEl, doc) {
|
|
532
553
|
const offset = this.mode === Mode.SORTABLE ? { left: 0, top: 0 } : { left: el.offsetLeft, top: el.offsetTop };
|
|
@@ -561,7 +582,7 @@ class DragResizeHelper {
|
|
|
561
582
|
return;
|
|
562
583
|
events.forEach((ev) => {
|
|
563
584
|
const matchEventTarget = this.targetList.find(
|
|
564
|
-
(targetItem) =>
|
|
585
|
+
(targetItem) => ev.target.id.startsWith(DRAG_EL_ID_PREFIX) && ev.target.id.endsWith(targetItem.id)
|
|
565
586
|
);
|
|
566
587
|
if (!matchEventTarget)
|
|
567
588
|
return;
|
|
@@ -622,7 +643,7 @@ const MoveableActionsAble = (handler) => ({
|
|
|
622
643
|
left: 0px;
|
|
623
644
|
top: 0px;
|
|
624
645
|
will-change: transform;
|
|
625
|
-
transform-origin:
|
|
646
|
+
transform-origin: 60px 28px;
|
|
626
647
|
display: flex;
|
|
627
648
|
}
|
|
628
649
|
${ableCss}
|
|
@@ -899,31 +920,9 @@ class MoveableOptionsManager extends EventEmitter {
|
|
|
899
920
|
}
|
|
900
921
|
}
|
|
901
922
|
|
|
902
|
-
var ContainerHighlightType = /* @__PURE__ */ ((ContainerHighlightType2) => {
|
|
903
|
-
ContainerHighlightType2["DEFAULT"] = "default";
|
|
904
|
-
ContainerHighlightType2["ALT"] = "alt";
|
|
905
|
-
return ContainerHighlightType2;
|
|
906
|
-
})(ContainerHighlightType || {});
|
|
907
|
-
var RenderType = /* @__PURE__ */ ((RenderType2) => {
|
|
908
|
-
RenderType2["IFRAME"] = "iframe";
|
|
909
|
-
RenderType2["NATIVE"] = "native";
|
|
910
|
-
return RenderType2;
|
|
911
|
-
})(RenderType || {});
|
|
912
|
-
var SelectStatus = /* @__PURE__ */ ((SelectStatus2) => {
|
|
913
|
-
SelectStatus2["SELECT"] = "select";
|
|
914
|
-
SelectStatus2["MULTI_SELECT"] = "multiSelect";
|
|
915
|
-
return SelectStatus2;
|
|
916
|
-
})(SelectStatus || {});
|
|
917
|
-
var StageDragStatus = /* @__PURE__ */ ((StageDragStatus2) => {
|
|
918
|
-
StageDragStatus2["START"] = "start";
|
|
919
|
-
StageDragStatus2["ING"] = "ing";
|
|
920
|
-
StageDragStatus2["END"] = "end";
|
|
921
|
-
return StageDragStatus2;
|
|
922
|
-
})(StageDragStatus || {});
|
|
923
|
-
|
|
924
923
|
class StageDragResize extends MoveableOptionsManager {
|
|
925
924
|
/** 目标节点 */
|
|
926
|
-
target;
|
|
925
|
+
target = null;
|
|
927
926
|
/** Moveable拖拽类实例 */
|
|
928
927
|
moveable;
|
|
929
928
|
/** 拖动状态 */
|
|
@@ -956,6 +955,11 @@ class StageDragResize extends MoveableOptionsManager {
|
|
|
956
955
|
* @param event 鼠标事件
|
|
957
956
|
*/
|
|
958
957
|
select(el, event) {
|
|
958
|
+
if (!el) {
|
|
959
|
+
this.moveable?.destroy();
|
|
960
|
+
this.moveable = void 0;
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
959
963
|
if (!this.moveable || el !== this.target) {
|
|
960
964
|
this.initMoveable(el);
|
|
961
965
|
} else {
|
|
@@ -998,6 +1002,12 @@ class StageDragResize extends MoveableOptionsManager {
|
|
|
998
1002
|
this.dragStatus = StageDragStatus.END;
|
|
999
1003
|
this.removeAllListeners();
|
|
1000
1004
|
}
|
|
1005
|
+
on(eventName, listener) {
|
|
1006
|
+
return super.on(eventName, listener);
|
|
1007
|
+
}
|
|
1008
|
+
emit(eventName, ...args) {
|
|
1009
|
+
return super.emit(eventName, ...args);
|
|
1010
|
+
}
|
|
1001
1011
|
init(el) {
|
|
1002
1012
|
if (/(auto|scroll)/.test(el.style.overflow)) {
|
|
1003
1013
|
el.style.overflow = "hidden";
|
|
@@ -1098,16 +1108,19 @@ class StageDragResize extends MoveableOptionsManager {
|
|
|
1098
1108
|
}).on("rotateEnd", (e) => {
|
|
1099
1109
|
this.dragStatus = StageDragStatus.END;
|
|
1100
1110
|
const frame = this.dragResizeHelper?.getFrame(e.target);
|
|
1101
|
-
this.
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1111
|
+
if (this.target && frame) {
|
|
1112
|
+
this.emit("update", {
|
|
1113
|
+
data: [
|
|
1114
|
+
{
|
|
1115
|
+
el: this.target,
|
|
1116
|
+
style: {
|
|
1117
|
+
transform: frame.get("transform")
|
|
1118
|
+
}
|
|
1107
1119
|
}
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1120
|
+
],
|
|
1121
|
+
parentEl: null
|
|
1122
|
+
});
|
|
1123
|
+
}
|
|
1111
1124
|
});
|
|
1112
1125
|
}
|
|
1113
1126
|
bindScaleEvent() {
|
|
@@ -1124,16 +1137,19 @@ class StageDragResize extends MoveableOptionsManager {
|
|
|
1124
1137
|
}).on("scaleEnd", (e) => {
|
|
1125
1138
|
this.dragStatus = StageDragStatus.END;
|
|
1126
1139
|
const frame = this.dragResizeHelper.getFrame(e.target);
|
|
1127
|
-
this.
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1140
|
+
if (this.target && frame) {
|
|
1141
|
+
this.emit("update", {
|
|
1142
|
+
data: [
|
|
1143
|
+
{
|
|
1144
|
+
el: this.target,
|
|
1145
|
+
style: {
|
|
1146
|
+
transform: frame.get("transform")
|
|
1147
|
+
}
|
|
1133
1148
|
}
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1149
|
+
],
|
|
1150
|
+
parentEl: null
|
|
1151
|
+
});
|
|
1152
|
+
}
|
|
1137
1153
|
});
|
|
1138
1154
|
}
|
|
1139
1155
|
sort() {
|
|
@@ -1305,6 +1321,10 @@ class StageMultiDragResize extends MoveableOptionsManager {
|
|
|
1305
1321
|
this.dragResizeHelper.onDragGroup(e);
|
|
1306
1322
|
this.dragStatus = StageDragStatus.ING;
|
|
1307
1323
|
}).on("dragGroupEnd", () => {
|
|
1324
|
+
if (timeout) {
|
|
1325
|
+
globalThis.clearTimeout(timeout);
|
|
1326
|
+
timeout = void 0;
|
|
1327
|
+
}
|
|
1308
1328
|
const parentEl = this.markContainerEnd();
|
|
1309
1329
|
this.update(false, parentEl);
|
|
1310
1330
|
this.dragStatus = StageDragStatus.END;
|
|
@@ -1364,6 +1384,12 @@ class StageMultiDragResize extends MoveableOptionsManager {
|
|
|
1364
1384
|
this.moveableForMulti?.destroy();
|
|
1365
1385
|
this.dragResizeHelper.destroy();
|
|
1366
1386
|
}
|
|
1387
|
+
on(eventName, listener) {
|
|
1388
|
+
return super.on(eventName, listener);
|
|
1389
|
+
}
|
|
1390
|
+
emit(eventName, ...args) {
|
|
1391
|
+
return super.emit(eventName, ...args);
|
|
1392
|
+
}
|
|
1367
1393
|
/**
|
|
1368
1394
|
* 拖拽完成后将更新的位置信息暴露给上层业务方,业务方可以接收事件进行保存
|
|
1369
1395
|
* @param isResize 是否进行大小缩放
|
|
@@ -1394,7 +1420,7 @@ class ActionManager extends EventEmitter {
|
|
|
1394
1420
|
/** 单选、多选、高亮的容器(蒙层的content) */
|
|
1395
1421
|
container;
|
|
1396
1422
|
/** 当前选中的节点 */
|
|
1397
|
-
selectedEl;
|
|
1423
|
+
selectedEl = null;
|
|
1398
1424
|
/** 多选选中的节点组 */
|
|
1399
1425
|
selectedElList = [];
|
|
1400
1426
|
/** 当前高亮的节点 */
|
|
@@ -1425,7 +1451,7 @@ class ActionManager extends EventEmitter {
|
|
|
1425
1451
|
return;
|
|
1426
1452
|
}
|
|
1427
1453
|
this.emit("mousemove", event);
|
|
1428
|
-
this.highlight(el);
|
|
1454
|
+
this.highlight(el.id);
|
|
1429
1455
|
}, throttleTime);
|
|
1430
1456
|
constructor(config) {
|
|
1431
1457
|
super();
|
|
@@ -1529,6 +1555,7 @@ class ActionManager extends EventEmitter {
|
|
|
1529
1555
|
return el;
|
|
1530
1556
|
}
|
|
1531
1557
|
}
|
|
1558
|
+
return null;
|
|
1532
1559
|
}
|
|
1533
1560
|
/**
|
|
1534
1561
|
* 判断一个元素能否在当前场景被选中
|
|
@@ -1565,8 +1592,14 @@ class ActionManager extends EventEmitter {
|
|
|
1565
1592
|
this.clearSelectStatus(SelectStatus.MULTI_SELECT);
|
|
1566
1593
|
this.dr.select(el, event);
|
|
1567
1594
|
}
|
|
1568
|
-
multiSelect(
|
|
1569
|
-
this.selectedElList =
|
|
1595
|
+
multiSelect(ids) {
|
|
1596
|
+
this.selectedElList = [];
|
|
1597
|
+
ids.forEach((id) => {
|
|
1598
|
+
const el = this.getTargetElement(id);
|
|
1599
|
+
if (el) {
|
|
1600
|
+
this.selectedElList.push(el);
|
|
1601
|
+
}
|
|
1602
|
+
});
|
|
1570
1603
|
this.clearSelectStatus(SelectStatus.SELECT);
|
|
1571
1604
|
this.multiDr?.multiSelect(this.selectedElList);
|
|
1572
1605
|
}
|
|
@@ -1576,10 +1609,10 @@ class ActionManager extends EventEmitter {
|
|
|
1576
1609
|
setHighlightEl(el) {
|
|
1577
1610
|
this.highlightedEl = el;
|
|
1578
1611
|
}
|
|
1579
|
-
highlight(
|
|
1612
|
+
highlight(id) {
|
|
1580
1613
|
let el;
|
|
1581
1614
|
try {
|
|
1582
|
-
el = this.getTargetElement(
|
|
1615
|
+
el = this.getTargetElement(id);
|
|
1583
1616
|
} catch (error) {
|
|
1584
1617
|
this.clearHighlight();
|
|
1585
1618
|
return;
|
|
@@ -1655,6 +1688,12 @@ class ActionManager extends EventEmitter {
|
|
|
1655
1688
|
this.multiDr?.destroy();
|
|
1656
1689
|
this.highlightLayer.destroy();
|
|
1657
1690
|
}
|
|
1691
|
+
on(eventName, listener) {
|
|
1692
|
+
return super.on(eventName, listener);
|
|
1693
|
+
}
|
|
1694
|
+
emit(eventName, ...args) {
|
|
1695
|
+
return super.emit(eventName, ...args);
|
|
1696
|
+
}
|
|
1658
1697
|
createDr(config) {
|
|
1659
1698
|
const createDrHelper = () => new DragResizeHelper({
|
|
1660
1699
|
container: config.container,
|
|
@@ -1674,9 +1713,9 @@ class ActionManager extends EventEmitter {
|
|
|
1674
1713
|
setTimeout(() => this.emit("update", data));
|
|
1675
1714
|
}).on("sort", (data) => {
|
|
1676
1715
|
setTimeout(() => this.emit("sort", data));
|
|
1677
|
-
}).on(
|
|
1716
|
+
}).on(AbleActionEventType.SELECT_PARENT, () => {
|
|
1678
1717
|
this.emit("select-parent");
|
|
1679
|
-
}).on(
|
|
1718
|
+
}).on(AbleActionEventType.REMOVE, () => {
|
|
1680
1719
|
const drTarget = this.dr.getTarget();
|
|
1681
1720
|
if (!drTarget)
|
|
1682
1721
|
return;
|
|
@@ -1705,11 +1744,10 @@ class ActionManager extends EventEmitter {
|
|
|
1705
1744
|
});
|
|
1706
1745
|
multiDr?.on("update", (data) => {
|
|
1707
1746
|
this.emit("multi-update", data);
|
|
1708
|
-
}).on("change-to-select",
|
|
1747
|
+
}).on("change-to-select", (id, e) => {
|
|
1709
1748
|
if (this.isMultiSelectStatus)
|
|
1710
|
-
return
|
|
1711
|
-
|
|
1712
|
-
this.emit("change-to-select", el, e);
|
|
1749
|
+
return;
|
|
1750
|
+
this.emit("change-to-select", id, e);
|
|
1713
1751
|
});
|
|
1714
1752
|
return multiDr;
|
|
1715
1753
|
}
|
|
@@ -1743,11 +1781,13 @@ class ActionManager extends EventEmitter {
|
|
|
1743
1781
|
return;
|
|
1744
1782
|
if (this.selectedEl && !this.selectedEl.className.includes(PAGE_CLASS)) {
|
|
1745
1783
|
this.selectedElList.push(this.selectedEl);
|
|
1746
|
-
this.setSelectedEl(
|
|
1784
|
+
this.setSelectedEl(null);
|
|
1747
1785
|
}
|
|
1748
1786
|
const existIndex = this.selectedElList.findIndex((selectedDom) => selectedDom.id === el.id);
|
|
1749
1787
|
if (existIndex !== -1) {
|
|
1750
|
-
this.selectedElList.
|
|
1788
|
+
if (this.selectedElList.length > 1) {
|
|
1789
|
+
this.selectedElList.splice(existIndex, 1);
|
|
1790
|
+
}
|
|
1751
1791
|
} else {
|
|
1752
1792
|
this.selectedElList.push(el);
|
|
1753
1793
|
}
|
|
@@ -2134,6 +2174,12 @@ class StageMask extends Rule {
|
|
|
2134
2174
|
this.wrapperResizeObserver?.disconnect();
|
|
2135
2175
|
super.destroy();
|
|
2136
2176
|
}
|
|
2177
|
+
on(eventName, listener) {
|
|
2178
|
+
return super.on(eventName, listener);
|
|
2179
|
+
}
|
|
2180
|
+
emit(eventName, ...args) {
|
|
2181
|
+
return super.emit(eventName, ...args);
|
|
2182
|
+
}
|
|
2137
2183
|
/**
|
|
2138
2184
|
* 监听选中元素是否在画布可视区域内,如果目标元素不在可视区域内,通过滚动使该元素出现在可视区域
|
|
2139
2185
|
*/
|
|
@@ -2309,14 +2355,11 @@ class StageRender extends EventEmitter$1 {
|
|
|
2309
2355
|
const runtime = await this.getRuntime();
|
|
2310
2356
|
runtime?.update?.(data);
|
|
2311
2357
|
}
|
|
2312
|
-
async select(
|
|
2358
|
+
async select(ids) {
|
|
2313
2359
|
const runtime = await this.getRuntime();
|
|
2314
|
-
for (const
|
|
2315
|
-
await runtime?.select?.(
|
|
2316
|
-
|
|
2317
|
-
await runtime.beforeSelect(el);
|
|
2318
|
-
}
|
|
2319
|
-
this.flagSelectedEl(el);
|
|
2360
|
+
for (const id of ids) {
|
|
2361
|
+
await runtime?.select?.(id);
|
|
2362
|
+
this.flagSelectedEl(this.getTargetElement(id));
|
|
2320
2363
|
}
|
|
2321
2364
|
}
|
|
2322
2365
|
setZoom(zoom = DEFAULT_ZOOM) {
|
|
@@ -2372,14 +2415,8 @@ class StageRender extends EventEmitter$1 {
|
|
|
2372
2415
|
}
|
|
2373
2416
|
return this.getDocument()?.elementsFromPoint(x / this.zoom, y / this.zoom);
|
|
2374
2417
|
}
|
|
2375
|
-
getTargetElement(
|
|
2376
|
-
|
|
2377
|
-
const el = this.getDocument()?.getElementById(`${idOrEl}`);
|
|
2378
|
-
if (!el)
|
|
2379
|
-
throw new Error(`不存在ID为${idOrEl}的元素`);
|
|
2380
|
-
return el;
|
|
2381
|
-
}
|
|
2382
|
-
return idOrEl;
|
|
2418
|
+
getTargetElement(id) {
|
|
2419
|
+
return this.getDocument()?.getElementById(`${id}`) || null;
|
|
2383
2420
|
}
|
|
2384
2421
|
/**
|
|
2385
2422
|
* 销毁实例
|
|
@@ -2391,6 +2428,12 @@ class StageRender extends EventEmitter$1 {
|
|
|
2391
2428
|
this.iframe = void 0;
|
|
2392
2429
|
this.removeAllListeners();
|
|
2393
2430
|
}
|
|
2431
|
+
on(eventName, listener) {
|
|
2432
|
+
return super.on(eventName, listener);
|
|
2433
|
+
}
|
|
2434
|
+
emit(eventName, ...args) {
|
|
2435
|
+
return super.emit(eventName, ...args);
|
|
2436
|
+
}
|
|
2394
2437
|
createIframe() {
|
|
2395
2438
|
this.iframe = globalThis.document.createElement("iframe");
|
|
2396
2439
|
this.iframe.src = this.runtimeUrl && isSameDomain(this.runtimeUrl) ? this.runtimeUrl : "";
|
|
@@ -2421,7 +2464,7 @@ class StageRender extends EventEmitter$1 {
|
|
|
2421
2464
|
const doc = this.getDocument();
|
|
2422
2465
|
if (doc) {
|
|
2423
2466
|
removeSelectedClassName(doc);
|
|
2424
|
-
addSelectedClassName(el, doc);
|
|
2467
|
+
el && addSelectedClassName(el, doc);
|
|
2425
2468
|
}
|
|
2426
2469
|
}
|
|
2427
2470
|
iframeLoadHandler = async () => {
|
|
@@ -2484,33 +2527,33 @@ class StageCore extends EventEmitter$1 {
|
|
|
2484
2527
|
}
|
|
2485
2528
|
/**
|
|
2486
2529
|
* 单选选中元素
|
|
2487
|
-
* @param
|
|
2530
|
+
* @param id 选中的id
|
|
2488
2531
|
*/
|
|
2489
|
-
async select(
|
|
2490
|
-
const el = this.renderer.getTargetElement(
|
|
2532
|
+
async select(id, event) {
|
|
2533
|
+
const el = this.renderer.getTargetElement(id);
|
|
2491
2534
|
if (el === this.actionManager.getSelectedEl())
|
|
2492
2535
|
return;
|
|
2493
|
-
await this.renderer.select([
|
|
2494
|
-
this.mask.setLayout(el);
|
|
2536
|
+
await this.renderer.select([id]);
|
|
2537
|
+
el && this.mask.setLayout(el);
|
|
2495
2538
|
this.actionManager.select(el, event);
|
|
2496
|
-
if (this.autoScrollIntoView || el.dataset.autoScrollIntoView) {
|
|
2539
|
+
if (el && (this.autoScrollIntoView || el.dataset.autoScrollIntoView)) {
|
|
2497
2540
|
this.mask.observerIntersection(el);
|
|
2498
2541
|
}
|
|
2499
2542
|
}
|
|
2500
2543
|
/**
|
|
2501
2544
|
* 多选选中多个元素
|
|
2502
|
-
* @param
|
|
2545
|
+
* @param ids 选中元素的id列表
|
|
2503
2546
|
*/
|
|
2504
|
-
async multiSelect(
|
|
2505
|
-
const els =
|
|
2547
|
+
async multiSelect(ids) {
|
|
2548
|
+
const els = ids.map((id) => this.renderer.getTargetElement(id)).filter((el) => Boolean(el));
|
|
2506
2549
|
if (els.length === 0)
|
|
2507
2550
|
return;
|
|
2508
2551
|
const lastEl = els[els.length - 1];
|
|
2509
2552
|
const isReduceSelect = els.length < this.actionManager.getSelectedElList().length;
|
|
2510
|
-
await this.renderer.select(
|
|
2511
|
-
this.mask.setLayout(lastEl);
|
|
2512
|
-
this.actionManager.multiSelect(
|
|
2513
|
-
if ((this.autoScrollIntoView || lastEl.dataset.autoScrollIntoView) && !isReduceSelect) {
|
|
2553
|
+
await this.renderer.select(ids);
|
|
2554
|
+
lastEl && this.mask.setLayout(lastEl);
|
|
2555
|
+
this.actionManager.multiSelect(ids);
|
|
2556
|
+
if (lastEl && (this.autoScrollIntoView || lastEl.dataset.autoScrollIntoView) && !isReduceSelect) {
|
|
2514
2557
|
this.mask.observerIntersection(lastEl);
|
|
2515
2558
|
}
|
|
2516
2559
|
}
|
|
@@ -2518,8 +2561,8 @@ class StageCore extends EventEmitter$1 {
|
|
|
2518
2561
|
* 高亮选中元素
|
|
2519
2562
|
* @param el 要高亮的元素
|
|
2520
2563
|
*/
|
|
2521
|
-
highlight(
|
|
2522
|
-
this.actionManager.highlight(
|
|
2564
|
+
highlight(id) {
|
|
2565
|
+
this.actionManager.highlight(id);
|
|
2523
2566
|
}
|
|
2524
2567
|
clearHighlight() {
|
|
2525
2568
|
this.actionManager.clearHighlight();
|
|
@@ -2615,6 +2658,12 @@ class StageCore extends EventEmitter$1 {
|
|
|
2615
2658
|
this.removeAllListeners();
|
|
2616
2659
|
this.container = void 0;
|
|
2617
2660
|
}
|
|
2661
|
+
on(eventName, listener) {
|
|
2662
|
+
return super.on(eventName, listener);
|
|
2663
|
+
}
|
|
2664
|
+
emit(eventName, ...args) {
|
|
2665
|
+
return super.emit(eventName, ...args);
|
|
2666
|
+
}
|
|
2618
2667
|
/**
|
|
2619
2668
|
* 监听页面大小变化
|
|
2620
2669
|
*/
|
|
@@ -2644,7 +2693,7 @@ class StageCore extends EventEmitter$1 {
|
|
|
2644
2693
|
updateDragEl: config.updateDragEl,
|
|
2645
2694
|
getRootContainer: () => this.container,
|
|
2646
2695
|
getRenderDocument: () => this.renderer.getDocument(),
|
|
2647
|
-
getTargetElement: (
|
|
2696
|
+
getTargetElement: (id) => this.renderer.getTargetElement(id),
|
|
2648
2697
|
getElementsFromPoint: (point) => this.renderer.getElementsFromPoint(point)
|
|
2649
2698
|
};
|
|
2650
2699
|
return actionManagerConfig;
|
|
@@ -2679,12 +2728,12 @@ class StageCore extends EventEmitter$1 {
|
|
|
2679
2728
|
* 初始化ActionManager类本身抛出来的事件监听
|
|
2680
2729
|
*/
|
|
2681
2730
|
initActionManagerEvent() {
|
|
2682
|
-
this.actionManager.on("before-select", (
|
|
2683
|
-
this.select(
|
|
2731
|
+
this.actionManager.on("before-select", (el, event) => {
|
|
2732
|
+
this.select(el.id, event);
|
|
2684
2733
|
}).on("select", (selectedEl, event) => {
|
|
2685
2734
|
this.emit("select", selectedEl, event);
|
|
2686
|
-
}).on("before-multi-select", (
|
|
2687
|
-
this.multiSelect(
|
|
2735
|
+
}).on("before-multi-select", (els) => {
|
|
2736
|
+
this.multiSelect(els.map((el) => el.id));
|
|
2688
2737
|
}).on("multi-select", (selectedElList, event) => {
|
|
2689
2738
|
this.emit("multi-select", selectedElList, event);
|
|
2690
2739
|
}).on("dblclick", (event) => {
|
|
@@ -2709,9 +2758,12 @@ class StageCore extends EventEmitter$1 {
|
|
|
2709
2758
|
* 初始化MultiDragResize类通过ActionManager抛出来的事件监听
|
|
2710
2759
|
*/
|
|
2711
2760
|
initMulDrEvent() {
|
|
2712
|
-
this.actionManager.on("change-to-select", (
|
|
2713
|
-
this.select(
|
|
2714
|
-
setTimeout(() =>
|
|
2761
|
+
this.actionManager.on("change-to-select", (id, e) => {
|
|
2762
|
+
this.select(id);
|
|
2763
|
+
setTimeout(() => {
|
|
2764
|
+
const el = this.renderer.getTargetElement(id);
|
|
2765
|
+
el && this.emit("select", el, e);
|
|
2766
|
+
});
|
|
2715
2767
|
}).on("multi-update", (data) => {
|
|
2716
2768
|
this.emit("update", data);
|
|
2717
2769
|
});
|
|
@@ -2720,7 +2772,7 @@ class StageCore extends EventEmitter$1 {
|
|
|
2720
2772
|
* 初始化Highlight类通过ActionManager抛出来的事件监听
|
|
2721
2773
|
*/
|
|
2722
2774
|
initHighlightEvent() {
|
|
2723
|
-
this.actionManager.on("highlight",
|
|
2775
|
+
this.actionManager.on("highlight", (highlightEl) => {
|
|
2724
2776
|
this.emit("highlight", highlightEl);
|
|
2725
2777
|
});
|
|
2726
2778
|
}
|