@tmagic/editor 1.8.0-beta.2 → 1.8.0-beta.21

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 (308) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +43 -9
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +8 -4
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +3 -2
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +22 -98
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +32 -9
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +68 -17
  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 +1 -1
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +1 -1
  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 +7 -7
  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 +58 -0
  19. package/dist/es/editorProps.js +9 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +16 -5
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +7 -7
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +81 -44
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +10 -3
  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 +13 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +11 -8
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +39 -12
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +11 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +11 -6
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +30 -14
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +11 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +5 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +38 -6
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +156 -155
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +5 -2
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +5 -2
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +8 -10
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +5 -2
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +28 -6
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
  41. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
  44. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
  46. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +7 -7
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +6 -3
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +29 -6
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +32 -6
  50. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +11 -3
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +11 -3
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +11 -3
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +11 -3
  59. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +17 -3
  60. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +19 -3
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +19 -3
  62. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +37 -3
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +33 -3
  64. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  67. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +56 -30
  68. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +7 -4
  69. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +35 -26
  70. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +76 -48
  71. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -23
  72. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +7 -4
  73. package/dist/es/fields/UISelect.js +0 -1
  74. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +5 -2
  75. package/dist/es/hooks/use-code-block-edit.js +6 -3
  76. package/dist/es/hooks/use-compare-form.js +119 -0
  77. package/dist/es/hooks/use-data-source-edit.js +5 -2
  78. package/dist/es/hooks/use-stage.js +9 -4
  79. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  80. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  81. package/dist/es/icons/DatasourceIcon.js +17 -0
  82. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  83. package/dist/es/index.js +24 -10
  84. package/dist/es/initService.js +19 -13
  85. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  86. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +24 -12
  87. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +25 -18
  88. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +4 -4
  89. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +25 -38
  91. package/dist/es/layouts/history-list/BucketTab.js +5 -0
  92. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
  93. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +177 -88
  94. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +139 -37
  95. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +164 -107
  96. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +44 -9
  97. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +49 -53
  98. package/dist/es/layouts/history-list/composables.js +138 -108
  99. package/dist/es/layouts/history-list/useHistoryList.js +56 -0
  100. package/dist/es/layouts/history-list/useHistoryRevert.js +317 -0
  101. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  102. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
  103. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  105. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -7
  107. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +33 -13
  108. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  109. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  110. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +26 -38
  111. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
  112. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  113. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  114. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  115. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +23 -6
  116. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +27 -5
  118. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  119. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  120. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  121. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  122. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
  123. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +3 -2
  124. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  125. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  126. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  128. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  129. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
  130. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  131. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +16 -16
  132. package/dist/es/plugin.js +5 -2
  133. package/dist/es/services/codeBlock.js +137 -56
  134. package/dist/es/services/dataSource.js +122 -52
  135. package/dist/es/services/dep.js +162 -41
  136. package/dist/es/services/editor.js +613 -179
  137. package/dist/es/services/events.js +2 -2
  138. package/dist/es/services/history.js +350 -386
  139. package/dist/es/services/keybinding.js +6 -6
  140. package/dist/es/services/props.js +3 -2
  141. package/dist/es/services/storage.js +2 -2
  142. package/dist/es/services/ui.js +10 -2
  143. package/dist/es/style.css +549 -113
  144. package/dist/es/utils/config.js +4 -1
  145. package/dist/es/utils/const.js +2 -2
  146. package/dist/es/utils/content-menu.js +19 -11
  147. package/dist/es/utils/data-source/index.js +34 -11
  148. package/dist/es/utils/dep/collect-worker-client.js +114 -0
  149. package/dist/es/utils/dep/idle-task.js +70 -22
  150. package/dist/es/utils/dep/worker.js +1 -1
  151. package/dist/es/utils/editor.js +103 -49
  152. package/dist/es/utils/event.js +135 -0
  153. package/dist/es/utils/history.js +220 -0
  154. package/dist/es/utils/indexed-db.js +86 -0
  155. package/dist/es/utils/monaco-editor.js +22 -6
  156. package/dist/es/utils/operator.js +2 -2
  157. package/dist/es/utils/props.js +114 -33
  158. package/dist/es/utils/type-match-rules.js +367 -0
  159. package/dist/es/utils/undo-redo.js +60 -1
  160. package/dist/style.css +549 -113
  161. package/dist/themes/magic-admin.css +3028 -0
  162. package/dist/tmagic-editor.umd.cjs +14403 -10121
  163. package/package.json +8 -8
  164. package/src/Editor.vue +43 -2
  165. package/src/components/CodeBlockEditor.vue +3 -0
  166. package/src/components/CompareForm.vue +18 -146
  167. package/src/components/ContentMenu.vue +44 -8
  168. package/src/components/FloatingBox.vue +84 -9
  169. package/src/components/ScrollBar.vue +0 -67
  170. package/src/components/ToolButton.vue +2 -2
  171. package/src/components/ViewForm.vue +55 -0
  172. package/src/editorProps.ts +30 -0
  173. package/src/fields/Code.vue +10 -2
  174. package/src/fields/CodeLink.vue +2 -5
  175. package/src/fields/CodeSelect.vue +54 -40
  176. package/src/fields/CodeSelectCol.vue +8 -1
  177. package/src/fields/CondOpSelect.vue +2 -24
  178. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +16 -2
  179. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  180. package/src/fields/DataSourceFields.vue +42 -8
  181. package/src/fields/DataSourceInput.vue +10 -28
  182. package/src/fields/DataSourceMethodSelect.vue +9 -4
  183. package/src/fields/DataSourceMethods.vue +42 -21
  184. package/src/fields/DataSourceMocks.vue +3 -0
  185. package/src/fields/DisplayConds.vue +18 -1
  186. package/src/fields/EventSelect.vue +152 -166
  187. package/src/fields/StyleSetter/Index.vue +3 -12
  188. package/src/fields/StyleSetter/components/Border.vue +15 -6
  189. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  190. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  191. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  192. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  193. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  194. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  195. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  196. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  197. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  198. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  199. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  200. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  201. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  202. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  203. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  204. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  205. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  206. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  207. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  208. package/src/fields/StyleSetter/pro/Background.vue +99 -55
  209. package/src/fields/StyleSetter/pro/Border.vue +9 -11
  210. package/src/fields/StyleSetter/pro/Font.vue +66 -64
  211. package/src/fields/StyleSetter/pro/Layout.vue +211 -139
  212. package/src/fields/StyleSetter/pro/Position.vue +69 -67
  213. package/src/fields/StyleSetter/pro/Transform.vue +23 -25
  214. package/src/fields/UISelect.vue +0 -12
  215. package/src/hooks/index.ts +1 -0
  216. package/src/hooks/use-code-block-edit.ts +4 -3
  217. package/src/hooks/use-compare-form.ts +187 -0
  218. package/src/hooks/use-data-source-edit.ts +2 -2
  219. package/src/hooks/use-stage.ts +5 -3
  220. package/src/icons/DatasourceIcon.vue +7 -0
  221. package/src/index.ts +12 -0
  222. package/src/initService.ts +26 -16
  223. package/src/layouts/CodeEditor.vue +34 -11
  224. package/src/layouts/Framework.vue +15 -8
  225. package/src/layouts/NavMenu.vue +3 -3
  226. package/src/layouts/history-list/Bucket.vue +33 -41
  227. package/src/layouts/history-list/BucketTab.vue +72 -0
  228. package/src/layouts/history-list/GroupRow.vue +190 -93
  229. package/src/layouts/history-list/HistoryDiffDialog.vue +169 -90
  230. package/src/layouts/history-list/HistoryListPanel.vue +191 -95
  231. package/src/layouts/history-list/InitialRow.vue +38 -8
  232. package/src/layouts/history-list/PageTab.vue +67 -43
  233. package/src/layouts/history-list/composables.ts +239 -125
  234. package/src/layouts/history-list/useHistoryList.ts +60 -0
  235. package/src/layouts/history-list/useHistoryRevert.ts +425 -0
  236. package/src/layouts/page-bar/PageBar.vue +4 -2
  237. package/src/layouts/props-panel/FormPanel.vue +72 -6
  238. package/src/layouts/props-panel/PropsPanel.vue +62 -18
  239. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  240. package/src/layouts/sidebar/ComponentListPanel.vue +10 -6
  241. package/src/layouts/sidebar/Sidebar.vue +13 -6
  242. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  243. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  244. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  245. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +34 -2
  246. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +29 -4
  247. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  248. package/src/layouts/sidebar/layer/LayerMenu.vue +21 -13
  249. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  250. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  251. package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
  252. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  253. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  254. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  255. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  256. package/src/layouts/workspace/viewer/ViewerMenu.vue +15 -15
  257. package/src/plugin.ts +6 -3
  258. package/src/services/codeBlock.ts +152 -47
  259. package/src/services/dataSource.ts +120 -41
  260. package/src/services/dep.ts +292 -47
  261. package/src/services/editor.ts +820 -224
  262. package/src/services/events.ts +3 -3
  263. package/src/services/history.ts +449 -412
  264. package/src/services/keybinding.ts +6 -6
  265. package/src/services/ui.ts +33 -5
  266. package/src/theme/code-block.scss +37 -0
  267. package/src/theme/common/var.scss +1 -1
  268. package/src/theme/component-list-panel.scss +2 -2
  269. package/src/theme/data-source-field.scss +4 -0
  270. package/src/theme/display-conds.scss +11 -0
  271. package/src/theme/event.scss +70 -1
  272. package/src/theme/floating-box.scss +9 -1
  273. package/src/theme/framework.scss +4 -1
  274. package/src/theme/history-list-panel.scss +157 -23
  275. package/src/theme/layer-node-content.scss +14 -0
  276. package/src/theme/nav-menu.scss +5 -1
  277. package/src/theme/page-bar.scss +0 -4
  278. package/src/theme/props-panel.scss +5 -4
  279. package/src/theme/scroll-bar.scss +64 -0
  280. package/src/theme/style-setter/border.scss +17 -5
  281. package/src/theme/theme.scss +4 -0
  282. package/src/theme/themes/magic-admin/index.scss +214 -0
  283. package/src/theme/ui-select.scss +9 -0
  284. package/src/type.ts +668 -124
  285. package/src/utils/config.ts +9 -1
  286. package/src/utils/const.ts +3 -2
  287. package/src/utils/content-menu.ts +20 -11
  288. package/src/utils/data-source/index.ts +32 -12
  289. package/src/utils/dep/collect-worker-client.ts +149 -0
  290. package/src/utils/dep/idle-task.ts +104 -35
  291. package/src/utils/dep/worker.ts +113 -9
  292. package/src/utils/editor.ts +166 -60
  293. package/src/utils/event.ts +237 -0
  294. package/src/utils/history.ts +286 -0
  295. package/src/utils/index.ts +4 -0
  296. package/src/utils/indexed-db.ts +122 -0
  297. package/src/utils/monaco-editor.ts +27 -0
  298. package/src/utils/operator.ts +2 -2
  299. package/src/utils/props.ts +114 -11
  300. package/src/utils/type-match-rules.ts +684 -0
  301. package/src/utils/undo-redo.ts +88 -0
  302. package/types/index.d.ts +1990 -517
  303. package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
  304. package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +0 -62
  305. package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
  306. package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
  307. package/src/layouts/history-list/CodeBlockTab.vue +0 -61
  308. package/src/layouts/history-list/DataSourceTab.vue +0 -61
