@tmagic/editor 1.8.0-beta.16 → 1.8.0-beta.18

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.
@@ -8976,6 +8976,7 @@
8976
8976
  containerHighlightClassName: stageOptions.containerHighlightClassName,
8977
8977
  containerHighlightDuration: stageOptions.containerHighlightDuration,
8978
8978
  containerHighlightType: stageOptions.containerHighlightType,
8979
+ containerHighlightAddOnly: stageOptions.containerHighlightAddOnly,
8979
8980
  disabledDragStart: stageOptions.disabledDragStart,
8980
8981
  renderType: stageOptions.renderType,
8981
8982
  canSelect: (el, event, stop) => {
@@ -9655,6 +9656,9 @@
9655
9656
  });
9656
9657
  }, 1);
9657
9658
  };
9659
+ globalThis.cancelIdleCallback = globalThis.cancelIdleCallback || function(handle) {
9660
+ clearTimeout(handle);
9661
+ };
9658
9662
  var IdleTask = class extends events.EventEmitter {
9659
9663
  taskList = [];
9660
9664
  hightLevelTaskList = [];
@@ -9676,7 +9680,7 @@
9676
9680
  this.taskList = [];
9677
9681
  this.taskHandle = null;
9678
9682
  this.emit("update-task-length", {
9679
- length: this.taskList.length + this.hightLevelTaskList.length,
9683
+ length: this.getTaskLength(),
9680
9684
  hightLevelLength: this.hightLevelTaskList.length
9681
9685
  });
9682
9686
  }
@@ -9690,30 +9694,51 @@
9690
9694
  return super.emit(eventName, ...args);
9691
9695
  }
9692
9696
  runTaskQueue(deadline) {
9693
- const { hightLevelTaskList, taskList } = this;
9694
- while (deadline.timeRemaining() > 0 && (taskList.length || hightLevelTaskList.length)) {
9695
- const timeRemaining = deadline.timeRemaining();
9696
- let times = 0;
9697
- if (timeRemaining <= 5) times = 10;
9698
- else if (timeRemaining <= 10) times = 100;
9699
- else if (timeRemaining <= 15) times = 300;
9700
- else times = 600;
9701
- for (let i = 0; i < times; i++) {
9702
- const task = hightLevelTaskList.length > 0 ? hightLevelTaskList.shift() : taskList.shift();
9703
- if (task) task.handler(task.data);
9704
- if (hightLevelTaskList.length === 0 && taskList.length === 0) break;
9697
+ this.taskHandle = null;
9698
+ try {
9699
+ while (deadline.timeRemaining() > 0 && this.getTaskLength()) {
9700
+ const timeRemaining = deadline.timeRemaining();
9701
+ let times = 0;
9702
+ if (timeRemaining <= 5) times = 10;
9703
+ else if (timeRemaining <= 10) times = 100;
9704
+ else if (timeRemaining <= 15) times = 300;
9705
+ else times = 600;
9706
+ for (let i = 0; i < times; i++) {
9707
+ const task = this.hightLevelTaskList.length > 0 ? this.hightLevelTaskList.shift() : this.taskList.shift();
9708
+ if (task) this.runTask(task);
9709
+ if (!this.getTaskLength()) break;
9710
+ }
9705
9711
  }
9712
+ } finally {
9713
+ this.finishRun();
9706
9714
  }
9707
- if (!hightLevelTaskList.length) this.emit("hight-level-finish");
9708
- if (hightLevelTaskList.length || taskList.length) this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 300 });
9709
- else {
9710
- this.taskHandle = 0;
9711
- this.emit("finish");
9715
+ }
9716
+ /**
9717
+ * 单个任务失败不能中断整个队列,否则后续任务永远不会被执行,
9718
+ * 依赖收集会停在半路(收集中状态与剩余任务数都不再变化)
9719
+ */
9720
+ runTask(task) {
9721
+ try {
9722
+ task.handler(task.data);
9723
+ } catch (e) {
9724
+ error("magic editor: 空闲任务执行失败", e);
9712
9725
  }
9713
- this.emit("update-task-length", {
9714
- length: taskList.length + hightLevelTaskList.length,
9715
- hightLevelLength: hightLevelTaskList.length
9716
- });
9726
+ }
9727
+ finishRun() {
9728
+ try {
9729
+ if (!this.hightLevelTaskList.length) this.emit("hight-level-finish");
9730
+ } finally {
9731
+ if (this.getTaskLength()) {
9732
+ if (!this.taskHandle) this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 300 });
9733
+ } else this.emit("finish");
9734
+ this.emit("update-task-length", {
9735
+ length: this.getTaskLength(),
9736
+ hightLevelLength: this.hightLevelTaskList.length
9737
+ });
9738
+ }
9739
+ }
9740
+ getTaskLength() {
9741
+ return this.taskList.length + this.hightLevelTaskList.length;
9717
9742
  }
