@tmagic/editor 1.8.0-manmanyu.10 → 1.8.0-manmanyu.11

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.
@@ -19,7 +19,7 @@ import stageOverlay_default from "./services/stageOverlay.js";
19
19
  import { defaultEditorProps } from "./editorProps.js";
20
20
  import { initServiceEvents, initServiceState } from "./initService.js";
21
21
  import { M_THEME_KEY } from "@tmagic/design";
22
- import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, renderSlot, unref, withCtx } from "vue";
22
+ import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, ref, renderSlot, unref, withCtx } from "vue";
23
23
  import { EventEmitter } from "events";
24
24
  //#region packages/editor/src/Editor.vue?vue&type=script&setup=true&lang.ts
25
25
  var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -127,6 +127,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
127
127
  beforeDblclick: props.beforeDblclick
128
128
  };
129
129
  stageOverlay_default.set("stageOptions", stageOptions);
130
+ const propsPanelRef = ref(null);
130
131
  provide("services", services);
131
132
  provide("codeOptions", props.codeOptions);
132
133
  provide("stageOptions", stageOptions);
@@ -137,6 +138,11 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
137
138
  */
138
139
  provide("extendFormState", props.extendFormState);
139
140
  /**
141
+ * 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
142
+ * 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
143
+ */
144
+ provide("getPropsPanelFormState", () => propsPanelRef.value?.configForm?.formState);
145
+ /**
140
146
  * 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
141
147
  * 以 markRaw component 形式渲染,无法直接通过 props 透传)。业务方可借此在历史记录
142
148
  * 面板内追加自定义模块的历史 tab。
@@ -150,9 +156,11 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
150
156
  */
151
157
  provide(M_THEME_KEY, computed(() => props.theme ?? ""));
152
158
  const propsPanelMountedHandler = (e) => {
159
+ propsPanelRef.value = e;
153
160
  emit("props-panel-mounted", e);
154
161
  };
155
162
  const propsPanelUnmountedHandler = () => {
163
+ propsPanelRef.value = null;
156
164
  emit("props-panel-unmounted");
157
165
  };
158
166
  const propsPanelSubmitErrorHandler = (e) => {
@@ -16,7 +16,12 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
16
16
  dataSourceType: {},
17
17
  labelWidth: { default: "120px" },
18
18
  height: {},
19
- extendState: {},
19
+ extendState: {
20
+ type: Function,
21
+ default: (state) => state
22
+ },
23
+ baseFormState: {},
24
+ selfDiffFieldTypes: {},
20
25
  loadConfig: {},
21
26
  services: { default: () => useServices() }
22
27
  },
@@ -94,6 +99,9 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
94
99
  })
95
100
  };
96
101
  });