@@ -1,53 +1,22 @@
1
- import { useServices } from "../../hooks/use-services.js";
2
- import { computed, reactive } from "vue";
1
+ import { datetimeFormatter } from "@tmagic/form";
2
+ import { tMagicMessageBox } from "@tmagic/design";
3
3
  //#region packages/editor/src/layouts/history-list/composables.ts
4
+ /** 合并组默认展开;仅当 expanded[key] === false 时为收起。 */
5
+ var isHistoryGroupExpanded = (expanded, key) => expanded[key] !== false;
4
6
  /**
5
- * 历史记录面板共享逻辑:
6
- * - 暴露三类历史的聚合数据(页面 / 数据源 / 代码块);
7
- * - 提供折叠状态管理;
8
- * - 提供操作描述文案生成器。
9
- *
10
- * 所有数据基于 historyService 的 reactive state 派生,自动跟随历史变化刷新。
7
+ * 历史面板的时间展示:
8
+ * - 当天的记录只显示 `HH:mm:ss`;
9
+ * - 跨天的记录显示 `MM-DD HH:mm:ss`。
10
+ * 无时间戳(旧数据 / 未写入)时返回空串,UI 据此不渲染时间。
11
11
  */
12
- var useHistoryList = () => {
13
- const { historyService } = useServices();
14
- /** 折叠状态:key 形如 `pg-${groupIdx}` / `ds-${id}-${groupIdx}` / `cb-${id}-${groupIdx}`。 */
15
- const expanded = reactive({});
16
- const toggleGroup = (key) => {
17
- expanded[key] = !expanded[key];
18
- };
19
- const pageGroups = computed(() => historyService.getPageHistoryGroups());
20
- const dataSourceGroups = computed(() => historyService.getDataSourceHistoryGroups());
21
- const codeBlockGroups = computed(() => historyService.getCodeBlockHistoryGroups());
22
- /** 页面 tab 倒序展示(最新一组在最上面)。 */
23
- const pageGroupsDisplay = computed(() => pageGroups.value.slice().reverse());
24
- /**
25
- * 把按时间正序的 group 列表,再按 id 聚拢成 bucket(同 id 的所有分组放一起)。
26
- * 每个 bucket 内部仍然按时间倒序展示(最近的操作最先看到)。
27
- */
28
- const groupByTarget = (groups) => {
29
- const map = /* @__PURE__ */ new Map();
30
- groups.forEach((g) => {
31
- const list = map.get(g.id) ?? [];
32
- list.push(g);
33
- map.set(g.id, list);
34
- });
35
- return Array.from(map.entries()).map(([id, gs]) => ({
36
- id,
37
- groups: gs.slice().reverse()
38
- }));
39
- };
40
- return {
41
- expanded,
42
- toggleGroup,
43
- pageGroups,
44
- dataSourceGroups,
45
- codeBlockGroups,
46
- pageGroupsDisplay,
47
- dataSourceGroupsByTarget: computed(() => groupByTarget(dataSourceGroups.value)),
48
- codeBlockGroupsByTarget: computed(() => groupByTarget(codeBlockGroups.value))
49
- };
12
+ var formatHistoryTime = (timestamp) => {
13
+ if (!timestamp) return "";
14
+ return `${datetimeFormatter(new Date(timestamp), "", "YYYY-MM-DD") === datetimeFormatter(/* @__PURE__ */ new Date(), "", "YYYY-MM-DD") ? datetimeFormatter(new Date(timestamp), "", "HH:mm:ss") : datetimeFormatter(new Date(timestamp), "", "MM-DD HH:mm:ss")}`;
50
15
  };
16
+ /** 完整时间(含年份与秒),用于 title 悬浮提示。无时间戳时返回空串。 */
17
+ var formatHistoryFullTime = (timestamp) => timestamp ? `${datetimeFormatter(new Date(timestamp), "", "YYYY-MM-DD HH:mm:ss")}` : "";
18
+ /** 取一组历史步骤里最后一步(最近一次)的时间戳,用于组头部展示。 */
19
+ var groupTimestamp = (group) => group.steps[group.steps.length - 1]?.step.timestamp;
51
20
  var opLabel = (op) => {
52
21
  switch (op) {
53
22
  case "add": return "新增";
@@ -55,6 +24,67 @@ var opLabel = (op) => {
55
24
  default: return "修改";
56
25
  }
57
26
  };
27
+ /** 内置操作途径的中文文案;自定义来源直接回显原值,未知 / 缺省返回空串(UI 据此不渲染)。 */
28
+ var HISTORY_SOURCE_LABELS = {
29
+ stage: "画布",
30
+ tree: "树面板",
31
+ "component-panel": "组件面板",
32
+ props: "配置面板",
33
+ code: "源码",
34
+ "root-code": "DSL源码",
35
+ "stage-contextmenu": "画布菜单",
36
+ "tree-contextmenu": "树菜单",
37
+ toolbar: "工具栏",
38
+ shortcut: "快捷键",
39
+ rollback: "回滚",
40
+ api: "接口",
41
+ ai: "AI",
42
+ initial: "初始值",
43
+ sync: "同步",
44
+ unknown: "未知"
45
+ };
46
+ /** 操作途径文案:用于历史面板展示「画布 / 树面板 / 配置面板…」标签。 */
47
+ var sourceLabel = (source = "unknown") => {
48
+ return HISTORY_SOURCE_LABELS[source] ?? `${source}`;
49
+ };
50
+ /** 取一组历史步骤里最后一步(最近一次)的操作途径,用于组头部展示。 */
51
+ var groupSource = (group) => group.steps[group.steps.length - 1]?.step.source;
52
+ /** 取一组历史步骤里最后一步(最近一次)的操作人,用于组头部展示。 */
53
+ var groupOperator = (group) => group.steps[group.steps.length - 1]?.step.operator;
54
+ /**
55
+ * 把一个历史分组(页面 / bucket)派生为 GroupRow 直接消费的视图模型 {@link HistoryRowGroup}。
56
+ * 统一了原先 PageTab / Bucket 各自内联的 sub-steps 映射逻辑:描述、可差异、可回滚、时间、途径
57
+ * 全部在此一次性算好,组件层只负责渲染。
58
+ */
59
+ var toRowGroup = (group, key, descriptor) => {
60
+ const { describeGroup, describeStep, isStepDiffable, isStepRevertable } = descriptor;
61
+ const timestamp = groupTimestamp(group);
62
+ const lastStep = group.steps[group.steps.length - 1]?.step;
63
+ return {
64
+ key,
65
+ applied: group.applied,
66
+ isCurrent: Boolean(group.isCurrent),
67
+ opType: group.opType,
68
+ desc: describeGroup ? describeGroup(group) : describeStep(lastStep),
69
+ source: groupSource(group),
70
+ operator: groupOperator(group),
71
+ time: formatHistoryTime(timestamp),
72
+ timeTitle: formatHistoryFullTime(timestamp),
73
+ subSteps: group.steps.map((s) => ({
74
+ index: s.index,
75
+ applied: s.applied,
76
+ isCurrent: Boolean(s.isCurrent),
77
+ saved: s.step.saved,
78
+ desc: describeStep(s.step),
79
+ diffable: isStepDiffable ? isStepDiffable(s.step) : false,
80
+ revertable: s.applied && (isStepRevertable ? isStepRevertable(s.step) : true),
81
+ source: s.step.source,
82
+ operator: s.step.operator,
83
+ time: formatHistoryTime(s.step.timestamp),
84
+ timeTitle: formatHistoryFullTime(s.step.timestamp)
85
+ }))
86
+ };
87
+ };
58
88
  var nameOf = (node) => node?.name || node?.type || `${node?.id ?? ""}`;
59
89
  /**
60
90
  * 默认描述里展示「名称 (id: xxx)」,便于区分同名实体。
@@ -70,28 +100,36 @@ var labelWithId = (label, id) => {
70
100
  var pickLastDescription = (descs) => {
71
101
  for (let i = descs.length - 1; i >= 0; i--) if (descs[i]) return descs[i];
72
102
  };
73
- var describePageStep = (step) => {
103
+ /**
104
+ * 页面 / 数据源 / 代码块三类历史共用的单步描述核心。
105
+ * 各类型只在「取展示名」与「实体单位名」上有差异,通过参数注入,文案模板完全一致:
106
+ * - 新增 / 删除:单实体展示「label」,多实体(仅页面可能出现)退化为「N 个X」;
107
+ * - 修改:展示「label · propPath」,无 diff 时兜底「X」,多实体退化为「N 个X」。
108
+ * 操作类型(新增 / 删除 / 修改)已由列表行的 op 徽标单独展示,故描述文案不再重复动词。
109
+ * 展示 id 统一取 schema.id;调用方显式传入的 historyDescription 永远优先。
110
+ */
111
+ var describeStep = (step, getLabel, unit) => {
74
112
  if (step.historyDescription) return step.historyDescription;
75
- const { opType } = step;
76
- if (opType === "add") {
77
- const count = step.nodes?.length ?? 0;
78
- const node = step.nodes?.[0];
79
- return `新增 ${count} 个节点${count === 1 && node ? `(${labelWithId(nameOf(node), node.id)})` : ""}`;
113
+ const items = step.diff ?? [];
114
+ const label = (schema) => labelWithId(getLabel(schema), schema?.id);
115
+ if (step.opType === "add") {
116
+ const node = items[0]?.newSchema;
117
+ return items.length === 1 && node ? label(node) : `${items.length} 个${unit}`;
80
118
  }
81
- if (opType === "remove") {
82
- const count = step.removedItems?.length ?? 0;
83
- const node = step.removedItems?.[0]?.node;
84
- return `删除 ${count} 个节点${count === 1 && node ? `(${labelWithId(nameOf(node), node.id)})` : ""}`;
119
+ if (step.opType === "remove") {
120
+ const node = items[0]?.oldSchema;
121
+ return items.length === 1 && node ? label(node) : `${items.length} 个${unit}`;
85
122
  }
86
- const updated = step.updatedItems ?? [];
87
- if (!updated.length) return "修改节点";
88
- if (updated.length === 1) {
89
- const { newNode, changeRecords } = updated[0];
90
- const propPath = changeRecords?.[0]?.propPath;
91
- return `修改 ${labelWithId(nameOf(newNode), newNode?.id)}${propPath ? ` · ${propPath}` : ""}`;
123
+ if (!items.length) return unit;
124
+ if (items.length === 1) {
125
+ const { newSchema, oldSchema, changeRecords } = items[0];
126
+ const propPath = changeRecords?.map((changeRecord) => changeRecord.propPath).join(",");
127
+ const target = label(newSchema ?? oldSchema);
128
+ return propPath ? `${target} · ${propPath}` : target;
92
129
  }
93
- return `修改 ${updated.length} 个节点`;
130
+ return `${items.length} 个${unit}`;
94
131
  };
132
+ var describePageStep = (step) => describeStep(step, (node) => nameOf(node), "节点");
95
133
  /**
96
134
  * 合并组的展示文案:
97
135
  * - 若组内任一步显式提供了 historyDescription:取最后一条非空 historyDescription(最近一次的描述更准确);
@@ -102,53 +140,45 @@ var describePageGroup = (group) => {
102
140
  const lastDesc = pickLastDescription(group.steps.map((s) => s.step.historyDescription));
103
141
  if (lastDesc) return lastDesc;
104
142
  if (group.steps.length === 1) return describePageStep(group.steps[0].step);
105
- const paths = /* @__PURE__ */ new Set();
106
- group.steps.forEach((s) => {
107
- s.step.updatedItems?.[0]?.changeRecords?.forEach((r) => r.propPath && paths.add(r.propPath));
108
- });
109
- const pathList = Array.from(paths).slice(0, 3).join(", ");
110
- const target = labelWithId(group.targetName ?? (group.targetId !== void 0 ? `${group.targetId}` : "节点"), group.targetId);
111
- return pathList ? `修改 ${target} · ${pathList}${paths.size > 3 ? "…" : ""}` : `修改 ${target}`;
143
+ return labelWithId(group.targetName ?? (group.targetId !== void 0 ? `${group.targetId}` : "节点"), group.targetId);
112
144
  };
113
- var describeDataSourceStep = (step) => {
114
- if (step.historyDescription) return step.historyDescription;
115
- if (step.oldSchema === null && step.newSchema) return `创建 ${labelWithId(step.newSchema.title, step.newSchema.id ?? step.id)}`;
116
- if (step.newSchema === null && step.oldSchema) return `删除 ${labelWithId(step.oldSchema.title, step.oldSchema.id ?? step.id)}`;
117
- const propPath = step.changeRecords?.[0]?.propPath;
118
- const title = labelWithId(step.newSchema?.title || step.oldSchema?.title, step.id);
119
- return propPath ? `修改 ${title} · ${propPath}` : `修改 ${title}`;
120
- };
121
- var describeDataSourceGroup = (group) => {
122
- const lastDesc = pickLastDescription(group.steps.map((s) => s.step.historyDescription));
123
- if (lastDesc) return lastDesc;
124
- if (group.steps.length === 1) return describeDataSourceStep(group.steps[0].step);
125
- const paths = /* @__PURE__ */ new Set();
126
- group.steps.forEach((s) => {
127
- s.step.changeRecords?.forEach((r) => r.propPath && paths.add(r.propPath));
128
- });
129
- const pathList = Array.from(paths).slice(0, 3).join(", ");
130
- const target = labelWithId(group.steps[group.steps.length - 1].step.newSchema?.title || group.steps[0].step.oldSchema?.title, group.id);
131
- return pathList ? `修改 ${target} · ${pathList}${paths.size > 3 ? "…" : ""}` : `修改 ${target}`;
145
+ /**
146
+ * 页面 step 是否支持「回滚」(类 git revert):
147
+ * - 新增 / 删除:不依赖 changeRecords,反向应用即删除 / 加回,始终可回滚;
148
+ * - 更新:必须每个被更新节点都带有 changeRecords,才支持按 propPath 局部反向 patch。
149
+ * 缺失 changeRecords 的更新只能整节点替换,会冲掉该节点后续的无关变更,因此不支持回滚。
150
+ */
151
+ var isPageStepRevertable = (step) => {
152
+ if (step.opType !== "update") return true;
153
+ const items = step.diff ?? [];
154
+ if (!items.length) return false;
155
+ return items.every((item) => Boolean(item.changeRecords?.length));
132
156
  };
133
- var describeCodeBlockStep = (step) => {
134
- if (step.historyDescription) return step.historyDescription;
135
- if (step.oldContent === null && step.newContent) return `创建 ${labelWithId(step.newContent.name, step.newContent.id ?? step.id)}`;
136
- if (step.newContent === null && step.oldContent) return `删除 ${labelWithId(step.oldContent.name, step.oldContent.id ?? step.id)}`;
137
- const propPath = step.changeRecords?.[0]?.propPath;
138
- const title = labelWithId(step.newContent?.name || step.oldContent?.name, step.id);
139
- return propPath ? `修改 ${title} · ${propPath}` : `修改 ${title}`;
157
+ /**
158
+ * diff 项历史(数据源 / 代码块)是否支持「回滚」:
159
+ * - 新增(无 oldSchema)/ 删除(无 newSchema):不依赖 changeRecords,始终可回滚;
160
+ * - 更新(前后内容都存在):必须有 changeRecords 才支持局部反向 patch,否则不支持回滚。
161
+ */
162
+ var isSingleDiffStepRevertable = (step) => {
163
+ const item = step.diff?.[0];
164
+ if (!item?.oldSchema || !item?.newSchema) return true;
165
+ return Boolean(item.changeRecords?.length);
140
166
  };
141
- var describeCodeBlockGroup = (group) => {
142
- const lastDesc = pickLastDescription(group.steps.map((s) => s.step.historyDescription));
143
- if (lastDesc) return lastDesc;
144
- if (group.steps.length === 1) return describeCodeBlockStep(group.steps[0].step);
145
- const paths = /* @__PURE__ */ new Set();
146
- group.steps.forEach((s) => {
147
- s.step.changeRecords?.forEach((r) => r.propPath && paths.add(r.propPath));
148
- });
149
- const pathList = Array.from(paths).slice(0, 3).join(", ");
150
- const target = labelWithId(group.steps[group.steps.length - 1].step.newContent?.name || group.steps[0].step.oldContent?.name, group.id);
151
- return pathList ? `修改 ${target} · ${pathList}${paths.size > 3 ? "…" : ""}` : `修改 ${target}`;
167
+ /**
168
+ * 通用二次确认弹窗:清空历史 / 无法差异对比的回滚等会改变状态的操作,先弹出确认框,
169
+ * 用户点击「确定」返回 true,取消(confirm reject)时返回 false 并静默忽略。
170
+ */
171
+ var confirmHistoryAction = async (message) => {
172
+ try {
173
+ await tMagicMessageBox.confirm(message, "提示", {
174
+ confirmButtonText: "确定",
175
+ cancelButtonText: "取消",
176
+ type: "warning"
177
+ });
178
+ return true;
179
+ } catch {
180
+ return false;
181
+ }
152
182
  };
153
183
  //#endregion
154
- export { describeCodeBlockGroup, describeCodeBlockStep, describeDataSourceGroup, describeDataSourceStep, describePageGroup, describePageStep, opLabel, useHistoryList };
184
+ export { confirmHistoryAction, describePageGroup, describePageStep, describeStep, formatHistoryFullTime, formatHistoryTime, groupOperator, groupSource, groupTimestamp, isHistoryGroupExpanded, isPageStepRevertable, isSingleDiffStepRevertable, opLabel, sourceLabel, toRowGroup };
@@ -0,0 +1,56 @@
1
+ import { useServices } from "../../hooks/use-services.js";
2
+ import { computed, reactive } from "vue";
3
+ //#region packages/editor/src/layouts/history-list/useHistoryList.ts
4
+ /**
5
+ * 历史记录面板共享逻辑:
6
+ * - 暴露三类历史的聚合数据(页面 / 数据源 / 代码块);
7
+ * - 提供折叠状态管理;
8
+ * - 提供操作描述文案生成器。
9
+ *
10
+ * 所有数据基于 historyService 的 reactive state 派生,自动跟随历史变化刷新。
11
+ */
12
+ var useHistoryList = () => {
13
+ const { editorService, historyService } = useServices();
14
+ /**
15
+ * 折叠状态:key 形如 `pg-${组内首步 index}` / `ds-${id}-${组内首步 index}` / `cb-${id}-${组内首步 index}`。
16
+ * 用组内首步的稳定 index(而非展示位置)作为 key,确保历史数据更新后已展开的分组状态保持不变。
17
+ * 合并组默认展开;仅当值为 `false` 时表示收起。
18
+ */
19
+ const expanded = reactive({});
20
+ const toggleGroup = (key) => {
21
+ expanded[key] = expanded[key] === false;
22
+ };
23
+ const pageGroups = computed(() => historyService.getHistoryGroups("page", editorService.get("page")?.id));
24
+ const dataSourceGroups = computed(() => historyService.getHistoryGroups("dataSource"));
25
+ const codeBlockGroups = computed(() => historyService.getHistoryGroups("codeBlock"));
26
+ /** 页面 tab 倒序展示(最新一组在最上面)。 */
27
+ const pageGroupsDisplay = computed(() => pageGroups.value.slice().reverse());
28
+ /**
29
+ * 把按时间正序的 group 列表,再按 id 聚拢成 bucket(同 id 的所有分组放一起)。
30
+ * 每个 bucket 内部仍然按时间倒序展示(最近的操作最先看到)。
31
+ */
32
+ const groupByTarget = (groups) => {
33
+ const map = /* @__PURE__ */ new Map();
34
+ groups.forEach((g) => {
35
+ const list = map.get(g.id) ?? [];
36
+ list.push(g);
37
+ map.set(g.id, list);
38
+ });
39
+ return Array.from(map.entries()).map(([id, gs]) => ({
40
+ id,
41
+ groups: gs.slice().reverse()
42
+ }));
43
+ };
44
+ return {
45
+ expanded,
46
+ toggleGroup,
47
+ pageGroups,
48
+ dataSourceGroups,
49
+ codeBlockGroups,
50
+ pageGroupsDisplay,
51
+ dataSourceGroupsByTarget: computed(() => groupByTarget(dataSourceGroups.value)),
52
+ codeBlockGroupsByTarget: computed(() => groupByTarget(codeBlockGroups.value))
53
+ };
54
+ };
55
+ //#endregion
56
+ export { useHistoryList };
@@ -0,0 +1,317 @@
1
+ import { confirmHistoryAction } from "./composables.js";
2
+ import { tMagicMessage } from "@tmagic/design";
3
+ import { createApp, getCurrentInstance } from "vue";
4
+ //#region packages/editor/src/layouts/history-list/useHistoryRevert.ts
5
+ /**
6
+ * 构造差异弹窗入参:仅 update(前后值都存在)可对比。
7
+ * - 页面(无 id):在全部分组中按 index 定位 step,目标 id 取自快照;
8
+ * - 数据源 / 代码块(带 id):先匹配分组 id 再按 index 定位。
9
+ * 无可对比内容(多节点 / add / remove)或定位不到时返回 null。
10
+ */
11
+ var buildDiffPayload = (source, index, id) => {
12
+ for (const group of source.groups()) {
13
+ if (id !== void 0 && group.id !== id) continue;
14
+ const step = group.steps.find((s) => s.index === index)?.step;
15
+ if (!step) continue;
16
+ const oldSchema = step.diff?.[0]?.oldSchema;
17
+ const newSchema = step.diff?.[0]?.newSchema;
18
+ if (!oldSchema || !newSchema) return null;
19
+ const targetId = id ?? newSchema.id ?? oldSchema.id;
20
+ const type = source.resolveType?.(newSchema, oldSchema);
21
+ return {
22
+ category: source.category,
23
+ ...type !== void 0 ? { type } : {},
24
+ lastValue: oldSchema,
25
+ value: newSchema,
26
+ currentValue: (targetId !== void 0 ? source.getCurrent(targetId) : null) || null,
27
+ targetLabel: source.resolveLabel(newSchema, oldSchema, targetId),
28
+ id: targetId
29
+ };
30
+ }
31
+ return null;
32
+ };
33
+ /**
34
+ * 按需动态 import 并挂载一个游离的 HistoryDiffDialog,返回其实例与清理函数。
35
+ * 通过继承 appContext 复用全局组件 / 指令 / provide / 插件(Element Plus、@tmagic/form 字段组件等),
36
+ * 弹窗组件动态 import,避免拖累其它消费者。供「确认回滚」与「查看差异」两种交互共用。
37
+ */
38
+ var mountHistoryDiffDialog = async (options) => {
39
+ const { default: historyDiffDialog } = await import("./HistoryDiffDialog.js");
40
+ const container = document.createElement("div");
41
+ container.style.display = "none";
42
+ document.body.appendChild(container);
43
+ const app = createApp(historyDiffDialog, {
44
+ services: options.services,
45
+ isConfirm: options.isConfirm,
46
+ extendState: options.extendState,
47
+ loadConfig: options.loadConfig,
48
+ selfDiffFieldTypes: options.selfDiffFieldTypes,
49
+ compareFormState: options.compareFormState,
50
+ width: options.width,
51
+ size: options.size ?? options.services?.uiService?.get("propsPanelSize"),
52
+ onClose: options.onClose
53
+ });
54
+ if (options.appContext) Object.assign(app._context, options.appContext);
55
+ const instance = app.mount(container);
56
+ const destroy = () => {
57
+ setTimeout(() => {
58
+ try {
59
+ app.unmount();
60
+ } catch {}
61
+ container.parentNode?.removeChild(container);
62
+ }, 300);
63
+ };
64
+ return {
65
+ app,
66
+ instance,
67
+ destroy
68
+ };
69
+ };
70
+ /**
71
+ * 动态挂载一个「确认回滚」模式的 HistoryDiffDialog,等待用户确认:
72
+ * - 用户点「确定回滚」resolve(true),取消 / 关闭 resolve(false);
73
+ * - 确认流程结束后自动卸载。
74
+ */
75
+ var confirmRevertWithDiffDialog = async (payload, options) => {
76
+ const { instance, destroy } = await mountHistoryDiffDialog({
77
+ ...options,
78
+ isConfirm: true
79
+ });
80
+ try {
81
+ return await instance.confirm(payload);
82
+ } finally {
83
+ destroy();
84
+ }
85
+ };
86
+ /**
87
+ * 动态挂载一个「查看差异」模式(只读)的 HistoryDiffDialog 并打开:
88
+ * 弹窗保持打开直到用户关闭,关闭(close 事件)后自动卸载并清理容器。
89
+ */
90
+ var viewHistoryDiffDialog = async (payload, options) => {
91
+ const handle = {};
92
+ const { instance, destroy } = await mountHistoryDiffDialog({
93
+ ...options,
94
+ isConfirm: false,
95
+ onClose: () => handle.destroy?.()
96
+ });
97
+ handle.destroy = destroy;
98
+ instance.open(payload);
99
+ };
100
+ /**
101
+ * 历史记录「单步回滚」与「查看差异」的完整交互流程,供历史面板与业务方共用。
102
+ *
103
+ * 单步回滚(类 git revert):
104
+ * 1. 前置校验:目标数据已被删除(update 写回目标 / 页面 remove 的原父容器缺失)时给出「回滚失败」提示并中止;
105
+ * 2. 二次确认:可差异对比的步骤(单实体 update)弹出差异确认弹窗,其余步骤弹普通二次确认框;
106
+ * 3. 用户确认后执行对应 service 的 revert(页面 / 数据源 / 代码块)。
107
+ *
108
+ * 查看差异:可差异对比的步骤动态挂载只读 HistoryDiffDialog 展示前后值差异。
109
+ *
110
+ * 上述弹窗均按需动态挂载 HistoryDiffDialog 实现,业务方无需自行挂载任何弹窗。
111
+ *
112
+ * 返回的能力分三组:
113
+ * - 内置三类(页面 / 数据源 / 代码块):`onPageRevert` / `onDataSourceRevert` / `onCodeBlockRevert` 单步回滚,
114
+ * `onPageDiff` / `onDataSourceDiff` / `onCodeBlockDiff` 查看差异,及配套的 `buildXxxDiffPayload` / `isXxxRevertTargetMissing`;
115
+ * - 业务自有历史(如管理台「模块」):`confirmAndRevert` / `viewDiff` 复用同一套交互流程,由业务方自行构造差异入参;
116
+ * 即上述内置三类本质上是它们各自预置好 payload 构造与 service.revert 的特例。
117
+ *
118
+ * 业务方可在拿到 Editor 实例暴露的 `services` 后直接 import 调用:
119
+ *
120
+ * ```ts
121
+ * import { useHistoryRevert } from '@tmagic/editor';
122
+ *
123
+ * const { onPageRevert, onPageDiff } = useHistoryRevert({}, editorRef.value); // editorRef.value 即 Editor 暴露的 services
124
+ * await onPageRevert(index); // 弹出差异 / 二次确认弹窗后回滚
125
+ * onPageDiff(index); // 弹出只读差异弹窗查看前后值差异
126
+ * ```
127
+ */
128
+ var useHistoryRevert = (options = {}, services) => {
129
+ const appContext = options.appContext ?? getCurrentInstance()?.appContext ?? null;
130
+ const { extendState, getPropsPanelFormState, dialogWidth } = options;
131
+ /** 目标数据已被删除、无法回滚时的统一提示。 */
132
+ const showRevertTargetMissing = () => {
133
+ tMagicMessage.error("回滚失败:该记录对应的数据已被删除");
134
+ };
135
+ /**
136
+ * 「回滚」二次确认:新增 / 删除 / 多节点更新等无法做差异对比的步骤,
137
+ * 不弹差异弹窗,改用一个普通确认框替代「确定回滚」按钮,避免点击后无任何提示直接执行。
138
+ * 用户取消时返回 false,调用方据此中止回滚。
139
+ */
140
+ const confirmRevert = () => confirmHistoryAction("确定回滚该步骤吗?回滚会将该操作作为一条新记录反向应用(新增将被删除、删除将被还原),不影响后续历史记录。");
141
+ /**
142
+ * 「回滚」统一确认入口:可差异对比的步骤动态挂载 HistoryDiffDialog 走差异确认弹窗,
143
+ * 无法对比的步骤(add / remove / 多节点更新)回退到普通二次确认框。
144
+ * `extra` 供业务自有历史(如模块)透传自定义表单配置加载等渲染入参。
145
+ */
146
+ const runRevert = (payload, extra) => {
147
+ if (payload) return confirmRevertWithDiffDialog(payload, {
148
+ appContext,
149
+ extendState,
150
+ services,
151
+ ...extra,
152
+ width: extra?.width ?? dialogWidth,
153
+ size: extra?.size
154
+ });
155
+ return confirmRevert();
156
+ };
157
+ const buildPageDiffPayload = (index) => buildDiffPayload({
158
+ category: "node",
159
+ groups: () => services?.historyService.getHistoryGroups("page", services?.editorService.get("page")?.id) ?? [],
160
+ getCurrent: (id) => services?.editorService.getNodeById(id),
161
+ resolveType: (n, o) => n.type || o.type || "",
162
+ resolveLabel: (n, o) => n.name || o.name || n.type || o.type || ""
163
+ }, index);
164
+ const buildDataSourceDiffPayload = (id, index) => buildDiffPayload({
165
+ category: "data-source",
166
+ groups: () => services?.historyService.getHistoryGroups("dataSource") ?? [],
167
+ getCurrent: (id) => services?.dataSourceService.getDataSourceById(`${id}`),
168
+ resolveType: (n, o) => n.type || o.type || "base",
169
+ resolveLabel: (n, o, id) => n.title || o.title || `${id}`
170
+ }, index, id);
171
+ const buildCodeBlockDiffPayload = (id, index) => buildDiffPayload({
172
+ category: "code-block",
173
+ groups: () => services?.historyService.getHistoryGroups("codeBlock") ?? [],
174
+ getCurrent: (id) => services?.codeBlockService.getCodeContentById(id),
175
+ resolveLabel: (n, o, id) => n.name || o.name || `${id}`
176
+ }, index, id);
177
+ /**
178
+ * 回滚前置校验:若该历史步骤回滚所依赖的目标数据已被删除,则无法回滚。
179
+ * - update(把旧值写回):被修改的目标必须仍存在;
180
+ * - 页面 remove(还原被删节点):被删节点的原父容器必须仍存在,否则无处插回;
181
+ * add(回滚即删除)即使目标已不在,也已达成「删除」目的,不视为失败。
182
+ */
183
+ const isPageRevertTargetMissing = (index) => {
184
+ const step = services?.historyService.getStepList("page", services?.editorService.get("page")?.id)[index]?.step;
185
+ if (!step) return false;
186
+ if (step.opType === "update") return (step.diff ?? []).some((item) => {
187
+ const id = item.newSchema?.id ?? item.oldSchema?.id;
188
+ return id !== void 0 && !services?.editorService.getNodeById(id, false);
189
+ });
190
+ if (step.opType === "remove") return (step.diff ?? []).some((item) => item.parentId !== void 0 && !services?.editorService.getNodeById(item.parentId, false));
191
+ return false;
192
+ };
193
+ /** 数据源 update 步骤回滚时,对应数据源必须仍存在(已删除则无处写回旧值)。 */
194
+ const isDataSourceRevertTargetMissing = (id, index) => {
195
+ const step = services?.historyService.getStepList("dataSource", id)[index]?.step;
196
+ return Boolean(step?.opType === "update" && !services?.dataSourceService.getDataSourceById(`${id}`));
197
+ };
198
+ /** 代码块 update 步骤回滚时,对应代码块必须仍存在(已删除则无处写回旧值)。 */
199
+ const isCodeBlockRevertTargetMissing = (id, index) => {
200
+ const step = services?.historyService.getStepList("codeBlock", id)[index]?.step;
201
+ return Boolean(step?.opType === "update" && !services?.codeBlockService.getCodeContentById(id));
202
+ };
203
+ const onPageRevert = (index) => {
204
+ if (isPageRevertTargetMissing(index)) {
205
+ showRevertTargetMissing();
206
+ return Promise.resolve(null);
207
+ }
208
+ return runRevert(buildPageDiffPayload(index), { compareFormState: getPropsPanelFormState?.() }).then((result) => result ? services?.editorService.revertPageStep(index) : null);
209
+ };
210
+ const onDataSourceRevert = (id, index) => {
211
+ if (isDataSourceRevertTargetMissing(id, index)) {
212
+ showRevertTargetMissing();
213
+ return Promise.resolve(null);
214
+ }
215
+ return runRevert(buildDataSourceDiffPayload(id, index)).then((result) => result ? services?.dataSourceService.revert(id, index) : null);
216
+ };
217
+ const onCodeBlockRevert = (id, index) => {
218
+ if (isCodeBlockRevertTargetMissing(id, index)) {
219
+ showRevertTargetMissing();
220
+ return Promise.resolve(null);
221
+ }
222
+ return runRevert(buildCodeBlockDiffPayload(id, index)).then((result) => result ? services?.codeBlockService.revert(id, index) : null);
223
+ };
224
+ /**
225
+ * 「查看差异」:可差异对比的步骤(单实体 update)动态挂载只读 HistoryDiffDialog 展示前后值差异,
226
+ * 无可对比内容(add / remove / 多节点更新)时不弹窗、静默返回。
227
+ */
228
+ const onPageDiff = (index) => {
229
+ const payload = buildPageDiffPayload(index);
230
+ if (payload) return viewHistoryDiffDialog(payload, {
231
+ appContext,
232
+ extendState,
233
+ services,
234
+ width: dialogWidth,
235
+ compareFormState: getPropsPanelFormState?.()
236
+ });
237
+ };
238
+ const onDataSourceDiff = (id, index) => {
239
+ const payload = buildDataSourceDiffPayload(id, index);
240
+ if (payload) return viewHistoryDiffDialog(payload, {
241
+ appContext,
242
+ extendState,
243
+ services,
244
+ width: dialogWidth
245
+ });
246
+ };
247
+ const onCodeBlockDiff = (id, index) => {
248
+ const payload = buildCodeBlockDiffPayload(id, index);
249
+ if (payload) return viewHistoryDiffDialog(payload, {
250
+ appContext,
251
+ extendState,
252
+ services,
253
+ width: dialogWidth
254
+ });
255
+ };
256
+ /**
257
+ * 业务自有历史(如管理台「模块」)的「单步回滚」统一入口:
258
+ * 复用与页面/数据源/代码块一致的「目标校验 → 差异/二次确认弹窗 → 反向回滚」流程,
259
+ * 内置三类只是它的特例(各自预置了 buildXxxDiffPayload + service.revert)。
260
+ *
261
+ * 用户取消或前置校验未过时返回 null,确认并执行回滚后返回 `revert()` 的结果。
262
+ *
263
+ * ```ts
264
+ * await confirmAndRevert({
265
+ * diffPayload: oldSchema && newSchema ? { category: 'module', lastValue: oldSchema, value: newSchema, ... } : null,
266
+ * loadConfig: (ctx) => loadModFormConfig(modTypeId, values),
267
+ * selfDiffFieldTypes: ['mod-cond'],
268
+ * revert: () => moduleHistoryStore.revert(id, index),
269
+ * });
270
+ * ```
271
+ */
272
+ const confirmAndRevert = async (revertOptions) => {
273
+ if (revertOptions.isTargetMissing?.()) {
274
+ showRevertTargetMissing();
275
+ return null;
276
+ }
277
+ if (!await runRevert(revertOptions.diffPayload ?? null, {
278
+ loadConfig: revertOptions.loadConfig,
279
+ selfDiffFieldTypes: revertOptions.selfDiffFieldTypes,
280
+ width: revertOptions.width,
281
+ size: revertOptions.size
282
+ })) return null;
283
+ return await revertOptions.revert();
284
+ };
285
+ /**
286
+ * 业务自有历史的「查看差异」统一入口:传入自行构造的差异入参即弹出只读差异弹窗,
287
+ * 可透传 `loadConfig` / `selfDiffFieldTypes`。payload 为 null(不可对比)时静默返回。
288
+ */
289
+ const viewDiff = (payload, extra) => {
290
+ if (payload) return viewHistoryDiffDialog(payload, {
291
+ appContext,
292
+ extendState,
293
+ services,
294
+ ...extra,
295
+ width: extra?.width ?? dialogWidth,
296
+ size: extra?.size
297
+ });
298
+ };
299
+ return {
300
+ onPageRevert,
301
+ onDataSourceRevert,
302
+ onCodeBlockRevert,
303
+ onPageDiff,
304
+ onDataSourceDiff,
305
+ onCodeBlockDiff,
306
+ buildPageDiffPayload,
307
+ buildDataSourceDiffPayload,
308
+ buildCodeBlockDiffPayload,
309
+ isPageRevertTargetMissing,
310
+ isDataSourceRevertTargetMissing,
311
+ isCodeBlockRevertTargetMissing,
312
+ confirmAndRevert,
313
+ viewDiff
314
+ };
315
+ };
316
+ //#endregion
317
+ export { useHistoryRevert };
@@ -16,7 +16,7 @@ var _hoisted_2 = {
16
16
  key: 1,
17
17
  style: { "width": "21px" }
18
18
  };
19
- var AddButton_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
19
+ var AddButton_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
20
20
  name: "MEditorPageBarAddButton",
21
21
  __name: "AddButton",
22
22
  setup(__props) {