9718
9743
  };
9719
9744
  //#endregion
@@ -12744,7 +12769,7 @@
12744
12769
  class: "m-editor-history-list-item-saved",
12745
12770
  title: "该记录为最近一次保存的状态"
12746
12771
  };
12747
- var _hoisted_5$5 = {
12772
+ var _hoisted_5$4 = {
12748
12773
  key: 1,
12749
12774
  class: "m-editor-history-list-item-actions"
12750
12775
  };
@@ -12906,7 +12931,7 @@
12906
12931
  (0, vue.createElementVNode)("span", { class: (0, vue.normalizeClass)(["m-editor-history-list-item-op", `op-${__props.group.opType}`]) }, (0, vue.toDisplayString)((0, vue.unref)(opLabel)(__props.group.opType)), 3),
12907
12932
  (0, vue.createElementVNode)("span", _hoisted_3$12, (0, vue.toDisplayString)(__props.group.desc), 1),
12908
12933
  headSaved.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_4$9, "已保存")) : (0, vue.createCommentVNode)("v-if", true),
12909
- !merged.value && (headRevertable.value || headDiffable.value || canHeadGoto.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_5$5, [
12934
+ !merged.value && (headRevertable.value || headDiffable.value || canHeadGoto.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_5$4, [
12910
12935
  headRevertable.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
12911
12936
  key: 0,
12912
12937
  class: "m-editor-history-list-item-revert",
@@ -13016,7 +13041,7 @@
13016
13041
  key: 1,
13017
13042
  class: "m-editor-history-list-item-actions"
13018
13043
  };
13019
- var _hoisted_5$4 = ["title"];
13044
+ var _hoisted_5$3 = ["title"];
13020
13045
  var InitialRow_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.defineComponent)({
13021
13046
  name: "MEditorHistoryListInitialRow",
13022
13047
  __name: "InitialRow",
@@ -13078,7 +13103,7 @@
13078
13103
  key: 2,
13079
13104
  class: "m-editor-history-list-item-time",
13080
13105
  title: timeTitle.value
13081
- }, (0, vue.toDisplayString)(time.value), 9, _hoisted_5$4)) : (0, vue.createCommentVNode)("v-if", true)
13106
+ }, (0, vue.toDisplayString)(time.value), 9, _hoisted_5$3)) : (0, vue.createCommentVNode)("v-if", true)
13082
13107
  ], 10, _hoisted_1$66);
13083
13108
  };
13084
13109
  }
@@ -13460,7 +13485,7 @@
13460
13485
  }));
13461
13486
  //#endregion
13462
13487
  //#region packages/editor/src/layouts/history-list/HistoryDiffDialog.vue?vue&type=script&setup=true&lang.ts
13463
- var _hoisted_1$62, _hoisted_2$19, _hoisted_3$7, _hoisted_4$6, _hoisted_5$3, _hoisted_6$2, _hoisted_7, HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default;
13488
+ var _hoisted_1$62, _hoisted_2$19, _hoisted_3$7, _hoisted_4$6, _hoisted_5$2, _hoisted_6$2, _hoisted_7, HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default;
13464
13489
  var init_HistoryDiffDialog_vue_vue_type_script_setup_true_lang = __esmMin((() => {
13465
13490
  init_lodash();
13466
13491
  init_CompareForm();
@@ -13475,7 +13500,7 @@
13475
13500
  };
13476
13501
  _hoisted_3$7 = { class: "m-editor-history-diff-dialog-header" };
13477
13502
  _hoisted_4$6 = { class: "m-editor-history-diff-dialog-target" };
13478
- _hoisted_5$3 = { class: "m-editor-history-diff-dialog-controls" };
13503
+ _hoisted_5$2 = { class: "m-editor-history-diff-dialog-controls" };
13479
13504
  _hoisted_6$2 = { class: "m-editor-history-diff-dialog-legend" };
13480
13505
  _hoisted_7 = {
13481
13506
  key: 0,
@@ -13655,7 +13680,7 @@
13655
13680
  }))]),
