@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.
@@ -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, createRelatedTargetForCopy, createCodeBlockTarget, createDataSourceTarget, createDataSourceMethodTarget, createDataSourceCondTarget } from '@tmagic/dep';
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
- depService.clearByType(DepTargetType.RELATED_COMP_WHEN_COPY);
857
- depService.collect(originConfigs, true, DepTargetType.RELATED_COMP_WHEN_COPY);
858
- const target = depService.getTarget(DepTargetType.RELATED_COMP_WHEN_COPY, DepTargetType.RELATED_COMP_WHEN_COPY);
859
- if (!target)
860
- return;
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
- depService.clearByType(DepTargetType.RELATED_COMP_WHEN_COPY);
1992
- depService.collect(copyNodes, true, DepTargetType.RELATED_COMP_WHEN_COPY);
1993
- const customTarget = depService.getTarget(
1994
- DepTargetType.RELATED_COMP_WHEN_COPY,
1995
- DepTargetType.RELATED_COMP_WHEN_COPY
1996
- );
1997
- if (customTarget) {
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
- propsService.replaceRelateId(config, pasteConfigs);
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 pasteConfigs = beforePaste(position, cloneDeep(config));
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
- const field = fields?.find((field2) => field2.name === item);
2598
- fields = field?.fields;
2599
- dsText += `.${field?.title || item}`;
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 (customTarget) {
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: fieldType,
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: true,
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: "select",
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
- return eventsService?.getMethod(node.type).map((option) => ({
5776
- text: option.label,
5777
- value: option.value
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(() => props.data.items?.some((item) => props.nodeStatusMap.get(item.id)?.visible));
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.values(depService?.getTargets(DepTargetType.CODE_BLOCK) || {}).map((target) => {
7905
- const compNodes = Object.entries(target.deps).map(([id, dep]) => ({
7906
- name: dep.name,
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: `${target.id}_${id}`,
7909
- key: id,
7910
- items: dep.keys.map((key) => {
7911
- const data2 = { name: `${key}`, id: `${target.id}_${id}_${key}`, type: "key" };
7912
- return data2;
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: target.id,
7917
- key: target.id,
7918
- name: target.name,
7963
+ id: codeId,
7964
+ key: codeId,
7965
+ name: code.name,
7919
7966
  type: "code",
7920
- codeBlockContent: codeBlockService?.getCodeContentById(target.id),
7921
- items: compNodes
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, items, deps, type) => {
8284
+ const mergeChildren = (dsId, pageItems, deps, type) => {
8237
8285
  Object.entries(deps).forEach(([id, dep]) => {
8238
- const nodeItem = items.find((item) => item.key === id);
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, dsId));
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
- items
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 (customTarget) {
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
- depService.collect(value.items, true);
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
- depService.collect(nodes);
11938
+ collectIdle(nodes, true);
11739
11939
  };
11740
11940
  const nodeUpdateHandler = (nodes) => {
11741
- depService.collect(nodes);
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.collect([page], true);
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
- depService.collect(root?.items || [], true);
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 },