@tmagic/editor 1.8.0-beta.15 → 1.8.0-beta.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,6 +50,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
50
50
  containerHighlightClassName: {},
51
51
  containerHighlightDuration: {},
52
52
  containerHighlightType: {},
53
+ containerHighlightAddOnly: { type: Boolean },
53
54
  stageRect: {},
54
55
  codeOptions: {},
55
56
  disabledDragStart: { type: Boolean },
@@ -120,6 +121,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
120
121
  containerHighlightClassName: props.containerHighlightClassName,
121
122
  containerHighlightDuration: props.containerHighlightDuration,
122
123
  containerHighlightType: props.containerHighlightType,
124
+ containerHighlightAddOnly: props.containerHighlightAddOnly,
123
125
  disabledDragStart: props.disabledDragStart,
124
126
  renderType: props.renderType,
125
127
  guidesOptions: props.guidesOptions,
@@ -16,6 +16,7 @@ var defaultEditorProps = {
16
16
  containerHighlightClassName: CONTAINER_HIGHLIGHT_CLASS_NAME,
17
17
  containerHighlightDuration: 800,
18
18
  containerHighlightType: ContainerHighlightType.DEFAULT,
19
+ containerHighlightAddOnly: false,
19
20
  disabledShowSrc: false,
20
21
  disabledDataSource: false,
21
22
  disabledCodeBlock: false,
@@ -3,7 +3,7 @@ import { getCompActionAllowedValues, getCompActionOptions, getEventNameAllowedVa
3
3
  import { MContainer, MPanel, MTable, defineFormItem } from "@tmagic/form";
4
4
  import { TMagicButton } from "@tmagic/design";
5
5
  import { ActionType } from "@tmagic/core";
6
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, renderList, toDisplayString, unref, withCtx } from "vue";
6
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
7
7
  import { has } from "lodash-es";
8
8
  import { Delete, Plus } from "@element-plus/icons-vue";
9
9
  //#region packages/editor/src/fields/EventSelect.vue?vue&type=script&setup=true&lang.ts
@@ -14,7 +14,6 @@ var _hoisted_2 = {
14
14
  };
15
15
  var _hoisted_3 = { class: "event-select-header" };
16
16
  var _hoisted_4 = { class: "event-item-header" };
17
- var _hoisted_5 = { class: "event-item-title" };
18
17
  var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
19
18
  name: "MFieldsEventSelect",
20
19
  __name: "EventSelect",
@@ -95,6 +94,12 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
95
94
  typeMatch: true,
96
95
  trigger: "blur"
97
96
  }],
97
+ onChange: (_mForm, _v, { setModel }) => {
98
+ setModel("to", "");
99
+ setModel("method", "");
100
+ setModel("codeId", "");
101
+ setModel("dataSourceMethod", []);
102
+ },
98
103
  ...props.config.actionTypeConfig
99
104
  };
100
105
  });
@@ -105,7 +110,7 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
105
110
  type: "ui-select",
106
111
  labelPosition: "left",
107
112
  display: (_mForm, { model }) => model.actionType === ActionType.COMP,
