@tmagic/stage 1.5.0-beta.8 → 1.5.0
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/dist/tmagic-stage.js +56 -40
- package/dist/tmagic-stage.umd.cjs +55 -39
- package/package.json +6 -5
- package/src/ActionManager.ts +3 -0
- package/src/DragResizeHelper.ts +33 -37
- package/src/MoveableActionsAble.ts +15 -0
- package/src/StageCore.ts +3 -0
- package/src/StageDragResize.ts +1 -1
- package/src/const.ts +1 -0
- package/src/moveable-able.css +6 -0
- package/src/types.ts +3 -0
- package/src/util.ts +13 -7
- package/types/index.d.ts +7 -3
package/dist/tmagic-stage.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import EventEmitter, { EventEmitter as EventEmitter$1 } from 'events';
|
|
2
|
-
import { removeClassName, guid, setIdToEl,
|
|
2
|
+
import { removeClassName, getIdFromEl, guid, setIdToEl, getElById, calcValueByFontsize, addClassName, removeClassNameByClassName, getDocument, createDiv, injectStyle, isSameDomain, getHost } from '@tmagic/utils';
|
|
3
3
|
import KeyController from 'keycon';
|
|
4
4
|
import { merge, throttle } from 'lodash-es';
|
|
5
5
|
import { Env } from '@tmagic/core';
|
|
@@ -43,6 +43,7 @@ const SELECTED_CLASS = "tmagic-stage-selected-area";
|
|
|
43
43
|
var AbleActionEventType = /* @__PURE__ */ ((AbleActionEventType2) => {
|
|
44
44
|
AbleActionEventType2["SELECT_PARENT"] = "select-parent";
|
|
45
45
|
AbleActionEventType2["REMOVE"] = "remove";
|
|
46
|
+
AbleActionEventType2["RERENDER"] = "rerender";
|
|
46
47
|
return AbleActionEventType2;
|
|
47
48
|
})(AbleActionEventType || {});
|
|
48
49
|
var ContainerHighlightType = /* @__PURE__ */ ((ContainerHighlightType2) => {
|
|
@@ -179,7 +180,7 @@ const down = (deltaTop, target) => {
|
|
|
179
180
|
let swapIndex = 0;
|
|
180
181
|
let addUpH = target.clientHeight;
|
|
181
182
|
const brothers = Array.from(target.parentNode?.children || []).filter(
|
|
182
|
-
(
|
|
183
|
+
(child) => !getIdFromEl()(child)?.startsWith(GHOST_EL_ID_PREFIX)
|
|
183
184
|
);
|
|
184
185
|
const index = brothers.indexOf(target);
|
|
185
186
|
const downEls = brothers.slice(index + 1);
|
|
@@ -195,14 +196,15 @@ const down = (deltaTop, target) => {
|
|
|
195
196
|
addUpH += ele.clientHeight / 2;
|
|
196
197
|
swapIndex = i;
|
|
197
198
|
}
|
|
199
|
+
const src = getIdFromEl()(target) || "";
|
|
198
200
|
return {
|
|
199
|
-
src
|
|
200
|
-
dist: downEls.length && swapIndex > -1 ? downEls[swapIndex]
|
|
201
|
+
src,
|
|
202
|
+
dist: downEls.length && swapIndex > -1 ? getIdFromEl()(downEls[swapIndex]) || "" : src
|
|
201
203
|
};
|
|
202
204
|
};
|
|
203
205
|
const up = (deltaTop, target) => {
|
|
204
206
|
const brothers = Array.from(target.parentNode?.children || []).filter(
|
|
205
|
-
(
|
|
207
|
+
(child) => !getIdFromEl()(child)?.startsWith(GHOST_EL_ID_PREFIX)
|
|
206
208
|
);
|
|
207
209
|
const index = brothers.indexOf(target);
|
|
208
210
|
const upEls = brothers.slice(0, index);
|
|
@@ -217,9 +219,10 @@ const up = (deltaTop, target) => {
|
|
|
217
219
|
addUpH += ele.clientHeight / 2;
|
|
218
220
|
swapIndex = i;
|
|
219
221
|
}
|
|
222
|
+
const src = getIdFromEl()(target) || "";
|
|
220
223
|
return {
|
|
221
|
-
src
|
|
222
|
-
dist: upEls.length && swapIndex > -1 ? upEls[swapIndex]
|
|
224
|
+
src,
|
|
225
|
+
dist: upEls.length && swapIndex > -1 ? getIdFromEl()(upEls[swapIndex]) || "" : src
|
|
223
226
|
};
|
|
224
227
|
};
|
|
225
228
|
const isMoveableButton = (target) => target.classList.contains("moveable-button") || target.parentElement?.classList.contains("moveable-button");
|
|
@@ -329,7 +332,6 @@ class TargetShadow {
|
|
|
329
332
|
};
|
|
330
333
|
}
|
|
331
334
|
|
|
332
|
-
const getId = getIdFromEl();
|
|
333
335
|
class DragResizeHelper {
|
|
334
336
|
/** 目标节点在蒙层上的占位节点,用于跟鼠标交互,避免鼠标事件直接作用到目标节点 */
|
|
335
337
|
targetShadow;
|
|
@@ -489,14 +491,16 @@ class DragResizeHelper {
|
|
|
489
491
|
events.forEach((ev) => {
|
|
490
492
|
const { width, height, beforeTranslate } = ev.drag;
|
|
491
493
|
const frameSnapShot = this.framesSnapShot.find(
|
|
492
|
-
(frameItem) => frameItem.id ===
|
|
494
|
+
(frameItem) => frameItem.id === getIdFromEl()(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
|
|
493
495
|
);
|
|
494
496
|
if (!frameSnapShot) return;
|
|
495
497
|
const targeEl = this.targetList.find(
|
|
496
|
-
(targetItem) => targetItem
|
|
498
|
+
(targetItem) => getIdFromEl()(targetItem) === getIdFromEl()(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
|
|
497
499
|
);
|
|
498
500
|
if (!targeEl) return;
|
|
499
|
-
const isParentIncluded = this.targetList.find(
|
|
501
|
+
const isParentIncluded = this.targetList.find(
|
|
502
|
+
(targetItem) => getIdFromEl()(targetItem) === getIdFromEl()(targeEl.parentElement)
|
|
503
|
+
);
|
|
500
504
|
if (!isParentIncluded) {
|
|
501
505
|
const { marginLeft, marginTop } = getMarginValue(targeEl);
|
|
502
506
|
targeEl.style.left = `${frameSnapShot.left + beforeTranslate[0] - marginLeft}px`;
|
|
@@ -516,14 +520,16 @@ class DragResizeHelper {
|
|
|
516
520
|
const { events } = e;
|
|
517
521
|
events.forEach((ev) => {
|
|
518
522
|
const frameSnapShot = this.framesSnapShot.find(
|
|
519
|
-
(frameItem) =>
|
|
523
|
+
(frameItem) => getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getIdFromEl()(ev.target)?.endsWith(frameItem.id)
|
|
520
524
|
);
|
|
521
525
|
if (!frameSnapShot) return;
|
|
522
526
|
const targeEl = this.targetList.find(
|
|
523
|
-
(targetItem) =>
|
|
527
|
+
(targetItem) => getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getIdFromEl()(targetItem) && getIdFromEl()(ev.target)?.endsWith(getIdFromEl()(targetItem))
|
|
524
528
|
);
|
|
525
529
|
if (!targeEl) return;
|
|
526
|
-
const isParentIncluded = this.targetList.find(
|
|
530
|
+
const isParentIncluded = this.targetList.find(
|
|
531
|
+
(targetItem) => getIdFromEl()(targetItem) === getIdFromEl()(targeEl.parentElement)
|
|
532
|
+
);
|
|
527
533
|
if (!isParentIncluded) {
|
|
528
534
|
const { marginLeft, marginTop } = getMarginValue(targeEl);
|
|
529
535
|
targeEl.style.left = `${frameSnapShot.left + ev.beforeTranslate[0] - marginLeft}px`;
|
|
@@ -542,7 +548,7 @@ class DragResizeHelper {
|
|
|
542
548
|
let shadowEl = this.getShadowEl();
|
|
543
549
|
const shadowEls = this.getShadowEls();
|
|
544
550
|
if (shadowEls.length) {
|
|
545
|
-
shadowEl = shadowEls.find((item) =>
|
|
551
|
+
shadowEl = shadowEls.find((item) => getIdFromEl()(item)?.endsWith(getIdFromEl()(el) || ""));
|
|
546
552
|
}
|
|
547
553
|
if (parentEl && this.mode === Mode.ABSOLUTE && shadowEl) {
|
|
548
554
|
const targetShadowHtmlEl = shadowEl;
|
|
@@ -563,10 +569,10 @@ class DragResizeHelper {
|
|
|
563
569
|
if (this.framesSnapShot.length > 0) return;
|
|
564
570
|
events.forEach((ev) => {
|
|
565
571
|
const matchEventTarget = this.targetList.find(
|
|
566
|
-
(targetItem) =>
|
|
572
|
+
(targetItem) => getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getIdFromEl()(ev.target)?.endsWith(getIdFromEl()(targetItem) || "")
|
|
567
573
|
);
|
|
568
574
|
if (!matchEventTarget) return;
|
|
569
|
-
const id =
|
|
575
|
+
const id = getIdFromEl()(matchEventTarget);
|
|
570
576
|
id && this.framesSnapShot.push({
|
|
571
577
|
left: matchEventTarget.offsetLeft,
|
|
572
578
|
top: matchEventTarget.offsetTop,
|
|
@@ -581,35 +587,26 @@ class DragResizeHelper {
|
|
|
581
587
|
if (this.ghostEl) {
|
|
582
588
|
this.destroyGhostEl();
|
|
583
589
|
}
|
|
584
|
-
const ghostEl =
|
|
585
|
-
this.setGhostElChildrenId(ghostEl);
|
|
590
|
+
const ghostEl = document.createElement("div");
|
|
586
591
|
const { top, left } = getAbsolutePosition(el, getOffset(el));
|
|
587
|
-
setIdToEl()(ghostEl, `${GHOST_EL_ID_PREFIX}${
|
|
588
|
-
ghostEl.style.
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
592
|
+
setIdToEl()(ghostEl, `${GHOST_EL_ID_PREFIX}${getIdFromEl()(el)}`);
|
|
593
|
+
ghostEl.style.cssText = `
|
|
594
|
+
z-index: ${ZIndex.GHOST_EL};
|
|
595
|
+
opacity: .6;
|
|
596
|
+
position: absolute;
|
|
597
|
+
left: ${left}px;
|
|
598
|
+
top: ${top}px;
|
|
599
|
+
margin: 0;
|
|
600
|
+
background: blue;
|
|
601
|
+
width: ${el.clientWidth}px;
|
|
602
|
+
height: ${el.clientHeight}px;
|
|
603
|
+
`;
|
|
595
604
|
el.after(ghostEl);
|
|
596
605
|
return ghostEl;
|
|
597
606
|
}
|
|
598
|
-
setGhostElChildrenId(el) {
|
|
599
|
-
for (const child of Array.from(el.children)) {
|
|
600
|
-
const el2 = child;
|
|
601
|
-
const id = getId(el2);
|
|
602
|
-
if (id) {
|
|
603
|
-
setIdToEl()(el2, `${GHOST_EL_ID_PREFIX}${id}`);
|
|
604
|
-
}
|
|
605
|
-
if (child.children.length) {
|
|
606
|
-
this.setGhostElChildrenId(child);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
607
|
}
|
|
611
608
|
|
|
612
|
-
const ableCss = ".moveable-button {\n width: 20px;\n height: 20px;\n background: #4af;\n border-radius: 4px;\n appearance: none;\n border: 0;\n color: white;\n font-size: 12px;\n font-weight: bold;\n margin-left: 2px;\n position: relative;\n}\n.moveable-remove-button:before, .moveable-remove-button:after {\n content: \"\";\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n width: 14px;\n height: 2px;\n background: #fff;\n border-radius: 1px;\n cursor: pointer;\n}\n.moveable-remove-button:after {\n transform: translate(-50%, -50%) rotate(-45deg);\n}\n\n.moveable-select-parent-arrow-top-icon {\n transform: rotateZ(-45deg);\n width: 4px;\n height: 4px;\n border-color: #fff;\n border-width: 2px 2px 0 0;\n border-style: solid;\n position: absolute;\n left: 4px;\n top: 4px;\n}\n\n.moveable-select-parent-arrow-body-icon {\n width: 7px;\n height: 11px;\n border-color: #fff;\n border-width: 0 0 2px 2px;\n border-style: solid;\n}\n\n.moveable-drag-area-button {\n cursor: move;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon {\n width: 2px;\n height: 2px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-top {\n transform: rotateZ(-45deg) translateX(-50%);\n left: 50%;\n top: 3px;\n transform-origin: left;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-bottom {\n transform: rotateZ(135deg) translateX(-50%);\n transform-origin: left;\n left: 50%;\n top: auto;\n bottom: 3px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-right {\n transform: rotateZ(45deg) translateY(-50%);\n transform-origin: top;\n right: 3px;\n left: auto;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-left {\n transform: rotateZ(235deg) translateY(-50%);\n transform-origin: top;\n left: 3px;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-horizontal {\n width: 2px;\n height: 11px;\n background-color: #fff;\n position: absolute;\n transform: translateX(-50%);\n left: 50%;\n top: 4px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-vertical {\n width: 11px;\n height: 2px;\n background-color: #fff;\n position: absolute;\n transform: translateY(-50%);\n left: 4px;\n top: 50%;;\n}\n\n";
|
|
609
|
+
const ableCss = ".moveable-button {\n width: 20px;\n height: 20px;\n background: #4af;\n border-radius: 4px;\n appearance: none;\n border: 0;\n color: white;\n font-size: 12px;\n font-weight: bold;\n margin-left: 2px;\n position: relative;\n cursor: pointer;\n}\n.moveable-remove-button:before, .moveable-remove-button:after {\n content: \"\";\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n width: 14px;\n height: 2px;\n background: #fff;\n border-radius: 1px;\n cursor: pointer;\n}\n.moveable-remove-button:after {\n transform: translate(-50%, -50%) rotate(-45deg);\n}\n\n.moveable-select-parent-arrow-top-icon {\n transform: rotateZ(-45deg);\n width: 4px;\n height: 4px;\n border-color: #fff;\n border-width: 2px 2px 0 0;\n border-style: solid;\n position: absolute;\n left: 4px;\n top: 4px;\n}\n\n.moveable-select-parent-arrow-body-icon {\n width: 7px;\n height: 11px;\n border-color: #fff;\n border-width: 0 0 2px 2px;\n border-style: solid;\n}\n\n.moveable-drag-area-button {\n cursor: move;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon {\n width: 2px;\n height: 2px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-top {\n transform: rotateZ(-45deg) translateX(-50%);\n left: 50%;\n top: 3px;\n transform-origin: left;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-bottom {\n transform: rotateZ(135deg) translateX(-50%);\n transform-origin: left;\n left: 50%;\n top: auto;\n bottom: 3px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-right {\n transform: rotateZ(45deg) translateY(-50%);\n transform-origin: top;\n right: 3px;\n left: auto;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-left {\n transform: rotateZ(235deg) translateY(-50%);\n transform-origin: top;\n left: 3px;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-horizontal {\n width: 2px;\n height: 11px;\n background-color: #fff;\n position: absolute;\n transform: translateX(-50%);\n left: 50%;\n top: 4px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-vertical {\n width: 11px;\n height: 2px;\n background-color: #fff;\n position: absolute;\n transform: translateY(-50%);\n left: 4px;\n top: 50%;;\n}\n\n.moveable-rerender-button img {\n position: absolute;\n left: 2px;\n top: 2px;\n}\n";
|
|
613
610
|
|
|
614
611
|
const MoveableActionsAble = (handler, customizedButton = []) => ({
|
|
615
612
|
name: "actions",
|
|
@@ -646,6 +643,21 @@ const MoveableActionsAble = (handler, customizedButton = []) => ({
|
|
|
646
643
|
const options = buttonRenderer(React);
|
|
647
644
|
return React.createElement("button", options.props || {}, ...options.children || []);
|
|
648
645
|
}),
|
|
646
|
+
React.createElement(
|
|
647
|
+
"button",
|
|
648
|
+
{
|
|
649
|
+
className: "moveable-button moveable-rerender-button",
|
|
650
|
+
title: "重新收集依赖后渲染",
|
|
651
|
+
onClick: () => {
|
|
652
|
+
handler(AbleActionEventType.RERENDER);
|
|
653
|
+
}
|
|
654
|
+
},
|
|
655
|
+
React.createElement("img", {
|
|
656
|
+
src: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLXJlcGxhY2UiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iI2ZmZmZmZiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBzdHJva2U9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KICA8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iNiIgaGVpZ2h0PSI2IiByeD0iMSIgLz4KICA8cmVjdCB4PSIxNSIgeT0iMTUiIHdpZHRoPSI2IiBoZWlnaHQ9IjYiIHJ4PSIxIiAvPgogIDxwYXRoIGQ9Ik0yMSAxMXYtM2EyIDIgMCAwIDAgLTIgLTJoLTZsMyAzbTAgLTZsLTMgMyIgLz4KICA8cGF0aCBkPSJNMyAxM3YzYTIgMiAwIDAgMCAyIDJoNmwtMyAtM20wIDZsMyAtMyIgLz4KPC9zdmc+CgoK",
|
|
657
|
+
width: "16",
|
|
658
|
+
height: "16"
|
|
659
|
+
})
|
|
660
|
+
),
|
|
649
661
|
React.createElement(
|
|
650
662
|
"button",
|
|
651
663
|
{
|
|
@@ -1689,6 +1701,8 @@ class ActionManager extends EventEmitter {
|
|
|
1689
1701
|
data: [{ el: drTarget }]
|
|
1690
1702
|
};
|
|
1691
1703
|
this.emit("remove", data);
|
|
1704
|
+
}).on(AbleActionEventType.RERENDER, () => {
|
|
1705
|
+
this.emit("rerender");
|
|
1692
1706
|
}).on("drag-start", (e) => {
|
|
1693
1707
|
this.emit("drag-start", e);
|
|
1694
1708
|
});
|
|
@@ -2712,6 +2726,8 @@ class StageCore extends EventEmitter$1 {
|
|
|
2712
2726
|
this.emit("sort", data);
|
|
2713
2727
|
}).on("select-parent", () => {
|
|
2714
2728
|
this.emit("select-parent");
|
|
2729
|
+
}).on("rerender", () => {
|
|
2730
|
+
this.emit("rerender");
|
|
2715
2731
|
}).on("remove", (data) => {
|
|
2716
2732
|
this.emit("remove", data);
|
|
2717
2733
|
});
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
var AbleActionEventType = /* @__PURE__ */ ((AbleActionEventType2) => {
|
|
40
40
|
AbleActionEventType2["SELECT_PARENT"] = "select-parent";
|
|
41
41
|
AbleActionEventType2["REMOVE"] = "remove";
|
|
42
|
+
AbleActionEventType2["RERENDER"] = "rerender";
|
|
42
43
|
return AbleActionEventType2;
|
|
43
44
|
})(AbleActionEventType || {});
|
|
44
45
|
var ContainerHighlightType = /* @__PURE__ */ ((ContainerHighlightType2) => {
|
|
@@ -175,7 +176,7 @@
|
|
|
175
176
|
let swapIndex = 0;
|
|
176
177
|
let addUpH = target.clientHeight;
|
|
177
178
|
const brothers = Array.from(target.parentNode?.children || []).filter(
|
|
178
|
-
(
|
|
179
|
+
(child) => !utils.getIdFromEl()(child)?.startsWith(GHOST_EL_ID_PREFIX)
|
|
179
180
|
);
|
|
180
181
|
const index = brothers.indexOf(target);
|
|
181
182
|
const downEls = brothers.slice(index + 1);
|
|
@@ -191,14 +192,15 @@
|
|
|
191
192
|
addUpH += ele.clientHeight / 2;
|
|
192
193
|
swapIndex = i;
|
|
193
194
|
}
|
|
195
|
+
const src = utils.getIdFromEl()(target) || "";
|
|
194
196
|
return {
|
|
195
|
-
src
|
|
196
|
-
dist: downEls.length && swapIndex > -1 ? downEls[swapIndex]
|
|
197
|
+
src,
|
|
198
|
+
dist: downEls.length && swapIndex > -1 ? utils.getIdFromEl()(downEls[swapIndex]) || "" : src
|
|
197
199
|
};
|
|
198
200
|
};
|
|
199
201
|
const up = (deltaTop, target) => {
|
|
200
202
|
const brothers = Array.from(target.parentNode?.children || []).filter(
|
|
201
|
-
(
|
|
203
|
+
(child) => !utils.getIdFromEl()(child)?.startsWith(GHOST_EL_ID_PREFIX)
|
|
202
204
|
);
|
|
203
205
|
const index = brothers.indexOf(target);
|
|
204
206
|
const upEls = brothers.slice(0, index);
|
|
@@ -213,9 +215,10 @@
|
|
|
213
215
|
addUpH += ele.clientHeight / 2;
|
|
214
216
|
swapIndex = i;
|
|
215
217
|
}
|
|
218
|
+
const src = utils.getIdFromEl()(target) || "";
|
|
216
219
|
return {
|
|
217
|
-
src
|
|
218
|
-
dist: upEls.length && swapIndex > -1 ? upEls[swapIndex]
|
|
220
|
+
src,
|
|
221
|
+
dist: upEls.length && swapIndex > -1 ? utils.getIdFromEl()(upEls[swapIndex]) || "" : src
|
|
219
222
|
};
|
|
220
223
|
};
|
|
221
224
|
const isMoveableButton = (target) => target.classList.contains("moveable-button") || target.parentElement?.classList.contains("moveable-button");
|
|
@@ -325,7 +328,6 @@
|
|
|
325
328
|
};
|
|
326
329
|
}
|
|
327
330
|
|
|
328
|
-
const getId = utils.getIdFromEl();
|
|
329
331
|
class DragResizeHelper {
|
|
330
332
|
/** 目标节点在蒙层上的占位节点,用于跟鼠标交互,避免鼠标事件直接作用到目标节点 */
|
|
331
333
|
targetShadow;
|
|
@@ -485,14 +487,16 @@
|
|
|
485
487
|
events.forEach((ev) => {
|
|
486
488
|
const { width, height, beforeTranslate } = ev.drag;
|
|
487
489
|
const frameSnapShot = this.framesSnapShot.find(
|
|
488
|
-
(frameItem) => frameItem.id ===
|
|
490
|
+
(frameItem) => frameItem.id === utils.getIdFromEl()(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
|
|
489
491
|
);
|
|
490
492
|
if (!frameSnapShot) return;
|
|
491
493
|
const targeEl = this.targetList.find(
|
|
492
|
-
(targetItem) => targetItem
|
|
494
|
+
(targetItem) => utils.getIdFromEl()(targetItem) === utils.getIdFromEl()(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
|
|
493
495
|
);
|
|
494
496
|
if (!targeEl) return;
|
|
495
|
-
const isParentIncluded = this.targetList.find(
|
|
497
|
+
const isParentIncluded = this.targetList.find(
|
|
498
|
+
(targetItem) => utils.getIdFromEl()(targetItem) === utils.getIdFromEl()(targeEl.parentElement)
|
|
499
|
+
);
|
|
496
500
|
if (!isParentIncluded) {
|
|
497
501
|
const { marginLeft, marginTop } = getMarginValue(targeEl);
|
|
498
502
|
targeEl.style.left = `${frameSnapShot.left + beforeTranslate[0] - marginLeft}px`;
|
|
@@ -512,14 +516,16 @@
|
|
|
512
516
|
const { events } = e;
|
|
513
517
|
events.forEach((ev) => {
|
|
514
518
|
const frameSnapShot = this.framesSnapShot.find(
|
|
515
|
-
(frameItem) =>
|
|
519
|
+
(frameItem) => utils.getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && utils.getIdFromEl()(ev.target)?.endsWith(frameItem.id)
|
|
516
520
|
);
|
|
517
521
|
if (!frameSnapShot) return;
|
|
518
522
|
const targeEl = this.targetList.find(
|
|
519
|
-
(targetItem) =>
|
|
523
|
+
(targetItem) => utils.getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && utils.getIdFromEl()(targetItem) && utils.getIdFromEl()(ev.target)?.endsWith(utils.getIdFromEl()(targetItem))
|
|
520
524
|
);
|
|
521
525
|
if (!targeEl) return;
|
|
522
|
-
const isParentIncluded = this.targetList.find(
|
|
526
|
+
const isParentIncluded = this.targetList.find(
|
|
527
|
+
(targetItem) => utils.getIdFromEl()(targetItem) === utils.getIdFromEl()(targeEl.parentElement)
|
|
528
|
+
);
|
|
523
529
|
if (!isParentIncluded) {
|
|
524
530
|
const { marginLeft, marginTop } = getMarginValue(targeEl);
|
|
525
531
|
targeEl.style.left = `${frameSnapShot.left + ev.beforeTranslate[0] - marginLeft}px`;
|
|
@@ -538,7 +544,7 @@
|
|
|
538
544
|
let shadowEl = this.getShadowEl();
|
|
539
545
|
const shadowEls = this.getShadowEls();
|
|
540
546
|
if (shadowEls.length) {
|
|
541
|
-
shadowEl = shadowEls.find((item) =>
|
|
547
|
+
shadowEl = shadowEls.find((item) => utils.getIdFromEl()(item)?.endsWith(utils.getIdFromEl()(el) || ""));
|
|
542
548
|
}
|
|
543
549
|
if (parentEl && this.mode === Mode.ABSOLUTE && shadowEl) {
|
|
544
550
|
const targetShadowHtmlEl = shadowEl;
|
|
@@ -559,10 +565,10 @@
|
|
|
559
565
|
if (this.framesSnapShot.length > 0) return;
|
|
560
566
|
events.forEach((ev) => {
|
|
561
567
|
const matchEventTarget = this.targetList.find(
|
|
562
|
-
(targetItem) =>
|
|
568
|
+
(targetItem) => utils.getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && utils.getIdFromEl()(ev.target)?.endsWith(utils.getIdFromEl()(targetItem) || "")
|
|
563
569
|
);
|
|
564
570
|
if (!matchEventTarget) return;
|
|
565
|
-
const id =
|
|
571
|
+
const id = utils.getIdFromEl()(matchEventTarget);
|
|
566
572
|
id && this.framesSnapShot.push({
|
|
567
573
|
left: matchEventTarget.offsetLeft,
|
|
568
574
|
top: matchEventTarget.offsetTop,
|
|
@@ -577,35 +583,26 @@
|
|
|
577
583
|
if (this.ghostEl) {
|
|
578
584
|
this.destroyGhostEl();
|
|
579
585
|
}
|
|
580
|
-
const ghostEl =
|
|
581
|
-
this.setGhostElChildrenId(ghostEl);
|
|
586
|
+
const ghostEl = document.createElement("div");
|
|
582
587
|
const { top, left } = getAbsolutePosition(el, getOffset(el));
|
|
583
|
-
utils.setIdToEl()(ghostEl, `${GHOST_EL_ID_PREFIX}${
|
|
584
|
-
ghostEl.style.
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
588
|
+
utils.setIdToEl()(ghostEl, `${GHOST_EL_ID_PREFIX}${utils.getIdFromEl()(el)}`);
|
|
589
|
+
ghostEl.style.cssText = `
|
|
590
|
+
z-index: ${ZIndex.GHOST_EL};
|
|
591
|
+
opacity: .6;
|
|
592
|
+
position: absolute;
|
|
593
|
+
left: ${left}px;
|
|
594
|
+
top: ${top}px;
|
|
595
|
+
margin: 0;
|
|
596
|
+
background: blue;
|
|
597
|
+
width: ${el.clientWidth}px;
|
|
598
|
+
height: ${el.clientHeight}px;
|
|
599
|
+
`;
|
|
591
600
|
el.after(ghostEl);
|
|
592
601
|
return ghostEl;
|
|
593
602
|
}
|
|
594
|
-
setGhostElChildrenId(el) {
|
|
595
|
-
for (const child of Array.from(el.children)) {
|
|
596
|
-
const el2 = child;
|
|
597
|
-
const id = getId(el2);
|
|
598
|
-
if (id) {
|
|
599
|
-
utils.setIdToEl()(el2, `${GHOST_EL_ID_PREFIX}${id}`);
|
|
600
|
-
}
|
|
601
|
-
if (child.children.length) {
|
|
602
|
-
this.setGhostElChildrenId(child);
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
603
|
}
|
|
607
604
|
|
|
608
|
-
const ableCss = ".moveable-button {\n width: 20px;\n height: 20px;\n background: #4af;\n border-radius: 4px;\n appearance: none;\n border: 0;\n color: white;\n font-size: 12px;\n font-weight: bold;\n margin-left: 2px;\n position: relative;\n}\n.moveable-remove-button:before, .moveable-remove-button:after {\n content: \"\";\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n width: 14px;\n height: 2px;\n background: #fff;\n border-radius: 1px;\n cursor: pointer;\n}\n.moveable-remove-button:after {\n transform: translate(-50%, -50%) rotate(-45deg);\n}\n\n.moveable-select-parent-arrow-top-icon {\n transform: rotateZ(-45deg);\n width: 4px;\n height: 4px;\n border-color: #fff;\n border-width: 2px 2px 0 0;\n border-style: solid;\n position: absolute;\n left: 4px;\n top: 4px;\n}\n\n.moveable-select-parent-arrow-body-icon {\n width: 7px;\n height: 11px;\n border-color: #fff;\n border-width: 0 0 2px 2px;\n border-style: solid;\n}\n\n.moveable-drag-area-button {\n cursor: move;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon {\n width: 2px;\n height: 2px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-top {\n transform: rotateZ(-45deg) translateX(-50%);\n left: 50%;\n top: 3px;\n transform-origin: left;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-bottom {\n transform: rotateZ(135deg) translateX(-50%);\n transform-origin: left;\n left: 50%;\n top: auto;\n bottom: 3px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-right {\n transform: rotateZ(45deg) translateY(-50%);\n transform-origin: top;\n right: 3px;\n left: auto;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-left {\n transform: rotateZ(235deg) translateY(-50%);\n transform-origin: top;\n left: 3px;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-horizontal {\n width: 2px;\n height: 11px;\n background-color: #fff;\n position: absolute;\n transform: translateX(-50%);\n left: 50%;\n top: 4px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-vertical {\n width: 11px;\n height: 2px;\n background-color: #fff;\n position: absolute;\n transform: translateY(-50%);\n left: 4px;\n top: 50%;;\n}\n\n";
|
|
605
|
+
const ableCss = ".moveable-button {\n width: 20px;\n height: 20px;\n background: #4af;\n border-radius: 4px;\n appearance: none;\n border: 0;\n color: white;\n font-size: 12px;\n font-weight: bold;\n margin-left: 2px;\n position: relative;\n cursor: pointer;\n}\n.moveable-remove-button:before, .moveable-remove-button:after {\n content: \"\";\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n width: 14px;\n height: 2px;\n background: #fff;\n border-radius: 1px;\n cursor: pointer;\n}\n.moveable-remove-button:after {\n transform: translate(-50%, -50%) rotate(-45deg);\n}\n\n.moveable-select-parent-arrow-top-icon {\n transform: rotateZ(-45deg);\n width: 4px;\n height: 4px;\n border-color: #fff;\n border-width: 2px 2px 0 0;\n border-style: solid;\n position: absolute;\n left: 4px;\n top: 4px;\n}\n\n.moveable-select-parent-arrow-body-icon {\n width: 7px;\n height: 11px;\n border-color: #fff;\n border-width: 0 0 2px 2px;\n border-style: solid;\n}\n\n.moveable-drag-area-button {\n cursor: move;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon {\n width: 2px;\n height: 2px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-top {\n transform: rotateZ(-45deg) translateX(-50%);\n left: 50%;\n top: 3px;\n transform-origin: left;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-bottom {\n transform: rotateZ(135deg) translateX(-50%);\n transform-origin: left;\n left: 50%;\n top: auto;\n bottom: 3px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-right {\n transform: rotateZ(45deg) translateY(-50%);\n transform-origin: top;\n right: 3px;\n left: auto;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-left {\n transform: rotateZ(235deg) translateY(-50%);\n transform-origin: top;\n left: 3px;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-horizontal {\n width: 2px;\n height: 11px;\n background-color: #fff;\n position: absolute;\n transform: translateX(-50%);\n left: 50%;\n top: 4px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-vertical {\n width: 11px;\n height: 2px;\n background-color: #fff;\n position: absolute;\n transform: translateY(-50%);\n left: 4px;\n top: 50%;;\n}\n\n.moveable-rerender-button img {\n position: absolute;\n left: 2px;\n top: 2px;\n}\n";
|
|
609
606
|
|
|
610
607
|
const MoveableActionsAble = (handler, customizedButton = []) => ({
|
|
611
608
|
name: "actions",
|
|
@@ -642,6 +639,21 @@
|
|
|
642
639
|
const options = buttonRenderer(React);
|
|
643
640
|
return React.createElement("button", options.props || {}, ...options.children || []);
|
|
644
641
|
}),
|
|
642
|
+
React.createElement(
|
|
643
|
+
"button",
|
|
644
|
+
{
|
|
645
|
+
className: "moveable-button moveable-rerender-button",
|
|
646
|
+
title: "重新收集依赖后渲染",
|
|
647
|
+
onClick: () => {
|
|
648
|
+
handler(AbleActionEventType.RERENDER);
|
|
649
|
+
}
|
|
650
|
+
},
|
|
651
|
+
React.createElement("img", {
|
|
652
|
+
src: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLXJlcGxhY2UiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iI2ZmZmZmZiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBzdHJva2U9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KICA8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iNiIgaGVpZ2h0PSI2IiByeD0iMSIgLz4KICA8cmVjdCB4PSIxNSIgeT0iMTUiIHdpZHRoPSI2IiBoZWlnaHQ9IjYiIHJ4PSIxIiAvPgogIDxwYXRoIGQ9Ik0yMSAxMXYtM2EyIDIgMCAwIDAgLTIgLTJoLTZsMyAzbTAgLTZsLTMgMyIgLz4KICA8cGF0aCBkPSJNMyAxM3YzYTIgMiAwIDAgMCAyIDJoNmwtMyAtM20wIDZsMyAtMyIgLz4KPC9zdmc+CgoK",
|
|
653
|
+
width: "16",
|
|
654
|
+
height: "16"
|
|
655
|
+
})
|
|
656
|
+
),
|
|
645
657
|
React.createElement(
|
|
646
658
|
"button",
|
|
647
659
|
{
|
|
@@ -1685,6 +1697,8 @@
|
|
|
1685
1697
|
data: [{ el: drTarget }]
|
|
1686
1698
|
};
|
|
1687
1699
|
this.emit("remove", data);
|
|
1700
|
+
}).on(AbleActionEventType.RERENDER, () => {
|
|
1701
|
+
this.emit("rerender");
|
|
1688
1702
|
}).on("drag-start", (e) => {
|
|
1689
1703
|
this.emit("drag-start", e);
|
|
1690
1704
|
});
|
|
@@ -2708,6 +2722,8 @@
|
|
|
2708
2722
|
this.emit("sort", data);
|
|
2709
2723
|
}).on("select-parent", () => {
|
|
2710
2724
|
this.emit("select-parent");
|
|
2725
|
+
}).on("rerender", () => {
|
|
2726
|
+
this.emit("rerender");
|
|
2711
2727
|
}).on("remove", (data) => {
|
|
2712
2728
|
this.emit("remove", data);
|
|
2713
2729
|
});
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.5.0
|
|
2
|
+
"version": "1.5.0",
|
|
3
3
|
"name": "@tmagic/stage",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/tmagic-stage.umd.cjs",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"node": ">=18"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
|
+
"directory": "packages/stage",
|
|
26
27
|
"type": "git",
|
|
27
28
|
"url": "https://github.com/Tencent/tmagic-editor.git"
|
|
28
29
|
},
|
|
@@ -41,13 +42,13 @@
|
|
|
41
42
|
"@types/node": "^18.19.0",
|
|
42
43
|
"rimraf": "^3.0.2",
|
|
43
44
|
"sass": "^1.78.0",
|
|
44
|
-
"vite": "^5.4.
|
|
45
|
+
"vite": "^5.4.10"
|
|
45
46
|
},
|
|
46
47
|
"peerDependencies": {
|
|
47
48
|
"typescript": "*",
|
|
48
|
-
"@tmagic/
|
|
49
|
-
"@tmagic/
|
|
50
|
-
"@tmagic/
|
|
49
|
+
"@tmagic/core": "1.5.0",
|
|
50
|
+
"@tmagic/utils": "1.5.0",
|
|
51
|
+
"@tmagic/schema": "1.5.0"
|
|
51
52
|
},
|
|
52
53
|
"peerDependenciesMeta": {
|
|
53
54
|
"typescript": {
|
package/src/ActionManager.ts
CHANGED
|
@@ -445,6 +445,9 @@ export default class ActionManager extends EventEmitter {
|
|
|
445
445
|
};
|
|
446
446
|
this.emit('remove', data);
|
|
447
447
|
})
|
|
448
|
+
.on(AbleActionEventType.RERENDER, () => {
|
|
449
|
+
this.emit('rerender');
|
|
450
|
+
})
|
|
448
451
|
.on('drag-start', (e: OnDragStart) => {
|
|
449
452
|
this.emit('drag-start', e);
|
|
450
453
|
});
|
package/src/DragResizeHelper.ts
CHANGED
|
@@ -39,8 +39,6 @@ import TargetShadow from './TargetShadow';
|
|
|
39
39
|
import type { DragResizeHelperConfig, Rect, TargetElement } from './types';
|
|
40
40
|
import { getAbsolutePosition, getBorderWidth, getMarginValue, getOffset } from './util';
|
|
41
41
|
|
|
42
|
-
const getId = getIdFromEl();
|
|
43
|
-
|
|
44
42
|
/**
|
|
45
43
|
* 拖拽/改变大小等操作发生时,moveable会抛出各种状态事件,DragResizeHelper负责响应这些事件,对目标节点target和拖拽节点targetShadow进行修改;
|
|
46
44
|
* 其中目标节点是DragResizeHelper直接改的,targetShadow作为直接被操作的拖拽框,是调用moveableHelper改的;
|
|
@@ -243,15 +241,17 @@ export default class DragResizeHelper {
|
|
|
243
241
|
events.forEach((ev) => {
|
|
244
242
|
const { width, height, beforeTranslate } = ev.drag;
|
|
245
243
|
const frameSnapShot = this.framesSnapShot.find(
|
|
246
|
-
(frameItem) => frameItem.id ===
|
|
244
|
+
(frameItem) => frameItem.id === getIdFromEl()(ev.target)?.replace(DRAG_EL_ID_PREFIX, ''),
|
|
247
245
|
);
|
|
248
246
|
if (!frameSnapShot) return;
|
|
249
247
|
const targeEl = this.targetList.find(
|
|
250
|
-
(targetItem) => targetItem
|
|
248
|
+
(targetItem) => getIdFromEl()(targetItem) === getIdFromEl()(ev.target)?.replace(DRAG_EL_ID_PREFIX, ''),
|
|
251
249
|
);
|
|
252
250
|
if (!targeEl) return;
|
|
253
251
|
// 元素与其所属组同时加入多选列表时,只更新父元素
|
|
254
|
-
const isParentIncluded = this.targetList.find(
|
|
252
|
+
const isParentIncluded = this.targetList.find(
|
|
253
|
+
(targetItem) => getIdFromEl()(targetItem) === getIdFromEl()(targeEl.parentElement),
|
|
254
|
+
);
|
|
255
255
|
|
|
256
256
|
if (!isParentIncluded) {
|
|
257
257
|
// 更新页面元素位置
|
|
@@ -281,18 +281,21 @@ export default class DragResizeHelper {
|
|
|
281
281
|
// 拖动过程更新
|
|
282
282
|
events.forEach((ev) => {
|
|
283
283
|
const frameSnapShot = this.framesSnapShot.find(
|
|
284
|
-
(frameItem) =>
|
|
284
|
+
(frameItem) =>
|
|
285
|
+
getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getIdFromEl()(ev.target)?.endsWith(frameItem.id),
|
|
285
286
|
);
|
|
286
287
|
if (!frameSnapShot) return;
|
|
287
288
|
const targeEl = this.targetList.find(
|
|
288
289
|
(targetItem) =>
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) &&
|
|
291
|
+
getIdFromEl()(targetItem) &&
|
|
292
|
+
getIdFromEl()(ev.target)?.endsWith(getIdFromEl()(targetItem)!),
|
|
292
293
|
);
|
|
293
294
|
if (!targeEl) return;
|
|
294
295
|
// 元素与其所属组同时加入多选列表时,只更新父元素
|
|
295
|
-
const isParentIncluded = this.targetList.find(
|
|
296
|
+
const isParentIncluded = this.targetList.find(
|
|
297
|
+
(targetItem) => getIdFromEl()(targetItem) === getIdFromEl()(targeEl.parentElement),
|
|
298
|
+
);
|
|
296
299
|
if (!isParentIncluded) {
|
|
297
300
|
// 更新页面元素位置
|
|
298
301
|
const { marginLeft, marginTop } = getMarginValue(targeEl);
|
|
@@ -319,7 +322,7 @@ export default class DragResizeHelper {
|
|
|
319
322
|
const shadowEls = this.getShadowEls();
|
|
320
323
|
|
|
321
324
|
if (shadowEls.length) {
|
|
322
|
-
shadowEl = shadowEls.find((item) =>
|
|
325
|
+
shadowEl = shadowEls.find((item) => getIdFromEl()(item)?.endsWith(getIdFromEl()(el) || ''));
|
|
323
326
|
}
|
|
324
327
|
|
|
325
328
|
if (parentEl && this.mode === Mode.ABSOLUTE && shadowEl) {
|
|
@@ -356,11 +359,12 @@ export default class DragResizeHelper {
|
|
|
356
359
|
// 实际目标元素
|
|
357
360
|
const matchEventTarget = this.targetList.find(
|
|
358
361
|
(targetItem) =>
|
|
359
|
-
|
|
362
|
+
getIdFromEl()(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) &&
|
|
363
|
+
getIdFromEl()(ev.target)?.endsWith(getIdFromEl()(targetItem) || ''),
|
|
360
364
|
);
|
|
361
365
|
if (!matchEventTarget) return;
|
|
362
366
|
|
|
363
|
-
const id =
|
|
367
|
+
const id = getIdFromEl()(matchEventTarget);
|
|
364
368
|
id &&
|
|
365
369
|
this.framesSnapShot.push({
|
|
366
370
|
left: matchEventTarget.offsetLeft,
|
|
@@ -378,32 +382,24 @@ export default class DragResizeHelper {
|
|
|
378
382
|
this.destroyGhostEl();
|
|
379
383
|
}
|
|
380
384
|
|
|
381
|
-
const ghostEl =
|
|
382
|
-
this.setGhostElChildrenId(ghostEl);
|
|
385
|
+
const ghostEl = document.createElement('div') as HTMLElement;
|
|
383
386
|
const { top, left } = getAbsolutePosition(el, getOffset(el));
|
|
384
|
-
setIdToEl()(ghostEl, `${GHOST_EL_ID_PREFIX}${getId(el)}`);
|
|
385
|
-
ghostEl.style.zIndex = ZIndex.GHOST_EL;
|
|
386
|
-
ghostEl.style.opacity = '.5';
|
|
387
|
-
ghostEl.style.position = 'absolute';
|
|
388
|
-
ghostEl.style.left = `${left}px`;
|
|
389
|
-
ghostEl.style.top = `${top}px`;
|
|
390
|
-
ghostEl.style.marginLeft = '0';
|
|
391
|
-
ghostEl.style.marginTop = '0';
|
|
392
|
-
el.after(ghostEl);
|
|
393
|
-
return ghostEl;
|
|
394
|
-
}
|
|
395
387
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
}
|
|
388
|
+
setIdToEl()(ghostEl, `${GHOST_EL_ID_PREFIX}${getIdFromEl()(el)}`);
|
|
389
|
+
|
|
390
|
+
ghostEl.style.cssText = `
|
|
391
|
+
z-index: ${ZIndex.GHOST_EL};
|
|
392
|
+
opacity: .6;
|
|
393
|
+
position: absolute;
|
|
394
|
+
left: ${left}px;
|
|
395
|
+
top: ${top}px;
|
|
396
|
+
margin: 0;
|
|
397
|
+
background: blue;
|
|
398
|
+
width: ${el.clientWidth}px;
|
|
399
|
+
height: ${el.clientHeight}px;
|
|
400
|
+
`;
|
|
401
|
+
el.after(ghostEl);
|
|
403
402
|
|
|
404
|
-
|
|
405
|
-
this.setGhostElChildrenId(child);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
403
|
+
return ghostEl;
|
|
408
404
|
}
|
|
409
405
|
}
|
|
@@ -57,6 +57,21 @@ export default (
|
|
|
57
57
|
return React.createElement('button', options.props || {}, ...(options.children || []));
|
|
58
58
|
}),
|
|
59
59
|
|
|
60
|
+
React.createElement(
|
|
61
|
+
'button',
|
|
62
|
+
{
|
|
63
|
+
className: 'moveable-button moveable-rerender-button',
|
|
64
|
+
title: '重新收集依赖后渲染',
|
|
65
|
+
onClick: () => {
|
|
66
|
+
handler(AbleActionEventType.RERENDER);
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
React.createElement('img', {
|
|
70
|
+
src: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLXJlcGxhY2UiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iI2ZmZmZmZiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBzdHJva2U9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KICA8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iNiIgaGVpZ2h0PSI2IiByeD0iMSIgLz4KICA8cmVjdCB4PSIxNSIgeT0iMTUiIHdpZHRoPSI2IiBoZWlnaHQ9IjYiIHJ4PSIxIiAvPgogIDxwYXRoIGQ9Ik0yMSAxMXYtM2EyIDIgMCAwIDAgLTIgLTJoLTZsMyAzbTAgLTZsLTMgMyIgLz4KICA8cGF0aCBkPSJNMyAxM3YzYTIgMiAwIDAgMCAyIDJoNmwtMyAtM20wIDZsMyAtMyIgLz4KPC9zdmc+CgoK',
|
|
71
|
+
width: '16',
|
|
72
|
+
height: '16',
|
|
73
|
+
}),
|
|
74
|
+
),
|
|
60
75
|
React.createElement(
|
|
61
76
|
'button',
|
|
62
77
|
{
|
package/src/StageCore.ts
CHANGED
|
@@ -373,6 +373,9 @@ export default class StageCore extends EventEmitter {
|
|
|
373
373
|
.on('select-parent', () => {
|
|
374
374
|
this.emit('select-parent');
|
|
375
375
|
})
|
|
376
|
+
.on('rerender', () => {
|
|
377
|
+
this.emit('rerender');
|
|
378
|
+
})
|
|
376
379
|
.on('remove', (data: RemoveEventData) => {
|
|
377
380
|
this.emit('remove', data);
|
|
378
381
|
});
|
package/src/StageDragResize.ts
CHANGED
|
@@ -22,7 +22,7 @@ import Moveable, { MoveableOptions } from 'moveable';
|
|
|
22
22
|
import { getIdFromEl } from '@tmagic/utils';
|
|
23
23
|
|
|
24
24
|
import { Mode, StageDragStatus } from './const';
|
|
25
|
-
import DragResizeHelper from './DragResizeHelper';
|
|
25
|
+
import type DragResizeHelper from './DragResizeHelper';
|
|
26
26
|
import MoveableOptionsManager from './MoveableOptionsManager';
|
|
27
27
|
import type {
|
|
28
28
|
DelayedMarkContainer,
|
package/src/const.ts
CHANGED
package/src/moveable-able.css
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
font-weight: bold;
|
|
11
11
|
margin-left: 2px;
|
|
12
12
|
position: relative;
|
|
13
|
+
cursor: pointer;
|
|
13
14
|
}
|
|
14
15
|
.moveable-remove-button:before, .moveable-remove-button:after {
|
|
15
16
|
content: "";
|
|
@@ -106,3 +107,8 @@
|
|
|
106
107
|
top: 50%;;
|
|
107
108
|
}
|
|
108
109
|
|
|
110
|
+
.moveable-rerender-button img {
|
|
111
|
+
position: absolute;
|
|
112
|
+
left: 2px;
|
|
113
|
+
top: 2px;
|
|
114
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -251,6 +251,7 @@ export interface CoreEvents {
|
|
|
251
251
|
update: [data: UpdateEventData];
|
|
252
252
|
sort: [data: SortEventData];
|
|
253
253
|
'select-parent': [];
|
|
254
|
+
rerender: [];
|
|
254
255
|
remove: [data: RemoveEventData];
|
|
255
256
|
highlight: [highlightEl: HTMLElement];
|
|
256
257
|
mousemove: [event: MouseEvent];
|
|
@@ -283,6 +284,7 @@ export interface ActionManagerEvents {
|
|
|
283
284
|
sort: [data: SortEventData];
|
|
284
285
|
remove: [data: RemoveEventData];
|
|
285
286
|
select: [selectedEl: HTMLElement | null, event: MouseEvent];
|
|
287
|
+
rerender: [];
|
|
286
288
|
'select-parent': [];
|
|
287
289
|
'drag-start': [event: OnDragStart];
|
|
288
290
|
'multi-update': [data: UpdateEventData];
|
|
@@ -297,6 +299,7 @@ export interface DrEvents {
|
|
|
297
299
|
'update-moveable': [];
|
|
298
300
|
[AbleActionEventType.REMOVE]: [];
|
|
299
301
|
[AbleActionEventType.SELECT_PARENT]: [];
|
|
302
|
+
[AbleActionEventType.RERENDER]: [];
|
|
300
303
|
'drag-start': [event: OnDragStart];
|
|
301
304
|
update: [data: UpdateEventData];
|
|
302
305
|
sort: [data: SortEventData];
|
package/src/util.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* See the License for the specific language governing permissions and
|
|
16
16
|
* limitations under the License.
|
|
17
17
|
*/
|
|
18
|
-
import { removeClassName } from '@tmagic/utils';
|
|
18
|
+
import { getIdFromEl, removeClassName } from '@tmagic/utils';
|
|
19
19
|
|
|
20
20
|
import { GHOST_EL_ID_PREFIX, Mode, SELECTED_CLASS, ZIndex } from './const';
|
|
21
21
|
import type { Offset, SortEventData, TargetElement } from './types';
|
|
@@ -170,7 +170,7 @@ export const down = (deltaTop: number, target: TargetElement): SortEventData =>
|
|
|
170
170
|
let swapIndex = 0;
|
|
171
171
|
let addUpH = target.clientHeight;
|
|
172
172
|
const brothers = Array.from(target.parentNode?.children || []).filter(
|
|
173
|
-
(
|
|
173
|
+
(child) => !getIdFromEl()(child as HTMLElement)?.startsWith(GHOST_EL_ID_PREFIX),
|
|
174
174
|
);
|
|
175
175
|
const index = brothers.indexOf(target);
|
|
176
176
|
// 往下移动
|
|
@@ -189,9 +189,12 @@ export const down = (deltaTop: number, target: TargetElement): SortEventData =>
|
|
|
189
189
|
addUpH += ele.clientHeight / 2;
|
|
190
190
|
swapIndex = i;
|
|
191
191
|
}
|
|
192
|
+
|
|
193
|
+
const src = getIdFromEl()(target) || '';
|
|
194
|
+
|
|
192
195
|
return {
|
|
193
|
-
src
|
|
194
|
-
dist: downEls.length && swapIndex > -1 ? downEls[swapIndex]
|
|
196
|
+
src,
|
|
197
|
+
dist: downEls.length && swapIndex > -1 ? getIdFromEl()(downEls[swapIndex]) || '' : src,
|
|
195
198
|
};
|
|
196
199
|
};
|
|
197
200
|
|
|
@@ -204,7 +207,7 @@ export const down = (deltaTop: number, target: TargetElement): SortEventData =>
|
|
|
204
207
|
*/
|
|
205
208
|
export const up = (deltaTop: number, target: TargetElement): SortEventData => {
|
|
206
209
|
const brothers = Array.from(target.parentNode?.children || []).filter(
|
|
207
|
-
(
|
|
210
|
+
(child) => !getIdFromEl()(child as HTMLElement)?.startsWith(GHOST_EL_ID_PREFIX),
|
|
208
211
|
);
|
|
209
212
|
const index = brothers.indexOf(target);
|
|
210
213
|
// 往上移动
|
|
@@ -225,9 +228,12 @@ export const up = (deltaTop: number, target: TargetElement): SortEventData => {
|
|
|
225
228
|
|
|
226
229
|
swapIndex = i;
|
|
227
230
|
}
|
|
231
|
+
|
|
232
|
+
const src = getIdFromEl()(target) || '';
|
|
233
|
+
|
|
228
234
|
return {
|
|
229
|
-
src
|
|
230
|
-
dist: upEls.length && swapIndex > -1 ? upEls[swapIndex]
|
|
235
|
+
src,
|
|
236
|
+
dist: upEls.length && swapIndex > -1 ? getIdFromEl()(upEls[swapIndex]) || '' : src,
|
|
231
237
|
};
|
|
232
238
|
};
|
|
233
239
|
|
package/types/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as _tmagic_editor from '@tmagic/editor';
|
|
1
2
|
import EventEmitter, { EventEmitter as EventEmitter$1 } from 'events';
|
|
2
3
|
import { OnResizeStart, OnResize, OnDragStart, OnDrag, OnRotateStart, OnRotate, OnScaleStart, OnScale, OnResizeGroupStart, OnResizeGroup, OnDragGroupStart, OnDragGroup, MoveableOptions, Renderer, MoveableManagerInterface } from 'moveable';
|
|
3
4
|
export * from 'moveable';
|
|
@@ -56,7 +57,8 @@ declare enum Mode {
|
|
|
56
57
|
declare const SELECTED_CLASS = "tmagic-stage-selected-area";
|
|
57
58
|
declare enum AbleActionEventType {
|
|
58
59
|
SELECT_PARENT = "select-parent",
|
|
59
|
-
REMOVE = "remove"
|
|
60
|
+
REMOVE = "remove",
|
|
61
|
+
RERENDER = "rerender"
|
|
60
62
|
}
|
|
61
63
|
/** 将组件添加到容器的方式 */
|
|
62
64
|
declare enum ContainerHighlightType {
|
|
@@ -151,7 +153,6 @@ declare class DragResizeHelper {
|
|
|
151
153
|
* 流式布局把目标节点复制一份进行拖拽,在拖拽结束前不影响页面原布局样式
|
|
152
154
|
*/
|
|
153
155
|
private generateGhostEl;
|
|
154
|
-
private setGhostElChildrenId;
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
type TargetElement = HTMLElement | SVGElement;
|
|
@@ -348,6 +349,7 @@ interface CoreEvents {
|
|
|
348
349
|
update: [data: UpdateEventData];
|
|
349
350
|
sort: [data: SortEventData];
|
|
350
351
|
'select-parent': [];
|
|
352
|
+
rerender: [];
|
|
351
353
|
remove: [data: RemoveEventData];
|
|
352
354
|
highlight: [highlightEl: HTMLElement];
|
|
353
355
|
mousemove: [event: MouseEvent];
|
|
@@ -377,6 +379,7 @@ interface ActionManagerEvents {
|
|
|
377
379
|
sort: [data: SortEventData];
|
|
378
380
|
remove: [data: RemoveEventData];
|
|
379
381
|
select: [selectedEl: HTMLElement | null, event: MouseEvent];
|
|
382
|
+
rerender: [];
|
|
380
383
|
'select-parent': [];
|
|
381
384
|
'drag-start': [event: OnDragStart];
|
|
382
385
|
'multi-update': [data: UpdateEventData];
|
|
@@ -390,6 +393,7 @@ interface DrEvents {
|
|
|
390
393
|
'update-moveable': [];
|
|
391
394
|
[AbleActionEventType.REMOVE]: [];
|
|
392
395
|
[AbleActionEventType.SELECT_PARENT]: [];
|
|
396
|
+
[AbleActionEventType.RERENDER]: [];
|
|
393
397
|
'drag-start': [event: OnDragStart];
|
|
394
398
|
update: [data: UpdateEventData];
|
|
395
399
|
sort: [data: SortEventData];
|
|
@@ -781,7 +785,7 @@ declare class StageCore extends EventEmitter$1 {
|
|
|
781
785
|
*/
|
|
782
786
|
delayedMarkContainer(event: MouseEvent, excludeElList?: Element[]): NodeJS.Timeout | undefined;
|
|
783
787
|
getMoveableOption<K extends keyof MoveableOptions>(key: K): MoveableOptions[K] | undefined;
|
|
784
|
-
getDragStatus(): StageDragStatus | undefined;
|
|
788
|
+
getDragStatus(): _tmagic_editor.StageDragStatus | undefined;
|
|
785
789
|
disableMultiSelect(): void;
|
|
786
790
|
enableMultiSelect(): void;
|
|
787
791
|
/**
|