@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.
@@ -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
- depService.clearByType(dep.DepTargetType.RELATED_COMP_WHEN_COPY);
862
- depService.collect(originConfigs, true, dep.DepTargetType.RELATED_COMP_WHEN_COPY);
863
- const target = depService.getTarget(dep.DepTargetType.RELATED_COMP_WHEN_COPY, dep.DepTargetType.RELATED_COMP_WHEN_COPY);
864
- if (!target)
865
- return;
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
- depService.clearByType(dep.DepTargetType.RELATED_COMP_WHEN_COPY);
1997
- depService.collect(copyNodes, true, dep.DepTargetType.RELATED_COMP_WHEN_COPY);
1998
- const customTarget = depService.getTarget(
1999
- dep.DepTargetType.RELATED_COMP_WHEN_COPY,
2000
- dep.DepTargetType.RELATED_COMP_WHEN_COPY
2001
- );
2002
- if (customTarget) {
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
- propsService.replaceRelateId(config, pasteConfigs);
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 pasteConfigs = beforePaste(position, lodashEs.cloneDeep(config));
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
- const field = fields?.find((field2) => field2.name === item);
2603
- fields = field?.fields;
2604
- dsText += `.${field?.title || item}`;
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 (customTarget) {
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: fieldType,
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: true,
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: "select",
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
- return eventsService?.getMethod(node.type).map((option) => ({
5781
- text: option.label,
5782
- value: option.value
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(() => props.data.items?.some((item) => props.nodeStatusMap.get(item.id)?.visible));
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.values(depService?.getTargets(dep.DepTargetType.CODE_BLOCK) || {}).map((target) => {
7910
- const compNodes = Object.entries(target.deps).map(([id, dep]) => ({
7911
- name: dep.name,
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: `${target.id}_${id}`,
7914
- key: id,
7915
- items: dep.keys.map((key) => {
7916
- const data2 = { name: `${key}`, id: `${target.id}_${id}_${key}`, type: "key" };
7917
- return data2;
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: target.id,
7922
- key: target.id,
7923
- name: target.name,
7968
+ id: codeId,
7969
+ key: codeId,
7970
+ name: code.name,
7924
7971
  type: "code",
7925
- codeBlockContent: codeBlockService?.getCodeContentById(target.id),
7926
- items: compNodes
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, items, deps, type) => {
8289
+ const mergeChildren = (dsId, pageItems, deps, type) => {
8242
8290
  Object.entries(deps).forEach(([id, dep]) => {
8243
- const nodeItem = items.find((item) => item.key === id);
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, dsId));
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
- items
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 (customTarget) {
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
- depService.collect(value.items, true);
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
- depService.collect(nodes);
11943
+ collectIdle(nodes, true);
11744
11944
  };
11745
11945
  const nodeUpdateHandler = (nodes) => {
11746
- depService.collect(nodes);
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.collect([page], true);
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
- depService.collect(root?.items || [], true);
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 },