102
+ const mergedExtendState = (state) => {
103
+ return props.extendState(props.baseFormState || state);
104
+ };
97
105
  /**
98
106
  * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
99
107
  * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
@@ -173,14 +181,15 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
173
181
  "is-compare": true,
174
182
  disabled: true,
175
183
  "label-width": __props.labelWidth,
176
- "extend-state": __props.extendState,
177
- "show-diff": showDiff
184
+ "extend-state": mergedExtendState,
185
+ "show-diff": showDiff,
186
+ "self-diff-field-types": __props.selfDiffFieldTypes
178
187
  }, null, 8, [
179
188
  "config",
180
189
  "init-values",
181
190
  "last-values",
182
191
  "label-width",
183
- "extend-state"
192
+ "self-diff-field-types"
184
193
  ])) : createCommentVNode("v-if", true)], 4);
185
194
  };
186
195
  }
@@ -230,7 +230,7 @@ var DataSourceInput_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
230
230
  onSelect: selectHandler
231
231
  }), {
232
232
  suffix: withCtx(() => [createVNode(Icon_default, { icon: unref(Coin) }, null, 8, ["icon"])]),
233
- default: withCtx(({ item }) => [createElementVNode("div", _hoisted_1, [createElementVNode("div", null, toDisplayString(item.text), 1), createElementVNode("span", _hoisted_2, toDisplayString(item.value), 1)])]),
233
+ default: withCtx((slotProps) => [createElementVNode("div", _hoisted_1, [createElementVNode("div", null, toDisplayString(slotProps?.item?.text || ""), 1), createElementVNode("span", _hoisted_2, toDisplayString(slotProps?.item?.value || ""), 1)])]),
234
234
  _: 1
235
235
  }, 16, ["modelValue"])) : (openBlock(), createElementBlock("div", {
236
236
  key: 2,
package/dist/es/index.js CHANGED
@@ -52,9 +52,11 @@ import DataSourceConfigPanel_default from "./layouts/sidebar/data-source/DataSou
52
52
  import LayerPanel_default from "./layouts/sidebar/layer/LayerPanel.js";
53
53
  import ComponentListPanel_default from "./layouts/sidebar/ComponentListPanel.js";
54
54
  import codeBlock_default from "./services/codeBlock.js";
55
+ import componentList_default from "./services/componentList.js";
55
56
  import dataSource_default from "./services/dataSource.js";
56
57
  import dep_default from "./services/dep.js";
57
58
  import events_default from "./services/events.js";
59
+ import keybinding_default from "./services/keybinding.js";
58
60
  import stageOverlay_default from "./services/stageOverlay.js";
59
61
  import Editor_default from "./Editor.js";
60
62
  import CodeSelect_default from "./fields/CodeSelect.js";
@@ -85,4 +87,4 @@ export * from "@tmagic/table";
85
87
  export * from "@tmagic/stage";
86
88
  export * from "@tmagic/design";
87
89
  export * from "@tmagic/utils";
88
- export { 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, 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, 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, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectRelatedNodes, 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, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isIncludeDataSource, isIndexedDBSupported, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, numberOptions, openIndexedDB, props_default as propsService, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
90
+ export { 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, 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, 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, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, 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, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isIncludeDataSource, isIndexedDBSupported, keybinding_default as keybindingService, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, numberOptions, openIndexedDB, props_default as propsService, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
@@ -31,7 +31,8 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
31
31
  width: { default: "900px" },
32
32
  isConfirm: { type: Boolean },
33
33
  onConfirm: {},
34
- selfDiffFieldTypes: {}
34
+ selfDiffFieldTypes: {},
35
+ compareFormState: {}
35
36
  },
36
37
  emits: ["close"],
37
38
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -236,6 +237,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
236
237
  "data-source-type": payload.value.dataSourceType,
237
238
  value: rightValue.value,
238
239
  "last-value": leftValue.value,
240
+ "base-form-state": __props.compareFormState,
239
241
  "extend-state": __props.extendState,
240
242
  "load-config": __props.loadConfig,
241
243
  "self-diff-field-types": __props.selfDiffFieldTypes,
@@ -247,6 +249,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
247
249
  "data-source-type",
248
250
  "value",
249
251
  "last-value",
252
+ "base-form-state",
250
253
  "extend-state",
251
254
  "load-config",
252
255
  "self-diff-field-types",
@@ -68,6 +68,7 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
68
68
  * 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
69
69
  */
70
70
  const extendFormState = inject("extendFormState", void 0);
71
+ const getPropsPanelFormState = inject("getPropsPanelFormState", void 0);
71
72
  const { expanded, toggleGroup, pageGroups, dataSourceGroups, codeBlockGroups, pageGroupsDisplay, dataSourceGroupsByTarget, codeBlockGroupsByTarget } = useHistoryList();
72
73
  /**
73
74
  * 当前活动页的「加载/初始」标记记录(设置 root 时生成),透传给 PageTab 的底部初始行展示。
@@ -151,7 +152,10 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
151
152
  * 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
152
153
  * 业务方亦可直接 import useHistoryRevert(services) 调用,无需自行挂载任何弹窗。
153
154
  */
