@tmagic/editor 1.8.0-manmanyu.8 → 1.8.0

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.
Files changed (281) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +22 -13
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +10 -5
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -6
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +21 -119
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +21 -5
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +62 -16
  7. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  8. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +3 -2
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +5 -4
  11. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
  13. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
  14. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +1 -1
  15. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/es/components/ViewForm.js +5 -0
  18. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +56 -0
  19. package/dist/es/editorProps.js +7 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +1 -1
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +30 -113
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
  25. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +7 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +4 -2
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +12 -4
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +9 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +2 -2
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +5 -3
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +9 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +10 -110
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +52 -363
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +3 -6
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +4 -35
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +3 -3
  41. package/dist/es/fields/StyleSetter/configs.js +663 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +1 -1
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +1 -1
  44. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +1 -1
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +1 -1
  46. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +1 -1
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +1 -1
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
  50. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +1 -1
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
  59. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
  60. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
  62. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
  64. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  67. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  68. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +29 -106
  69. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +8 -11
  70. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +30 -89
  71. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +29 -297
  72. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -82
  73. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +8 -24
  74. package/dist/es/fields/UISelect.js +0 -1
  75. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +1 -1
  76. package/dist/es/fields/configs/codeSelect.js +98 -0
  77. package/dist/es/fields/configs/displayConds.js +158 -0
  78. package/dist/es/fields/configs/eventSelect.js +225 -0
  79. package/dist/es/fields/configs/stickyAddButton.js +21 -0
  80. package/dist/es/fields/headless-validation.js +139 -0
  81. package/dist/es/headless.js +2 -0
  82. package/dist/es/hooks/use-code-block-edit.js +4 -2
  83. package/dist/es/hooks/use-compare-form.js +101 -0
  84. package/dist/es/hooks/use-form-context.js +29 -0
  85. package/dist/es/hooks/use-stage.js +1 -0
  86. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  87. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  88. package/dist/es/icons/DatasourceIcon.js +1 -1
  89. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/index.js +17 -9
  91. package/dist/es/initService.js +52 -16
  92. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  93. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +26 -10
  94. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +11 -8
  95. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  96. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  97. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +8 -5
  99. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +26 -10
  101. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +36 -28
  102. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +1 -1
  103. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/history-list/composables.js +1 -1
  105. package/dist/es/layouts/history-list/useHistoryList.js +4 -4
  106. package/dist/es/layouts/history-list/useHistoryRevert.js +38 -33
  107. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  108. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +1 -1
  109. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  111. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  112. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -20
  113. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +53 -35
  114. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  115. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  116. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +21 -36
  117. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +1 -1
  118. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  119. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  120. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  121. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +9 -4
  122. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  123. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  124. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  125. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  126. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  127. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  128. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
  129. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +6 -4
  130. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  131. package/dist/es/layouts/sidebar/layer/use-drag.js +11 -10
  132. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  133. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  134. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  135. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  136. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +55 -9
  137. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  138. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  139. package/dist/es/plugin.js +35 -23
  140. package/dist/es/services/codeBlock.js +40 -31
  141. package/dist/es/services/dataSource.js +46 -34
  142. package/dist/es/services/dep.js +162 -41
  143. package/dist/es/services/editor.js +373 -137
  144. package/dist/es/services/events.js +4 -4
  145. package/dist/es/services/history.js +275 -392
  146. package/dist/es/services/keybinding.js +3 -3
  147. package/dist/es/services/props.js +2 -1
  148. package/dist/es/services/storage.js +2 -2
  149. package/dist/es/services/ui.js +7 -2
  150. package/dist/es/style.css +277 -114
  151. package/dist/es/utils/code-block.js +14 -7
  152. package/dist/es/utils/config.js +4 -1
  153. package/dist/es/utils/const.js +2 -2
  154. package/dist/es/utils/content-menu.js +2 -2
  155. package/dist/es/utils/data-source/index.js +34 -12
  156. package/dist/es/utils/dep/collect-worker-client.js +154 -0
  157. package/dist/es/utils/dep/idle-task.js +70 -22
  158. package/dist/es/utils/dep/worker.js +1 -1
  159. package/dist/es/utils/editor.js +4 -2
  160. package/dist/es/utils/event.js +135 -0
  161. package/dist/es/utils/history.js +35 -47
  162. package/dist/es/utils/monaco-editor.js +22 -6
  163. package/dist/es/utils/operator.js +2 -2
  164. package/dist/es/utils/props.js +50 -106
  165. package/dist/es/utils/type-match-rules.js +356 -0
  166. package/dist/style.css +277 -114
  167. package/dist/themes/magic-admin.css +978 -175
  168. package/dist/tmagic-editor-headless.umd.cjs +10880 -0
  169. package/dist/tmagic-editor.umd.cjs +13047 -11363
  170. package/package.json +18 -13
  171. package/src/Editor.vue +23 -6
  172. package/src/components/CodeBlockEditor.vue +3 -0
  173. package/src/components/CodeParams.vue +10 -4
  174. package/src/components/CompareForm.vue +20 -190
  175. package/src/components/ContentMenu.vue +34 -6
  176. package/src/components/FloatingBox.vue +71 -7
  177. package/src/components/ScrollBar.vue +0 -67
  178. package/src/components/ViewForm.vue +54 -0
  179. package/src/editorProps.ts +23 -10
  180. package/src/fields/Code.vue +1 -1
  181. package/src/fields/CodeSelect.vue +20 -113
  182. package/src/fields/CodeSelectCol.vue +1 -1
  183. package/src/fields/CondOpSelect.vue +5 -26
  184. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +2 -2
  185. package/src/fields/DataSourceFieldSelect/Index.vue +4 -1
  186. package/src/fields/DataSourceFields.vue +5 -1
  187. package/src/fields/DataSourceInput.vue +10 -28
  188. package/src/fields/DataSourceMethodSelect.vue +1 -1
  189. package/src/fields/DataSourceMethods.vue +6 -2
  190. package/src/fields/DataSourceMocks.vue +3 -0
  191. package/src/fields/DataSourceSelect.vue +1 -1
  192. package/src/fields/DisplayConds.vue +17 -139
  193. package/src/fields/EventSelect.vue +29 -416
  194. package/src/fields/KeyValue.vue +1 -1
  195. package/src/fields/StyleSetter/Index.vue +2 -8
  196. package/src/fields/StyleSetter/components/Border.vue +4 -38
  197. package/src/fields/StyleSetter/components/Box.vue +1 -1
  198. package/src/fields/StyleSetter/components/Position.vue +1 -1
  199. package/src/fields/StyleSetter/configs.ts +690 -0
  200. package/src/fields/StyleSetter/pro/Background.vue +9 -64
  201. package/src/fields/StyleSetter/pro/Border.vue +5 -16
  202. package/src/fields/StyleSetter/pro/Font.vue +11 -71
  203. package/src/fields/StyleSetter/pro/Layout.vue +10 -230
  204. package/src/fields/StyleSetter/pro/Position.vue +11 -82
  205. package/src/fields/StyleSetter/pro/Transform.vue +6 -34
  206. package/src/fields/UISelect.vue +0 -12
  207. package/src/fields/configs/codeSelect.ts +127 -0
  208. package/src/fields/configs/displayConds.ts +184 -0
  209. package/src/fields/configs/eventSelect.ts +309 -0
  210. package/src/fields/configs/stickyAddButton.ts +32 -0
  211. package/src/fields/headless-validation.ts +177 -0
  212. package/src/headless.ts +33 -0
  213. package/src/hooks/index.ts +1 -0
  214. package/src/hooks/use-compare-form.ts +166 -0
  215. package/src/hooks/use-form-context.ts +56 -0
  216. package/src/hooks/use-stage.ts +1 -0
  217. package/src/index.ts +9 -0
  218. package/src/initService.ts +73 -18
  219. package/src/layouts/CodeEditor.vue +32 -6
  220. package/src/layouts/Framework.vue +7 -6
  221. package/src/layouts/history-list/BucketTab.vue +2 -2
  222. package/src/layouts/history-list/HistoryDiffDialog.vue +33 -15
  223. package/src/layouts/history-list/HistoryListPanel.vue +16 -18
  224. package/src/layouts/history-list/useHistoryRevert.ts +57 -41
  225. package/src/layouts/props-panel/FormPanel.vue +75 -20
  226. package/src/layouts/props-panel/PropsPanel.vue +81 -30
  227. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  228. package/src/layouts/sidebar/ComponentListPanel.vue +6 -2
  229. package/src/layouts/sidebar/Sidebar.vue +5 -3
  230. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  231. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  232. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
  233. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +3 -3
  234. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  235. package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
  236. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  237. package/src/layouts/sidebar/layer/LayerPanel.vue +5 -2
  238. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  239. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  240. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  241. package/src/layouts/workspace/viewer/Stage.vue +80 -10
  242. package/src/layouts/workspace/viewer/ViewerMenu.vue +7 -7
  243. package/src/plugin.ts +35 -25
  244. package/src/services/codeBlock.ts +4 -0
  245. package/src/services/dataSource.ts +3 -0
  246. package/src/services/dep.ts +292 -47
  247. package/src/services/editor.ts +383 -120
  248. package/src/services/events.ts +8 -7
  249. package/src/services/history.ts +22 -1
  250. package/src/services/keybinding.ts +3 -3
  251. package/src/services/ui.ts +26 -5
  252. package/src/theme/code-block.scss +0 -37
  253. package/src/theme/display-conds.scss +4 -0
  254. package/src/theme/event.scss +25 -33
  255. package/src/theme/floating-box.scss +9 -1
  256. package/src/theme/framework.scss +4 -1
  257. package/src/theme/layer-node-content.scss +14 -0
  258. package/src/theme/nav-menu.scss +5 -1
  259. package/src/theme/props-panel.scss +17 -3
  260. package/src/theme/scroll-bar.scss +64 -0
  261. package/src/theme/theme.scss +3 -0
  262. package/src/theme/themes/magic-admin/index.scss +109 -9
  263. package/src/theme/ui-select.scss +9 -0
  264. package/src/type.ts +216 -6
  265. package/src/utils/code-block.ts +1 -0
  266. package/src/utils/config.ts +9 -1
  267. package/src/utils/const.ts +3 -3
  268. package/src/utils/content-menu.ts +2 -2
  269. package/src/utils/data-source/index.ts +31 -12
  270. package/src/utils/dep/collect-worker-client.ts +215 -0
  271. package/src/utils/dep/idle-task.ts +104 -35
  272. package/src/utils/dep/worker.ts +113 -9
  273. package/src/utils/event.ts +237 -0
  274. package/src/utils/index.ts +2 -0
  275. package/src/utils/monaco-editor.ts +27 -0
  276. package/src/utils/operator.ts +2 -2
  277. package/src/utils/props.ts +61 -122
  278. package/src/utils/type-match-rules.ts +697 -0
  279. package/types/headless.d.ts +17 -0
  280. package/types/index.d.ts +1494 -978
  281. package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
