@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.
- package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/es/editorProps.js +1 -0
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +41 -40
- package/dist/es/hooks/use-stage.js +1 -0
- package/dist/es/initService.js +18 -12
- package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/services/dep.js +87 -22
- package/dist/es/style.css +25 -7
- package/dist/es/utils/dep/idle-task.js +47 -22
- package/dist/style.css +25 -7
- package/dist/themes/magic-admin.css +31 -7
- package/dist/tmagic-editor.umd.cjs +205 -105
- package/package.json +7 -7
- package/src/Editor.vue +1 -0
- package/src/editorProps.ts +6 -0
- package/src/fields/EventSelect.vue +8 -3
- package/src/hooks/use-stage.ts +1 -0
- package/src/initService.ts +25 -15
- package/src/layouts/sidebar/ComponentListPanel.vue +1 -1
- package/src/services/dep.ts +140 -24
- package/src/theme/code-block.scss +1 -1
- package/src/theme/event.scss +11 -4
- package/src/type.ts +5 -0
- package/src/utils/dep/idle-task.ts +72 -35
- package/types/index.d.ts +32 -1
|
@@ -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.
|
|
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
|
-
|
|
9694
|
-
|
|
9695
|
-
|
|
9696
|
-
|
|
9697
|
-
|
|
9698
|
-
|
|
9699
|
-
|
|
9700
|
-
|
|
9701
|
-
|
|
9702
|
-
|
|
9703
|
-
|
|
9704
|
-
|
|
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
|
-
|
|
9708
|
-
|
|
9709
|
-
|
|
9710
|
-
|
|
9711
|
-
|
|
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
|
-
|
|
9714
|
-
|
|
9715
|
-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
-
|
|
19285
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
-
|
|
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: (
|
|
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":
|
|
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
|
-
|
|
22882
|
-
|
|
22883
|
-
|
|
22884
|
-
|
|
22885
|
-
|
|
22886
|
-
|
|
22887
|
-
|
|
22888
|
-
|
|
22889
|
-
|
|
22890
|
-
|
|
22891
|
-
|
|
22892
|
-
|
|
22893
|
-
|
|
22894
|
-
|
|
22895
|
-
|
|
22896
|
-
|
|
22897
|
-
|
|
22898
|
-
|
|
22899
|
-
|
|
22900
|
-
|
|
22901
|
-
|
|
22902
|
-
|
|
22903
|
-
|
|
22904
|
-
|
|
22905
|
-
|
|
22906
|
-
|
|
22907
|
-
|
|
22908
|
-
|
|
22909
|
-
|
|
22910
|
-
|
|
22911
|
-
|
|
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.
|
|
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.
|
|
62
|
-
"@tmagic/
|
|
63
|
-
"@tmagic/
|
|
64
|
-
"@tmagic/
|
|
65
|
-
"@tmagic/
|
|
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.
|
|
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,
|
package/src/editorProps.ts
CHANGED
|
@@ -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="
|
|
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: (
|
|
230
|
+
onChange: (_mForm, _v, { setModel }) => {
|
|
226
231
|
setModel('method', '');
|
|
227
232
|
},
|
|
228
233
|
rules: [
|