154
- const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert(services, { extendState: extendFormState });
155
+ const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert(services, {
156
+ extendState: extendFormState,
157
+ getPropsPanelFormState
158
+ });
155
159
  /**
156
160
  * 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,
157
161
  * 使本地持久化的那份与内存保持一致——即「连同本地保存的一并删除」。
@@ -227,7 +231,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
227
231
  default: withCtx(() => [
228
232
  (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(guardReactiveProps(unref(tabPaneComponent)?.props({
229
233
  name: "page",
230
- label: `${pageName.value} (${unref(pageGroups).length})`
234
+ label: `${pageName.value} (${unref(pageGroups).length})`,
235
+ lazy: true
231
236
  }) || {})), {
232
237
  default: withCtx(() => [createVNode(PageTab_default, {
233
238
  list: unref(pageGroupsDisplay),
@@ -252,7 +257,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
252
257
  }, 16)),
253
258
  !disabledDataSource.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 0 }, unref(tabPaneComponent)?.props({
254
259
  name: "data-source",
255
- label: `${dataSourceName.value} (${unref(dataSourceGroups).length})`
260
+ label: `${dataSourceName.value} (${unref(dataSourceGroups).length})`,
261
+ lazy: true
256
262
  }) || {})), {
257
263
  default: withCtx(() => [createVNode(BucketTab_default, {
258
264
  config: dataSourceConfig.value,
@@ -276,7 +282,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
276
282
  }, 16)) : createCommentVNode("v-if", true),
277
283
  !disabledCodeBlock.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 1 }, unref(tabPaneComponent)?.props({
278
284
  name: "code-block",
279
- label: `${codeBlockName.value} (${unref(codeBlockGroups).length})`
285
+ label: `${codeBlockName.value} (${unref(codeBlockGroups).length})`,
286
+ lazy: true
280
287
  }) || {})), {
281
288
  default: withCtx(() => [createVNode(BucketTab_default, {
282
289
  config: codeBlockConfig.value,
@@ -301,7 +308,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
301
308
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(extraTabs), (tab) => {
302
309
  return openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), mergeProps({ key: tab.name }, { ref_for: true }, unref(tabPaneComponent)?.props({
303
310
  name: tab.name,
304
- label: resolveTabLabel(tab)
311
+ label: resolveTabLabel(tab),
312
+ lazy: true
305
313
  }) || {}), {
306
314
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tab.component), mergeProps({ ref_for: true }, tab.props || {}, toHandlers(tab.listeners || {})), null, 16))]),
307
315
  _: 2
@@ -46,6 +46,7 @@ var mountHistoryDiffDialog = async (options) => {
46
46
  extendState: options.extendState,
47
47
  loadConfig: options.loadConfig,
48
48
  selfDiffFieldTypes: options.selfDiffFieldTypes,
49
+ compareFormState: options.compareFormState,
49
50
  onClose: options.onClose
50
51
  });
51
52
  if (options.appContext) Object.assign(app._context, options.appContext);
@@ -59,6 +60,7 @@ var mountHistoryDiffDialog = async (options) => {
59
60
  }, 300);
60
61
  };
61
62
  return {
63
+ app,
62
64
  instance,
63
65
  destroy
64
66
  };
@@ -124,7 +126,7 @@ var viewHistoryDiffDialog = async (payload, options) => {
124
126
  var useHistoryRevert = (services, options = {}) => {
125
127
  const { editorService, dataSourceService, codeBlockService, historyService } = services;
126
128
  const appContext = options.appContext ?? getCurrentInstance()?.appContext ?? null;
127
- const { extendState } = options;
129
+ const { extendState, getPropsPanelFormState } = options;
128
130
  /** 目标数据已被删除、无法回滚时的统一提示。 */
129
131
  const showRevertTargetMissing = () => {
130
132
  tMagicMessage.error("回滚失败:该记录对应的数据已被删除");
@@ -200,7 +202,7 @@ var useHistoryRevert = (services, options = {}) => {
200
202
  showRevertTargetMissing();
201
203
  return Promise.resolve(null);
202
204
  }
203
- return runRevert(buildPageDiffPayload(index)).then((result) => result ? editorService.revertPageStep(index) : null);
205
+ return runRevert(buildPageDiffPayload(index), { compareFormState: getPropsPanelFormState?.() }).then((result) => result ? editorService.revertPageStep(index) : null);
204
206
  };