13656
13681
  default: (0, vue.withCtx)(() => [payload.value && visible.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$62, [
13657
13682
  __props.onConfirm ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$19, "仅回滚有差异的字段")) : (0, vue.createCommentVNode)("v-if", true),
13658
- (0, vue.createElementVNode)("div", _hoisted_3$7, [(0, vue.createElementVNode)("span", _hoisted_4$6, (0, vue.toDisplayString)(targetText.value), 1), (0, vue.createElementVNode)("div", _hoisted_5$3, [(0, vue.createVNode)((0, vue.unref)(_tmagic_design.TMagicRadioGroup), {
13683
+ (0, vue.createElementVNode)("div", _hoisted_3$7, [(0, vue.createElementVNode)("span", _hoisted_4$6, (0, vue.toDisplayString)(targetText.value), 1), (0, vue.createElementVNode)("div", _hoisted_5$2, [(0, vue.createVNode)((0, vue.unref)(_tmagic_design.TMagicRadioGroup), {
13659
13684
  modelValue: viewMode.value,
13660
13685
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => viewMode.value = $event),
13661
13686
  size: "small",
@@ -14800,6 +14825,7 @@
14800
14825
  containerHighlightClassName: _tmagic_stage.CONTAINER_HIGHLIGHT_CLASS_NAME,
14801
14826
  containerHighlightDuration: 800,
14802
14827
  containerHighlightType: _tmagic_stage.ContainerHighlightType.DEFAULT,
14828
+ containerHighlightAddOnly: false,
14803
14829
  disabledShowSrc: false,
14804
14830
  disabledDataSource: false,
14805
14831
  disabledCodeBlock: false,
@@ -17884,7 +17910,7 @@
17884
17910
  return;
17885
17911
  }
17886
17912
  if (timeout || !stage.value) return;
17887
- timeout = stage.value.delayedMarkContainer(e);
17913
+ timeout = stage.value.delayedMarkContainer(e, [], true);
17888
17914
  };
17889
17915
  return (_ctx, _cache) => {
17890
17916
  return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_tmagic_design.TMagicScrollbar), null, {
@@ -17952,7 +17978,7 @@
17952
17978
  key: 1,
17953
17979
  class: "magic-editor-tab-panel-title"
17954
17980
  };
17955
- var _hoisted_5$2 = {
17981
+ var _hoisted_5$1 = {
17956
17982
  key: 0,
17957
17983
  class: "m-editor-sidebar-tips"
17958
17984
  };
@@ -18196,7 +18222,7 @@
18196
18222
  `${index}`
18197
18223
  ].includes(activeTabName.value)]]);
18198
18224
  }), 128)),
18199
- tipsBarVisible.value && collecting.value && taskLength.value > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5$2, [(0, vue.createElementVNode)("span", null, "依赖收集中(剩余任务:" + (0, vue.toDisplayString)(taskLength.value) + ")", 1), (0, vue.createVNode)(Icon_default, {
18225
+ tipsBarVisible.value && collecting.value && taskLength.value > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5$1, [(0, vue.createElementVNode)("span", null, "依赖收集中(剩余任务:" + (0, vue.toDisplayString)(taskLength.value) + ")", 1), (0, vue.createVNode)(Icon_default, {
18200
18226
  icon: (0, vue.unref)(_element_plus_icons_vue.Close),
18201
18227
  class: "close-icon",
18202
18228
  onClick: _cache[1] || (_cache[1] = (0, vue.withModifiers)(($event) => tipsBarVisible.value = false, ["stop"]))
@@ -19232,6 +19258,9 @@
19232
19258
  idleTask = new IdleTask();
19233
19259
  watcher = new _tmagic_core.Watcher({ initialTargets: (0, vue.reactive)({}) });
19234
19260
  waitingWorker;
19261
+ resolveWaitingWorker;
19262
+ workerGeneration = 0;
19263
+ activeBatches = /* @__PURE__ */ new Set();
19235
19264
  constructor() {
19236
19265
  super();
19237
19266
  this.idleTask.on("update-task-length", throttle(({ length }) => {
@@ -19281,33 +19310,36 @@
19281
19310
  }
19282
19311
  async collectIdle(nodes, depExtendedData = {}, deep = false, type) {
19283
19312
  if (this.waitingWorker) await this.waitingWorker;
19284
- this.set("collecting", true);
19285
- let startTask = false;
19313
+ const batch = {
19314
+ nodes,
19315
+ deep,
19316
+ pending: 0,
19317
+ dsPending: 0,
19318
+ collectedEmitted: false,
19319
+ dsSettled: false,
19320
+ resolve: () => {}
19321
+ };
19286
19322
  this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
19287
- startTask = true;
19288
- this.enqueueTask(node, target, depExtendedData, deep);
19323
+ this.enqueueTask(node, target, depExtendedData, deep, batch);
19289
19324
  });
19325
+ if (batch.pending === 0) {
19326
+ this.emit("collected", nodes, deep);
19327
+ this.updateCollectingState();
19328
+ return true;
19329
+ }
19330
+ this.activeBatches.add(batch);
19331
+ this.set("collecting", true);
19290
19332
  return new Promise((resolve) => {
19291
- if (!startTask) {
19292
- this.emit("collected", nodes, deep);
19293
- this.set("collecting", false);
19294
- resolve();
19295
- return;
19296
- }
19297
- this.idleTask.once("finish", () => {
19298
- this.emit("collected", nodes, deep);
19299
- this.set("collecting", false);
19300
- });
19301
- this.idleTask.once("hight-level-finish", () => {
19302
- this.emit("ds-collected", nodes, deep);
19303
- resolve();
19304
- });
19333
+ batch.resolve = resolve;
19305
19334
  });
19306
19335
  }
19307
19336
  collectByWorker(dsl) {
19308
19337
  this.set("collecting", true);
19338
+ this.workerGeneration += 1;
19339
+ const generation = this.workerGeneration;
19309
19340
  const { promise, resolve: waitingResolve } = Promise.withResolvers();
19310
19341
  this.waitingWorker = promise;
19342
+ this.resolveWaitingWorker = waitingResolve;
19311
19343
  return new Promise((resolve) => {
19312
19344
  const worker = new WorkerWrapper();
19313
19345
  worker.postMessage({ dsl: (0, serialize_javascript.default)(dsl) });
@@ -19318,6 +19350,10 @@
19318
19350
  resolve({});
19319
19351
  };
19320
19352
  }).then((depsData) => {
19353
+ if (generation !== this.workerGeneration) {
19354
+ waitingResolve();
19355
+ return depsData;
19356
+ }
19321
19357
  (0, _tmagic_core.traverseTarget)(this.watcher.getTargetsList(), (target) => {
19322
19358
  if (depsData[target.type]?.[target.id]) {
19323
19359
  target.deps = (0, vue.reactive)(depsData[target.type][target.id]);
@@ -19330,6 +19366,10 @@
19330
19366
  this.emit("collected", dsl.items, true);
19331
19367
  this.emit("ds-collected", dsl.items, true);
19332
19368
  waitingResolve();
19369
+ if (this.waitingWorker === promise) {
19370
+ this.waitingWorker = void 0;
19371
+ this.resolveWaitingWorker = void 0;
19372
+ }
19333
19373
  return depsData;
19334
19374
  });
19335
19375
  }
@@ -19351,6 +19391,7 @@
19351
19391
  return this.watcher.hasSpecifiedTypeTarget(type);
19352
19392
  }
19353
19393
  clearIdleTasks() {
19394
+ this.abortActiveBatches();
19354
19395
  this.idleTask.clearTasks();
19355
19396
  }
19356
19397
  on(eventName, listener) {
@@ -19360,6 +19401,11 @@
19360
19401
  return super.once(eventName, listener);
19361
19402
  }
19362
19403
  reset() {
19404
+ this.abortActiveBatches();
19405
+ this.workerGeneration += 1;
19406
+ this.resolveWaitingWorker?.();
19407
+ this.resolveWaitingWorker = void 0;
19408
+ this.waitingWorker = void 0;
19363
19409
  this.idleTask.clearTasks();
19364
19410
  for (const type of Object.keys(this.watcher.getTargetsList())) this.removeTargets(type);
19365
19411
  this.set("collecting", false);
@@ -19384,18 +19430,63 @@
19384
19430
  if (dep.data?.pageId && dep.data.pageId === depExtendedData.pageId) delete target.deps[depKey];
19385
19431
  }
19386
19432
  }
19387
- enqueueTask(node, target, depExtendedData, deep) {
19433
+ enqueueTask(node, target, depExtendedData, deep, batch) {
19434
+ const isDataSource = target.type === _tmagic_core.DepTargetType.DATA_SOURCE;
19435
+ batch.pending += 1;
19436
+ if (isDataSource) batch.dsPending += 1;
19388
19437
  this.idleTask.enqueueTask(({ node, deep, target }) => {
19389
- this.collectNode(node, target, depExtendedData, deep);
19438
+ try {
19439
+ this.collectNode(node, target, depExtendedData, deep);
19440
+ } finally {
19441
+ this.onBatchTaskDone(batch, isDataSource);
19442
+ }
19390
19443
  }, {
19391
19444
  node,
19392
19445
  deep: false,
19393
19446
  target
19394
- }, target.type === _tmagic_core.DepTargetType.DATA_SOURCE);
19447
+ }, isDataSource);
19395
19448
  if (deep && Array.isArray(node.items) && node.items.length) node.items.forEach((item) => {
19396
- this.enqueueTask(item, target, depExtendedData, deep);
19449
+ this.enqueueTask(item, target, depExtendedData, deep, batch);
19397
19450
  });
19398
19451
  }
19452
+ onBatchTaskDone(batch, isDataSource) {
19453
+ if (isDataSource) {
19454
+ batch.dsPending -= 1;
19455
+ if (batch.dsPending === 0) this.settleBatchDs(batch);
19456
+ }
19457
+ batch.pending -= 1;
19458
+ if (batch.pending === 0) this.finishBatch(batch);
19459
+ }
19460
+ settleBatchDs(batch) {
19461
+ if (batch.dsSettled) return;
19462
+ batch.dsSettled = true;
19463
+ this.emit("ds-collected", batch.nodes, batch.deep);
19464
+ batch.resolve(true);
19465
+ }
19466
+ finishBatch(batch) {
19467
+ if (!batch.collectedEmitted) {
19468
+ batch.collectedEmitted = true;
19469
+ this.emit("collected", batch.nodes, batch.deep);
19470
+ }
19471
+ this.settleBatchDs(batch);
19472
+ this.activeBatches.delete(batch);
19473
+ this.updateCollectingState();
19474
+ }
19475
+ /**
19476
+ * idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
19477
+ * 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
19478
+ * 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
19479
+ */
19480
+ abortActiveBatches() {
19481
+ if (!this.activeBatches.size) return;
19482
+ const batches = [...this.activeBatches];
19483
+ this.activeBatches.clear();
19484
+ for (const batch of batches) batch.resolve(false);
19485
+ this.updateCollectingState();
19486
+ }
19487
+ updateCollectingState() {
19488
+ this.set("collecting", this.activeBatches.size > 0);
19489
+ }
19399
19490
  };
19400
19491
  var dep_default = new Dep();
19401
19492
  //#endregion
@@ -19839,15 +19930,15 @@
19839
19930
  return pageId;
19840
19931
  };
19841
19932
  const collectIdle = (nodes, deep, type) => Promise.all(nodes.map((node) => {
19842
- if (node.type === _tmagic_core.NodeType.ROOT) return Promise.resolve();
19933
+ if (node.type === _tmagic_core.NodeType.ROOT) return Promise.resolve(true);
19843
19934
  return depService.collectIdle([node], { pageId: getPageIdByNode(node) }, deep, type);
19844
- }));
19935
+ })).then((results) => results.every(Boolean));
19845
19936
  (0, vue.watch)(() => editorService.get("stage"), (stage) => {
19846
19937
  if (!stage) return;
19847
19938
  stage.on("rerender", async () => {
19848
19939
  const node = editorService.get("node");
19849
19940
  if (!node) return;
19850
- await collectIdle([node], true, _tmagic_core.DepTargetType.DATA_SOURCE);
19941
+ if (!await collectIdle([node], true, _tmagic_core.DepTargetType.DATA_SOURCE)) return;
19851
19942
  updateStageNode(node);
19852
19943
  });
19853
19944
  });
@@ -19934,8 +20025,8 @@
19934
20025
  })();
19935
20026
  };
19936
20027
  const nodeAddHandler = (nodes) => {
19937
- collectIdle(nodes, true).then(() => {
19938
- updateStageNodes(nodes);
20028
+ collectIdle(nodes, true).then((completed) => {
20029
+ if (completed) updateStageNodes(nodes);
19939
20030
  });
19940
20031
  };
19941
20032
  const nodeUpdateHandler = (data) => {
@@ -19964,8 +20055,8 @@
19964
20055
  else normalNodes.push(newNode);
19965
20056
  if (needRecollectNodes.length) {
19966
20057
  const handler = async () => {
19967
- await collectIdle(needRecollectNodes, true, _tmagic_core.DepTargetType.DATA_SOURCE);
19968
- await collectIdle(needRecollectNodes, true, _tmagic_core.DepTargetType.DATA_SOURCE_COND);
20058
+ if (!await collectIdle(needRecollectNodes, true, _tmagic_core.DepTargetType.DATA_SOURCE)) return;
20059
+ if (!await collectIdle(needRecollectNodes, true, _tmagic_core.DepTargetType.DATA_SOURCE_COND)) return;
19969
20060
  updateStageNodes(needRecollectNodes);
19970
20061
  };
19971
20062
  handler();
@@ -19978,8 +20069,8 @@
19978
20069
  depService.clear(nodes);
19979
20070
  };
19980
20071
  const historyChangeHandler = (page) => {
19981
- collectIdle([page], true).then(() => {
19982
- updateStageNode(page);
20072
+ collectIdle([page], true).then((completed) => {
20073
+ if (completed) updateStageNode(page);
19983
20074
  });
19984
20075
  };
19985
20076
  editorService.on("history-change", historyChangeHandler);
@@ -20039,7 +20130,13 @@
20039
20130
  depService.addTarget((0, _tmagic_core.createDataSourceMethodTarget)(config, (0, vue.reactive)({})));
20040
20131
  collectIdlePromises = [collectIdle(root.items, true, _tmagic_core.DepTargetType.DATA_SOURCE_METHOD)];
20041
20132
  }
20042
- Promise.all(collectIdlePromises).then(() => updateDataSourceSchema()).then(() => updateDsData()).then(() => updateStageNodes(root.items));
20133
+ const handler = async () => {
20134
+ if (!(await Promise.all(collectIdlePromises)).every(Boolean)) return;
20135
+ updateDataSourceSchema();
20136
+ await updateDsData();
20137
+ updateStageNodes(root.items);
20138
+ };
20139
+ handler();
20043
20140
  }
20044
20141
  } else if (root?.dataSources) updateDsData();
20045
20142
  };
@@ -20053,11 +20150,11 @@
20053
20150
  if (!root) return;
20054
20151
  const handler = async () => {
20055
20152
  const nodes = (0, _tmagic_utils.getNodes)(Object.keys(root.dataSourceDeps?.[id] || {}), root.items);
20056
- await Promise.all([
20153
+ if (!(await Promise.all([
20057
20154
  collectIdle(nodes, false, _tmagic_core.DepTargetType.DATA_SOURCE),
20058
20155
  collectIdle(nodes, false, _tmagic_core.DepTargetType.DATA_SOURCE_COND),
20059
20156
  collectIdle(nodes, false, _tmagic_core.DepTargetType.DATA_SOURCE_METHOD)
20060
- ]);
20157
+ ])).every(Boolean)) return;
20061
20158
  updateDataSourceSchema();
20062
20159
  (await getTMagicApp())?.dataSourceManager?.removeDataSource(id);
20063
20160
  updateStageNodes(nodes);
@@ -20150,6 +20247,7 @@
20150
20247
  containerHighlightClassName: {},
20151
20248
  containerHighlightDuration: {},
20152
20249
  containerHighlightType: {},
20250
+ containerHighlightAddOnly: { type: Boolean },
20153
20251
  stageRect: {},
20154
20252
  codeOptions: {},
20155
20253
  disabledDragStart: { type: Boolean },
@@ -20220,6 +20318,7 @@
20220
20318
  containerHighlightClassName: props.containerHighlightClassName,
20221
20319
  containerHighlightDuration: props.containerHighlightDuration,
20222
20320
  containerHighlightType: props.containerHighlightType,
20321
+ containerHighlightAddOnly: props.containerHighlightAddOnly,
20223
20322
  disabledDragStart: props.disabledDragStart,
20224
20323
  renderType: props.renderType,
20225
20324
  guidesOptions: props.guidesOptions,
@@ -22575,7 +22674,6 @@
22575
22674
  };
22576
22675
  var _hoisted_3$3 = { class: "event-select-header" };
22577
22676
  var _hoisted_4$2 = { class: "event-item-header" };
22578
- var _hoisted_5$1 = { class: "event-item-title" };
22579
22677
  var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.defineComponent)({
22580
22678
  name: "MFieldsEventSelect",
22581
22679
  __name: "EventSelect",
@@ -22656,6 +22754,12 @@
22656
22754
  typeMatch: true,
22657
22755
  trigger: "blur"
22658
22756
  }],
22757
+ onChange: (_mForm, _v, { setModel }) => {
22758
+ setModel("to", "");
22759
+ setModel("method", "");
22760
+ setModel("codeId", "");
22761
+ setModel("dataSourceMethod", []);
22762
+ },
22659
22763
  ...props.config.actionTypeConfig
22660
22764
  };