108
- onChange: (_MForm, _v, { setModel }) => {
113
+ onChange: (_mForm, _v, { setModel }) => {
109
114
  setModel("method", "");
110
115
  },
111
116
  rules: [{
@@ -312,46 +317,42 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
312
317
  model: entry.cardItem,
313
318
  "last-values": entry.lastCardItem,
314
319
  "is-compare": isCompareMode.value,
315
- "hide-expand": true,
320
+ "hide-expand": false,
316
321
  "label-width": __props.config.labelWidth || "100px",
317
322
  onChange: onChangeHandler
318
323
  }, {
319
- header: withCtx(() => [createElementVNode("div", _hoisted_4, [
320
- createElementVNode("div", _hoisted_5, "事件" + toDisplayString(Number(entry.index) + 1), 1),
321
- createVNode(unref(MContainer), {
322
- class: "fullWidth",
323
- config: eventNameConfig.value,
324
- model: entry.cardItem,
325
- "last-values": entry.lastCardItem,
326
- "is-compare": isCompareMode.value,
327
- disabled: __props.disabled,
328
- size: __props.size,
329
- prop: `${__props.prop}.${entry.index}`,
330
- onChange: eventNameChangeHandler
331
- }, null, 8, [
332
- "config",
333
- "model",
334
- "last-values",
335
- "is-compare",
336
- "disabled",
337
- "size",
338
- "prop"
339
- ]),
340
- !isCompareMode.value ? (openBlock(), createBlock(unref(TMagicButton), {
341
- key: 0,
342
- class: "event-item-delete-button",
343
- link: "",
344
- icon: unref(Delete),
345
- disabled: __props.disabled,
346
- size: __props.size,
347
- onClick: ($event) => removeEvent(Number(entry.index))
348
- }, null, 8, [
349
- "icon",
350
- "disabled",
351
- "size",
352
- "onClick"
353
- ])) : createCommentVNode("v-if", true)
354
- ])]),
324
+ header: withCtx(() => [createElementVNode("div", _hoisted_4, [createVNode(unref(MContainer), {
325
+ class: "fullWidth",
326
+ config: eventNameConfig.value,
327
+ model: entry.cardItem,
328
+ "last-values": entry.lastCardItem,
329
+ "is-compare": isCompareMode.value,
330
+ disabled: __props.disabled,
331
+ size: __props.size,
332
+ prop: `${__props.prop}.${entry.index}`,
333
+ onChange: eventNameChangeHandler
334
+ }, null, 8, [
335
+ "config",
336
+ "model",
337
+ "last-values",
338
+ "is-compare",
339
+ "disabled",
340
+ "size",
341
+ "prop"
342
+ ]), !isCompareMode.value ? (openBlock(), createBlock(unref(TMagicButton), {
343
+ key: 0,
344
+ class: "event-item-delete-button",
345
+ link: "",
346
+ icon: unref(Delete),
347
+ disabled: __props.disabled,
348
+ size: __props.size,
349
+ onClick: ($event) => removeEvent(Number(entry.index))
350
+ }, null, 8, [
351
+ "icon",
352
+ "disabled",
353
+ "size",
354
+ "onClick"
355
+ ])) : createCommentVNode("v-if", true)])]),
355
356
  _: 2
356
357
  }, 1032, [
357
358
  "disabled",
@@ -22,6 +22,7 @@ var useStage = (stageOptions) => {
22
22
  containerHighlightClassName: stageOptions.containerHighlightClassName,
23
23
  containerHighlightDuration: stageOptions.containerHighlightDuration,
24
24
  containerHighlightType: stageOptions.containerHighlightType,
25
+ containerHighlightAddOnly: stageOptions.containerHighlightAddOnly,
25
26
  disabledDragStart: stageOptions.disabledDragStart,
26
27
  renderType: stageOptions.renderType,
27
28
  canSelect: (el, event, stop) => {
package/dist/es/index.js CHANGED
@@ -2,7 +2,7 @@ import { CODE_DRAFT_STORAGE_KEY, CodeDeleteErrorType, ColumnLayout, DragType, Ke
2
2
  import { useCodeBlockEdit } from "./hooks/use-code-block-edit.js";
3
3
  import { getEditorConfig, isGlobalFlat, setEditorConfig } from "./utils/config.js";
4
4
  import { getCodeBlockFormConfig } from "./utils/code-block.js";
5
- import { advancedTabConfig, arrayOptions, booleanOptions, displayTabConfig, eqOptions, eventTabConfig, fillConfig, getCondOpOptionsByFieldType, numberOptions, removeStyleDisplayConfig, styleTabConfig, validatePropsForm } from "./utils/props.js";
5
+ import { advancedTabConfig, arrayOptions, booleanOptions, displayTabConfig, eqOptions, eventTabConfig, fillConfig, getCondOpOptionsByFieldType, numberOptions, removeStyleDisplayConfig, styleTabConfig } from "./utils/props.js";
6
6
  import { useCompareForm } from "./hooks/use-compare-form.js";
7
7
  import props_default from "./services/props.js";
8
8
  import { UndoRedo } from "./utils/undo-redo.js";
@@ -92,4 +92,4 @@ export * from "@tmagic/table";
92
92
  export * from "@tmagic/stage";
93
93
  export * from "@tmagic/design";
94
94
  export * from "@tmagic/utils";
95
- export { ALL_COND_OPS, CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EVENT_NAME_VALUE_SEPARATOR, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, BucketTab_default as HistoryListBucketTab, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerNodeContent_default as LayerNodeContent, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, ViewForm_default as ViewForm, advancedTabConfig, arrayOptions, beforePaste, booleanOptions, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectEventNameOptionValues, collectRelatedNodes, componentList_default as componentListService, confirmHistoryAction, createStackStep, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, describeRevertStep, describeStepForRevert, deserializeStacks, designPlugin, detectStackOpType, detectTargetId, detectTargetName, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, editorTypeMatchRules, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getCompActionAllowedValues, getCompActionOptions, getCondOpOptionsByFieldType, getDefaultConfig, getDisplayField, getEditorConfig, getEventNameAllowedValues, getEventNameOptions, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isEventNameCheckStrictly, isGlobalFlat, isIncludeDataSource, isIndexedDBSupported, keybinding_default as keybindingService, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, normalizeCompActionValue, numberOptions, openIndexedDB, props_default as propsService, removeStyleDisplayConfig, resolveFieldByPath, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useCompareForm, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, validatePropsForm, warn };
95
+ export { ALL_COND_OPS, CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EVENT_NAME_VALUE_SEPARATOR, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, BucketTab_default as HistoryListBucketTab, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerNodeContent_default as LayerNodeContent, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, ViewForm_default as ViewForm, advancedTabConfig, arrayOptions, beforePaste, booleanOptions, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectEventNameOptionValues, collectRelatedNodes, componentList_default as componentListService, confirmHistoryAction, createStackStep, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, describeRevertStep, describeStepForRevert, deserializeStacks, designPlugin, detectStackOpType, detectTargetId, detectTargetName, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, editorTypeMatchRules, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getCompActionAllowedValues, getCompActionOptions, getCondOpOptionsByFieldType, getDefaultConfig, getDisplayField, getEditorConfig, getEventNameAllowedValues, getEventNameOptions, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isEventNameCheckStrictly, isGlobalFlat, isIncludeDataSource, isIndexedDBSupported, keybinding_default as keybindingService, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, normalizeCompActionValue, numberOptions, openIndexedDB, props_default as propsService, removeStyleDisplayConfig, resolveFieldByPath, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useCompareForm, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
@@ -110,15 +110,15 @@ var initServiceEvents = (props, emit, { editorService, codeBlockService, dataSou
110
110
  return pageId;
111
111
  };
112
112
  const collectIdle = (nodes, deep, type) => Promise.all(nodes.map((node) => {
113
- if (node.type === NodeType.ROOT) return Promise.resolve();
113
+ if (node.type === NodeType.ROOT) return Promise.resolve(true);
114
114
  return depService.collectIdle([node], { pageId: getPageIdByNode(node) }, deep, type);
115
- }));
115
+ })).then((results) => results.every(Boolean));
116
116
  watch(() => editorService.get("stage"), (stage) => {
117
117
  if (!stage) return;
118
118
  stage.on("rerender", async () => {
119
119
  const node = editorService.get("node");
120
120
  if (!node) return;
121
- await collectIdle([node], true, DepTargetType.DATA_SOURCE);
121
+ if (!await collectIdle([node], true, DepTargetType.DATA_SOURCE)) return;
122
122
  updateStageNode(node);
123
123
  });
124
124
  });
@@ -205,8 +205,8 @@ var initServiceEvents = (props, emit, { editorService, codeBlockService, dataSou
205
205
  })();
206
206
  };
207
207
  const nodeAddHandler = (nodes) => {
208
- collectIdle(nodes, true).then(() => {
209
- updateStageNodes(nodes);
208
+ collectIdle(nodes, true).then((completed) => {
209
+ if (completed) updateStageNodes(nodes);
210
210
  });
211
211
  };
212
212
  const nodeUpdateHandler = (data) => {
@@ -235,8 +235,8 @@ var initServiceEvents = (props, emit, { editorService, codeBlockService, dataSou
235
235
  else normalNodes.push(newNode);
236
236
  if (needRecollectNodes.length) {
237
237
  const handler = async () => {
238
- await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE);
239
- await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND);
238
+ if (!await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE)) return;
239
+ if (!await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND)) return;
240
240
  updateStageNodes(needRecollectNodes);
241
241
  };
242
242
  handler();
@@ -249,8 +249,8 @@ var initServiceEvents = (props, emit, { editorService, codeBlockService, dataSou
249
249
  depService.clear(nodes);
250
250
  };
251
251
  const historyChangeHandler = (page) => {
252
- collectIdle([page], true).then(() => {
253
- updateStageNode(page);
252
+ collectIdle([page], true).then((completed) => {
253
+ if (completed) updateStageNode(page);
254
254
  });
255
255
  };
256
256
  editorService.on("history-change", historyChangeHandler);
@@ -310,7 +310,13 @@ var initServiceEvents = (props, emit, { editorService, codeBlockService, dataSou
310
310
  depService.addTarget(createDataSourceMethodTarget(config, reactive({})));
311
311
  collectIdlePromises = [collectIdle(root.items, true, DepTargetType.DATA_SOURCE_METHOD)];
312
312
  }
313
- Promise.all(collectIdlePromises).then(() => updateDataSourceSchema()).then(() => updateDsData()).then(() => updateStageNodes(root.items));
313
+ const handler = async () => {
314
+ if (!(await Promise.all(collectIdlePromises)).every(Boolean)) return;
315
+ updateDataSourceSchema();
316
+ await updateDsData();
317
+ updateStageNodes(root.items);
318
+ };
319
+ handler();
314
320
  }
315
321
  } else if (root?.dataSources) updateDsData();
316
322
  };
@@ -324,11 +330,11 @@ var initServiceEvents = (props, emit, { editorService, codeBlockService, dataSou
324
330
  if (!root) return;
325
331
  const handler = async () => {
326
332
  const nodes = getNodes(Object.keys(root.dataSourceDeps?.[id] || {}), root.items);
327
- await Promise.all([
333
+ if (!(await Promise.all([
328
334
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE),
329
335
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE_COND),
330
336
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE_METHOD)
331
- ]);
337
+ ])).every(Boolean)) return;
332
338
  updateDataSourceSchema();
333
339
  (await getTMagicApp())?.dataSourceManager?.removeDataSource(id);
334
340
  updateStageNodes(nodes);
@@ -1,10 +1,9 @@
1
- import { validatePropsForm } from "../../utils/props.js";
2
1
  import { useServices } from "../../hooks/use-services.js";
3
2
  import { useEditorContentHeight } from "../../hooks/use-editor-content-height.js";
4
3
  import Icon_default from "../../components/Icon.js";
5
4
  import CodeEditor_default from "../CodeEditor.js";
6
5
  import { ENABLE_PROPS_FORM_VALIDATE } from "../../editorProps.js";
7
- import { MForm } from "@tmagic/form";
6
+ import { MForm, validateForm } from "@tmagic/form";
8
7
  import { TMagicButton, TMagicScrollbar, tMagicMessage } from "@tmagic/design";
9
8
  import { filterXSS } from "@tmagic/utils";
10
9
  import { computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, getCurrentInstance, inject, normalizeClass, onMounted, onUnmounted, openBlock, ref, renderSlot, unref, useTemplateRef, watchEffect, withCtx } from "vue";
@@ -82,14 +81,18 @@ var FormPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
82
81
  return;
83
82
  }
84
83
  try {
85
- const error = await validatePropsForm({
84
+ const error = await validateForm({
86
85
  config: props.config,
87
- values: newValues,
88
- appContext: internalInstance?.appContext ?? null,
89
- services,
90
- stage: stage.value,
91
86
  typeMatchValid: true,
92
- extendState: props.extendState
87
+ initValues: newValues,
88
+ appContext: internalInstance?.appContext ? {
89
+ ...internalInstance?.appContext,
90
+ provides: { services }
91
+ } : null,
92
+ extendState: (state) => {
93
+ if (configFormRef.value?.formState) return { ...configFormRef.value?.formState || {} };
94
+ return props.extendState?.(state) || {};
95
+ }
93
96
  });
94
97
  if (error) tMagicMessage({
95
98
  type: "error",
@@ -70,7 +70,7 @@ var ComponentListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__
70
70
  return;
71
71
  }
72
72
  if (timeout || !stage.value) return;
73
- timeout = stage.value.delayedMarkContainer(e);
73
+ timeout = stage.value.delayedMarkContainer(e, [], true);
74
74
  };
75
75
  return (_ctx, _cache) => {
76
76
  return openBlock(), createBlock(unref(TMagicScrollbar), null, {
@@ -15,6 +15,9 @@ var Dep = class extends BaseService {
15
15
  idleTask = new IdleTask();
16
16
  watcher = new Watcher({ initialTargets: reactive({}) });
17
17
  waitingWorker;
18
+ resolveWaitingWorker;
19
+ workerGeneration = 0;
20
+ activeBatches = /* @__PURE__ */ new Set();
18
21
  constructor() {
19
22
  super();
20
23
  this.idleTask.on("update-task-length", throttle(({ length }) => {
@@ -64,33 +67,36 @@ var Dep = class extends BaseService {
64
67
  }
65
68
  async collectIdle(nodes, depExtendedData = {}, deep = false, type) {
66
69
  if (this.waitingWorker) await this.waitingWorker;
67
- this.set("collecting", true);
68
- let startTask = false;
70
+ const batch = {
71
+ nodes,
72
+ deep,
73
+ pending: 0,
74
+ dsPending: 0,
75
+ collectedEmitted: false,
76
+ dsSettled: false,
77
+ resolve: () => {}
78
+ };
69
79
  this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
70
- startTask = true;
71
- this.enqueueTask(node, target, depExtendedData, deep);
80
+ this.enqueueTask(node, target, depExtendedData, deep, batch);
72
81
  });
82
+ if (batch.pending === 0) {
83
+ this.emit("collected", nodes, deep);
84
+ this.updateCollectingState();
85
+ return true;
86
+ }
87
+ this.activeBatches.add(batch);
88
+ this.set("collecting", true);
73
89
  return new Promise((resolve) => {
74
- if (!startTask) {
75
- this.emit("collected", nodes, deep);
76
- this.set("collecting", false);
77
- resolve();
78
- return;
79
- }
80
- this.idleTask.once("finish", () => {
81
- this.emit("collected", nodes, deep);
82
- this.set("collecting", false);
83
- });
84
- this.idleTask.once("hight-level-finish", () => {
85
- this.emit("ds-collected", nodes, deep);
86
- resolve();
87
- });
90
+ batch.resolve = resolve;
88
91
  });
89
92
  }
90
93
  collectByWorker(dsl) {
91
94
  this.set("collecting", true);
95
+ this.workerGeneration += 1;
96
+ const generation = this.workerGeneration;
92
97
  const { promise, resolve: waitingResolve } = Promise.withResolvers();
93
98
  this.waitingWorker = promise;
99
+ this.resolveWaitingWorker = waitingResolve;
94
100
  return new Promise((resolve) => {
95
101
  const worker = new WorkerWrapper();
96
102
  worker.postMessage({ dsl: serialize(dsl) });
@@ -101,6 +107,10 @@ var Dep = class extends BaseService {
101
107
  resolve({});
102
108
  };
103
109
  }).then((depsData) => {
110
+ if (generation !== this.workerGeneration) {
111
+ waitingResolve();
112
+ return depsData;
113
+ }
104
114
  traverseTarget(this.watcher.getTargetsList(), (target) => {
105
115
  if (depsData[target.type]?.[target.id]) {
106
116
  target.deps = reactive(depsData[target.type][target.id]);
@@ -113,6 +123,10 @@ var Dep = class extends BaseService {
113
123
  this.emit("collected", dsl.items, true);
114
124
  this.emit("ds-collected", dsl.items, true);
115
125
  waitingResolve();
126
+ if (this.waitingWorker === promise) {
127
+ this.waitingWorker = void 0;
128
+ this.resolveWaitingWorker = void 0;
129
+ }
116
130
  return depsData;
117
131
  });
118
132
  }
@@ -134,6 +148,7 @@ var Dep = class extends BaseService {
134
148
  return this.watcher.hasSpecifiedTypeTarget(type);
135
149
  }
136
150
  clearIdleTasks() {
151
+ this.abortActiveBatches();
137
152
  this.idleTask.clearTasks();
138
153
  }
139
154
  on(eventName, listener) {
@@ -143,6 +158,11 @@ var Dep = class extends BaseService {
143
158
  return super.once(eventName, listener);
144
159
  }
145
160
  reset() {
161
+ this.abortActiveBatches();
162
+ this.workerGeneration += 1;
163
+ this.resolveWaitingWorker?.();
164
+ this.resolveWaitingWorker = void 0;
165
+ this.waitingWorker = void 0;
146
166
  this.idleTask.clearTasks();
147
167
  for (const type of Object.keys(this.watcher.getTargetsList())) this.removeTargets(type);
148
168
  this.set("collecting", false);
@@ -167,18 +187,63 @@ var Dep = class extends BaseService {
167
187
  if (dep.data?.pageId && dep.data.pageId === depExtendedData.pageId) delete target.deps[depKey];
168
188
  }
169
189
  }
170
- enqueueTask(node, target, depExtendedData, deep) {
190
+ enqueueTask(node, target, depExtendedData, deep, batch) {
191
+ const isDataSource = target.type === DepTargetType.DATA_SOURCE;
192
+ batch.pending += 1;
193
+ if (isDataSource) batch.dsPending += 1;
171
194
  this.idleTask.enqueueTask(({ node, deep, target }) => {
172
- this.collectNode(node, target, depExtendedData, deep);
195
+ try {
196
+ this.collectNode(node, target, depExtendedData, deep);
197
+ } finally {
198
+ this.onBatchTaskDone(batch, isDataSource);
199
+ }
173
200
  }, {
174
201
  node,
175
202
  deep: false,
176
203
  target
177
- }, target.type === DepTargetType.DATA_SOURCE);
204
+ }, isDataSource);
178
205
  if (deep && Array.isArray(node.items) && node.items.length) node.items.forEach((item) => {
179
- this.enqueueTask(item, target, depExtendedData, deep);
206
+ this.enqueueTask(item, target, depExtendedData, deep, batch);
180
207
  });
181
208
  }
209
+ onBatchTaskDone(batch, isDataSource) {
210
+ if (isDataSource) {
211
+ batch.dsPending -= 1;
212
+ if (batch.dsPending === 0) this.settleBatchDs(batch);
213
+ }
214
+ batch.pending -= 1;
215
+ if (batch.pending === 0) this.finishBatch(batch);
216
+ }
217
+ settleBatchDs(batch) {
218
+ if (batch.dsSettled) return;
219
+ batch.dsSettled = true;
220
+ this.emit("ds-collected", batch.nodes, batch.deep);
221
+ batch.resolve(true);
222
+ }
223
+ finishBatch(batch) {
224
+ if (!batch.collectedEmitted) {
225
+ batch.collectedEmitted = true;
226
+ this.emit("collected", batch.nodes, batch.deep);
227
+ }
228
+ this.settleBatchDs(batch);
229
+ this.activeBatches.delete(batch);
230
+ this.updateCollectingState();
231
+ }
232
+ /**
233
+ * idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
234
+ * 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
235
+ * 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
236
+ */
237
+ abortActiveBatches() {
238
+ if (!this.activeBatches.size) return;
239
+ const batches = [...this.activeBatches];
240
+ this.activeBatches.clear();
241
+ for (const batch of batches) batch.resolve(false);
242
+ this.updateCollectingState();
243
+ }
244
+ updateCollectingState() {
245
+ this.set("collecting", this.activeBatches.size > 0);
246
+ }
182
247
  };
183
248
  var dep_default = new Dep();
184
249
  //#endregion
package/dist/es/style.css CHANGED
@@ -59,6 +59,9 @@
59
59
  border-radius: 0;
60
60
  border-bottom: 0;
61
61
  }
62
+ .tmagic-design-card.tmagic-design-card--flat.m-flat-hide-body .el-card__header {
63
+ border-bottom: 0 !important;
64
+ }
62
65
  .tmagic-design-card.tmagic-design-card--flat.m-fields-group-list-item {
63
66
  margin-bottom: 0;
64
67
  }
@@ -67,18 +70,22 @@
67
70
  }
68
71
  .tmagic-design-card.tmagic-design-card--flat .el-card__header {
69
72
  border-bottom: none;
70
- padding: 16px;
73
+ padding: 8px 16px;
71
74
  }
72
75
  .tmagic-design-card.tmagic-design-card--flat .el-card__header:hover {
73
76
  background: transparent;
74
77
  box-shadow: none;
75
78
  cursor: default;
76
79
  }
80
+ .tmagic-design-card.tmagic-design-card--flat .m-fields-group-list-footer {
81
+ margin-bottom: 4px;
82
+ margin-top: 4px;
83
+ }
77
84
  .tmagic-design-card.tmagic-design-card--flat .el-card__body {
78
85
  padding: 0 16px 0 16px;
79
86
  }
80
87
  .tmagic-design-card.tmagic-design-card--flat .el-card__body .tmagic-design-form-item:not(tbody .tmagic-design-form-item) {
81
- margin-bottom: 16px;
88
+ margin-bottom: 8px;
82
89
  }
83
90
  .tmagic-design-card.tmagic-design-card--flat .el-card__body > .m-container-row {
84
91
  overflow-x: hidden;
@@ -95,7 +102,7 @@
95
102
  }
96
103
  .m-split-title-card-container > .tmagic-design-card.tmagic-design-card--flat > .el-card__body {
97
104
  background-color: #fff;
98
- padding-top: 16px;
105
+ padding-top: 8px;
99
106
  }
100
107
 
101
108
  .tmagic-design-color-picker-input {
@@ -434,12 +441,16 @@ fieldset.m-fieldset .m-form-tip {
434
441
  gap: 8px;
435
442
  }
436
443
  .m-fields-group-list .m-fields-group-list-footer {
437
- display: flex;
438
444
  justify-content: space-between;
439
445
  margin-top: 10px;
440
446
  margin-bottom: 16px;
441
447
  }
442
448
 
449
+ /** 最外层的groupList需要每个item需要增加空白区域界限时,增加outer-gorup_list可以实现 */
450
+ .m-container-group-list.outer-gorup_list > .m-fields-group-list > .m-fields-group-list-item {
451
+ margin-bottom: 10px;
452
+ }
453
+
443
454
  .m-form-panel .el-card__header:hover {
444
455
  background: #f2f6fc;
445
456
  }
@@ -1927,20 +1938,23 @@ fieldset.m-fieldset .m-form-tip {
1927
1938
  margin-bottom: 18px;
1928
1939
  }
1929
1940
  .m-fields-code-select .code-select-content > .m-fields-group-list > .tmagic-design-card--flat > .el-card__header {
1930
- padding: 16px 0;
1941
+ padding: 8px 0;
1931
1942
  }
1932
1943
  .m-fields-code-select .create-button.fullWidth {
1933
1944
  width: 100%;
1934
- margin: 0 0 16px 0;
1945
+ margin: 0 0 8px 0;
1935
1946
  }
1936
1947
 
1937
1948
  .m-fields-event-select {
1938
1949
  width: 100%;
1939
1950
  }
1940
1951
  .m-fields-event-select .fullWidth {
1941
- width: 100%;
1952
+ width: calc(100% - 32px);
1942
1953
  box-sizing: border-box;
1943
1954
  }
1955
+ .m-fields-event-select .fullWidth.create-button {
1956
+ width: 100%;
1957
+ }
1944
1958
  .m-fields-event-select .event-select-container {
1945
1959
  padding: 0 16px;
1946
1960
  }
@@ -1948,13 +1962,13 @@ fieldset.m-fieldset .m-form-tip {
1948
1962
  border-bottom: 1px solid #ebeef5;
1949
1963
  }
1950
1964
  .m-fields-event-select .event-select-container > .el-card.tmagic-design-card--flat > .el-card__body {
1951
- padding-bottom: 16px;
1965
+ padding-bottom: 8px;
1952
1966
  }
1953
1967
  .m-fields-event-select .event-select-container > .el-card.tmagic-design-card--flat > .el-card__body .m-fields-group-list-footer div {
1954
1968
  justify-content: flex-start !important;
1955
1969
  }
1956
1970
  .m-fields-event-select .event-select-container > .el-card.tmagic-design-card--flat > .el-card__body .el-card.tmagic-design-card--flat > .el-card__header {
1957
- padding: 16px 0;
1971
+ padding: 8px 0;
1958
1972
  }
1959
1973
  .m-fields-event-select .event-select-code {
1960
1974
  margin-left: 20px;
@@ -2008,18 +2022,19 @@ fieldset.m-fieldset .m-form-tip {
2008
2022
  .event-item-header {
2009
2023
  position: relative;
2010
2024
  width: 100%;
2025
+ display: flex;
2026
+ align-items: center;
2027
+ justify-content: space-between;
2011
2028
  }
2012
2029
  .event-item-header .event-item-title {
2013
2030
  color: #0f1113;
2014
2031
  font-size: 16px;
2015
2032
  font-weight: 500;
2016
2033
  line-height: 24px;
2017
- margin-bottom: 16px;
2034
+ margin-bottom: 8px;
2018
2035
  }
2019
2036
  .event-item-header .event-item-delete-button {
2020
- position: absolute;
2021
- right: 0;
2022
- top: 0;
2037
+ color: #0f1113;
2023
2038
  }
2024
2039
  .event-item-header .el-form-item .el-form-item.is-error {
2025
2040
  margin-bottom: 18px;
@@ -11,6 +11,9 @@ globalThis.requestIdleCallback = globalThis.requestIdleCallback || function(cb)
11
11
  });
12
12
  }, 1);
13
13
  };
14
+ globalThis.cancelIdleCallback = globalThis.cancelIdleCallback || function(handle) {
15
+ clearTimeout(handle);
16
+ };
14
17
  var IdleTask = class extends EventEmitter {
15
18
  taskList = [];
16
19
  hightLevelTaskList = [];