205
207
  const onDataSourceRevert = (id, index) => {
206
208
  if (isDataSourceRevertTargetMissing(id, index)) {
@@ -225,7 +227,8 @@ var useHistoryRevert = (services, options = {}) => {
225
227
  if (payload) return viewHistoryDiffDialog(payload, {
226
228
  appContext,
227
229
  extendState,
228
- services
230
+ services,
231
+ compareFormState: getPropsPanelFormState?.()
229
232
  });
230
233
  };
231
234
  const onDataSourceDiff = (id, index) => {
package/dist/es/style.css CHANGED
@@ -462,6 +462,7 @@ fieldset.m-fieldset .m-form-tip {
462
462
  display: flex;
463
463
  justify-content: space-between;
464
464
  margin-top: 10px;
465
+ margin-bottom: 16px;
465
466
  }
466
467
 
467
468
  .m-form-panel .el-card__header:hover {
package/dist/style.css CHANGED
@@ -462,6 +462,7 @@ fieldset.m-fieldset .m-form-tip {
462
462
  display: flex;
463
463
  justify-content: space-between;
464
464
  margin-top: 10px;
465
+ margin-bottom: 16px;
465
466
  }
466
467
 
467
468
  .m-form-panel .el-card__header:hover {
@@ -110,6 +110,25 @@
110
110
  margin-bottom: 8px;
111
111
  }
112
112
 
113
+ .tmagic-design-form-item.has-extra-tips > .el-form-item__content {
114
+ gap: 10px;
115
+ }
116
+ .tmagic-design-form-item.has-extra-tips > .el-form-item__content > .tmagic-design-alert {
117
+ border-radius: 2px;
118
+ width: fit-content;
119
+ padding: 0 8px;
120
+ color: var(--el-color-primary, #0056ea);
121
+ background-color: var(--el-color-primary-light-9, rgb(236, 245, 255));
122
+ }
123
+ .tmagic-design-form-item.has-extra-tips > .el-form-item__content > .tmagic-design-alert .el-icon.el-alert__icon {
124
+ fill: var(--el-color-primary, #0056ea);
125
+ color: var(--el-color-primary, #0056ea);
126
+ }
127
+ .tmagic-design-form-item.has-extra-tips > .el-form-item__content > .tmagic-design-alert .el-alert__title {
128
+ font-size: 14px;
129
+ line-height: 22px;
130
+ }
131
+
113
132
  .m-table .el-button.action-btn + .el-button.action-btn {
114
133
  margin-left: 0;
115
134
  }
@@ -423,6 +442,7 @@ fieldset.m-fieldset .m-form-tip {
423
442
  display: flex;
424
443
  justify-content: space-between;
425
444
  margin-top: 10px;
445
+ margin-bottom: 16px;
426
446
  }
427
447
 
428
448
  .m-form-panel .el-card__header:hover {
@@ -11255,7 +11255,12 @@
11255
11255
  dataSourceType: {},
11256
11256
  labelWidth: { default: "120px" },
11257
11257
  height: {},
11258
- extendState: {},
11258
+ extendState: {
11259
+ type: Function,
11260
+ default: (state) => state
11261
+ },
11262
+ baseFormState: {},
11263
+ selfDiffFieldTypes: {},
11259
11264
  loadConfig: {},
11260
11265
  services: { default: () => useServices() }
11261
11266
  },
@@ -11333,6 +11338,9 @@
11333
11338
  })
11334
11339
  };
11335
11340
  });
11341
+ const mergedExtendState = (state) => {
11342
+ return props.extendState(props.baseFormState || state);
11343
+ };
11336
11344
  /**
11337
11345
  * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
11338
11346
  * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
@@ -11412,14 +11420,15 @@
11412
11420
  "is-compare": true,
11413
11421
  disabled: true,
11414
11422
  "label-width": __props.labelWidth,
11415
- "extend-state": __props.extendState,
11416
- "show-diff": showDiff
11423
+ "extend-state": mergedExtendState,
11424
+ "show-diff": showDiff,
11425
+ "self-diff-field-types": __props.selfDiffFieldTypes
11417
11426
  }, null, 8, [
11418
11427
  "config",
11419
11428
  "init-values",
11420
11429
  "last-values",
11421
11430
  "label-width",
11422
- "extend-state"
11431
+ "self-diff-field-types"
11423
11432
  ])) : (0, vue.createCommentVNode)("v-if", true)], 4);
11424
11433
  };
11425
11434
  }
@@ -11467,7 +11476,8 @@
11467
11476
  width: { default: "900px" },
11468
11477
  isConfirm: { type: Boolean },
11469
11478
  onConfirm: {},
11470
- selfDiffFieldTypes: {}
11479
+ selfDiffFieldTypes: {},
11480
+ compareFormState: {}
11471
11481
  },
11472
11482
  emits: ["close"],
11473
11483
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -11672,6 +11682,7 @@
11672
11682
  "data-source-type": payload.value.dataSourceType,
11673
11683
  value: rightValue.value,
11674
11684
  "last-value": leftValue.value,
11685
+ "base-form-state": __props.compareFormState,
11675
11686
  "extend-state": __props.extendState,
11676
11687
  "load-config": __props.loadConfig,
11677
11688
  "self-diff-field-types": __props.selfDiffFieldTypes,
@@ -11683,6 +11694,7 @@
11683
11694
  "data-source-type",
11684
11695
  "value",
11685
11696
  "last-value",
11697
+ "base-form-state",
11686
11698
  "extend-state",
11687
11699
  "load-config",
11688
11700
  "self-diff-field-types",
@@ -11763,6 +11775,7 @@
11763
11775
  extendState: options.extendState,
11764
11776
  loadConfig: options.loadConfig,
11765
11777
  selfDiffFieldTypes: options.selfDiffFieldTypes,
11778
+ compareFormState: options.compareFormState,
11766
11779
  onClose: options.onClose
11767
11780
  });
11768
11781
  if (options.appContext) Object.assign(app._context, options.appContext);
@@ -11776,6 +11789,7 @@
11776
11789
  }, 300);
11777
11790
  };
11778
11791
  return {
11792
+ app,
11779
11793
  instance,
11780
11794
  destroy
11781
11795
  };
@@ -11841,7 +11855,7 @@
11841
11855
  var useHistoryRevert = (services, options = {}) => {
11842
11856
  const { editorService, dataSourceService, codeBlockService, historyService } = services;
11843
11857
  const appContext = options.appContext ?? (0, vue.getCurrentInstance)()?.appContext ?? null;
11844
- const { extendState } = options;
11858
+ const { extendState, getPropsPanelFormState } = options;
11845
11859
  /** 目标数据已被删除、无法回滚时的统一提示。 */
11846
11860
  const showRevertTargetMissing = () => {
11847
11861
  _tmagic_design.tMagicMessage.error("回滚失败:该记录对应的数据已被删除");
@@ -11917,7 +11931,7 @@
11917
11931
  showRevertTargetMissing();
11918
11932
  return Promise.resolve(null);
11919
11933
  }
11920
- return runRevert(buildPageDiffPayload(index)).then((result) => result ? editorService.revertPageStep(index) : null);
11934
+ return runRevert(buildPageDiffPayload(index), { compareFormState: getPropsPanelFormState?.() }).then((result) => result ? editorService.revertPageStep(index) : null);
11921
11935
  };
11922
11936
  const onDataSourceRevert = (id, index) => {
11923
11937
  if (isDataSourceRevertTargetMissing(id, index)) {
@@ -11942,7 +11956,8 @@
11942
11956
  if (payload) return viewHistoryDiffDialog(payload, {
11943
11957
  appContext,
11944
11958
  extendState,
11945
- services
11959
+ services,
11960
+ compareFormState: getPropsPanelFormState?.()
11946
11961
  });
11947
11962
  };
11948
11963
  const onDataSourceDiff = (id, index) => {
@@ -12080,6 +12095,7 @@
12080
12095
  * 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
12081
12096
  */
12082
12097
  const extendFormState = (0, vue.inject)("extendFormState", void 0);
12098
+ const getPropsPanelFormState = (0, vue.inject)("getPropsPanelFormState", void 0);
12083
12099
  const { expanded, toggleGroup, pageGroups, dataSourceGroups, codeBlockGroups, pageGroupsDisplay, dataSourceGroupsByTarget, codeBlockGroupsByTarget } = useHistoryList();
12084
12100
  /**
12085
12101
  * 当前活动页的「加载/初始」标记记录(设置 root 时生成),透传给 PageTab 的底部初始行展示。
@@ -12163,7 +12179,10 @@
12163
12179
  * 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
12164
12180
  * 业务方亦可直接 import useHistoryRevert(services) 调用,无需自行挂载任何弹窗。
12165
12181
  */
12166
- const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert(services, { extendState: extendFormState });
12182
+ const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert(services, {
12183
+ extendState: extendFormState,
12184
+ getPropsPanelFormState
12185
+ });
12167
12186
  /**
12168
12187
  * 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,
12169
12188
  * 使本地持久化的那份与内存保持一致——即「连同本地保存的一并删除」。
@@ -12239,7 +12258,8 @@
12239
12258
  default: (0, vue.withCtx)(() => [
12240
12259
  ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(tabPaneComponent)?.component || "el-tab-pane"), (0, vue.normalizeProps)((0, vue.guardReactiveProps)((0, vue.unref)(tabPaneComponent)?.props({
12241
12260
  name: "page",
12242
- label: `${pageName.value} (${(0, vue.unref)(pageGroups).length})`
12261
+ label: `${pageName.value} (${(0, vue.unref)(pageGroups).length})`,
12262
+ lazy: true
12243
12263
  }) || {})), {
12244
12264
  default: (0, vue.withCtx)(() => [(0, vue.createVNode)(PageTab_default, {
12245
12265
  list: (0, vue.unref)(pageGroupsDisplay),
@@ -12264,7 +12284,8 @@
12264
12284
  }, 16)),
12265
12285
  !disabledDataSource.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(tabPaneComponent)?.component || "el-tab-pane"), (0, vue.normalizeProps)((0, vue.mergeProps)({ key: 0 }, (0, vue.unref)(tabPaneComponent)?.props({
12266
12286
  name: "data-source",
12267
- label: `${dataSourceName.value} (${(0, vue.unref)(dataSourceGroups).length})`
12287
+ label: `${dataSourceName.value} (${(0, vue.unref)(dataSourceGroups).length})`,
12288
+ lazy: true
12268
12289
  }) || {})), {
12269
12290
  default: (0, vue.withCtx)(() => [(0, vue.createVNode)(BucketTab_default, {
12270
12291
  config: dataSourceConfig.value,
@@ -12288,7 +12309,8 @@
12288
12309
  }, 16)) : (0, vue.createCommentVNode)("v-if", true),
12289
12310
  !disabledCodeBlock.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(tabPaneComponent)?.component || "el-tab-pane"), (0, vue.normalizeProps)((0, vue.mergeProps)({ key: 1 }, (0, vue.unref)(tabPaneComponent)?.props({
12290
12311
  name: "code-block",
12291
- label: `${codeBlockName.value} (${(0, vue.unref)(codeBlockGroups).length})`
12312
+ label: `${codeBlockName.value} (${(0, vue.unref)(codeBlockGroups).length})`,
12313
+ lazy: true
12292
12314
  }) || {})), {
12293
12315
  default: (0, vue.withCtx)(() => [(0, vue.createVNode)(BucketTab_default, {
12294
12316
  config: codeBlockConfig.value,
@@ -12313,7 +12335,8 @@
12313
12335
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)((0, vue.unref)(extraTabs), (tab) => {
12314
12336
  return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(tabPaneComponent)?.component || "el-tab-pane"), (0, vue.mergeProps)({ key: tab.name }, { ref_for: true }, (0, vue.unref)(tabPaneComponent)?.props({
12315
12337
  name: tab.name,
12316
- label: resolveTabLabel(tab)
12338
+ label: resolveTabLabel(tab),
12339
+ lazy: true
12317
12340
  }) || {}), {
12318
12341
  default: (0, vue.withCtx)(() => [((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)(tab.component), (0, vue.mergeProps)({ ref_for: true }, tab.props || {}, (0, vue.toHandlers)(tab.listeners || {})), null, 16))]),
12319
12342
  _: 2
@@ -18993,6 +19016,7 @@
18993
19016
  beforeDblclick: props.beforeDblclick
18994
19017
  };
18995
19018
  stageOverlay_default.set("stageOptions", stageOptions);
19019
+ const propsPanelRef = (0, vue.ref)(null);
18996
19020
  (0, vue.provide)("services", services);
18997
19021
  (0, vue.provide)("codeOptions", props.codeOptions);
18998
19022
  (0, vue.provide)("stageOptions", stageOptions);
@@ -19003,6 +19027,11 @@
19003
19027
  */
19004
19028
  (0, vue.provide)("extendFormState", props.extendFormState);
19005
19029
  /**
19030
+ * 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
19031
+ * 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
19032
+ */
19033
+ (0, vue.provide)("getPropsPanelFormState", () => propsPanelRef.value?.configForm?.formState);
19034
+ /**
19006
19035
  * 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
19007
19036
  * 以 markRaw component 形式渲染,无法直接通过 props 透传)。业务方可借此在历史记录
19008
19037
  * 面板内追加自定义模块的历史 tab。
@@ -19016,9 +19045,11 @@
19016
19045
  */
19017
19046
  (0, vue.provide)(_tmagic_design.M_THEME_KEY, (0, vue.computed)(() => props.theme ?? ""));
19018
19047
  const propsPanelMountedHandler = (e) => {
19048
+ propsPanelRef.value = e;
19019
19049
  emit("props-panel-mounted", e);
19020
19050
  };
19021
19051
  const propsPanelUnmountedHandler = () => {
19052
+ propsPanelRef.value = null;
19022
19053
  emit("props-panel-unmounted");
19023
19054
  };
19024
19055
  const propsPanelSubmitErrorHandler = (e) => {
@@ -20613,7 +20644,7 @@
20613
20644
  onSelect: selectHandler
20614
20645
  }), {
20615
20646
  suffix: (0, vue.withCtx)(() => [(0, vue.createVNode)(Icon_default, { icon: (0, vue.unref)(_element_plus_icons_vue.Coin) }, null, 8, ["icon"])]),
20616
- default: (0, vue.withCtx)(({ item }) => [(0, vue.createElementVNode)("div", _hoisted_1$38, [(0, vue.createElementVNode)("div", null, (0, vue.toDisplayString)(item.text), 1), (0, vue.createElementVNode)("span", _hoisted_2$7, (0, vue.toDisplayString)(item.value), 1)])]),
20647
+ default: (0, vue.withCtx)((slotProps) => [(0, vue.createElementVNode)("div", _hoisted_1$38, [(0, vue.createElementVNode)("div", null, (0, vue.toDisplayString)(slotProps?.item?.text || ""), 1), (0, vue.createElementVNode)("span", _hoisted_2$7, (0, vue.toDisplayString)(slotProps?.item?.value || ""), 1)])]),
20617
20648
  _: 1
20618
20649
  }, 16, ["modelValue"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
20619
20650
  key: 2,
@@ -24482,6 +24513,7 @@
24482
24513
  exports.classifyDragSources = classifyDragSources;
24483
24514
  exports.codeBlockService = codeBlock_default;
24484
24515
  exports.collectRelatedNodes = collectRelatedNodes;
24516
+ exports.componentListService = componentList_default;
24485
24517
  exports.confirmHistoryAction = confirmHistoryAction;
24486
24518
  exports.createStackStep = createStackStep;
24487
24519
  exports.dataSourceService = dataSource_default;
@@ -24545,6 +24577,7 @@
24545
24577
  exports.info = info;
24546
24578
  exports.isIncludeDataSource = isIncludeDataSource;
24547
24579
  exports.isIndexedDBSupported = isIndexedDBSupported;
24580
+ exports.keybindingService = keybinding_default;
24548
24581
  exports.loadMonaco = monaco_editor_default;
24549
24582
  exports.log = log;
24550
24583
  exports.markStackSaved = markStackSaved;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.8.0-manmanyu.10",
2
+ "version": "1.8.0-manmanyu.11",
3
3
  "name": "@tmagic/editor",
4
4
  "type": "module",
5
5
  "sideEffects": [
@@ -58,11 +58,11 @@
58
58
  "moveable": "^0.53.0",
59
59
  "serialize-javascript": "^7.0.0",
60
60
  "sortablejs": "^1.15.6",
61
- "@tmagic/design": "1.8.0-manmanyu.10",
62
- "@tmagic/stage": "1.8.0-manmanyu.10",
63
- "@tmagic/table": "1.8.0-manmanyu.10",
64
- "@tmagic/utils": "1.8.0-manmanyu.10",
65
- "@tmagic/form": "1.8.0-manmanyu.10"
61
+ "@tmagic/design": "1.8.0-manmanyu.11",
62
+ "@tmagic/form": "1.8.0-manmanyu.11",
63
+ "@tmagic/stage": "1.8.0-manmanyu.11",
64
+ "@tmagic/utils": "1.8.0-manmanyu.11",
65
+ "@tmagic/table": "1.8.0-manmanyu.11"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/events": "^3.0.3",
@@ -76,7 +76,7 @@
76
76
  "type-fest": "^5.2.0",
77
77
  "typescript": "^6.0.3",
78
78
  "vue": "^3.5.38",
79
- "@tmagic/core": "1.8.0-manmanyu.10"
79
+ "@tmagic/core": "1.8.0-manmanyu.11"
80
80
  },
81
81
  "peerDependenciesMeta": {
82
82
  "typescript": {
package/src/Editor.vue CHANGED
@@ -136,7 +136,7 @@
136
136
  <script lang="ts" setup>
137
137
  import { EventEmitter } from 'events';
138
138
 
139
- import { computed, provide } from 'vue';
139
+ import { computed, provide, ref } from 'vue';
140
140
 
141
141
  import type { MApp } from '@tmagic/core';
142
142
  import { M_THEME_KEY } from '@tmagic/design';
@@ -229,6 +229,8 @@ const stageOptions: StageOptions = {
229
229
 
230
230
  stageOverlayService.set('stageOptions', stageOptions);
231
231
 
232
+ const propsPanelRef = ref<InstanceType<typeof FormPanel> | null>(null);
233
+
232
234
  provide('services', services);
233
235
 
234
236
  provide('codeOptions', props.codeOptions);
@@ -239,6 +241,11 @@ provide('stageOptions', stageOptions);
239
241
  * 与 PropsPanel 通过 `:extend-state` 显式传入的方式保持等价。
240
242
  */
241
243
  provide('extendFormState', props.extendFormState);
244
+ /**
245
+ * 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
246
+ * 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
247
+ */
248
+ provide('getPropsPanelFormState', () => propsPanelRef.value?.configForm?.formState);
242
249
 
243
250
  /**
244
251
  * 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
@@ -260,9 +267,11 @@ provide(
260
267
  );
261
268
 
262
269
  const propsPanelMountedHandler = (e: InstanceType<typeof FormPanel>) => {
270
+ propsPanelRef.value = e;
263
271
  emit('props-panel-mounted', e);
264
272
  };
265
273
  const propsPanelUnmountedHandler = () => {
274
+ propsPanelRef.value = null;
266
275
  emit('props-panel-unmounted');
267
276
  };
268
277
 
@@ -10,8 +10,9 @@
10
10
  :is-compare="true"
11
11
  :disabled="true"
12
12
  :label-width="labelWidth"
13
- :extend-state="extendState"
13
+ :extend-state="mergedExtendState"
14
14
  :show-diff="showDiff"
15
+ :self-diff-field-types="selfDiffFieldTypes"
15
16
  ></MForm>
16
17
  </div>
17
18
  </template>
@@ -61,6 +62,13 @@ const props = withDefaults(
61
62
  * 因此在差异对比场景下也需要透传,避免出现 `formState.xxx is undefined` 的运行时错误。
62
63
  */
63
64
  extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
65
+ /**
66
+ * 外部透传的基础 formState(通常来自 PropsPanel 主属性表单)。
67
+ * CompareForm 会提取其中的扩展字段覆盖到自己的 formState,保证 filterFunction 上下文一致。
68
+ */
69
+ baseFormState?: FormState;
70
+ /** 需要走 self diff 的字段类型(例如 mod-cond)。 */
71
+ selfDiffFieldTypes?: string[];
64
72
  /**
65
73
  * 自定义 FormConfig 加载逻辑。传入后将接管内置的按 `category`(node/data-source/code-block)
66
74
  * 取配置逻辑,调用方可根据业务自行返回(或异步返回)表单配置。可通过
@@ -74,6 +82,7 @@ const props = withDefaults(
74
82
  category: 'node',
75
83
  labelWidth: '120px',
76
84
  services: () => useServices(),
85
+ extendState: (state: FormState) => state,
77
86
  },
78
87
  );
79
88
 
@@ -174,6 +183,10 @@ const removeStyleDisplayConfig = (formConfig: FormConfig): FormConfig =>
174
183
  };
175
184
  });
176
185
 
186
+ const mergedExtendState = (state: FormState) => {
187
+ return props.extendState(props.baseFormState || state);
188
+ };
189
+
177
190
  /**
178
191
  * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
179
192
  * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。