@@ -29,6 +29,7 @@ import { getDepNodeIds, getNodes, isPage, isValueIncludeDataSource } from '@tmag
29
29
 
30
30
  import PropsPanel from './layouts/PropsPanel.vue';
31
31
  import { isIncludeDataSource } from './utils/editor';
32
+ import { error as logError } from './utils/logger';
32
33
  import { EditorProps } from './editorProps';
33
34
  import { Services } from './type';
34
35
 
@@ -36,6 +37,19 @@ export declare type LooseRequired<T> = {
36
37
  [P in string & keyof T]: T[P];
37
38
  };
38
39
 
40
+ /**
41
+ * select 为异步串行执行,节点不可选中(如已从 DSL 中移除)时会抛错。
42
+ * 在 watch 回调中调用不能把拒绝抛回调用方,否则会变成 Vue 的「Unhandled error during execution of watcher callback」,
43
+ * 这里统一兜底成日志。
44
+ */
45
+ const selectNode = async (editorService: Services['editorService'], id: Id) => {
46
+ try {
47
+ await editorService.select(id);
48
+ } catch (e) {
49
+ logError(e);
50
+ }
51
+ };
52
+
39
53
  export const initServiceState = (
40
54
  props: EditorProps,
41
55
  {
@@ -193,9 +207,17 @@ export const initServiceState = (
193
207
  },
194
208
  );
195
209
 
210
+ // defaultSelected 可能早于 modelValue 到位(immediate 首次执行时 root 还是空的,或节点尚未出现在 DSL 中),
211
+ // 此时 select 会因为「获取不到组件信息」而抛错,交由 root-change 中的选中逻辑在 root 就绪后补上即可。
196
212
  watch(
197
213
  () => props.defaultSelected,
198
- (defaultSelected) => defaultSelected && editorService.select(defaultSelected),
214
+ (defaultSelected) => {
215
+ if (!defaultSelected || !editorService.getNodeById(defaultSelected)) {
216
+ return;
217
+ }
218
+
219
+ selectNode(editorService, defaultSelected);
220
+ },
199
221
  {
200
222
  immediate: true,
201
223
  },
@@ -232,6 +254,7 @@ export const initServiceState = (
232
254
  uiService.resetState();
233
255
  componentListService.resetState();
234
256
  codeBlockService.resetState();
257
+ eventsService.resetState();
235
258
  keybindingService.reset();
236
259
  depService.reset();
237
260
  });
@@ -333,11 +356,11 @@ export const initServiceEvents = (
333
356
  Promise.all(
334
357
  nodes.map((node) => {
335
358
  if (node.type === NodeType.ROOT) {
336
- return Promise.resolve();
359
+ return Promise.resolve(true);
337
360
  }
338
361
  return depService.collectIdle([node], { pageId: getPageIdByNode(node) }, deep, type);
339
362
  }),
340
- );
363
+ ).then((results) => results.every(Boolean));
341
364
 
342
365
  watch(
343
366
  () => editorService.get('stage'),
@@ -351,7 +374,7 @@ export const initServiceEvents = (
351
374
 
352
375
  if (!node) return;
353
376
 
354
- await collectIdle([node], true, DepTargetType.DATA_SOURCE);
377
+ if (!(await collectIdle([node], true, DepTargetType.DATA_SOURCE))) return;
355
378
  updateStageNode(node);
356
379
  });
357
380
  },