22661
22765
  });
@@ -22666,7 +22770,7 @@
22666
22770
  type: "ui-select",
22667
22771
  labelPosition: "left",
22668
22772
  display: (_mForm, { model }) => model.actionType === _tmagic_core.ActionType.COMP,
22669
- onChange: (_MForm, _v, { setModel }) => {
22773
+ onChange: (_mForm, _v, { setModel }) => {
22670
22774
  setModel("method", "");
22671
22775
  },
22672
22776
  rules: [{
@@ -22873,46 +22977,42 @@
22873
22977
  model: entry.cardItem,
22874
22978
  "last-values": entry.lastCardItem,
22875
22979
  "is-compare": isCompareMode.value,
22876
- "hide-expand": true,
22980
+ "hide-expand": false,
22877
22981
  "label-width": __props.config.labelWidth || "100px",
22878
22982
  onChange: onChangeHandler
22879
22983
  }, {
22880
- header: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_4$2, [
22881
- (0, vue.createElementVNode)("div", _hoisted_5$1, "事件" + (0, vue.toDisplayString)(Number(entry.index) + 1), 1),
22882
- (0, vue.createVNode)((0, vue.unref)(_tmagic_form.MContainer), {
22883
- class: "fullWidth",
22884
- config: eventNameConfig.value,
22885
- model: entry.cardItem,
22886
- "last-values": entry.lastCardItem,
22887
- "is-compare": isCompareMode.value,
22888
- disabled: __props.disabled,
22889
- size: __props.size,
22890
- prop: `${__props.prop}.${entry.index}`,
22891
- onChange: eventNameChangeHandler
22892
- }, null, 8, [
22893
- "config",
22894
- "model",
22895
- "last-values",
22896
- "is-compare",
22897
- "disabled",
22898
- "size",
22899
- "prop"
22900
- ]),
22901
- !isCompareMode.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_tmagic_design.TMagicButton), {
22902
- key: 0,
22903
- class: "event-item-delete-button",
22904
- link: "",
22905
- icon: (0, vue.unref)(_element_plus_icons_vue.Delete),
22906
- disabled: __props.disabled,
22907
- size: __props.size,
22908
- onClick: ($event) => removeEvent(Number(entry.index))
22909
- }, null, 8, [
22910
- "icon",
22911
- "disabled",
22912
- "size",
22913
- "onClick"
22914
- ])) : (0, vue.createCommentVNode)("v-if", true)
22915
- ])]),
22984
+ header: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_4$2, [(0, vue.createVNode)((0, vue.unref)(_tmagic_form.MContainer), {
22985
+ class: "fullWidth",
22986
+ config: eventNameConfig.value,
22987
+ model: entry.cardItem,
22988
+ "last-values": entry.lastCardItem,
22989
+ "is-compare": isCompareMode.value,
22990
+ disabled: __props.disabled,
22991
+ size: __props.size,
22992
+ prop: `${__props.prop}.${entry.index}`,
22993
+ onChange: eventNameChangeHandler
22994
+ }, null, 8, [
22995
+ "config",
22996
+ "model",
22997
+ "last-values",
22998
+ "is-compare",
22999
+ "disabled",
23000
+ "size",
23001
+ "prop"
23002
+ ]), !isCompareMode.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_tmagic_design.TMagicButton), {
23003
+ key: 0,
23004
+ class: "event-item-delete-button",
23005
+ link: "",
23006
+ icon: (0, vue.unref)(_element_plus_icons_vue.Delete),
23007
+ disabled: __props.disabled,
23008
+ size: __props.size,
23009
+ onClick: ($event) => removeEvent(Number(entry.index))
23010
+ }, null, 8, [
23011
+ "icon",
23012
+ "disabled",
23013
+ "size",
23014
+ "onClick"
23015
+ ])) : (0, vue.createCommentVNode)("v-if", true)])]),
22916
23016
  _: 2
