@tmagic/editor 1.4.6 → 1.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tmagic-editor.js +324 -139
- package/dist/tmagic-editor.umd.cjs +323 -138
- package/package.json +9 -9
- package/src/components/TreeNode.vue +3 -1
- package/src/editorProps.ts +0 -7
- package/src/fields/DataSourceInput.vue +7 -1
- package/src/fields/EventSelect.vue +90 -16
- package/src/initService.ts +24 -28
- package/src/layouts/sidebar/code-block/CodeBlockList.vue +34 -16
- package/src/layouts/sidebar/data-source/DataSourceList.vue +17 -5
- package/src/services/codeBlock.ts +14 -11
- package/src/services/dataSource.ts +14 -7
- package/src/services/dep.ts +77 -5
- package/src/services/editor.ts +23 -14
- package/src/services/props.ts +14 -8
- package/src/utils/data-source/index.ts +20 -13
- package/src/utils/idle-task.ts +72 -0
- package/src/utils/operator.ts +6 -6
- package/types/editorProps.d.ts +0 -7
- package/types/layouts/PropsPanel.vue.d.ts +9 -9
- package/types/services/codeBlock.d.ts +2 -1
- package/types/services/dataSource.d.ts +2 -1
- package/types/services/dep.d.ts +12 -2
- package/types/services/editor.d.ts +3 -2
- package/types/services/props.d.ts +2 -1
- package/types/utils/idle-task.d.ts +14 -0
- package/types/utils/operator.d.ts +2 -2
|
@@ -673,48 +673,6 @@
|
|
|
673
673
|
}
|
|
674
674
|
}
|
|
675
675
|
|
|
676
|
-
class Dep extends BaseService {
|
|
677
|
-
watcher = new dep.Watcher({ initialTargets: vue.reactive({}) });
|
|
678
|
-
removeTargets(type = dep.DepTargetType.DEFAULT) {
|
|
679
|
-
this.watcher.removeTargets(type);
|
|
680
|
-
this.emit("remove-target");
|
|
681
|
-
}
|
|
682
|
-
getTargets(type = dep.DepTargetType.DEFAULT) {
|
|
683
|
-
return this.watcher.getTargets(type);
|
|
684
|
-
}
|
|
685
|
-
getTarget(id, type = dep.DepTargetType.DEFAULT) {
|
|
686
|
-
return this.watcher.getTarget(id, type);
|
|
687
|
-
}
|
|
688
|
-
addTarget(target) {
|
|
689
|
-
this.watcher.addTarget(target);
|
|
690
|
-
this.emit("add-target", target);
|
|
691
|
-
}
|
|
692
|
-
removeTarget(id, type = dep.DepTargetType.DEFAULT) {
|
|
693
|
-
this.watcher.removeTarget(id, type);
|
|
694
|
-
this.emit("remove-target");
|
|
695
|
-
}
|
|
696
|
-
clearTargets() {
|
|
697
|
-
this.watcher.clearTargets();
|
|
698
|
-
}
|
|
699
|
-
collect(nodes, deep = false, type) {
|
|
700
|
-
this.watcher.collect(nodes, deep, type);
|
|
701
|
-
this.emit("collected", nodes, deep);
|
|
702
|
-
}
|
|
703
|
-
clear(nodes) {
|
|
704
|
-
return this.watcher.clear(nodes);
|
|
705
|
-
}
|
|
706
|
-
clearByType(type, nodes) {
|
|
707
|
-
return this.watcher.clearByType(type, nodes);
|
|
708
|
-
}
|
|
709
|
-
hasTarget(id, type = dep.DepTargetType.DEFAULT) {
|
|
710
|
-
return this.watcher.hasTarget(id, type);
|
|
711
|
-
}
|
|
712
|
-
hasSpecifiedTypeTarget(type = dep.DepTargetType.DEFAULT) {
|
|
713
|
-
return this.watcher.hasSpecifiedTypeTarget(type);
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
const depService = new Dep();
|
|
717
|
-
|
|
718
676
|
const canUsePluginMethods$6 = {
|
|
719
677
|
async: [
|
|
720
678
|
"setPropsConfig",
|
|
@@ -854,15 +812,16 @@
|
|
|
854
812
|
* @param originConfigs 原组件配置
|
|
855
813
|
* @param targetConfigs 待替换的组件配置
|
|
856
814
|
*/
|
|
857
|
-
replaceRelateId(originConfigs, targetConfigs) {
|
|
815
|
+
replaceRelateId(originConfigs, targetConfigs, collectorOptions) {
|
|
858
816
|
const relateIdMap = this.getRelateIdMap();
|
|
859
817
|
if (Object.keys(relateIdMap).length === 0)
|
|
860
818
|
return;
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
819
|
+
const target = new dep.Target({
|
|
820
|
+
...collectorOptions
|
|
821
|
+
});
|
|
822
|
+
const coperWatcher = new dep.Watcher();
|
|
823
|
+
coperWatcher.addTarget(target);
|
|
824
|
+
coperWatcher.collect(originConfigs, {}, true, collectorOptions.type);
|
|
866
825
|
originConfigs.forEach((config) => {
|
|
867
826
|
const newId = relateIdMap[config.id];
|
|
868
827
|
const path = utils.getNodePath(newId, targetConfigs);
|
|
@@ -877,7 +836,7 @@
|
|
|
877
836
|
utils.setValueByKeyPath(fullKey, relateTargetId, targetConfig);
|
|
878
837
|
});
|
|
879
838
|
if (config.items && Array.isArray(config.items)) {
|
|
880
|
-
this.replaceRelateId(config.items, targetConfigs);
|
|
839
|
+
this.replaceRelateId(config.items, targetConfigs, collectorOptions);
|
|
881
840
|
}
|
|
882
841
|
});
|
|
883
842
|
}
|
|
@@ -1423,7 +1382,7 @@
|
|
|
1423
1382
|
}
|
|
1424
1383
|
};
|
|
1425
1384
|
|
|
1426
|
-
const beforePaste = (position, config) => {
|
|
1385
|
+
const beforePaste = (position, config, doc) => {
|
|
1427
1386
|
if (!config[0]?.style)
|
|
1428
1387
|
return config;
|
|
1429
1388
|
const curNode = editorService.get("node");
|
|
@@ -1432,7 +1391,7 @@
|
|
|
1432
1391
|
const { offsetX = 0, offsetY = 0, ...positionClone } = position;
|
|
1433
1392
|
let pastePosition = positionClone;
|
|
1434
1393
|
if (!lodashEs.isEmpty(pastePosition) && curNode?.items) {
|
|
1435
|
-
pastePosition = getPositionInContainer(pastePosition, curNode.id);
|
|
1394
|
+
pastePosition = getPositionInContainer(pastePosition, curNode.id, doc);
|
|
1436
1395
|
}
|
|
1437
1396
|
if (pastePosition.left && configItem.style?.left) {
|
|
1438
1397
|
pastePosition.left = configItem.style.left - referenceLeft + pastePosition.left;
|
|
@@ -1462,12 +1421,12 @@
|
|
|
1462
1421
|
});
|
|
1463
1422
|
return pasteConfigs;
|
|
1464
1423
|
};
|
|
1465
|
-
const getPositionInContainer = (position = {}, id) => {
|
|
1424
|
+
const getPositionInContainer = (position = {}, id, doc) => {
|
|
1466
1425
|
let { left = 0, top = 0 } = position;
|
|
1467
1426
|
const parentEl = editorService.get("stage")?.renderer?.contentWindow?.document.getElementById(`${id}`);
|
|
1468
1427
|
const parentElRect = parentEl?.getBoundingClientRect();
|
|
1469
|
-
left = left - (parentElRect?.left || 0);
|
|
1470
|
-
top = top - (parentElRect?.top || 0);
|
|
1428
|
+
left = left - utils.calcValueByFontsize(doc, parentElRect?.left || 0);
|
|
1429
|
+
top = top - utils.calcValueByFontsize(doc, parentElRect?.top || 0);
|
|
1471
1430
|
return {
|
|
1472
1431
|
left,
|
|
1473
1432
|
top
|
|
@@ -1991,15 +1950,15 @@
|
|
|
1991
1950
|
* @param config 组件节点配置
|
|
1992
1951
|
* @returns
|
|
1993
1952
|
*/
|
|
1994
|
-
copyWithRelated(config) {
|
|
1953
|
+
copyWithRelated(config, collectorOptions) {
|
|
1995
1954
|
const copyNodes = Array.isArray(config) ? config : [config];
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
dep.
|
|
2001
|
-
|
|
2002
|
-
|
|
1955
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
1956
|
+
const customTarget = new dep.Target({
|
|
1957
|
+
...collectorOptions
|
|
1958
|
+
});
|
|
1959
|
+
const coperWatcher = new dep.Watcher();
|
|
1960
|
+
coperWatcher.addTarget(customTarget);
|
|
1961
|
+
coperWatcher.collect(copyNodes, {}, true, collectorOptions.type);
|
|
2003
1962
|
Object.keys(customTarget.deps).forEach((nodeId) => {
|
|
2004
1963
|
const node = this.getNodeById(nodeId);
|
|
2005
1964
|
if (!node)
|
|
@@ -2025,7 +1984,7 @@
|
|
|
2025
1984
|
* @param position 粘贴的坐标
|
|
2026
1985
|
* @returns 添加后的组件节点配置
|
|
2027
1986
|
*/
|
|
2028
|
-
async paste(position = {}) {
|
|
1987
|
+
async paste(position = {}, collectorOptions) {
|
|
2029
1988
|
const config = storageService.getItem(COPY_STORAGE_KEY);
|
|
2030
1989
|
if (!Array.isArray(config))
|
|
2031
1990
|
return;
|
|
@@ -2038,12 +1997,15 @@
|
|
|
2038
1997
|
}
|
|
2039
1998
|
}
|
|
2040
1999
|
const pasteConfigs = await this.doPaste(config, position);
|
|
2041
|
-
|
|
2000
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
2001
|
+
propsService.replaceRelateId(config, pasteConfigs, collectorOptions);
|
|
2002
|
+
}
|
|
2042
2003
|
return this.add(pasteConfigs, parent);
|
|
2043
2004
|
}
|
|
2044
2005
|
async doPaste(config, position = {}) {
|
|
2045
2006
|
propsService.clearRelateId();
|
|
2046
|
-
const
|
|
2007
|
+
const doc = this.get("stage")?.renderer.contentWindow?.document;
|
|
2008
|
+
const pasteConfigs = beforePaste(position, lodashEs.cloneDeep(config), doc);
|
|
2047
2009
|
return pasteConfigs;
|
|
2048
2010
|
}
|
|
2049
2011
|
async doAlignCenter(config) {
|
|
@@ -2592,16 +2554,20 @@
|
|
|
2592
2554
|
let dsText = "";
|
|
2593
2555
|
let ds;
|
|
2594
2556
|
let fields;
|
|
2595
|
-
match[1].split(".").forEach((item, index2) => {
|
|
2557
|
+
match[1].replaceAll(/\[(\d+)\]/g, ".$1").split(".").forEach((item, index2) => {
|
|
2596
2558
|
if (index2 === 0) {
|
|
2597
2559
|
ds = dataSources.find((ds2) => ds2.id === item);
|
|
2598
2560
|
dsText += ds?.title || item;
|
|
2599
2561
|
fields = ds?.fields;
|
|
2600
2562
|
return;
|
|
2601
2563
|
}
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2564
|
+
if (utils.isNumber(item)) {
|
|
2565
|
+
dsText += `[${item}]`;
|
|
2566
|
+
} else {
|
|
2567
|
+
const field = fields?.find((field2) => field2.name === item);
|
|
2568
|
+
fields = field?.fields;
|
|
2569
|
+
dsText += `.${field?.title || item}`;
|
|
2570
|
+
}
|
|
2605
2571
|
});
|
|
2606
2572
|
displayState.push({
|
|
2607
2573
|
type: "var",
|
|
@@ -2749,13 +2715,16 @@
|
|
|
2749
2715
|
* @param config 组件节点配置
|
|
2750
2716
|
* @returns
|
|
2751
2717
|
*/
|
|
2752
|
-
copyWithRelated(config) {
|
|
2718
|
+
copyWithRelated(config, collectorOptions) {
|
|
2753
2719
|
const copyNodes = Array.isArray(config) ? config : [config];
|
|
2754
|
-
depService.clearByType(dep.DepTargetType.RELATED_DS_WHEN_COPY);
|
|
2755
|
-
depService.collect(copyNodes, true, dep.DepTargetType.RELATED_DS_WHEN_COPY);
|
|
2756
|
-
const customTarget = depService.getTarget(dep.DepTargetType.RELATED_DS_WHEN_COPY, dep.DepTargetType.RELATED_DS_WHEN_COPY);
|
|
2757
2720
|
const copyData = [];
|
|
2758
|
-
if (
|
|
2721
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
2722
|
+
const customTarget = new dep.Target({
|
|
2723
|
+
...collectorOptions
|
|
2724
|
+
});
|
|
2725
|
+
const coperWatcher = new dep.Watcher();
|
|
2726
|
+
coperWatcher.addTarget(customTarget);
|
|
2727
|
+
coperWatcher.collect(copyNodes, {}, true, collectorOptions.type);
|
|
2759
2728
|
Object.keys(customTarget.deps).forEach((nodeId) => {
|
|
2760
2729
|
const node = editorService.getNodeById(nodeId);
|
|
2761
2730
|
if (!node)
|
|
@@ -4638,7 +4607,7 @@
|
|
|
4638
4607
|
const fieldQuerySearch = (queryString, leftAngleIndex, dotIndex, cb) => {
|
|
4639
4608
|
let result = [];
|
|
4640
4609
|
const dsKey = queryString.substring(leftAngleIndex + 1, dotIndex);
|
|
4641
|
-
const keys = dsKey.split(".");
|
|
4610
|
+
const keys = dsKey.replaceAll(/\[(\d+)\]/g, ".$1").split(".");
|
|
4642
4611
|
const dsId = keys.shift();
|
|
4643
4612
|
const ds = dataSources.value.find((ds2) => ds2.id === dsId);
|
|
4644
4613
|
if (!ds) {
|
|
@@ -4648,6 +4617,10 @@
|
|
|
4648
4617
|
let fields = ds.fields || [];
|
|
4649
4618
|
let key = keys.shift();
|
|
4650
4619
|
while (key) {
|
|
4620
|
+
if (utils.isNumber(key)) {
|
|
4621
|
+
key = keys.shift();
|
|
4622
|
+
continue;
|
|
4623
|
+
}
|
|
4651
4624
|
for (const field of fields) {
|
|
4652
4625
|
if (field.name === key) {
|
|
4653
4626
|
fields = field.fields || [];
|
|
@@ -5691,13 +5664,17 @@
|
|
|
5691
5664
|
const eventsService = services?.eventsService;
|
|
5692
5665
|
const codeBlockService = services?.codeBlockService;
|
|
5693
5666
|
const eventNameConfig = vue.computed(() => {
|
|
5694
|
-
const fieldType = props.config.src === "component" ? "select" : "cascader";
|
|
5695
5667
|
const defaultEventNameConfig = {
|
|
5696
5668
|
name: "name",
|
|
5697
5669
|
text: "事件",
|
|
5698
|
-
type:
|
|
5670
|
+
type: (mForm, { formValue }) => {
|
|
5671
|
+
if (props.config.src !== "component" || formValue.type === "page-fragment-container" && formValue.pageFragmentId) {
|
|
5672
|
+
return "cascader";
|
|
5673
|
+
}
|
|
5674
|
+
return "select";
|
|
5675
|
+
},
|
|
5699
5676
|
labelWidth: "40px",
|
|
5700
|
-
checkStrictly:
|
|
5677
|
+
checkStrictly: () => props.config.src !== "component",
|
|
5701
5678
|
valueSeparator: ".",
|
|
5702
5679
|
options: (mForm, { formValue }) => {
|
|
5703
5680
|
let events = [];
|
|
@@ -5705,6 +5682,29 @@
|
|
|
5705
5682
|
return events;
|
|
5706
5683
|
if (props.config.src === "component") {
|
|
5707
5684
|
events = eventsService.getEvent(formValue.type);
|
|
5685
|
+
if (formValue.type === "page-fragment-container" && formValue.pageFragmentId) {
|
|
5686
|
+
const pageFragment = editorService?.get("root")?.items?.find((page) => page.id === formValue.pageFragmentId);
|
|
5687
|
+
if (pageFragment) {
|
|
5688
|
+
events = [
|
|
5689
|
+
{
|
|
5690
|
+
label: pageFragment.name || "迭代器容器",
|
|
5691
|
+
value: pageFragment.id,
|
|
5692
|
+
children: events
|
|
5693
|
+
}
|
|
5694
|
+
];
|
|
5695
|
+
pageFragment.items.forEach((node) => {
|
|
5696
|
+
traverseNode(node, (node2) => {
|
|
5697
|
+
const nodeEvents = node2.type && eventsService.getEvent(node2.type) || [];
|
|
5698
|
+
events.push({
|
|
5699
|
+
label: `${node2.name}_${node2.id}`,
|
|
5700
|
+
value: `${node2.id}`,
|
|
5701
|
+
children: nodeEvents
|
|
5702
|
+
});
|
|
5703
|
+
});
|
|
5704
|
+
});
|
|
5705
|
+
return events;
|
|
5706
|
+
}
|
|
5707
|
+
}
|
|
5708
5708
|
return events.map((option) => ({
|
|
5709
5709
|
text: option.label,
|
|
5710
5710
|
value: option.value
|
|
@@ -5763,7 +5763,11 @@
|
|
|
5763
5763
|
name: "to",
|
|
5764
5764
|
text: "联动组件",
|
|
5765
5765
|
type: "ui-select",
|
|
5766
|
-
display: (mForm, { model }) => model.actionType === schema.ActionType.COMP
|
|
5766
|
+
display: (mForm, { model }) => model.actionType === schema.ActionType.COMP,
|
|
5767
|
+
onChange: (MForm, v, { model }) => {
|
|
5768
|
+
model.method = "";
|
|
5769
|
+
return v;
|
|
5770
|
+
}
|
|
5767
5771
|
};
|
|
5768
5772
|
return { ...defaultTargetCompConfig, ...props.config.targetCompConfig };
|
|
5769
5773
|
});
|
|
@@ -5771,15 +5775,43 @@
|
|
|
5771
5775
|
const defaultCompActionConfig = {
|
|
5772
5776
|
name: "method",
|
|
5773
5777
|
text: "动作",
|
|
5774
|
-
type:
|
|
5778
|
+
type: (mForm, { model }) => {
|
|
5779
|
+
const to = editorService?.getNodeById(model.to);
|
|
5780
|
+
if (to && to.type === "page-fragment-container" && to.pageFragmentId) {
|
|
5781
|
+
return "cascader";
|
|
5782
|
+
}
|
|
5783
|
+
return "select";
|
|
5784
|
+
},
|
|
5785
|
+
checkStrictly: () => props.config.src !== "component",
|
|
5775
5786
|
display: (mForm, { model }) => model.actionType === schema.ActionType.COMP,
|
|
5776
5787
|
options: (mForm, { model }) => {
|
|
5777
5788
|
const node = editorService?.getNodeById(model.to);
|
|
5778
5789
|
if (!node?.type)
|
|
5779
5790
|
return [];
|
|
5780
|
-
|
|
5781
|
-
|
|
5782
|
-
|
|
5791
|
+
let methods = [];
|
|
5792
|
+
methods = eventsService?.getMethod(node.type) || [];
|
|
5793
|
+
if (node.type === "page-fragment-container" && node.pageFragmentId) {
|
|
5794
|
+
const pageFragment = editorService?.get("root")?.items?.find((page) => page.id === node.pageFragmentId);
|
|
5795
|
+
if (pageFragment) {
|
|
5796
|
+
methods = [];
|
|
5797
|
+
pageFragment.items.forEach((node2) => {
|
|
5798
|
+
traverseNode(node2, (node3) => {
|
|
5799
|
+
const nodeMethods = node3.type && eventsService?.getMethod(node3.type) || [];
|
|
5800
|
+
if (nodeMethods.length) {
|
|
5801
|
+
methods.push({
|
|
5802
|
+
label: `${node3.name}_${node3.id}`,
|
|
5803
|
+
value: `${node3.id}`,
|
|
5804
|
+
children: nodeMethods
|
|
5805
|
+
});
|
|
5806
|
+
}
|
|
5807
|
+
});
|
|
5808
|
+
});
|
|
5809
|
+
return methods;
|
|
5810
|
+
}
|
|
5811
|
+
}
|
|
5812
|
+
return methods.map((method) => ({
|
|
5813
|
+
text: method.label,
|
|
5814
|
+
value: method.value
|
|
5783
5815
|
}));
|
|
5784
5816
|
}
|
|
5785
5817
|
};
|
|
@@ -7675,7 +7707,9 @@
|
|
|
7675
7707
|
const selected = vue.computed(() => nodeStatus.value.selected);
|
|
7676
7708
|
const visible = vue.computed(() => nodeStatus.value.visible);
|
|
7677
7709
|
const draggable = vue.computed(() => nodeStatus.value.draggable);
|
|
7678
|
-
const hasChildren = vue.computed(
|
|
7710
|
+
const hasChildren = vue.computed(
|
|
7711
|
+
() => Array.isArray(props.data.items) && props.data.items.some((item) => props.nodeStatusMap.get(item.id)?.visible)
|
|
7712
|
+
);
|
|
7679
7713
|
const handleDragStart = (event) => {
|
|
7680
7714
|
treeEmit?.("node-dragstart", event, props.data);
|
|
7681
7715
|
};
|
|
@@ -7906,24 +7940,38 @@
|
|
|
7906
7940
|
const services = vue.inject("services");
|
|
7907
7941
|
const { codeBlockService, depService, editorService } = services || {};
|
|
7908
7942
|
const codeList = vue.computed(
|
|
7909
|
-
() => Object.
|
|
7910
|
-
const
|
|
7911
|
-
|
|
7943
|
+
() => Object.entries(codeBlockService?.getCodeDsl() || {}).map(([codeId, code]) => {
|
|
7944
|
+
const target = depService?.getTarget(codeId, dep.DepTargetType.CODE_BLOCK);
|
|
7945
|
+
const pageList = editorService?.get("root")?.items.map((page) => ({
|
|
7946
|
+
name: page.devconfig?.tabName || page.name,
|
|
7912
7947
|
type: "node",
|
|
7913
|
-
id: `${
|
|
7914
|
-
key: id,
|
|
7915
|
-
items:
|
|
7916
|
-
|
|
7917
|
-
|
|
7918
|
-
|
|
7919
|
-
|
|
7948
|
+
id: `${codeId}_${page.id}`,
|
|
7949
|
+
key: page.id,
|
|
7950
|
+
items: []
|
|
7951
|
+
})) || [];
|
|
7952
|
+
if (target) {
|
|
7953
|
+
Object.entries(target.deps).forEach(([id, dep]) => {
|
|
7954
|
+
const page = pageList.find((page2) => page2.key === dep.data?.pageId);
|
|
7955
|
+
page?.items?.push({
|
|
7956
|
+
name: dep.name,
|
|
7957
|
+
type: "node",
|
|
7958
|
+
id: `${page.id}_${id}`,
|
|
7959
|
+
key: id,
|
|
7960
|
+
items: dep.keys.map((key) => {
|
|
7961
|
+
const data2 = { name: `${key}`, id: `${target.id}_${id}_${key}`, type: "key" };
|
|
7962
|
+
return data2;
|
|
7963
|
+
})
|
|
7964
|
+
});
|
|
7965
|
+
});
|
|
7966
|
+
}
|
|
7920
7967
|
const data = {
|
|
7921
|
-
id:
|
|
7922
|
-
key:
|
|
7923
|
-
name:
|
|
7968
|
+
id: codeId,
|
|
7969
|
+
key: codeId,
|
|
7970
|
+
name: code.name,
|
|
7924
7971
|
type: "code",
|
|
7925
|
-
codeBlockContent: codeBlockService?.getCodeContentById(
|
|
7926
|
-
|
|
7972
|
+
codeBlockContent: codeBlockService?.getCodeContentById(codeId),
|
|
7973
|
+
// 只有一个页面不显示页面分类
|
|
7974
|
+
items: pageList.length > 1 ? pageList.filter((page) => page.items?.length) : pageList[0]?.items || []
|
|
7927
7975
|
};
|
|
7928
7976
|
return data;
|
|
7929
7977
|
})
|
|
@@ -8238,13 +8286,14 @@
|
|
|
8238
8286
|
key: id,
|
|
8239
8287
|
items: getKeyTreeConfig(dep, type, `${parentKey}_${id}`)
|
|
8240
8288
|
});
|
|
8241
|
-
const mergeChildren = (dsId,
|
|
8289
|
+
const mergeChildren = (dsId, pageItems, deps, type) => {
|
|
8242
8290
|
Object.entries(deps).forEach(([id, dep]) => {
|
|
8243
|
-
const
|
|
8291
|
+
const page = pageItems.find((page2) => page2.key === dep.data?.pageId);
|
|
8292
|
+
const nodeItem = page?.items.find((item) => item.key === id);
|
|
8244
8293
|
if (nodeItem) {
|
|
8245
8294
|
nodeItem.items = nodeItem.items.concat(getKeyTreeConfig(dep, type, nodeItem.key));
|
|
8246
8295
|
} else {
|
|
8247
|
-
items.push(getNodeTreeConfig(id, dep, type,
|
|
8296
|
+
page?.items.push(getNodeTreeConfig(id, dep, type, page.id));
|
|
8248
8297
|
}
|
|
8249
8298
|
});
|
|
8250
8299
|
};
|
|
@@ -8253,7 +8302,13 @@
|
|
|
8253
8302
|
const dsDeps = dsDep.value[ds.id]?.deps || {};
|
|
8254
8303
|
const dsMethodDeps = dsMethodDep.value[ds.id]?.deps || {};
|
|
8255
8304
|
const dsCondDeps = dsCondDep.value[ds.id]?.deps || {};
|
|
8256
|
-
const items =
|
|
8305
|
+
const items = editorService?.get("root")?.items.map((page) => ({
|
|
8306
|
+
name: page.devconfig?.tabName || page.name,
|
|
8307
|
+
type: "node",
|
|
8308
|
+
id: `${ds.id}_${page.id}`,
|
|
8309
|
+
key: page.id,
|
|
8310
|
+
items: []
|
|
8311
|
+
})) || [];
|
|
8257
8312
|
mergeChildren(ds.id, items, dsDeps);
|
|
8258
8313
|
mergeChildren(ds.id, items, dsMethodDeps, "method");
|
|
8259
8314
|
mergeChildren(ds.id, items, dsCondDeps, "cond");
|
|
@@ -8262,7 +8317,8 @@
|
|
|
8262
8317
|
key: ds.id,
|
|
8263
8318
|
name: ds.title,
|
|
8264
8319
|
type: "ds",
|
|
8265
|
-
|
|
8320
|
+
// 只有一个页面不显示页面分类
|
|
8321
|
+
items: items.length > 1 ? items.filter((page) => page.items.length) : items[0]?.items || []
|
|
8266
8322
|
};
|
|
8267
8323
|
})
|
|
8268
8324
|
);
|
|
@@ -10983,16 +11039,16 @@
|
|
|
10983
11039
|
* @param config 组件节点配置
|
|
10984
11040
|
* @returns
|
|
10985
11041
|
*/
|
|
10986
|
-
copyWithRelated(config) {
|
|
11042
|
+
copyWithRelated(config, collectorOptions) {
|
|
10987
11043
|
const copyNodes = Array.isArray(config) ? config : [config];
|
|
10988
|
-
depService.clearByType(dep.DepTargetType.RELATED_CODE_WHEN_COPY);
|
|
10989
|
-
depService.collect(copyNodes, true, dep.DepTargetType.RELATED_CODE_WHEN_COPY);
|
|
10990
|
-
const customTarget = depService.getTarget(
|
|
10991
|
-
dep.DepTargetType.RELATED_CODE_WHEN_COPY,
|
|
10992
|
-
dep.DepTargetType.RELATED_CODE_WHEN_COPY
|
|
10993
|
-
);
|
|
10994
11044
|
const copyData = {};
|
|
10995
|
-
if (
|
|
11045
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
11046
|
+
const customTarget = new dep.Target({
|
|
11047
|
+
...collectorOptions
|
|
11048
|
+
});
|
|
11049
|
+
const coperWatcher = new dep.Watcher();
|
|
11050
|
+
coperWatcher.addTarget(customTarget);
|
|
11051
|
+
coperWatcher.collect(copyNodes, {}, true, collectorOptions.type);
|
|
10996
11052
|
Object.keys(customTarget.deps).forEach((nodeId) => {
|
|
10997
11053
|
const node = editorService.getNodeById(nodeId);
|
|
10998
11054
|
if (!node)
|
|
@@ -11067,6 +11123,140 @@
|
|
|
11067
11123
|
}
|
|
11068
11124
|
const componentListService = new ComponentList();
|
|
11069
11125
|
|
|
11126
|
+
globalThis.requestIdleCallback = globalThis.requestIdleCallback || function(cb) {
|
|
11127
|
+
const start = Date.now();
|
|
11128
|
+
return setTimeout(() => {
|
|
11129
|
+
cb({
|
|
11130
|
+
didTimeout: false,
|
|
11131
|
+
timeRemaining() {
|
|
11132
|
+
return Math.max(0, 50 - (Date.now() - start));
|
|
11133
|
+
}
|
|
11134
|
+
});
|
|
11135
|
+
}, 1);
|
|
11136
|
+
};
|
|
11137
|
+
class IdleTask extends events.EventEmitter {
|
|
11138
|
+
taskList = [];
|
|
11139
|
+
taskHandle = null;
|
|
11140
|
+
enqueueTask(taskHandler, taskData) {
|
|
11141
|
+
this.taskList.push({
|
|
11142
|
+
handler: taskHandler,
|
|
11143
|
+
data: taskData
|
|
11144
|
+
});
|
|
11145
|
+
if (!this.taskHandle) {
|
|
11146
|
+
this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 1e4 });
|
|
11147
|
+
}
|
|
11148
|
+
}
|
|
11149
|
+
on(eventName, listener) {
|
|
11150
|
+
return super.on(eventName, listener);
|
|
11151
|
+
}
|
|
11152
|
+
once(eventName, listener) {
|
|
11153
|
+
return super.once(eventName, listener);
|
|
11154
|
+
}
|
|
11155
|
+
emit(eventName, ...args) {
|
|
11156
|
+
return super.emit(eventName, ...args);
|
|
11157
|
+
}
|
|
11158
|
+
runTaskQueue(deadline) {
|
|
11159
|
+
while ((deadline.timeRemaining() > 15 || deadline.didTimeout) && this.taskList.length) {
|
|
11160
|
+
const task = this.taskList.shift();
|
|
11161
|
+
task.handler(task.data);
|
|
11162
|
+
}
|
|
11163
|
+
if (this.taskList.length) {
|
|
11164
|
+
this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 1e4 });
|
|
11165
|
+
} else {
|
|
11166
|
+
this.taskHandle = 0;
|
|
11167
|
+
this.emit("finish");
|
|
11168
|
+
}
|
|
11169
|
+
}
|
|
11170
|
+
}
|
|
11171
|
+
|
|
11172
|
+
const idleTask = new IdleTask();
|
|
11173
|
+
class Dep extends BaseService {
|
|
11174
|
+
watcher = new dep.Watcher({ initialTargets: vue.reactive({}) });
|
|
11175
|
+
removeTargets(type = dep.DepTargetType.DEFAULT) {
|
|
11176
|
+
this.watcher.removeTargets(type);
|
|
11177
|
+
const targets = this.watcher.getTargets(type);
|
|
11178
|
+
if (!targets)
|
|
11179
|
+
return;
|
|
11180
|
+
for (const target of Object.values(targets)) {
|
|
11181
|
+
this.emit("remove-target", target.id);
|
|
11182
|
+
}
|
|
11183
|
+
}
|
|
11184
|
+
getTargets(type = dep.DepTargetType.DEFAULT) {
|
|
11185
|
+
return this.watcher.getTargets(type);
|
|
11186
|
+
}
|
|
11187
|
+
getTarget(id, type = dep.DepTargetType.DEFAULT) {
|
|
11188
|
+
return this.watcher.getTarget(id, type);
|
|
11189
|
+
}
|
|
11190
|
+
addTarget(target) {
|
|
11191
|
+
this.watcher.addTarget(target);
|
|
11192
|
+
this.emit("add-target", target);
|
|
11193
|
+
}
|
|
11194
|
+
removeTarget(id, type = dep.DepTargetType.DEFAULT) {
|
|
11195
|
+
this.watcher.removeTarget(id, type);
|
|
11196
|
+
this.emit("remove-target", id);
|
|
11197
|
+
}
|
|
11198
|
+
clearTargets() {
|
|
11199
|
+
this.watcher.clearTargets();
|
|
11200
|
+
}
|
|
11201
|
+
collect(nodes, depExtendedData = {}, deep = false, type) {
|
|
11202
|
+
this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
|
|
11203
|
+
this.collectNode(node, target, depExtendedData, deep);
|
|
11204
|
+
});
|
|
11205
|
+
this.emit("collected", nodes, deep);
|
|
11206
|
+
}
|
|
11207
|
+
collectIdle(nodes, depExtendedData = {}, deep = false, type) {
|
|
11208
|
+
this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
|
|
11209
|
+
idleTask.enqueueTask(
|
|
11210
|
+
({ node: node2, deep: deep2, target: target2 }) => {
|
|
11211
|
+
this.collectNode(node2, target2, depExtendedData, deep2);
|
|
11212
|
+
},
|
|
11213
|
+
{
|
|
11214
|
+
node,
|
|
11215
|
+
deep,
|
|
11216
|
+
target
|
|
11217
|
+
}
|
|
11218
|
+
);
|
|
11219
|
+
});
|
|
11220
|
+
idleTask.once("finish", () => {
|
|
11221
|
+
this.emit("collected", nodes, deep);
|
|
11222
|
+
});
|
|
11223
|
+
}
|
|
11224
|
+
collectNode(node, target, depExtendedData = {}, deep = false) {
|
|
11225
|
+
if (utils.isPage(node)) {
|
|
11226
|
+
Object.entries(target.deps).forEach(([depKey, dep]) => {
|
|
11227
|
+
if (dep.data?.pageId && dep.data.pageId === depExtendedData.pageId) {
|
|
11228
|
+
delete target.deps[depKey];
|
|
11229
|
+
}
|
|
11230
|
+
});
|
|
11231
|
+
} else {
|
|
11232
|
+
this.watcher.removeTargetDep(target, node);
|
|
11233
|
+
}
|
|
11234
|
+
this.watcher.collectItem(node, target, depExtendedData, deep);
|
|
11235
|
+
}
|
|
11236
|
+
clear(nodes) {
|
|
11237
|
+
return this.watcher.clear(nodes);
|
|
11238
|
+
}
|
|
11239
|
+
clearByType(type, nodes) {
|
|
11240
|
+
return this.watcher.clearByType(type, nodes);
|
|
11241
|
+
}
|
|
11242
|
+
hasTarget(id, type = dep.DepTargetType.DEFAULT) {
|
|
11243
|
+
return this.watcher.hasTarget(id, type);
|
|
11244
|
+
}
|
|
11245
|
+
hasSpecifiedTypeTarget(type = dep.DepTargetType.DEFAULT) {
|
|
11246
|
+
return this.watcher.hasSpecifiedTypeTarget(type);
|
|
11247
|
+
}
|
|
11248
|
+
on(eventName, listener) {
|
|
11249
|
+
return super.on(eventName, listener);
|
|
11250
|
+
}
|
|
11251
|
+
once(eventName, listener) {
|
|
11252
|
+
return super.once(eventName, listener);
|
|
11253
|
+
}
|
|
11254
|
+
emit(eventName, ...args) {
|
|
11255
|
+
return super.emit(eventName, ...args);
|
|
11256
|
+
}
|
|
11257
|
+
}
|
|
11258
|
+
const depService = new Dep();
|
|
11259
|
+
|
|
11070
11260
|
let eventMap = vue.reactive({});
|
|
11071
11261
|
let methodMap = vue.reactive({});
|
|
11072
11262
|
class Events extends BaseService {
|
|
@@ -11686,15 +11876,11 @@
|
|
|
11686
11876
|
delete root.dataSourceCondDeps[id];
|
|
11687
11877
|
}
|
|
11688
11878
|
};
|
|
11689
|
-
const depUpdateHandler = (node) => {
|
|
11690
|
-
updateNodeWhenDataSourceChange([node]);
|
|
11691
|
-
};
|
|
11692
11879
|
const collectedHandler = (nodes) => {
|
|
11693
11880
|
updateNodeWhenDataSourceChange(nodes);
|
|
11694
11881
|
};
|
|
11695
11882
|
depService.on("add-target", targetAddHandler);
|
|
11696
11883
|
depService.on("remove-target", targetRemoveHandler);
|
|
11697
|
-
depService.on("dep-update", depUpdateHandler);
|
|
11698
11884
|
depService.on("collected", collectedHandler);
|
|
11699
11885
|
const initDataSourceDepTarget = (ds) => {
|
|
11700
11886
|
depService.addTarget(dep.createDataSourceTarget(ds, vue.reactive({})));
|
|
@@ -11716,7 +11902,9 @@
|
|
|
11716
11902
|
initDataSourceDepTarget(ds);
|
|
11717
11903
|
});
|
|
11718
11904
|
if (Array.isArray(value.items)) {
|
|
11719
|
-
|
|
11905
|
+
value.items.forEach((page) => {
|
|
11906
|
+
depService.collectIdle([page], { pageId: page.id }, true);
|
|
11907
|
+
});
|
|
11720
11908
|
} else {
|
|
11721
11909
|
depService.clear();
|
|
11722
11910
|
delete value.dataSourceDeps;
|
|
@@ -11739,17 +11927,29 @@
|
|
|
11739
11927
|
emit("update:modelValue", value);
|
|
11740
11928
|
}
|
|
11741
11929
|
};
|
|
11930
|
+
const collectIdle = (nodes, deep) => {
|
|
11931
|
+
nodes.forEach((node) => {
|
|
11932
|
+
let pageId;
|
|
11933
|
+
if (utils.isPage(node)) {
|
|
11934
|
+
pageId = node.id;
|
|
11935
|
+
} else {
|
|
11936
|
+
const info = editorService.getNodeInfo(node.id);
|
|
11937
|
+
pageId = info.page?.id;
|
|
11938
|
+
}
|
|
11939
|
+
depService.collectIdle([node], { pageId }, deep);
|
|
11940
|
+
});
|
|
11941
|
+
};
|
|
11742
11942
|
const nodeAddHandler = (nodes) => {
|
|
11743
|
-
|
|
11943
|
+
collectIdle(nodes, true);
|
|
11744
11944
|
};
|
|
11745
11945
|
const nodeUpdateHandler = (nodes) => {
|
|
11746
|
-
|
|
11946
|
+
collectIdle(nodes, false);
|
|
11747
11947
|
};
|
|
11748
11948
|
const nodeRemoveHandler = (nodes) => {
|
|
11749
11949
|
depService.clear(nodes);
|
|
11750
11950
|
};
|
|
11751
11951
|
const historyChangeHandler = (page) => {
|
|
11752
|
-
depService.
|
|
11952
|
+
depService.collectIdle([page], { pageId: page.id }, true);
|
|
11753
11953
|
};
|
|
11754
11954
|
editorService.on("history-change", historyChangeHandler);
|
|
11755
11955
|
editorService.on("root-change", rootChangeHandler);
|
|
@@ -11776,7 +11976,9 @@
|
|
|
11776
11976
|
const root = editorService.get("root");
|
|
11777
11977
|
removeDataSourceTarget(config.id);
|
|
11778
11978
|
initDataSourceDepTarget(config);
|
|
11779
|
-
|
|
11979
|
+
(root?.items || []).forEach((page) => {
|
|
11980
|
+
depService.collectIdle([page], { pageId: page.id }, true);
|
|
11981
|
+
});
|
|
11780
11982
|
const targets = depService.getTargets(dep.DepTargetType.DATA_SOURCE);
|
|
11781
11983
|
const nodes = utils.getNodes(Object.keys(targets[config.id].deps), root?.items);
|
|
11782
11984
|
updateNodeWhenDataSourceChange(nodes);
|
|
@@ -11793,23 +11995,9 @@
|
|
|
11793
11995
|
dataSourceService.on("add", dataSourceAddHandler);
|
|
11794
11996
|
dataSourceService.on("update", dataSourceUpdateHandler);
|
|
11795
11997
|
dataSourceService.on("remove", dataSourceRemoveHandler);
|
|
11796
|
-
if (props.collectorOptions && !depService.hasTarget(dep.DepTargetType.RELATED_COMP_WHEN_COPY)) {
|
|
11797
|
-
depService.addTarget(dep.createRelatedTargetForCopy(props.collectorOptions, dep.DepTargetType.RELATED_COMP_WHEN_COPY));
|
|
11798
|
-
}
|
|
11799
|
-
if (props.collectorOptionsForCode && !depService.hasTarget(dep.DepTargetType.RELATED_CODE_WHEN_COPY)) {
|
|
11800
|
-
depService.addTarget(
|
|
11801
|
-
dep.createRelatedTargetForCopy(props.collectorOptionsForCode, dep.DepTargetType.RELATED_CODE_WHEN_COPY)
|
|
11802
|
-
);
|
|
11803
|
-
}
|
|
11804
|
-
if (props.collectorOptionsForDataSource && !depService.hasTarget(dep.DepTargetType.RELATED_DS_WHEN_COPY)) {
|
|
11805
|
-
depService.addTarget(
|
|
11806
|
-
dep.createRelatedTargetForCopy(props.collectorOptionsForDataSource, dep.DepTargetType.RELATED_DS_WHEN_COPY)
|
|
11807
|
-
);
|
|
11808
|
-
}
|
|
11809
11998
|
vue.onBeforeUnmount(() => {
|
|
11810
11999
|
depService.off("add-target", targetAddHandler);
|
|
11811
12000
|
depService.off("remove-target", targetRemoveHandler);
|
|
11812
|
-
depService.off("dep-update", depUpdateHandler);
|
|
11813
12001
|
depService.off("collected", collectedHandler);
|
|
11814
12002
|
editorService.off("history-change", historyChangeHandler);
|
|
11815
12003
|
editorService.off("root-change", rootChangeHandler);
|
|
@@ -11854,9 +12042,6 @@
|
|
|
11854
12042
|
stageRect: {},
|
|
11855
12043
|
codeOptions: {},
|
|
11856
12044
|
disabledDragStart: { type: Boolean },
|
|
11857
|
-
collectorOptions: {},
|
|
11858
|
-
collectorOptionsForCode: {},
|
|
11859
|
-
collectorOptionsForDataSource: {},
|
|
11860
12045
|
guidesOptions: {},
|
|
11861
12046
|
disabledMultiSelect: { type: Boolean },
|
|
11862
12047
|
disabledPageFragment: { type: Boolean },
|