@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.
@@ -1,5 +1,5 @@
1
1
  import EventEmitter, { EventEmitter as EventEmitter$1 } from 'events';
2
- import { removeClassName, guid, setIdToEl, getIdFromEl, getElById, calcValueByFontsize, addClassName, removeClassNameByClassName, getDocument, createDiv, injectStyle, isSameDomain, getHost } from '@tmagic/utils';
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
- (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX)
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: target.id,
200
- dist: downEls.length && swapIndex > -1 ? downEls[swapIndex].id : target.id
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
- (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX)
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: target.id,
222
- dist: upEls.length && swapIndex > -1 ? upEls[swapIndex].id : target.id
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 === getId(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
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.id === getId(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
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((targetItem) => getId(targetItem) === getId(targeEl.parentElement));
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(ev.target)?.endsWith(frameItem.id)
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(targetItem) && getId(ev.target)?.endsWith(getId(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((targetItem) => getId(targetItem) === getId(targeEl.parentElement));
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) => getId(item)?.endsWith(getId(el) || ""));
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(ev.target)?.endsWith(getId(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 = getId(matchEventTarget);
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 = el.cloneNode(true);
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}${getId(el)}`);
588
- ghostEl.style.zIndex = ZIndex.GHOST_EL;
589
- ghostEl.style.opacity = ".5";
590
- ghostEl.style.position = "absolute";
591
- ghostEl.style.left = `${left}px`;
592
- ghostEl.style.top = `${top}px`;
593
- ghostEl.style.marginLeft = "0";
594
- ghostEl.style.marginTop = "0";
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
- (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX)
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: target.id,
196
- dist: downEls.length && swapIndex > -1 ? downEls[swapIndex].id : target.id
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
- (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX)
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: target.id,
218
- dist: upEls.length && swapIndex > -1 ? upEls[swapIndex].id : target.id
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 === getId(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
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.id === getId(ev.target)?.replace(DRAG_EL_ID_PREFIX, "")
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((targetItem) => getId(targetItem) === getId(targeEl.parentElement));
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(ev.target)?.endsWith(frameItem.id)
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(targetItem) && getId(ev.target)?.endsWith(getId(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((targetItem) => getId(targetItem) === getId(targeEl.parentElement));
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) => getId(item)?.endsWith(getId(el) || ""));
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(ev.target)?.endsWith(getId(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 = getId(matchEventTarget);
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 = el.cloneNode(true);
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}${getId(el)}`);
584
- ghostEl.style.zIndex = ZIndex.GHOST_EL;
585
- ghostEl.style.opacity = ".5";
586
- ghostEl.style.position = "absolute";
587
- ghostEl.style.left = `${left}px`;
588
- ghostEl.style.top = `${top}px`;
589
- ghostEl.style.marginLeft = "0";
590
- ghostEl.style.marginTop = "0";
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-beta.8",
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.3"
45
+ "vite": "^5.4.10"
45
46
  },
46
47
  "peerDependencies": {
47
48
  "typescript": "*",
48
- "@tmagic/schema": "1.5.0-beta.8",
49
- "@tmagic/core": "1.5.0-beta.8",
50
- "@tmagic/utils": "1.5.0-beta.8"
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": {
@@ -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
  });
@@ -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 === getId(ev.target)?.replace(DRAG_EL_ID_PREFIX, ''),
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.id === getId(ev.target)?.replace(DRAG_EL_ID_PREFIX, ''),
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((targetItem) => getId(targetItem) === getId(targeEl.parentElement));
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) => getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(ev.target)?.endsWith(frameItem.id),
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
- getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) &&
290
- getId(targetItem) &&
291
- getId(ev.target)?.endsWith(getId(targetItem)!),
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((targetItem) => getId(targetItem) === getId(targeEl.parentElement));
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) => getId(item)?.endsWith(getId(el) || ''));
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
- getId(ev.target)?.startsWith(DRAG_EL_ID_PREFIX) && getId(ev.target)?.endsWith(getId(targetItem) || ''),
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 = getId(matchEventTarget);
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 = el.cloneNode(true) as HTMLElement;
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
- private setGhostElChildrenId(el: Element): void {
397
- for (const child of Array.from(el.children)) {
398
- const el = child as HTMLElement;
399
- const id = getId(el);
400
- if (id) {
401
- setIdToEl()(el, `${GHOST_EL_ID_PREFIX}${id}`);
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
- if (child.children.length) {
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
  });
@@ -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
@@ -77,6 +77,7 @@ export const SELECTED_CLASS = 'tmagic-stage-selected-area';
77
77
  export enum AbleActionEventType {
78
78
  SELECT_PARENT = 'select-parent',
79
79
  REMOVE = 'remove',
80
+ RERENDER = 'rerender',
80
81
  }
81
82
 
82
83
  /** 将组件添加到容器的方式 */
@@ -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
- (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX),
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: target.id,
194
- dist: downEls.length && swapIndex > -1 ? downEls[swapIndex].id : target.id,
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
- (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX),
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: target.id,
230
- dist: upEls.length && swapIndex > -1 ? upEls[swapIndex].id : target.id,
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
  /**