@@ -404,12 +427,26 @@ export const initServiceEvents = (
404
427
  });
405
428
  };
406
429
 
430
+ /**
431
+ * root 是否已经不是编辑器当前的 root。
432
+ *
433
+ * `editorService.set('root', v)` 是同步赋值后再派发 `root-change`,因此派发那一刻 `v` 一定
434
+ * 就是当前 root;但处理 `root-change` 要等 stage / runtime / 依赖收集等异步过程,期间 root
435
+ * 可能被新的一次整体替换(外部重设 DSL、更新 root 节点、源码保存等)顶掉,此时手上的 `v`
436
+ * 已是过期快照,继续用它刷画布或回写给外部都会与新 root 互相覆盖。
437
+ */
438
+ const isStaleRoot = (value: MApp | null) => toRaw(editorService.get('root')) !== toRaw(value);
439
+
407
440
  const updateStageDsl = async (value: MApp | null) => {
408
441
  const stage = await getStage();
409
442
 
410
443
  const runtime = await stage.renderer?.getRuntime();
411
444
  const app = await getTMagicApp();
412
445
 
446
+ // 等 stage / runtime 就绪期间 root 已被替换:新 root 的刷新可能已经完成,
447
+ // 再把旧 dsl 推给 runtime 会让画布回退到旧内容
448
+ if (isStaleRoot(value)) return;
449
+
413
450
  if (!app?.dataSourceManager) {
414
451
  runtime?.updateRootConfig?.(cloneDeep(toRaw(value))!);
415
452
  }
@@ -426,6 +463,8 @@ export const initServiceEvents = (
426
463
 
427
464
  await (typeof Worker === 'undefined' ? collectIdle(value.items, true) : depService.collectByWorker(value));
428
465
 
466
+ if (isStaleRoot(value)) return;
467
+
429
468
  const dsl = cloneDeep(toRaw(value));
430
469
  if (dsl.dataSources && dsl.dataSourceDeps && app?.dataSourceManager) {
431
470
  for (const node of getNodes(getDepNodeIds(dsl.dataSourceDeps), dsl.items)) {
@@ -443,7 +482,7 @@ export const initServiceEvents = (
443
482
  depService.addTarget(createDataSourceCondTarget(ds, reactive({})));
444
483
  };
445
484
 
446
- const rootChangeHandler = (value: MApp | null, preValue?: MApp | null) => {
485
+ const rootChangeHandler = (value: MApp | null) => {
447
486
  if (!value) return;
448
487
 
449
488
  value.codeBlocks = value.codeBlocks || {};
@@ -486,7 +525,13 @@ export const initServiceEvents = (
486
525
  editorService.set('page', null);
487
526
  }
488
527
 
489
- if (toRaw(value) !== toRaw(preValue)) {
528
+ // 上面的 select 是异步的,期间 root 可能已被替换,过期快照不能再回写给外部:
529
+ // 两次整体替换各自持有一个快照时,回写会把对方的 root 顶掉,外部 modelValue 变化又会
530
+ // 重新 set root,两条链路无休止地交替下去(表现为编辑器卡死)
531
+ if (isStaleRoot(value)) return;
532
+
533
+ // 外部已经持有这个 root(如本次变化就是 modelValue 传进来的)时无需回写
534
+ if (toRaw(props.modelValue) !== toRaw(value)) {
490
535
  emit('update:modelValue', value);
491
536
  }
492
537
  })();
@@ -494,8 +539,10 @@ export const initServiceEvents = (
494
539
 
495
540
  // 新增节点,收集依赖
496
541
  const nodeAddHandler = (nodes: MComponent[]) => {
497
- collectIdle(nodes, true).then(() => {
498
- updateStageNodes(nodes);
542
+ collectIdle(nodes, true).then((completed) => {
543
+ if (completed) {
544
+ updateStageNodes(nodes);
545
+ }
499
546
  });
500
547
  };
501
548
 
@@ -549,8 +596,8 @@ export const initServiceEvents = (
549
596
  if (needRecollectNodes.length) {
550
597
  // 有数据源依赖,需要等依赖重新收集完才更新stage
551
598
  const handler = async () => {
552
- await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE);
553
- await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND);
599
+ if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE))) return;
600
+ if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND))) return;
554
601
  updateStageNodes(needRecollectNodes);
555
602
  };
556
603
  handler();
@@ -572,8 +619,10 @@ export const initServiceEvents = (
572
619
 
573
620
  // 历史记录变化时,需要重新收集依赖
574
621
  const historyChangeHandler = (page: MPage | MPageFragment) => {
575
- collectIdle([page], true).then(() => {
576
- updateStageNode(page);
622
+ collectIdle([page], true).then((completed) => {
623
+ if (completed) {
624
+ updateStageNode(page);
625
+ }
577
626
  });
578
627
  };
579
628
 
@@ -654,7 +703,7 @@ export const initServiceEvents = (
654
703
  if (Array.isArray(root?.items)) {
655
704
  depService.clearIdleTasks();
656
705
 
657
- let collectIdlePromises: Promise<void[]>[] = [];
706
+ let collectIdlePromises: Promise<boolean>[] = [];
658
707
  if (isModifyField) {
659
708
  depService.removeTarget(config.id, DepTargetType.DATA_SOURCE);
660
709
  depService.removeTarget(config.id, DepTargetType.DATA_SOURCE_COND);
@@ -679,10 +728,15 @@ export const initServiceEvents = (
679
728
 
680
729
  collectIdlePromises = [collectIdle(root.items, true, DepTargetType.DATA_SOURCE_METHOD)];
681
730
  }
682
- Promise.all(collectIdlePromises)
683
- .then(() => updateDataSourceSchema())
684
- .then(() => updateDsData())
685
- .then(() => updateStageNodes(root.items));
731
+ const handler = async () => {
732
+ const results = await Promise.all(collectIdlePromises);
733
+ if (!results.every(Boolean)) return;
734
+
735
+ updateDataSourceSchema();
736
+ await updateDsData();
737
+ updateStageNodes(root.items);
738
+ };
739
+ handler();
686
740
  }
687
741
  } else if (root?.dataSources) {
688
742
  updateDsData();
@@ -706,11 +760,12 @@ export const initServiceEvents = (
706
760
  const nodeIds = Object.keys(root.dataSourceDeps?.[id] || {});
707
761
  const nodes = getNodes(nodeIds, root.items);
708
762
 
709
- await Promise.all([
763
+ const results = await Promise.all([
710
764
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE),
711
765
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE_COND),
712
766
  collectIdle(nodes, false, DepTargetType.DATA_SOURCE_METHOD),
713
767
  ]);
768
+ if (!results.every(Boolean)) return;
714
769
 
715
770
  updateDataSourceSchema();
716
771
 
@@ -194,6 +194,9 @@ const values = ref('');
194
194
  const loading = ref(false);
195
195
  const codeEditorEl = useTemplateRef<HTMLDivElement>('codeEditor');
196
196
 
197
+ // 组件是否已卸载,避免异步初始化过程中组件被销毁后继续创建编辑器
198
+ let destroyed = false;
199
+
197
200
  const resizeObserver = new globalThis.ResizeObserver(
198
201
  throttle((): void => {
199
202
  vsEditor?.layout();
@@ -254,11 +257,18 @@ const handleKeyDown = (e: KeyboardEvent) => {
254
257
  }
255
258
  };
256
259
 
260
+ // 判断容器是否仍然有效:组件未卸载、ref 存在且已挂载到文档树中
261
+ // Monaco 在创建编辑器时会向上遍历 parentNode 判断是否处于 shadow DOM,
262
+ // 若容器为 null 或已从文档树脱离,将抛出 "Cannot read properties of null (reading 'parentNode')"
263
+ const isEditorElValid = () => !destroyed && !!codeEditorEl.value && codeEditorEl.value.isConnected;
264
+
257
265
  const init = async () => {
258
- if (!codeEditorEl.value) return;
266
+ if (!isEditorElValid()) return;
259
267
 
260
- if (codeEditorEl.value.clientHeight === 0) {
268
+ if (codeEditorEl.value!.clientHeight === 0) {
261
269
  await nextTick();
270
+ // await 期间组件可能已被卸载或容器被移除
271
+ if (!isEditorElValid()) return;
262
272
  }
263
273
 
264
274
  // 重置缓存的额外高度,因为编辑器重新初始化
@@ -266,6 +276,11 @@ const init = async () => {
266
276
 
267
277
  monaco = await loadMonaco();
268
278
 
279
+ // 加载 monaco 是异步过程,期间组件可能已被卸载或容器被移除
280
+ if (!isEditorElValid()) return;
281
+
282
+ const editorEl = codeEditorEl.value!;
283
+
269
284
  const options = {
270
285
  value: values.value,
271
286
  language: props.language,
@@ -275,7 +290,7 @@ const init = async () => {
275
290
  };
276
291
 
277
292
  if (props.type === 'diff') {
278
- vsDiffEditor = await getEditorConfig('customCreateMonacoDiffEditor')(monaco!, codeEditorEl.value, options);
293
+ vsDiffEditor = await getEditorConfig('customCreateMonacoDiffEditor')(monaco!, editorEl, options);
279
294
 
280
295
  // 监听diff编辑器内容变化
281
296
  vsDiffEditor.getModifiedEditor().onDidChangeModelContent(() => {
@@ -285,7 +300,7 @@ const init = async () => {
285
300
  }
286
301
  });
287
302
  } else {
288
- vsEditor = await getEditorConfig('customCreateMonacoEditor')(monaco!, codeEditorEl.value, options);
303
+ vsEditor = await getEditorConfig('customCreateMonacoEditor')(monaco!, editorEl, options);
289
304
 
290
305
  // 监听编辑器内容变化
291
306
  vsEditor.onDidChangeModelContent(() => {
@@ -296,10 +311,19 @@ const init = async () => {
296
311
  });
297
312
  }
298
313
 
314
+ // 编辑器创建可能是异步的,创建完成后若组件已卸载则立即销毁,避免内存泄漏
315
+ if (destroyed) {
316
+ vsEditor?.dispose();
317
+ vsDiffEditor?.dispose();
318
+ vsEditor = null;
319
+ vsDiffEditor = null;
320
+ return;
321
+ }
322
+
299
323
  setEditorValue(props.initValues, props.modifiedValues);
300
324
 
301
325
  emit('initd', vsEditor);
302
- codeEditorEl.value.addEventListener('keydown', handleKeyDown);
326
+ editorEl.addEventListener('keydown', handleKeyDown);
303
327
 
304
328
  if (props.type !== 'diff' && props.autoSave) {
305
329
  vsEditor?.onDidBlurEditorWidget(() => {
@@ -311,7 +335,7 @@ const init = async () => {
311
335
  });
312
336
  }
313
337
 
314
- resizeObserver.observe(codeEditorEl.value);
338
+ resizeObserver.observe(editorEl);
315
339
  };
316
340
 
317
341
  watch(
@@ -362,6 +386,8 @@ onMounted(async () => {
362
386
  });
363
387
 
364
388
  onBeforeUnmount(() => {
389
+ destroyed = true;
390
+
365
391
  resizeObserver.disconnect();
366
392
 
367
393
  vsEditor?.dispose();
@@ -29,9 +29,9 @@
29
29
  right-class="m-editor-framework-right"
30
30
  :left="hideSidebar ? undefined : columnWidth.left"
31
31
  :right="columnWidth.right"
32
- :min-left="hideSidebar ? 0 : MIN_LEFT_COLUMN_WIDTH"
33
- :min-right="MIN_RIGHT_COLUMN_WIDTH"
34
- :min-center="MIN_CENTER_COLUMN_WIDTH"
32
+ :min-left="hideSidebar ? 0 : minLeftColumnWidth"
33
+ :min-right="minRightColumnWidth"
34
+ :min-center="minCenterColumnWidth"
35
35
  :width="frameworkRect.width"
36
36
  @change="columnWidthChange"
37
37
  >
@@ -82,9 +82,6 @@ import { getEditorConfig } from '@editor/utils/config';
82
82
  import {
83
83
  DEFAULT_LEFT_COLUMN_WIDTH,
84
84
  LEFT_COLUMN_WIDTH_STORAGE_KEY,
85
- MIN_CENTER_COLUMN_WIDTH,
86
- MIN_LEFT_COLUMN_WIDTH,
87
- MIN_RIGHT_COLUMN_WIDTH,
88
85
  RIGHT_COLUMN_WIDTH_STORAGE_KEY,
89
86
  } from '@editor/utils/const';
90
87
 
@@ -122,6 +119,10 @@ const showSrc = computed(() => uiService.get('showSrc'));
122
119
 
123
120
  const columnWidth = computed(() => uiService.get('columnWidth'));
124
121
 
122
+ const minLeftColumnWidth = computed(() => uiService.get('minLeftColumnWidth'));
123
+ const minCenterColumnWidth = computed(() => uiService.get('minCenterColumnWidth'));
124
+ const minRightColumnWidth = computed(() => uiService.get('minRightColumnWidth'));
125
+
125
126
  watch(pageLength, () => {
126
127
  splitViewRef.value?.updateWidth();
127
128
  });
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div v-if="!buckets.length" class="m-editor-history-list-empty">暂无操作记录</div>
3
3
  <template v-else>
4
- <div class="m-editor-history-list-toolbar">
4
+ <div v-if="config.showClear !== false" class="m-editor-history-list-toolbar">
5
5
  <span class="m-editor-history-list-clear" :title="`清空${config.title}的历史记录`" @click="$emit('clear')"
6
6
  >清空</span
7
7
  >
@@ -38,7 +38,7 @@ defineOptions({
38
38
 
39
39
  defineProps<{
40
40
  /**
41
- * 该类历史的整体渲染配置(title / prefix / describe* / isStep* / showInitial / gotoEnabled),
41
+ * 该类历史的整体渲染配置(title / prefix / describe* / isStep* / showInitial / gotoEnabled / showClear),
42
42
  * 由父组件按业务类型注入并整体透传给 Bucket,避免逐项透传多个 props。
43
43
  */
44
44
  config: HistoryBucketConfig<T>;
@@ -21,7 +21,7 @@
21
21
  </TMagicRadioGroup>
22
22
 
23
23
  <TMagicRadioGroup v-model="mode" size="small" class="m-editor-history-diff-dialog-mode">
24
- <TMagicRadioButton value="before">与修改前对比</TMagicRadioButton>
24
+ <TMagicRadioButton value="before" :disabled="!hasValue">与修改前对比</TMagicRadioButton>
25
25
  <TMagicRadioButton value="current" :disabled="!hasCurrent">与当前对比</TMagicRadioButton>
26
26
  </TMagicRadioGroup>
27
27
  </div>
@@ -43,10 +43,10 @@
43
43
  :data-source-type="payload.dataSourceType"
44
44
  :value="rightValue"
45
45
  :last-value="leftValue"
46
- :extend-state="extendState"
47
46
  :load-config="loadConfig"
48
47
  :self-diff-field-types="selfDiffFieldTypes"
49
48
  :services="props.services"
49
+ :size="props.size"
50
50
  height="70vh"
51
51
  />
52
52
 
@@ -76,11 +76,16 @@
76
76
  import { computed, ref, watch } from 'vue';
77
77
  import { isEqual } from 'lodash-es';
78
78
 
79
- import { TMagicButton, TMagicDialog, TMagicRadioButton, TMagicRadioGroup, TMagicTag } from '@tmagic/design';
80
- import type { FormState } from '@tmagic/form';
79
+ import {
80
+ type FieldSize,
81
+ TMagicButton,
82
+ TMagicDialog,
83
+ TMagicRadioButton,
84
+ TMagicRadioGroup,
85
+ TMagicTag,
86
+ } from '@tmagic/design';
81
87
 
82
88
  import CompareForm from '@editor/components/CompareForm.vue';
83
- import { useServices } from '@editor/hooks/use-services';
84
89
  import CodeEditor from '@editor/layouts/CodeEditor.vue';
85
90
  import type { CompareCategory, CompareFormLoadConfig, DiffDialogPayload, Services } from '@editor/type';
86
91
 
@@ -91,25 +96,20 @@ defineOptions({
91
96
  const props = withDefaults(
92
97
  defineProps<{
93
98
  /** 编辑器服务集合,由调用方传入(不再通过 inject('services') 获取)。 */
94
- services: Services;
95
- /**
96
- * 来自 Editor 顶层的 `extendFormState`,用于扩展 MForm.formState。
97
- * 透传给 CompareForm,从而让差异对比时表单 item 中依赖业务上下文的
98
- * `display` / `disabled` 等 filterFunction 正常工作。
99
- */
100
- extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
99
+ services?: Services;
101
100
  /**
102
101
  * 自定义 FormConfig 加载逻辑,透传给 CompareForm。传入后将接管内置的按 `category`
103
102
  * 取配置逻辑,可通过 `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
104
103
  */
105
104
  loadConfig?: CompareFormLoadConfig;
106
105
  width?: string;
106
+ /** 差异对比表单内组件的尺寸(透传给 CompareForm 的 `size`),可选 'large' | 'default' | 'small'。 */
107
+ size?: FieldSize;
107
108
  isConfirm?: boolean;
108
109
  onConfirm?: () => void;
109
110
  selfDiffFieldTypes?: string[];
110
111
  }>(),
111
112
  {
112
- services: () => useServices(),
113
113
  width: '900px',
114
114
  },
115
115
  );
@@ -159,6 +159,23 @@ const dialogTitle = computed(() => (props.onConfirm ? '确认回滚' : '查看
159
159
 
160
160
  const hasCurrent = computed(() => payload.value?.currentValue !== undefined && payload.value?.currentValue !== null);
161
161
 
162
+ /** 是否存在该步「修改后的值」:不存在(如仅删除)时「与修改前对比」无意义,置灰禁用。 */
163
+ const hasValue = computed(() => payload.value?.value !== undefined && payload.value?.value !== null);
164
+
165
+ /** 指定模式当前是否可用:before 依赖「修改后的值」,current 依赖「当前值」。 */
166
+ const isModeAvailable = (m: DiffMode): boolean => (m === 'current' ? hasCurrent.value : hasValue.value);
167
+
168
+ /**
169
+ * 计算 open 时的初始对比模式:
170
+ * - 调用方通过 payload.mode 指定且该模式可用时,优先使用指定模式;
171
+ * - 否则没有「修改后的值」但有当前值时(「与修改前对比」不可用),默认进入「与当前对比」;
172
+ * - 其余情况默认「与修改前对比」。
173
+ */
174
+ const resolveInitialMode = (specified?: DiffMode): DiffMode => {
175
+ if (specified && isModeAvailable(specified)) return specified;
176
+ return !hasValue.value && hasCurrent.value ? 'current' : 'before';
177
+ };
178
+
162
179
  /** 左侧(旧/参照)值 */
163
180
  const leftValue = computed<Record<string, any>>(() => {
164
181
  if (!payload.value) return {};
@@ -212,8 +229,9 @@ const targetText = computed(() => {
212
229
 
213
230
  const open = (p: DiffDialogPayload) => {
214
231
  payload.value = p;
215
- // 每次打开按需重置默认模式:有当前值时优先「与当前对比」更贴近"看现在差什么",否则回退到默认
216
- mode.value = 'before';
232
+ // 每次打开按 payload 重置对比模式(hasValue / hasCurrent 依赖 payload,需先赋值):
233
+ // 优先使用 payload.mode 指定的模式;不可用或未指定时按数据自动推断。
234
+ mode.value = resolveInitialMode(p.mode);
217
235
  // 默认回到表单对比形态,避免残留上一次选择的源码模式
218
236
  viewMode.value = 'form';
219
237
  visible.value = true;
@@ -18,7 +18,9 @@
18
18
  <TMagicTabs v-model="activeTab" class="m-editor-history-list-tabs">
19
19
  <component
20
20
  :is="tabPaneComponent?.component || 'el-tab-pane'"
21
- v-bind="tabPaneComponent?.props({ name: 'page', label: `${pageName} (${pageGroups.length})` }) || {}"
21
+ v-bind="
22
+ tabPaneComponent?.props({ name: 'page', label: `${pageName} (${pageGroups.length})`, lazy: true }) || {}
23
+ "
22
24
  >
23
25
  <PageTab
24
26
  :list="pageGroupsDisplay"
@@ -38,8 +40,11 @@
38
40
  v-if="!disabledDataSource"
39
41
  :is="tabPaneComponent?.component || 'el-tab-pane'"
40
42
  v-bind="
41
- tabPaneComponent?.props({ name: 'data-source', label: `${dataSourceName} (${dataSourceGroups.length})` }) ||
42
- {}
43
+ tabPaneComponent?.props({
44
+ name: 'data-source',
45
+ label: `${dataSourceName} (${dataSourceGroups.length})`,
46
+ lazy: true,
47
+ }) || {}
43
48
  "
44
49
  >
45
50
  <BucketTab
@@ -59,7 +64,11 @@
59
64
  v-if="!disabledCodeBlock"
60
65
  :is="tabPaneComponent?.component || 'el-tab-pane'"
61
66
  v-bind="
62
- tabPaneComponent?.props({ name: 'code-block', label: `${codeBlockName} (${codeBlockGroups.length})` }) || {}
67
+ tabPaneComponent?.props({
68
+ name: 'code-block',
69
+ label: `${codeBlockName} (${codeBlockGroups.length})`,
70
+ lazy: true,
71
+ }) || {}
63
72
  "
64
73
  >
65
74
  <BucketTab
@@ -79,7 +88,7 @@
79
88
  v-for="tab in extraTabs"
80
89
  :key="tab.name"
81
90
  :is="tabPaneComponent?.component || 'el-tab-pane'"
82
- v-bind="tabPaneComponent?.props({ name: tab.name, label: resolveTabLabel(tab) }) || {}"
91
+ v-bind="tabPaneComponent?.props({ name: tab.name, label: resolveTabLabel(tab), lazy: true }) || {}"
83
92
  >
84
93
  <component :is="tab.component" v-bind="tab.props || {}" v-on="tab.listeners || {}" />
85
94
  </component>
@@ -124,7 +133,6 @@ import { computed, inject, markRaw, ref, watch } from 'vue';
124
133
  import { Clock, Close } from '@element-plus/icons-vue';
125
134
 
126
135
  import { getDesignConfig, TMagicButton, tMagicMessage, TMagicPopover, TMagicTabs, TMagicTooltip } from '@tmagic/design';
127
- import type { FormState } from '@tmagic/form';
128
136
 
129
137
  import MIcon from '@editor/components/Icon.vue';
130
138
  import { useServices } from '@editor/hooks/use-services';
@@ -184,16 +192,6 @@ watch([disabledDataSource, disabledCodeBlock], ([dsDisabled, cbDisabled]) => {
184
192
  }
185
193
  });
186
194
 
187
- /**
188
- * 通过 inject 拿到 Editor 顶层注入的 `extendFormState`,转交给 HistoryDiffDialog
189
- * 内部的 CompareForm,使差异对比表单的 filterFunction 能拿到完整的业务上下文。
190
- * 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
191
- */
192
- const extendFormState = inject<((_state: FormState) => Record<string, any> | Promise<Record<string, any>>) | undefined>(
193
- 'extendFormState',
194
- undefined,
195
- );
196
-
197
195
  const {
198
196
  expanded,
199
197
  toggleGroup,
@@ -303,10 +301,10 @@ const onCodeBlockGotoInitial = (id: string | number) => {
303
301
  /**
304
302
  * 「单步回滚」与「查看差异」的完整逻辑收敛到 useHistoryRevert,面板与业务方共用:
305
303
  * 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
306
- * 业务方亦可直接 import useHistoryRevert(services) 调用,无需自行挂载任何弹窗。
304
+ * 业务方亦可直接 import useHistoryRevert(options, services) 调用,无需自行挂载任何弹窗。
307
305
  */
308
306
  const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } =
309
- useHistoryRevert(services, { extendState: extendFormState });
307
+ useHistoryRevert({}, services);
310
308
 
311
309
  /**
312
310
  * 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,