@tmagic/editor 1.8.0-beta.16 → 1.8.0-beta.17
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 +28 -13
- package/dist/es/utils/dep/idle-task.js +3 -0
- package/dist/style.css +28 -13
- package/dist/themes/magic-admin.css +34 -13
- package/dist/tmagic-editor.umd.cjs +162 -83
- 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 +2 -2
- package/src/theme/event.scss +11 -7
- package/src/type.ts +5 -0
- package/src/utils/dep/idle-task.ts +6 -0
- package/types/index.d.ts +25 -1
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: [
|
package/src/hooks/use-stage.ts
CHANGED
|
@@ -28,6 +28,7 @@ export const useStage = (stageOptions: StageOptions) => {
|
|
|
28
28
|
containerHighlightClassName: stageOptions.containerHighlightClassName,
|
|
29
29
|
containerHighlightDuration: stageOptions.containerHighlightDuration,
|
|
30
30
|
containerHighlightType: stageOptions.containerHighlightType,
|
|
31
|
+
containerHighlightAddOnly: stageOptions.containerHighlightAddOnly,
|
|
31
32
|
disabledDragStart: stageOptions.disabledDragStart,
|
|
32
33
|
renderType: stageOptions.renderType,
|
|
33
34
|
canSelect: (el, event, stop) => {
|
package/src/initService.ts
CHANGED
|
@@ -333,11 +333,11 @@ export const initServiceEvents = (
|
|
|
333
333
|
Promise.all(
|
|
334
334
|
nodes.map((node) => {
|
|
335
335
|
if (node.type === NodeType.ROOT) {
|
|
336
|
-
return Promise.resolve();
|
|
336
|
+
return Promise.resolve(true);
|
|
337
337
|
}
|
|
338
338
|
return depService.collectIdle([node], { pageId: getPageIdByNode(node) }, deep, type);
|
|
339
339
|
}),
|
|
340
|
-
);
|
|
340
|
+
).then((results) => results.every(Boolean));
|
|
341
341
|
|
|
342
342
|
watch(
|
|
343
343
|
() => editorService.get('stage'),
|
|
@@ -351,7 +351,7 @@ export const initServiceEvents = (
|
|
|
351
351
|
|
|
352
352
|
if (!node) return;
|
|
353
353
|
|
|
354
|
-
await collectIdle([node], true, DepTargetType.DATA_SOURCE);
|
|
354
|
+
if (!(await collectIdle([node], true, DepTargetType.DATA_SOURCE))) return;
|
|
355
355
|
updateStageNode(node);
|
|
356
356
|
});
|
|
357
357
|
},
|
|
@@ -494,8 +494,10 @@ export const initServiceEvents = (
|
|
|
494
494
|
|
|
495
495
|
// 新增节点,收集依赖
|
|
496
496
|
const nodeAddHandler = (nodes: MComponent[]) => {
|
|
497
|
-
collectIdle(nodes, true).then(() => {
|
|
498
|
-
|
|
497
|
+
collectIdle(nodes, true).then((completed) => {
|
|
498
|
+
if (completed) {
|
|
499
|
+
updateStageNodes(nodes);
|
|
500
|
+
}
|
|
499
501
|
});
|
|
500
502
|
};
|
|
501
503
|
|
|
@@ -549,8 +551,8 @@ export const initServiceEvents = (
|
|
|
549
551
|
if (needRecollectNodes.length) {
|
|
550
552
|
// 有数据源依赖,需要等依赖重新收集完才更新stage
|
|
551
553
|
const handler = async () => {
|
|
552
|
-
await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE);
|
|
553
|
-
await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND);
|
|
554
|
+
if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE))) return;
|
|
555
|
+
if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND))) return;
|
|
554
556
|
updateStageNodes(needRecollectNodes);
|
|
555
557
|
};
|
|
556
558
|
handler();
|
|
@@ -572,8 +574,10 @@ export const initServiceEvents = (
|
|
|
572
574
|
|
|
573
575
|
// 历史记录变化时,需要重新收集依赖
|
|
574
576
|
const historyChangeHandler = (page: MPage | MPageFragment) => {
|
|
575
|
-
collectIdle([page], true).then(() => {
|
|
576
|
-
|
|
577
|
+
collectIdle([page], true).then((completed) => {
|
|
578
|
+
if (completed) {
|
|
579
|
+
updateStageNode(page);
|
|
580
|
+
}
|
|
577
581
|
});
|
|
578
582
|
};
|
|
579
583
|
|
|
@@ -654,7 +658,7 @@ export const initServiceEvents = (
|
|
|
654
658
|
if (Array.isArray(root?.items)) {
|
|
655
659
|
depService.clearIdleTasks();
|
|
656
660
|
|
|
657
|
-
let collectIdlePromises: Promise<
|
|
661
|
+
let collectIdlePromises: Promise<boolean>[] = [];
|
|
658
662
|
if (isModifyField) {
|
|
659
663
|
depService.removeTarget(config.id, DepTargetType.DATA_SOURCE);
|
|
660
664
|
depService.removeTarget(config.id, DepTargetType.DATA_SOURCE_COND);
|
|
@@ -679,10 +683,15 @@ export const initServiceEvents = (
|
|
|
679
683
|
|
|
680
684
|
collectIdlePromises = [collectIdle(root.items, true, DepTargetType.DATA_SOURCE_METHOD)];
|
|
681
685
|
}
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
.
|
|
685
|
-
|
|
686
|
+
const handler = async () => {
|
|
687
|
+
const results = await Promise.all(collectIdlePromises);
|
|
688
|
+
if (!results.every(Boolean)) return;
|
|
689
|
+
|
|
690
|
+
updateDataSourceSchema();
|
|
691
|
+
await updateDsData();
|
|
692
|
+
updateStageNodes(root.items);
|
|
693
|
+
};
|
|
694
|
+
handler();
|
|
686
695
|
}
|
|
687
696
|
} else if (root?.dataSources) {
|
|
688
697
|
updateDsData();
|
|
@@ -706,11 +715,12 @@ export const initServiceEvents = (
|
|
|
706
715
|
const nodeIds = Object.keys(root.dataSourceDeps?.[id] || {});
|
|
707
716
|
const nodes = getNodes(nodeIds, root.items);
|
|
708
717
|
|
|
709
|
-
await Promise.all([
|
|
718
|
+
const results = await Promise.all([
|
|
710
719
|
collectIdle(nodes, false, DepTargetType.DATA_SOURCE),
|
|
711
720
|
collectIdle(nodes, false, DepTargetType.DATA_SOURCE_COND),
|
|
712
721
|
collectIdle(nodes, false, DepTargetType.DATA_SOURCE_METHOD),
|
|
713
722
|
]);
|
|
723
|
+
if (!results.every(Boolean)) return;
|
|
714
724
|
|
|
715
725
|
updateDataSourceSchema();
|
|
716
726
|
|
package/src/services/dep.ts
CHANGED
|
@@ -42,6 +42,21 @@ interface State {
|
|
|
42
42
|
|
|
43
43
|
type StateKey = keyof State;
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* 一次 collectIdle 调用对应一个批次。批次自行统计入队/完成的任务数,在自身任务全部完成或被中断时
|
|
47
|
+
* 结算对应的 Promise,避免多次快速触发时共用 idleTask 的 finish 事件造成的串扰、提前 resolve,
|
|
48
|
+
* 以及 clearTasks 后 Promise 永不 resolve(collecting 卡死、监听器泄漏)。
|
|
49
|
+
*/
|
|
50
|
+
interface CollectBatch {
|
|
51
|
+
nodes: MNode[];
|
|
52
|
+
deep: boolean;
|
|
53
|
+
pending: number;
|
|
54
|
+
dsPending: number;
|
|
55
|
+
collectedEmitted: boolean;
|
|
56
|
+
dsSettled: boolean;
|
|
57
|
+
resolve: (completed: boolean) => void;
|
|
58
|
+
}
|
|
59
|
+
|
|
45
60
|
class Dep extends BaseService {
|
|
46
61
|
private state = shallowReactive<State>({
|
|
47
62
|
collecting: false,
|
|
@@ -54,6 +69,12 @@ class Dep extends BaseService {
|
|
|
54
69
|
|
|
55
70
|
private waitingWorker?: Promise<void>;
|
|
56
71
|
|
|
72
|
+
private resolveWaitingWorker?: () => void;
|
|
73
|
+
|
|
74
|
+
private workerGeneration = 0;
|
|
75
|
+
|
|
76
|
+
private activeBatches = new Set<CollectBatch>();
|
|
77
|
+
|
|
57
78
|
constructor() {
|
|
58
79
|
super();
|
|
59
80
|
|
|
@@ -137,38 +158,44 @@ class Dep extends BaseService {
|
|
|
137
158
|
await this.waitingWorker;
|
|
138
159
|
}
|
|
139
160
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
161
|
+
const batch: CollectBatch = {
|
|
162
|
+
nodes,
|
|
163
|
+
deep,
|
|
164
|
+
pending: 0,
|
|
165
|
+
dsPending: 0,
|
|
166
|
+
collectedEmitted: false,
|
|
167
|
+
dsSettled: false,
|
|
168
|
+
resolve: () => {},
|
|
169
|
+
};
|
|
144
170
|
|
|
145
|
-
|
|
171
|
+
this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
|
|
172
|
+
this.enqueueTask(node, target, depExtendedData, deep, batch);
|
|
146
173
|
});
|
|
147
174
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
this.emit('ds-collected', nodes, deep);
|
|
161
|
-
resolve();
|
|
162
|
-
});
|
|
175
|
+
// 没有命中任何 target,无需收集,直接完成
|
|
176
|
+
if (batch.pending === 0) {
|
|
177
|
+
this.emit('collected', nodes, deep);
|
|
178
|
+
this.updateCollectingState();
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
this.activeBatches.add(batch);
|
|
183
|
+
this.set('collecting', true);
|
|
184
|
+
|
|
185
|
+
return new Promise<boolean>((resolve) => {
|
|
186
|
+
batch.resolve = resolve;
|
|
163
187
|
});
|
|
164
188
|
}
|
|
165
189
|
|
|
166
190
|
public collectByWorker(dsl: MApp) {
|
|
167
191
|
this.set('collecting', true);
|
|
192
|
+
this.workerGeneration += 1;
|
|
193
|
+
const generation = this.workerGeneration;
|
|
168
194
|
|
|
169
195
|
const { promise, resolve: waitingResolve } = Promise.withResolvers<void>();
|
|
170
196
|
|
|
171
197
|
this.waitingWorker = promise;
|
|
198
|
+
this.resolveWaitingWorker = waitingResolve;
|
|
172
199
|
|
|
173
200
|
return new Promise<Record<string, Record<string, DepData>>>((resolve) => {
|
|
174
201
|
const worker = new Work();
|
|
@@ -182,6 +209,11 @@ class Dep extends BaseService {
|
|
|
182
209
|
resolve({});
|
|
183
210
|
};
|
|
184
211
|
}).then((depsData) => {
|
|
212
|
+
if (generation !== this.workerGeneration) {
|
|
213
|
+
waitingResolve();
|
|
214
|
+
return depsData;
|
|
215
|
+
}
|
|
216
|
+
|
|
185
217
|
traverseTarget(this.watcher.getTargetsList(), (target) => {
|
|
186
218
|
if (depsData[target.type]?.[target.id]) {
|
|
187
219
|
target.deps = reactive(depsData[target.type][target.id]);
|
|
@@ -200,6 +232,10 @@ class Dep extends BaseService {
|
|
|
200
232
|
this.emit('collected', dsl.items, true);
|
|
201
233
|
this.emit('ds-collected', dsl.items, true);
|
|
202
234
|
waitingResolve();
|
|
235
|
+
if (this.waitingWorker === promise) {
|
|
236
|
+
this.waitingWorker = undefined;
|
|
237
|
+
this.resolveWaitingWorker = undefined;
|
|
238
|
+
}
|
|
203
239
|
|
|
204
240
|
return depsData;
|
|
205
241
|
});
|
|
@@ -233,6 +269,7 @@ class Dep extends BaseService {
|
|
|
233
269
|
}
|
|
234
270
|
|
|
235
271
|
public clearIdleTasks() {
|
|
272
|
+
this.abortActiveBatches();
|
|
236
273
|
this.idleTask.clearTasks();
|
|
237
274
|
}
|
|
238
275
|
|
|
@@ -251,6 +288,11 @@ class Dep extends BaseService {
|
|
|
251
288
|
}
|
|
252
289
|
|
|
253
290
|
public reset() {
|
|
291
|
+
this.abortActiveBatches();
|
|
292
|
+
this.workerGeneration += 1;
|
|
293
|
+
this.resolveWaitingWorker?.();
|
|
294
|
+
this.resolveWaitingWorker = undefined;
|
|
295
|
+
this.waitingWorker = undefined;
|
|
254
296
|
this.idleTask.clearTasks();
|
|
255
297
|
|
|
256
298
|
for (const type of Object.keys(this.watcher.getTargetsList())) {
|
|
@@ -286,25 +328,99 @@ class Dep extends BaseService {
|
|
|
286
328
|
}
|
|
287
329
|
}
|
|
288
330
|
|
|
289
|
-
private enqueueTask(
|
|
331
|
+
private enqueueTask(
|
|
332
|
+
node: MNode,
|
|
333
|
+
target: Target,
|
|
334
|
+
depExtendedData: DepExtendedData,
|
|
335
|
+
deep: boolean,
|
|
336
|
+
batch: CollectBatch,
|
|
337
|
+
) {
|
|
338
|
+
const isDataSource = target.type === DepTargetType.DATA_SOURCE;
|
|
339
|
+
|
|
340
|
+
batch.pending += 1;
|
|
341
|
+
if (isDataSource) {
|
|
342
|
+
batch.dsPending += 1;
|
|
343
|
+
}
|
|
344
|
+
|
|
290
345
|
this.idleTask.enqueueTask(
|
|
291
346
|
({ node, deep, target }) => {
|
|
292
|
-
|
|
347
|
+
try {
|
|
348
|
+
this.collectNode(node, target, depExtendedData, deep);
|
|
349
|
+
} finally {
|
|
350
|
+
this.onBatchTaskDone(batch, isDataSource);
|
|
351
|
+
}
|
|
293
352
|
},
|
|
294
353
|
{
|
|
295
354
|
node,
|
|
296
355
|
deep: false,
|
|
297
356
|
target,
|
|
298
357
|
},
|
|
299
|
-
|
|
358
|
+
isDataSource,
|
|
300
359
|
);
|
|
301
360
|
|
|
302
361
|
if (deep && Array.isArray(node.items) && node.items.length) {
|
|
303
362
|
node.items.forEach((item) => {
|
|
304
|
-
this.enqueueTask(item, target, depExtendedData, deep);
|
|
363
|
+
this.enqueueTask(item, target, depExtendedData, deep, batch);
|
|
305
364
|
});
|
|
306
365
|
}
|
|
307
366
|
}
|
|
367
|
+
|
|
368
|
+
private onBatchTaskDone(batch: CollectBatch, isDataSource: boolean) {
|
|
369
|
+
if (isDataSource) {
|
|
370
|
+
batch.dsPending -= 1;
|
|
371
|
+
// 数据源依赖收集完先 resolve,让 stage 尽快更新,其余依赖继续在后台收集
|
|
372
|
+
if (batch.dsPending === 0) {
|
|
373
|
+
this.settleBatchDs(batch);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
batch.pending -= 1;
|
|
378
|
+
if (batch.pending === 0) {
|
|
379
|
+
this.finishBatch(batch);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
private settleBatchDs(batch: CollectBatch) {
|
|
384
|
+
if (batch.dsSettled) return;
|
|
385
|
+
batch.dsSettled = true;
|
|
386
|
+
this.emit('ds-collected', batch.nodes, batch.deep);
|
|
387
|
+
batch.resolve(true);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private finishBatch(batch: CollectBatch) {
|
|
391
|
+
if (!batch.collectedEmitted) {
|
|
392
|
+
batch.collectedEmitted = true;
|
|
393
|
+
this.emit('collected', batch.nodes, batch.deep);
|
|
394
|
+
}
|
|
395
|
+
// 没有数据源任务的批次在此结算 Promise
|
|
396
|
+
this.settleBatchDs(batch);
|
|
397
|
+
this.activeBatches.delete(batch);
|
|
398
|
+
this.updateCollectingState();
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
|
|
403
|
+
* 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
|
|
404
|
+
* 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
|
|
405
|
+
*/
|
|
406
|
+
private abortActiveBatches() {
|
|
407
|
+
if (!this.activeBatches.size) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
const batches = [...this.activeBatches];
|
|
412
|
+
this.activeBatches.clear();
|
|
413
|
+
|
|
414
|
+
for (const batch of batches) {
|
|
415
|
+
batch.resolve(false);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
this.updateCollectingState();
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
private updateCollectingState() {
|
|
422
|
+
this.set('collecting', this.activeBatches.size > 0);
|
|
423
|
+
}
|
|
308
424
|
}
|
|
309
425
|
|
|
310
426
|
export type DepService = Dep;
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
> .m-fields-group-list {
|
|
27
27
|
> .tmagic-design-card--flat {
|
|
28
28
|
> .el-card__header {
|
|
29
|
-
padding:
|
|
29
|
+
padding: 8px 0;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
.create-button {
|
|
35
35
|
&.fullWidth {
|
|
36
36
|
width: 100%;
|
|
37
|
-
margin: 0 0
|
|
37
|
+
margin: 0 0 8px 0;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
package/src/theme/event.scss
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
.m-fields-event-select {
|
|
2
2
|
width: 100%;
|
|
3
3
|
.fullWidth {
|
|
4
|
-
width: 100
|
|
4
|
+
width: calc(100% - 32px);
|
|
5
5
|
box-sizing: border-box;
|
|
6
|
+
&.create-button {
|
|
7
|
+
width: 100%;
|
|
8
|
+
}
|
|
6
9
|
}
|
|
7
10
|
.event-select-container {
|
|
8
11
|
padding: 0 16px;
|
|
@@ -11,7 +14,7 @@
|
|
|
11
14
|
border-bottom: 1px solid #ebeef5;
|
|
12
15
|
}
|
|
13
16
|
> .el-card__body {
|
|
14
|
-
padding-bottom:
|
|
17
|
+
padding-bottom: 8px;
|
|
15
18
|
.m-fields-group-list-footer {
|
|
16
19
|
div {
|
|
17
20
|
justify-content: flex-start !important;
|
|
@@ -19,7 +22,7 @@
|
|
|
19
22
|
}
|
|
20
23
|
.el-card.tmagic-design-card--flat {
|
|
21
24
|
> .el-card__header {
|
|
22
|
-
padding:
|
|
25
|
+
padding: 8px 0;
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
}
|
|
@@ -76,17 +79,18 @@
|
|
|
76
79
|
.event-item-header {
|
|
77
80
|
position: relative;
|
|
78
81
|
width: 100%;
|
|
82
|
+
display: flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
justify-content: space-between;
|
|
79
85
|
.event-item-title {
|
|
80
86
|
color: #0f1113;
|
|
81
87
|
font-size: 16px;
|
|
82
88
|
font-weight: 500;
|
|
83
89
|
line-height: 24px;
|
|
84
|
-
margin-bottom:
|
|
90
|
+
margin-bottom: 8px;
|
|
85
91
|
}
|
|
86
92
|
.event-item-delete-button {
|
|
87
|
-
|
|
88
|
-
right: 0;
|
|
89
|
-
top: 0;
|
|
93
|
+
color: #0f1113;
|
|
90
94
|
}
|
|
91
95
|
|
|
92
96
|
.el-form-item {
|
package/src/type.ts
CHANGED
|
@@ -178,6 +178,11 @@ export interface StageOptions {
|
|
|
178
178
|
containerHighlightClassName?: string;
|
|
179
179
|
containerHighlightDuration?: number;
|
|
180
180
|
containerHighlightType?: ContainerHighlightType;
|
|
181
|
+
/**
|
|
182
|
+
* 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
|
|
183
|
+
* 开启后在画布中拖动已有组件不会识别容器,默认 false
|
|
184
|
+
*/
|
|
185
|
+
containerHighlightAddOnly?: boolean;
|
|
181
186
|
disabledDragStart?: boolean;
|
|
182
187
|
render?: (stage: StageCore) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
|
|
183
188
|
moveableOptions?: CustomizeMoveableOptions;
|
|
@@ -25,6 +25,12 @@ globalThis.requestIdleCallback =
|
|
|
25
25
|
}, 1);
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
globalThis.cancelIdleCallback =
|
|
29
|
+
globalThis.cancelIdleCallback ||
|
|
30
|
+
function (handle) {
|
|
31
|
+
clearTimeout(handle as unknown as ReturnType<typeof setTimeout>);
|
|
32
|
+
};
|
|
33
|
+
|
|
28
34
|
export class IdleTask<T = any> extends EventEmitter {
|
|
29
35
|
private taskList: TaskList<T> = [];
|
|
30
36
|
|
package/types/index.d.ts
CHANGED
|
@@ -520,6 +520,9 @@ declare class Dep extends BaseService {
|
|
|
520
520
|
private idleTask;
|
|
521
521
|
private watcher;
|
|
522
522
|
private waitingWorker?;
|
|
523
|
+
private resolveWaitingWorker?;
|
|
524
|
+
private workerGeneration;
|
|
525
|
+
private activeBatches;
|
|
523
526
|
constructor();
|
|
524
527
|
set<K extends StateKey, T extends State$1[K]>(name: K, value: T): void;
|
|
525
528
|
get<K extends StateKey>(name: K): State$1[K];
|
|
@@ -533,7 +536,7 @@ declare class Dep extends BaseService {
|
|
|
533
536
|
removeTarget(id: Id, type?: string): void;
|
|
534
537
|
clearTargets(): void;
|
|
535
538
|
collect(nodes: MNode[], depExtendedData?: DepExtendedData, deep?: boolean, type?: DepTargetType$1): void;
|
|
536
|
-
collectIdle(nodes: MNode[], depExtendedData?: DepExtendedData, deep?: boolean, type?: DepTargetType$1): Promise<
|
|
539
|
+
collectIdle(nodes: MNode[], depExtendedData?: DepExtendedData, deep?: boolean, type?: DepTargetType$1): Promise<boolean>;
|
|
537
540
|
collectByWorker(dsl: MApp): Promise<Record<string, Record<string, DepData>>>;
|
|
538
541
|
collectNode(node: MNode, target: Target, depExtendedData?: DepExtendedData, deep?: boolean): void;
|
|
539
542
|
clear(nodes?: MNode[]): void;
|
|
@@ -552,6 +555,16 @@ declare class Dep extends BaseService {
|
|
|
552
555
|
*/
|
|
553
556
|
private removePageDep;
|
|
554
557
|
private enqueueTask;
|
|
558
|
+
private onBatchTaskDone;
|
|
559
|
+
private settleBatchDs;
|
|
560
|
+
private finishBatch;
|
|
561
|
+
/**
|
|
562
|
+
* idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
|
|
563
|
+
* 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
|
|
564
|
+
* 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
|
|
565
|
+
*/
|
|
566
|
+
private abortActiveBatches;
|
|
567
|
+
private updateCollectingState;
|
|
555
568
|
}
|
|
556
569
|
type DepService = Dep;
|
|
557
570
|
declare const _default$44: Dep;
|
|
@@ -1700,6 +1713,11 @@ interface StageOptions {
|
|
|
1700
1713
|
containerHighlightClassName?: string;
|
|
1701
1714
|
containerHighlightDuration?: number;
|
|
1702
1715
|
containerHighlightType?: ContainerHighlightType;
|
|
1716
|
+
/**
|
|
1717
|
+
* 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
|
|
1718
|
+
* 开启后在画布中拖动已有组件不会识别容器,默认 false
|
|
1719
|
+
*/
|
|
1720
|
+
containerHighlightAddOnly?: boolean;
|
|
1703
1721
|
disabledDragStart?: boolean;
|
|
1704
1722
|
render?: (stage: StageCore$1) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
|
|
1705
1723
|
moveableOptions?: CustomizeMoveableOptions;
|
|
@@ -3657,6 +3675,11 @@ interface EditorProps {
|
|
|
3657
3675
|
containerHighlightDuration?: number;
|
|
3658
3676
|
/** 拖入画布中容器时,识别容器的操作类型 */
|
|
3659
3677
|
containerHighlightType?: ContainerHighlightType;
|
|
3678
|
+
/**
|
|
3679
|
+
* 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
|
|
3680
|
+
* 开启后在画布中拖动已有组件不会识别容器,默认 false
|
|
3681
|
+
*/
|
|
3682
|
+
containerHighlightAddOnly?: boolean;
|
|
3660
3683
|
/** 画布大小 */
|
|
3661
3684
|
stageRect?: StageRect;
|
|
3662
3685
|
/** monaco editor 的配置 */
|
|
@@ -4720,6 +4743,7 @@ declare const __VLS_base$12: import("@vue/runtime-core").DefineComponent<EditorP
|
|
|
4720
4743
|
datasourceConfigs: Record<string, import("@tmagic/form-schema").FormConfig>;
|
|
4721
4744
|
containerHighlightDuration: number;
|
|
4722
4745
|
containerHighlightType: import("@tmagic/stage").ContainerHighlightType;
|
|
4746
|
+
containerHighlightAddOnly: boolean;
|
|
4723
4747
|
canSelect: (el: HTMLElement) => boolean | Promise<boolean>;
|
|
4724
4748
|
}, {}, {}, {}, string, import("@vue/runtime-core").ComponentProvideOptions, false, {}, any>;
|
|
4725
4749
|
declare const __VLS_export$39: __VLS_WithSlots$12<typeof __VLS_base$12, __VLS_Slots$12>;
|