@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
package/dist/tmagic-editor.js
CHANGED
|
@@ -10,7 +10,7 @@ import { HookCodeType, HookType, NodeType, ActionType } from '@tmagic/schema';
|
|
|
10
10
|
import { MagicTable } from '@tmagic/table';
|
|
11
11
|
import { toLine, guid, getNodePath, getValueByKeyPath, setValueByKeyPath, isPage, isPageFragment, isPop, isNumber, calcValueByFontsize, convertToNumber, getDefaultValueFromFields, DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX, DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX, getKeys, addClassName, removeClassName, removeClassNameByClassName, getNodes } from '@tmagic/utils';
|
|
12
12
|
import VanillaMoveable from 'moveable';
|
|
13
|
-
import { Watcher, DepTargetType,
|
|
13
|
+
import { Target, Watcher, DepTargetType, createCodeBlockTarget, createDataSourceTarget, createDataSourceMethodTarget, createDataSourceCondTarget } from '@tmagic/dep';
|
|
14
14
|
export { DepTargetType } from '@tmagic/dep';
|
|
15
15
|
import { EventEmitter } from 'events';
|
|
16
16
|
import Gesto from 'gesto';
|
|
@@ -668,48 +668,6 @@ class BaseService extends EventEmitter {
|
|
|
668
668
|
}
|
|
669
669
|
}
|
|
670
670
|
|
|
671
|
-
class Dep extends BaseService {
|
|
672
|
-
watcher = new Watcher({ initialTargets: reactive({}) });
|
|
673
|
-
removeTargets(type = DepTargetType.DEFAULT) {
|
|
674
|
-
this.watcher.removeTargets(type);
|
|
675
|
-
this.emit("remove-target");
|
|
676
|
-
}
|
|
677
|
-
getTargets(type = DepTargetType.DEFAULT) {
|
|
678
|
-
return this.watcher.getTargets(type);
|
|
679
|
-
}
|
|
680
|
-
getTarget(id, type = DepTargetType.DEFAULT) {
|
|
681
|
-
return this.watcher.getTarget(id, type);
|
|
682
|
-
}
|
|
683
|
-
addTarget(target) {
|
|
684
|
-
this.watcher.addTarget(target);
|
|
685
|
-
this.emit("add-target", target);
|
|
686
|
-
}
|
|
687
|
-
removeTarget(id, type = DepTargetType.DEFAULT) {
|
|
688
|
-
this.watcher.removeTarget(id, type);
|
|
689
|
-
this.emit("remove-target");
|
|
690
|
-
}
|
|
691
|
-
clearTargets() {
|
|
692
|
-
this.watcher.clearTargets();
|
|
693
|
-
}
|
|
694
|
-
collect(nodes, deep = false, type) {
|
|
695
|
-
this.watcher.collect(nodes, deep, type);
|
|
696
|
-
this.emit("collected", nodes, deep);
|
|
697
|
-
}
|
|
698
|
-
clear(nodes) {
|
|
699
|
-
return this.watcher.clear(nodes);
|
|
700
|
-
}
|
|
701
|
-
clearByType(type, nodes) {
|
|
702
|
-
return this.watcher.clearByType(type, nodes);
|
|
703
|
-
}
|
|
704
|
-
hasTarget(id, type = DepTargetType.DEFAULT) {
|
|
705
|
-
return this.watcher.hasTarget(id, type);
|
|
706
|
-
}
|
|
707
|
-
hasSpecifiedTypeTarget(type = DepTargetType.DEFAULT) {
|
|
708
|
-
return this.watcher.hasSpecifiedTypeTarget(type);
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
const depService = new Dep();
|
|
712
|
-
|
|
713
671
|
const canUsePluginMethods$6 = {
|
|
714
672
|
async: [
|
|
715
673
|
"setPropsConfig",
|
|
@@ -849,15 +807,16 @@ class Props extends BaseService {
|
|
|
849
807
|
* @param originConfigs 原组件配置
|
|
850
808
|
* @param targetConfigs 待替换的组件配置
|
|
851
809
|
*/
|
|
852
|
-
replaceRelateId(originConfigs, targetConfigs) {
|
|
810
|
+
replaceRelateId(originConfigs, targetConfigs, collectorOptions) {
|
|
853
811
|
const relateIdMap = this.getRelateIdMap();
|
|
854
812
|
if (Object.keys(relateIdMap).length === 0)
|
|
855
813
|
return;
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
814
|
+
const target = new Target({
|
|
815
|
+
...collectorOptions
|
|
816
|
+
});
|
|
817
|
+
const coperWatcher = new Watcher();
|
|
818
|
+
coperWatcher.addTarget(target);
|
|
819
|
+
coperWatcher.collect(originConfigs, {}, true, collectorOptions.type);
|
|
861
820
|
originConfigs.forEach((config) => {
|
|
862
821
|
const newId = relateIdMap[config.id];
|
|
863
822
|
const path = getNodePath(newId, targetConfigs);
|
|
@@ -872,7 +831,7 @@ class Props extends BaseService {
|
|
|
872
831
|
setValueByKeyPath(fullKey, relateTargetId, targetConfig);
|
|
873
832
|
});
|
|
874
833
|
if (config.items && Array.isArray(config.items)) {
|
|
875
|
-
this.replaceRelateId(config.items, targetConfigs);
|
|
834
|
+
this.replaceRelateId(config.items, targetConfigs, collectorOptions);
|
|
876
835
|
}
|
|
877
836
|
});
|
|
878
837
|
}
|
|
@@ -1418,7 +1377,7 @@ const traverseNode = (node, cb, parents = []) => {
|
|
|
1418
1377
|
}
|
|
1419
1378
|
};
|
|
1420
1379
|
|
|
1421
|
-
const beforePaste = (position, config) => {
|
|
1380
|
+
const beforePaste = (position, config, doc) => {
|
|
1422
1381
|
if (!config[0]?.style)
|
|
1423
1382
|
return config;
|
|
1424
1383
|
const curNode = editorService.get("node");
|
|
@@ -1427,7 +1386,7 @@ const beforePaste = (position, config) => {
|
|
|
1427
1386
|
const { offsetX = 0, offsetY = 0, ...positionClone } = position;
|
|
1428
1387
|
let pastePosition = positionClone;
|
|
1429
1388
|
if (!isEmpty(pastePosition) && curNode?.items) {
|
|
1430
|
-
pastePosition = getPositionInContainer(pastePosition, curNode.id);
|
|
1389
|
+
pastePosition = getPositionInContainer(pastePosition, curNode.id, doc);
|
|
1431
1390
|
}
|
|
1432
1391
|
if (pastePosition.left && configItem.style?.left) {
|
|
1433
1392
|
pastePosition.left = configItem.style.left - referenceLeft + pastePosition.left;
|
|
@@ -1457,12 +1416,12 @@ const beforePaste = (position, config) => {
|
|
|
1457
1416
|
});
|
|
1458
1417
|
return pasteConfigs;
|
|
1459
1418
|
};
|
|
1460
|
-
const getPositionInContainer = (position = {}, id) => {
|
|
1419
|
+
const getPositionInContainer = (position = {}, id, doc) => {
|
|
1461
1420
|
let { left = 0, top = 0 } = position;
|
|
1462
1421
|
const parentEl = editorService.get("stage")?.renderer?.contentWindow?.document.getElementById(`${id}`);
|
|
1463
1422
|
const parentElRect = parentEl?.getBoundingClientRect();
|
|
1464
|
-
left = left - (parentElRect?.left || 0);
|
|
1465
|
-
top = top - (parentElRect?.top || 0);
|
|
1423
|
+
left = left - calcValueByFontsize(doc, parentElRect?.left || 0);
|
|
1424
|
+
top = top - calcValueByFontsize(doc, parentElRect?.top || 0);
|
|
1466
1425
|
return {
|
|
1467
1426
|
left,
|
|
1468
1427
|
top
|
|
@@ -1986,15 +1945,15 @@ class Editor extends BaseService {
|
|
|
1986
1945
|
* @param config 组件节点配置
|
|
1987
1946
|
* @returns
|
|
1988
1947
|
*/
|
|
1989
|
-
copyWithRelated(config) {
|
|
1948
|
+
copyWithRelated(config, collectorOptions) {
|
|
1990
1949
|
const copyNodes = Array.isArray(config) ? config : [config];
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1950
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
1951
|
+
const customTarget = new Target({
|
|
1952
|
+
...collectorOptions
|
|
1953
|
+
});
|
|
1954
|
+
const coperWatcher = new Watcher();
|
|
1955
|
+
coperWatcher.addTarget(customTarget);
|
|
1956
|
+
coperWatcher.collect(copyNodes, {}, true, collectorOptions.type);
|
|
1998
1957
|
Object.keys(customTarget.deps).forEach((nodeId) => {
|
|
1999
1958
|
const node = this.getNodeById(nodeId);
|
|
2000
1959
|
if (!node)
|
|
@@ -2020,7 +1979,7 @@ class Editor extends BaseService {
|
|
|
2020
1979
|
* @param position 粘贴的坐标
|
|
2021
1980
|
* @returns 添加后的组件节点配置
|
|
2022
1981
|
*/
|
|
2023
|
-
async paste(position = {}) {
|
|
1982
|
+
async paste(position = {}, collectorOptions) {
|
|
2024
1983
|
const config = storageService.getItem(COPY_STORAGE_KEY);
|
|
2025
1984
|
if (!Array.isArray(config))
|
|
2026
1985
|
return;
|
|
@@ -2033,12 +1992,15 @@ class Editor extends BaseService {
|
|
|
2033
1992
|
}
|
|
2034
1993
|
}
|
|
2035
1994
|
const pasteConfigs = await this.doPaste(config, position);
|
|
2036
|
-
|
|
1995
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
1996
|
+
propsService.replaceRelateId(config, pasteConfigs, collectorOptions);
|
|
1997
|
+
}
|
|
2037
1998
|
return this.add(pasteConfigs, parent);
|
|
2038
1999
|
}
|
|
2039
2000
|
async doPaste(config, position = {}) {
|
|
2040
2001
|
propsService.clearRelateId();
|
|
2041
|
-
const
|
|
2002
|
+
const doc = this.get("stage")?.renderer.contentWindow?.document;
|
|
2003
|
+
const pasteConfigs = beforePaste(position, cloneDeep(config), doc);
|
|
2042
2004
|
return pasteConfigs;
|
|
2043
2005
|
}
|
|
2044
2006
|
async doAlignCenter(config) {
|
|
@@ -2587,16 +2549,20 @@ const getDisplayField = (dataSources, key) => {
|
|
|
2587
2549
|
let dsText = "";
|
|
2588
2550
|
let ds;
|
|
2589
2551
|
let fields;
|
|
2590
|
-
match[1].split(".").forEach((item, index2) => {
|
|
2552
|
+
match[1].replaceAll(/\[(\d+)\]/g, ".$1").split(".").forEach((item, index2) => {
|
|
2591
2553
|
if (index2 === 0) {
|
|
2592
2554
|
ds = dataSources.find((ds2) => ds2.id === item);
|
|
2593
2555
|
dsText += ds?.title || item;
|
|
2594
2556
|
fields = ds?.fields;
|
|
2595
2557
|
return;
|
|
2596
2558
|
}
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2559
|
+
if (isNumber(item)) {
|
|
2560
|
+
dsText += `[${item}]`;
|
|
2561
|
+
} else {
|
|
2562
|
+
const field = fields?.find((field2) => field2.name === item);
|
|
2563
|
+
fields = field?.fields;
|
|
2564
|
+
dsText += `.${field?.title || item}`;
|
|
2565
|
+
}
|
|
2600
2566
|
});
|
|
2601
2567
|
displayState.push({
|
|
2602
2568
|
type: "var",
|
|
@@ -2744,13 +2710,16 @@ class DataSource extends BaseService {
|
|
|
2744
2710
|
* @param config 组件节点配置
|
|
2745
2711
|
* @returns
|
|
2746
2712
|
*/
|
|
2747
|
-
copyWithRelated(config) {
|
|
2713
|
+
copyWithRelated(config, collectorOptions) {
|
|
2748
2714
|
const copyNodes = Array.isArray(config) ? config : [config];
|
|
2749
|
-
depService.clearByType(DepTargetType.RELATED_DS_WHEN_COPY);
|
|
2750
|
-
depService.collect(copyNodes, true, DepTargetType.RELATED_DS_WHEN_COPY);
|
|
2751
|
-
const customTarget = depService.getTarget(DepTargetType.RELATED_DS_WHEN_COPY, DepTargetType.RELATED_DS_WHEN_COPY);
|
|
2752
2715
|
const copyData = [];
|
|
2753
|
-
if (
|
|
2716
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
2717
|
+
const customTarget = new Target({
|
|
2718
|
+
...collectorOptions
|
|
2719
|
+
});
|
|
2720
|
+
const coperWatcher = new Watcher();
|
|
2721
|
+
coperWatcher.addTarget(customTarget);
|
|
2722
|
+
coperWatcher.collect(copyNodes, {}, true, collectorOptions.type);
|
|
2754
2723
|
Object.keys(customTarget.deps).forEach((nodeId) => {
|
|
2755
2724
|
const node = editorService.getNodeById(nodeId);
|
|
2756
2725
|
if (!node)
|
|
@@ -4633,7 +4602,7 @@ const _sfc_main$K = /* @__PURE__ */ defineComponent({
|
|
|
4633
4602
|
const fieldQuerySearch = (queryString, leftAngleIndex, dotIndex, cb) => {
|
|
4634
4603
|
let result = [];
|
|
4635
4604
|
const dsKey = queryString.substring(leftAngleIndex + 1, dotIndex);
|
|
4636
|
-
const keys = dsKey.split(".");
|
|
4605
|
+
const keys = dsKey.replaceAll(/\[(\d+)\]/g, ".$1").split(".");
|
|
4637
4606
|
const dsId = keys.shift();
|
|
4638
4607
|
const ds = dataSources.value.find((ds2) => ds2.id === dsId);
|
|
4639
4608
|
if (!ds) {
|
|
@@ -4643,6 +4612,10 @@ const _sfc_main$K = /* @__PURE__ */ defineComponent({
|
|
|
4643
4612
|
let fields = ds.fields || [];
|
|
4644
4613
|
let key = keys.shift();
|
|
4645
4614
|
while (key) {
|
|
4615
|
+
if (isNumber(key)) {
|
|
4616
|
+
key = keys.shift();
|
|
4617
|
+
continue;
|
|
4618
|
+
}
|
|
4646
4619
|
for (const field of fields) {
|
|
4647
4620
|
if (field.name === key) {
|
|
4648
4621
|
fields = field.fields || [];
|
|
@@ -5686,13 +5659,17 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
|
|
|
5686
5659
|
const eventsService = services?.eventsService;
|
|
5687
5660
|
const codeBlockService = services?.codeBlockService;
|
|
5688
5661
|
const eventNameConfig = computed(() => {
|
|
5689
|
-
const fieldType = props.config.src === "component" ? "select" : "cascader";
|
|
5690
5662
|
const defaultEventNameConfig = {
|
|
5691
5663
|
name: "name",
|
|
5692
5664
|
text: "事件",
|
|
5693
|
-
type:
|
|
5665
|
+
type: (mForm, { formValue }) => {
|
|
5666
|
+
if (props.config.src !== "component" || formValue.type === "page-fragment-container" && formValue.pageFragmentId) {
|
|
5667
|
+
return "cascader";
|
|
5668
|
+
}
|
|
5669
|
+
return "select";
|
|
5670
|
+
},
|
|
5694
5671
|
labelWidth: "40px",
|
|
5695
|
-
checkStrictly:
|
|
5672
|
+
checkStrictly: () => props.config.src !== "component",
|
|
5696
5673
|
valueSeparator: ".",
|
|
5697
5674
|
options: (mForm, { formValue }) => {
|
|
5698
5675
|
let events = [];
|
|
@@ -5700,6 +5677,29 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
|
|
|
5700
5677
|
return events;
|
|
5701
5678
|
if (props.config.src === "component") {
|
|
5702
5679
|
events = eventsService.getEvent(formValue.type);
|
|
5680
|
+
if (formValue.type === "page-fragment-container" && formValue.pageFragmentId) {
|
|
5681
|
+
const pageFragment = editorService?.get("root")?.items?.find((page) => page.id === formValue.pageFragmentId);
|
|
5682
|
+
if (pageFragment) {
|
|
5683
|
+
events = [
|
|
5684
|
+
{
|
|
5685
|
+
label: pageFragment.name || "迭代器容器",
|
|
5686
|
+
value: pageFragment.id,
|
|
5687
|
+
children: events
|
|
5688
|
+
}
|
|
5689
|
+
];
|
|
5690
|
+
pageFragment.items.forEach((node) => {
|
|
5691
|
+
traverseNode(node, (node2) => {
|
|
5692
|
+
const nodeEvents = node2.type && eventsService.getEvent(node2.type) || [];
|
|
5693
|
+
events.push({
|
|
5694
|
+
label: `${node2.name}_${node2.id}`,
|
|
5695
|
+
value: `${node2.id}`,
|
|
5696
|
+
children: nodeEvents
|
|
5697
|
+
});
|
|
5698
|
+
});
|
|
5699
|
+
});
|
|
5700
|
+
return events;
|
|
5701
|
+
}
|
|
5702
|
+
}
|
|
5703
5703
|
return events.map((option) => ({
|
|
5704
5704
|
text: option.label,
|
|
5705
5705
|
value: option.value
|
|
@@ -5758,7 +5758,11 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
|
|
|
5758
5758
|
name: "to",
|
|
5759
5759
|
text: "联动组件",
|
|
5760
5760
|
type: "ui-select",
|
|
5761
|
-
display: (mForm, { model }) => model.actionType === ActionType.COMP
|
|
5761
|
+
display: (mForm, { model }) => model.actionType === ActionType.COMP,
|
|
5762
|
+
onChange: (MForm, v, { model }) => {
|
|
5763
|
+
model.method = "";
|
|
5764
|
+
return v;
|
|
5765
|
+
}
|
|
5762
5766
|
};
|
|
5763
5767
|
return { ...defaultTargetCompConfig, ...props.config.targetCompConfig };
|
|
5764
5768
|
});
|
|
@@ -5766,15 +5770,43 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
|
|
|
5766
5770
|
const defaultCompActionConfig = {
|
|
5767
5771
|
name: "method",
|
|
5768
5772
|
text: "动作",
|
|
5769
|
-
type:
|
|
5773
|
+
type: (mForm, { model }) => {
|
|
5774
|
+
const to = editorService?.getNodeById(model.to);
|
|
5775
|
+
if (to && to.type === "page-fragment-container" && to.pageFragmentId) {
|
|
5776
|
+
return "cascader";
|
|
5777
|
+
}
|
|
5778
|
+
return "select";
|
|
5779
|
+
},
|
|
5780
|
+
checkStrictly: () => props.config.src !== "component",
|
|
5770
5781
|
display: (mForm, { model }) => model.actionType === ActionType.COMP,
|
|
5771
5782
|
options: (mForm, { model }) => {
|
|
5772
5783
|
const node = editorService?.getNodeById(model.to);
|
|
5773
5784
|
if (!node?.type)
|
|
5774
5785
|
return [];
|
|
5775
|
-
|
|
5776
|
-
|
|
5777
|
-
|
|
5786
|
+
let methods = [];
|
|
5787
|
+
methods = eventsService?.getMethod(node.type) || [];
|
|
5788
|
+
if (node.type === "page-fragment-container" && node.pageFragmentId) {
|
|
5789
|
+
const pageFragment = editorService?.get("root")?.items?.find((page) => page.id === node.pageFragmentId);
|
|
5790
|
+
if (pageFragment) {
|
|
5791
|
+
methods = [];
|
|
5792
|
+
pageFragment.items.forEach((node2) => {
|
|
5793
|
+
traverseNode(node2, (node3) => {
|
|
5794
|
+
const nodeMethods = node3.type && eventsService?.getMethod(node3.type) || [];
|
|
5795
|
+
if (nodeMethods.length) {
|
|
5796
|
+
methods.push({
|
|
5797
|
+
label: `${node3.name}_${node3.id}`,
|
|
5798
|
+
value: `${node3.id}`,
|
|
5799
|
+
children: nodeMethods
|
|
5800
|
+
});
|
|
5801
|
+
}
|
|
5802
|
+
});
|
|
5803
|
+
});
|
|
5804
|
+
return methods;
|
|
5805
|
+
}
|
|
5806
|
+
}
|
|
5807
|
+
return methods.map((method) => ({
|
|
5808
|
+
text: method.label,
|
|
5809
|
+
value: method.value
|
|
5778
5810
|
}));
|
|
5779
5811
|
}
|
|
5780
5812
|
};
|
|
@@ -7670,7 +7702,9 @@ const _sfc_main$n = /* @__PURE__ */ defineComponent({
|
|
|
7670
7702
|
const selected = computed(() => nodeStatus.value.selected);
|
|
7671
7703
|
const visible = computed(() => nodeStatus.value.visible);
|
|
7672
7704
|
const draggable = computed(() => nodeStatus.value.draggable);
|
|
7673
|
-
const hasChildren = computed(
|
|
7705
|
+
const hasChildren = computed(
|
|
7706
|
+
() => Array.isArray(props.data.items) && props.data.items.some((item) => props.nodeStatusMap.get(item.id)?.visible)
|
|
7707
|
+
);
|
|
7674
7708
|
const handleDragStart = (event) => {
|
|
7675
7709
|
treeEmit?.("node-dragstart", event, props.data);
|
|
7676
7710
|
};
|
|
@@ -7901,24 +7935,38 @@ const _sfc_main$l = /* @__PURE__ */ defineComponent({
|
|
|
7901
7935
|
const services = inject("services");
|
|
7902
7936
|
const { codeBlockService, depService, editorService } = services || {};
|
|
7903
7937
|
const codeList = computed(
|
|
7904
|
-
() => Object.
|
|
7905
|
-
const
|
|
7906
|
-
|
|
7938
|
+
() => Object.entries(codeBlockService?.getCodeDsl() || {}).map(([codeId, code]) => {
|
|
7939
|
+
const target = depService?.getTarget(codeId, DepTargetType.CODE_BLOCK);
|
|
7940
|
+
const pageList = editorService?.get("root")?.items.map((page) => ({
|
|
7941
|
+
name: page.devconfig?.tabName || page.name,
|
|
7907
7942
|
type: "node",
|
|
7908
|
-
id: `${
|
|
7909
|
-
key: id,
|
|
7910
|
-
items:
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
7914
|
-
|
|
7943
|
+
id: `${codeId}_${page.id}`,
|
|
7944
|
+
key: page.id,
|
|
7945
|
+
items: []
|
|
7946
|
+
})) || [];
|
|
7947
|
+
if (target) {
|
|
7948
|
+
Object.entries(target.deps).forEach(([id, dep]) => {
|
|
7949
|
+
const page = pageList.find((page2) => page2.key === dep.data?.pageId);
|
|
7950
|
+
page?.items?.push({
|
|
7951
|
+
name: dep.name,
|
|
7952
|
+
type: "node",
|
|
7953
|
+
id: `${page.id}_${id}`,
|
|
7954
|
+
key: id,
|
|
7955
|
+
items: dep.keys.map((key) => {
|
|
7956
|
+
const data2 = { name: `${key}`, id: `${target.id}_${id}_${key}`, type: "key" };
|
|
7957
|
+
return data2;
|
|
7958
|
+
})
|
|
7959
|
+
});
|
|
7960
|
+
});
|
|
7961
|
+
}
|
|
7915
7962
|
const data = {
|
|
7916
|
-
id:
|
|
7917
|
-
key:
|
|
7918
|
-
name:
|
|
7963
|
+
id: codeId,
|
|
7964
|
+
key: codeId,
|
|
7965
|
+
name: code.name,
|
|
7919
7966
|
type: "code",
|
|
7920
|
-
codeBlockContent: codeBlockService?.getCodeContentById(
|
|
7921
|
-
|
|
7967
|
+
codeBlockContent: codeBlockService?.getCodeContentById(codeId),
|
|
7968
|
+
// 只有一个页面不显示页面分类
|
|
7969
|
+
items: pageList.length > 1 ? pageList.filter((page) => page.items?.length) : pageList[0]?.items || []
|
|
7922
7970
|
};
|
|
7923
7971
|
return data;
|
|
7924
7972
|
})
|
|
@@ -8233,13 +8281,14 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
|
|
|
8233
8281
|
key: id,
|
|
8234
8282
|
items: getKeyTreeConfig(dep, type, `${parentKey}_${id}`)
|
|
8235
8283
|
});
|
|
8236
|
-
const mergeChildren = (dsId,
|
|
8284
|
+
const mergeChildren = (dsId, pageItems, deps, type) => {
|
|
8237
8285
|
Object.entries(deps).forEach(([id, dep]) => {
|
|
8238
|
-
const
|
|
8286
|
+
const page = pageItems.find((page2) => page2.key === dep.data?.pageId);
|
|
8287
|
+
const nodeItem = page?.items.find((item) => item.key === id);
|
|
8239
8288
|
if (nodeItem) {
|
|
8240
8289
|
nodeItem.items = nodeItem.items.concat(getKeyTreeConfig(dep, type, nodeItem.key));
|
|
8241
8290
|
} else {
|
|
8242
|
-
items.push(getNodeTreeConfig(id, dep, type,
|
|
8291
|
+
page?.items.push(getNodeTreeConfig(id, dep, type, page.id));
|
|
8243
8292
|
}
|
|
8244
8293
|
});
|
|
8245
8294
|
};
|
|
@@ -8248,7 +8297,13 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
|
|
|
8248
8297
|
const dsDeps = dsDep.value[ds.id]?.deps || {};
|
|
8249
8298
|
const dsMethodDeps = dsMethodDep.value[ds.id]?.deps || {};
|
|
8250
8299
|
const dsCondDeps = dsCondDep.value[ds.id]?.deps || {};
|
|
8251
|
-
const items =
|
|
8300
|
+
const items = editorService?.get("root")?.items.map((page) => ({
|
|
8301
|
+
name: page.devconfig?.tabName || page.name,
|
|
8302
|
+
type: "node",
|
|
8303
|
+
id: `${ds.id}_${page.id}`,
|
|
8304
|
+
key: page.id,
|
|
8305
|
+
items: []
|
|
8306
|
+
})) || [];
|
|
8252
8307
|
mergeChildren(ds.id, items, dsDeps);
|
|
8253
8308
|
mergeChildren(ds.id, items, dsMethodDeps, "method");
|
|
8254
8309
|
mergeChildren(ds.id, items, dsCondDeps, "cond");
|
|
@@ -8257,7 +8312,8 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
|
|
|
8257
8312
|
key: ds.id,
|
|
8258
8313
|
name: ds.title,
|
|
8259
8314
|
type: "ds",
|
|
8260
|
-
|
|
8315
|
+
// 只有一个页面不显示页面分类
|
|
8316
|
+
items: items.length > 1 ? items.filter((page) => page.items.length) : items[0]?.items || []
|
|
8261
8317
|
};
|
|
8262
8318
|
})
|
|
8263
8319
|
);
|
|
@@ -10978,16 +11034,16 @@ class CodeBlock extends BaseService {
|
|
|
10978
11034
|
* @param config 组件节点配置
|
|
10979
11035
|
* @returns
|
|
10980
11036
|
*/
|
|
10981
|
-
copyWithRelated(config) {
|
|
11037
|
+
copyWithRelated(config, collectorOptions) {
|
|
10982
11038
|
const copyNodes = Array.isArray(config) ? config : [config];
|
|
10983
|
-
depService.clearByType(DepTargetType.RELATED_CODE_WHEN_COPY);
|
|
10984
|
-
depService.collect(copyNodes, true, DepTargetType.RELATED_CODE_WHEN_COPY);
|
|
10985
|
-
const customTarget = depService.getTarget(
|
|
10986
|
-
DepTargetType.RELATED_CODE_WHEN_COPY,
|
|
10987
|
-
DepTargetType.RELATED_CODE_WHEN_COPY
|
|
10988
|
-
);
|
|
10989
11039
|
const copyData = {};
|
|
10990
|
-
if (
|
|
11040
|
+
if (collectorOptions && typeof collectorOptions.isTarget === "function") {
|
|
11041
|
+
const customTarget = new Target({
|
|
11042
|
+
...collectorOptions
|
|
11043
|
+
});
|
|
11044
|
+
const coperWatcher = new Watcher();
|
|
11045
|
+
coperWatcher.addTarget(customTarget);
|
|
11046
|
+
coperWatcher.collect(copyNodes, {}, true, collectorOptions.type);
|
|
10991
11047
|
Object.keys(customTarget.deps).forEach((nodeId) => {
|
|
10992
11048
|
const node = editorService.getNodeById(nodeId);
|
|
10993
11049
|
if (!node)
|
|
@@ -11062,6 +11118,140 @@ class ComponentList extends BaseService {
|
|
|
11062
11118
|
}
|
|
11063
11119
|
const componentListService = new ComponentList();
|
|
11064
11120
|
|
|
11121
|
+
globalThis.requestIdleCallback = globalThis.requestIdleCallback || function(cb) {
|
|
11122
|
+
const start = Date.now();
|
|
11123
|
+
return setTimeout(() => {
|
|
11124
|
+
cb({
|
|
11125
|
+
didTimeout: false,
|
|
11126
|
+
timeRemaining() {
|
|
11127
|
+
return Math.max(0, 50 - (Date.now() - start));
|
|
11128
|
+
}
|
|
11129
|
+
});
|
|
11130
|
+
}, 1);
|
|
11131
|
+
};
|
|
11132
|
+
class IdleTask extends EventEmitter {
|
|
11133
|
+
taskList = [];
|
|
11134
|
+
taskHandle = null;
|
|
11135
|
+
enqueueTask(taskHandler, taskData) {
|
|
11136
|
+
this.taskList.push({
|
|
11137
|
+
handler: taskHandler,
|
|
11138
|
+
data: taskData
|
|
11139
|
+
});
|
|
11140
|
+
if (!this.taskHandle) {
|
|
11141
|
+
this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 1e4 });
|
|
11142
|
+
}
|
|
11143
|
+
}
|
|
11144
|
+
on(eventName, listener) {
|
|
11145
|
+
return super.on(eventName, listener);
|
|
11146
|
+
}
|
|
11147
|
+
once(eventName, listener) {
|
|
11148
|
+
return super.once(eventName, listener);
|
|
11149
|
+
}
|
|
11150
|
+
emit(eventName, ...args) {
|
|
11151
|
+
return super.emit(eventName, ...args);
|
|
11152
|
+
}
|
|
11153
|
+
runTaskQueue(deadline) {
|
|
11154
|
+
while ((deadline.timeRemaining() > 15 || deadline.didTimeout) && this.taskList.length) {
|
|
11155
|
+
const task = this.taskList.shift();
|
|
11156
|
+
task.handler(task.data);
|
|
11157
|
+
}
|
|
11158
|
+
if (this.taskList.length) {
|
|
11159
|
+
this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 1e4 });
|
|
11160
|
+
} else {
|
|
11161
|
+
this.taskHandle = 0;
|
|
11162
|
+
this.emit("finish");
|
|
11163
|
+
}
|
|
11164
|
+
}
|
|
11165
|
+
}
|
|
11166
|
+
|
|
11167
|
+
const idleTask = new IdleTask();
|
|
11168
|
+
class Dep extends BaseService {
|
|
11169
|
+
watcher = new Watcher({ initialTargets: reactive({}) });
|
|
11170
|
+
removeTargets(type = DepTargetType.DEFAULT) {
|
|
11171
|
+
this.watcher.removeTargets(type);
|
|
11172
|
+
const targets = this.watcher.getTargets(type);
|
|
11173
|
+
if (!targets)
|
|
11174
|
+
return;
|
|
11175
|
+
for (const target of Object.values(targets)) {
|
|
11176
|
+
this.emit("remove-target", target.id);
|
|
11177
|
+
}
|
|
11178
|
+
}
|
|
11179
|
+
getTargets(type = DepTargetType.DEFAULT) {
|
|
11180
|
+
return this.watcher.getTargets(type);
|
|
11181
|
+
}
|
|
11182
|
+
getTarget(id, type = DepTargetType.DEFAULT) {
|
|
11183
|
+
return this.watcher.getTarget(id, type);
|
|
11184
|
+
}
|
|
11185
|
+
addTarget(target) {
|
|
11186
|
+
this.watcher.addTarget(target);
|
|
11187
|
+
this.emit("add-target", target);
|
|
11188
|
+
}
|
|
11189
|
+
removeTarget(id, type = DepTargetType.DEFAULT) {
|
|
11190
|
+
this.watcher.removeTarget(id, type);
|
|
11191
|
+
this.emit("remove-target", id);
|
|
11192
|
+
}
|
|
11193
|
+
clearTargets() {
|
|
11194
|
+
this.watcher.clearTargets();
|
|
11195
|
+
}
|
|
11196
|
+
collect(nodes, depExtendedData = {}, deep = false, type) {
|
|
11197
|
+
this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
|
|
11198
|
+
this.collectNode(node, target, depExtendedData, deep);
|
|
11199
|
+
});
|
|
11200
|
+
this.emit("collected", nodes, deep);
|
|
11201
|
+
}
|
|
11202
|
+
collectIdle(nodes, depExtendedData = {}, deep = false, type) {
|
|
11203
|
+
this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
|
|
11204
|
+
idleTask.enqueueTask(
|
|
11205
|
+
({ node: node2, deep: deep2, target: target2 }) => {
|
|
11206
|
+
this.collectNode(node2, target2, depExtendedData, deep2);
|
|
11207
|
+
},
|
|
11208
|
+
{
|
|
11209
|
+
node,
|
|
11210
|
+
deep,
|
|
11211
|
+
target
|
|
11212
|
+
}
|
|
11213
|
+
);
|
|
11214
|
+
});
|
|
11215
|
+
idleTask.once("finish", () => {
|
|
11216
|
+
this.emit("collected", nodes, deep);
|
|
11217
|
+
});
|
|
11218
|
+
}
|
|
11219
|
+
collectNode(node, target, depExtendedData = {}, deep = false) {
|
|
11220
|
+
if (isPage(node)) {
|
|
11221
|
+
Object.entries(target.deps).forEach(([depKey, dep]) => {
|
|
11222
|
+
if (dep.data?.pageId && dep.data.pageId === depExtendedData.pageId) {
|
|
11223
|
+
delete target.deps[depKey];
|
|
11224
|
+
}
|
|
11225
|
+
});
|
|
11226
|
+
} else {
|
|
11227
|
+
this.watcher.removeTargetDep(target, node);
|
|
11228
|
+
}
|
|
11229
|
+
this.watcher.collectItem(node, target, depExtendedData, deep);
|
|
11230
|
+
}
|
|
11231
|
+
clear(nodes) {
|
|
11232
|
+
return this.watcher.clear(nodes);
|
|
11233
|
+
}
|
|
11234
|
+
clearByType(type, nodes) {
|
|
11235
|
+
return this.watcher.clearByType(type, nodes);
|
|
11236
|
+
}
|
|
11237
|
+
hasTarget(id, type = DepTargetType.DEFAULT) {
|
|
11238
|
+
return this.watcher.hasTarget(id, type);
|
|
11239
|
+
}
|
|
11240
|
+
hasSpecifiedTypeTarget(type = DepTargetType.DEFAULT) {
|
|
11241
|
+
return this.watcher.hasSpecifiedTypeTarget(type);
|
|
11242
|
+
}
|
|
11243
|
+
on(eventName, listener) {
|
|
11244
|
+
return super.on(eventName, listener);
|
|
11245
|
+
}
|
|
11246
|
+
once(eventName, listener) {
|
|
11247
|
+
return super.once(eventName, listener);
|
|
11248
|
+
}
|
|
11249
|
+
emit(eventName, ...args) {
|
|
11250
|
+
return super.emit(eventName, ...args);
|
|
11251
|
+
}
|
|
11252
|
+
}
|
|
11253
|
+
const depService = new Dep();
|
|
11254
|
+
|
|
11065
11255
|
let eventMap = reactive({});
|
|
11066
11256
|
let methodMap = reactive({});
|
|
11067
11257
|
class Events extends BaseService {
|
|
@@ -11681,15 +11871,11 @@ const initServiceEvents = (props, emit, { editorService, codeBlockService, dataS
|
|
|
11681
11871
|
delete root.dataSourceCondDeps[id];
|
|
11682
11872
|
}
|
|
11683
11873
|
};
|
|
11684
|
-
const depUpdateHandler = (node) => {
|
|
11685
|
-
updateNodeWhenDataSourceChange([node]);
|
|
11686
|
-
};
|
|
11687
11874
|
const collectedHandler = (nodes) => {
|
|
11688
11875
|
updateNodeWhenDataSourceChange(nodes);
|
|
11689
11876
|
};
|
|
11690
11877
|
depService.on("add-target", targetAddHandler);
|
|
11691
11878
|
depService.on("remove-target", targetRemoveHandler);
|
|
11692
|
-
depService.on("dep-update", depUpdateHandler);
|
|
11693
11879
|
depService.on("collected", collectedHandler);
|
|
11694
11880
|
const initDataSourceDepTarget = (ds) => {
|
|
11695
11881
|
depService.addTarget(createDataSourceTarget(ds, reactive({})));
|
|
@@ -11711,7 +11897,9 @@ const initServiceEvents = (props, emit, { editorService, codeBlockService, dataS
|
|
|
11711
11897
|
initDataSourceDepTarget(ds);
|
|
11712
11898
|
});
|
|
11713
11899
|
if (Array.isArray(value.items)) {
|
|
11714
|
-
|
|
11900
|
+
value.items.forEach((page) => {
|
|
11901
|
+
depService.collectIdle([page], { pageId: page.id }, true);
|
|
11902
|
+
});
|
|
11715
11903
|
} else {
|
|
11716
11904
|
depService.clear();
|
|
11717
11905
|
delete value.dataSourceDeps;
|
|
@@ -11734,17 +11922,29 @@ const initServiceEvents = (props, emit, { editorService, codeBlockService, dataS
|
|
|
11734
11922
|
emit("update:modelValue", value);
|
|
11735
11923
|
}
|
|
11736
11924
|
};
|
|
11925
|
+
const collectIdle = (nodes, deep) => {
|
|
11926
|
+
nodes.forEach((node) => {
|
|
11927
|
+
let pageId;
|
|
11928
|
+
if (isPage(node)) {
|
|
11929
|
+
pageId = node.id;
|
|
11930
|
+
} else {
|
|
11931
|
+
const info = editorService.getNodeInfo(node.id);
|
|
11932
|
+
pageId = info.page?.id;
|
|
11933
|
+
}
|
|
11934
|
+
depService.collectIdle([node], { pageId }, deep);
|
|
11935
|
+
});
|
|
11936
|
+
};
|
|
11737
11937
|
const nodeAddHandler = (nodes) => {
|
|
11738
|
-
|
|
11938
|
+
collectIdle(nodes, true);
|
|
11739
11939
|
};
|
|
11740
11940
|
const nodeUpdateHandler = (nodes) => {
|
|
11741
|
-
|
|
11941
|
+
collectIdle(nodes, false);
|
|
11742
11942
|
};
|
|
11743
11943
|
const nodeRemoveHandler = (nodes) => {
|
|
11744
11944
|
depService.clear(nodes);
|
|
11745
11945
|
};
|
|
11746
11946
|
const historyChangeHandler = (page) => {
|
|
11747
|
-
depService.
|
|
11947
|
+
depService.collectIdle([page], { pageId: page.id }, true);
|
|
11748
11948
|
};
|
|
11749
11949
|
editorService.on("history-change", historyChangeHandler);
|
|
11750
11950
|
editorService.on("root-change", rootChangeHandler);
|
|
@@ -11771,7 +11971,9 @@ const initServiceEvents = (props, emit, { editorService, codeBlockService, dataS
|
|
|
11771
11971
|
const root = editorService.get("root");
|
|
11772
11972
|
removeDataSourceTarget(config.id);
|
|
11773
11973
|
initDataSourceDepTarget(config);
|
|
11774
|
-
|
|
11974
|
+
(root?.items || []).forEach((page) => {
|
|
11975
|
+
depService.collectIdle([page], { pageId: page.id }, true);
|
|
11976
|
+
});
|
|
11775
11977
|
const targets = depService.getTargets(DepTargetType.DATA_SOURCE);
|
|
11776
11978
|
const nodes = getNodes(Object.keys(targets[config.id].deps), root?.items);
|
|
11777
11979
|
updateNodeWhenDataSourceChange(nodes);
|
|
@@ -11788,23 +11990,9 @@ const initServiceEvents = (props, emit, { editorService, codeBlockService, dataS
|
|
|
11788
11990
|
dataSourceService.on("add", dataSourceAddHandler);
|
|
11789
11991
|
dataSourceService.on("update", dataSourceUpdateHandler);
|
|
11790
11992
|
dataSourceService.on("remove", dataSourceRemoveHandler);
|
|
11791
|
-
if (props.collectorOptions && !depService.hasTarget(DepTargetType.RELATED_COMP_WHEN_COPY)) {
|
|
11792
|
-
depService.addTarget(createRelatedTargetForCopy(props.collectorOptions, DepTargetType.RELATED_COMP_WHEN_COPY));
|
|
11793
|
-
}
|
|
11794
|
-
if (props.collectorOptionsForCode && !depService.hasTarget(DepTargetType.RELATED_CODE_WHEN_COPY)) {
|
|
11795
|
-
depService.addTarget(
|
|
11796
|
-
createRelatedTargetForCopy(props.collectorOptionsForCode, DepTargetType.RELATED_CODE_WHEN_COPY)
|
|
11797
|
-
);
|
|
11798
|
-
}
|
|
11799
|
-
if (props.collectorOptionsForDataSource && !depService.hasTarget(DepTargetType.RELATED_DS_WHEN_COPY)) {
|
|
11800
|
-
depService.addTarget(
|
|
11801
|
-
createRelatedTargetForCopy(props.collectorOptionsForDataSource, DepTargetType.RELATED_DS_WHEN_COPY)
|
|
11802
|
-
);
|
|
11803
|
-
}
|
|
11804
11993
|
onBeforeUnmount(() => {
|
|
11805
11994
|
depService.off("add-target", targetAddHandler);
|
|
11806
11995
|
depService.off("remove-target", targetRemoveHandler);
|
|
11807
|
-
depService.off("dep-update", depUpdateHandler);
|
|
11808
11996
|
depService.off("collected", collectedHandler);
|
|
11809
11997
|
editorService.off("history-change", historyChangeHandler);
|
|
11810
11998
|
editorService.off("root-change", rootChangeHandler);
|
|
@@ -11849,9 +12037,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
11849
12037
|
stageRect: {},
|
|
11850
12038
|
codeOptions: {},
|
|
11851
12039
|
disabledDragStart: { type: Boolean },
|
|
11852
|
-
collectorOptions: {},
|
|
11853
|
-
collectorOptionsForCode: {},
|
|
11854
|
-
collectorOptionsForDataSource: {},
|
|
11855
12040
|
guidesOptions: {},
|
|
11856
12041
|
disabledMultiSelect: { type: Boolean },
|
|
11857
12042
|
disabledPageFragment: { type: Boolean },
|