22917
23017
  }, 1032, [
22918
23018
  "disabled",
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.8.0-beta.16",
2
+ "version": "1.8.0-beta.18",
3
3
  "name": "@tmagic/editor",
4
4
  "type": "module",
5
5
  "sideEffects": [
@@ -58,11 +58,11 @@
58
58
  "moveable": "^0.53.0",
59
59
  "serialize-javascript": "^7.0.0",
60
60
  "sortablejs": "^1.15.6",
61
- "@tmagic/design": "1.8.0-beta.16",
62
- "@tmagic/stage": "1.8.0-beta.16",
63
- "@tmagic/form": "1.8.0-beta.16",
64
- "@tmagic/utils": "1.8.0-beta.16",
65
- "@tmagic/table": "1.8.0-beta.16"
61
+ "@tmagic/design": "1.8.0-beta.18",
62
+ "@tmagic/form": "1.8.0-beta.18",
63
+ "@tmagic/stage": "1.8.0-beta.18",
64
+ "@tmagic/table": "1.8.0-beta.18",
65
+ "@tmagic/utils": "1.8.0-beta.18"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/events": "^3.0.3",
@@ -76,7 +76,7 @@
76
76
  "type-fest": "^5.2.0",
77
77
  "typescript": "^6.0.3",
78
78
  "vue": "^3.5.40",
79
- "@tmagic/core": "1.8.0-beta.16"
79
+ "@tmagic/core": "1.8.0-beta.18"
80
80
  },
81
81
  "peerDependenciesMeta": {
82
82
  "typescript": {
package/src/Editor.vue CHANGED
@@ -218,6 +218,7 @@ const stageOptions: StageOptions = {
218
218
  containerHighlightClassName: props.containerHighlightClassName,
219
219
  containerHighlightDuration: props.containerHighlightDuration,
220
220
  containerHighlightType: props.containerHighlightType,
221
+ containerHighlightAddOnly: props.containerHighlightAddOnly,
221
222
  disabledDragStart: props.disabledDragStart,
222
223
  renderType: props.renderType,
223
224
  guidesOptions: props.guidesOptions,
@@ -82,6 +82,11 @@ export interface EditorProps {
82
82
  containerHighlightDuration?: number;
83
83
  /** 拖入画布中容器时,识别容器的操作类型 */
84
84
  containerHighlightType?: ContainerHighlightType;
85
+ /**
86
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
87
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
88
+ */
89
+ containerHighlightAddOnly?: boolean;
85
90
  /** 画布大小 */
86
91
  stageRect?: StageRect;
87
92
  /** monaco editor 的配置 */
@@ -163,6 +168,7 @@ export const defaultEditorProps = {
163
168
  containerHighlightClassName: CONTAINER_HIGHLIGHT_CLASS_NAME,
164
169
  containerHighlightDuration: 800,
165
170
  containerHighlightType: ContainerHighlightType.DEFAULT,
171
+ containerHighlightAddOnly: false,
166
172
  disabledShowSrc: false,
167
173
  disabledDataSource: false,
168
174
  disabledCodeBlock: false,
@@ -37,13 +37,12 @@
37
37
  :model="entry.cardItem"
38
38
  :last-values="entry.lastCardItem"
39
39
  :is-compare="isCompareMode"
40
- :hide-expand="true"
40
+ :hide-expand="false"
41
41
  :label-width="config.labelWidth || '100px'"
42
42
  @change="onChangeHandler"
43
43
  >
44
44
  <template #header>
45
45
  <div class="event-item-header">
46
- <div class="event-item-title">事件{{ Number(entry.index) + 1 }}</div>
47
46
  <MFormContainer
48
47
  class="fullWidth"
49
48
  :config="eventNameConfig"
@@ -210,6 +209,12 @@ const actionTypeConfig = computed(() => {
210
209
  trigger: 'blur',
211
210
  },
212
211
  ],
212
+ onChange: (_mForm: FormState, _v: string, { setModel }: any) => {
213
+ setModel('to', '');
214
+ setModel('method', '');
215
+ setModel('codeId', '');
216
+ setModel('dataSourceMethod', []);
217
+ },
213
218
  };
214
219
  return { ...defaultActionTypeConfig, ...props.config.actionTypeConfig };
215
220
  });
@@ -222,7 +227,7 @@ const targetCompConfig = computed(() => {
222
227
  type: 'ui-select',
223
228
  labelPosition: 'left',
224
229
  display: (_mForm, { model }) => model.actionType === ActionType.COMP,
225
- onChange: (_MForm, _v, { setModel }) => {
230
+ onChange: (_mForm, _v, { setModel }) => {
226
231
  setModel('method', '');
227
232
  },
228
233
  rules: [