@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,24 +1,24 @@
1
1
  import { useServices } from "../../hooks/use-services.js";
2
2
  import Icon_default from "../../components/Icon.js";
3
- import { useHistoryList } from "./composables.js";
4
- import CodeBlockTab_default from "./CodeBlockTab.js";
5
- import DataSourceTab_default from "./DataSourceTab.js";
6
- import HistoryDiffDialog_default from "./HistoryDiffDialog.js";
3
+ import { confirmHistoryAction, describeStep, isSingleDiffStepRevertable } from "./composables.js";
4
+ import BucketTab_default from "./BucketTab.js";
7
5
  import PageTab_default from "./PageTab.js";
8
- import { TMagicButton, TMagicPopover, TMagicTabs, TMagicTooltip, getDesignConfig } from "@tmagic/design";
9
- import { Fragment, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, inject, markRaw, normalizeProps, openBlock, ref, resolveDynamicComponent, unref, useTemplateRef, withCtx } from "vue";
6
+ import { useHistoryList } from "./useHistoryList.js";
7
+ import { useHistoryRevert } from "./useHistoryRevert.js";
8
+ import { TMagicButton, TMagicPopover, TMagicTabs, TMagicTooltip, getDesignConfig, tMagicMessage } from "@tmagic/design";
9
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, inject, markRaw, mergeProps, normalizeProps, openBlock, ref, renderList, resolveDynamicComponent, toHandlers, unref, watch, withCtx } from "vue";
10
10
  import { Clock, Close } from "@element-plus/icons-vue";
11
11
  //#region packages/editor/src/layouts/history-list/HistoryListPanel.vue?vue&type=script&setup=true&lang.ts
12
12
  var _hoisted_1 = { class: "m-editor-history-list" };
13
- var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
13
+ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
14
14
  name: "MEditorHistoryListPanel",
15
15
  __name: "HistoryListPanel",
16
16
  setup(__props) {
17
17
  /**
18
18
  * 历史记录面板:在顶部 NavMenu 上点击图标打开 popover,分三个 tab:
19
19
  * - 页面:当前活动页面的历史栈,连续修改同一节点的多步会被合并成一组
20
- * - 数据源:以 dataSource.id 分组,每组内部相邻的连续 update 自动合并
21
- * - 代码块:同上,按 codeBlock.id 分组并合并相邻 update
20
+ * - 数据源:以 dataSource.id 分桶,每条操作记录独立展示
21
+ * - 代码块:同上,按 codeBlock.id 分桶,每条操作记录独立展示
22
22
  *
23
23
  * 数据通过 historyService 暴露的聚合 API 读取,UI 仅用于只读展示,
24
24
  * 同时支持点击任意一条记录跳转至该状态:
@@ -31,28 +31,103 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
31
31
  * 此外每条 step 上提供"查看差异"入口(仅在前后值都存在的 update 步骤显示),
32
32
  * 点击后弹出 HistoryDiffDialog,使用 CompareForm 组件以表单形式展示新旧值差异。
33
33
  *
34
- * 各 tab 的内容拆分为独立的 SFCPageTab / DataSourceTab / CodeBlockTab),
34
+ * 各 tab 的内容拆分为独立的 SFC:页面用 PageTab,数据源 / 代码块复用通用的 BucketTab
35
+ * (通过 title / prefix / describe* / isStepDiffable 注入差异)。
35
36
  * 共享的描述生成与折叠状态在 composables.ts 中维护。
36
37
  */
37
38
  const ClockIcon = markRaw(Clock);
38
39
  const CloseIcon = markRaw(Close);
39
40
  const activeTab = ref("page");
40
- /** 面板显隐受控:reference 图标点击切换,右上角关闭按钮置为 false。 */
41
+ /**
42
+ * 面板显隐受控:reference 图标点击切换,右上角关闭按钮置为 false。
43
+ * 点击面板以外区域的自动收起由 TMagicPopover 通过 v-model:visible 回写完成。
44
+ */
41
45
  const visible = ref(false);
42
46
  const tabPaneComponent = getDesignConfig("components")?.tabPane;
43
- const { editorService, dataSourceService, codeBlockService, historyService } = useServices();
47
+ /**
48
+ * 业务方自定义的扩展 tab,由 Editor 顶层通过 `historyListExtraTabs` 注入。
49
+ * 追加在内置「页面 / 数据源 / 代码块」三个 tab 之后,未提供时为空数组。
50
+ */
51
+ const extraTabs = inject("historyListExtraTabs", []);
52
+ /** label 支持字符串或函数,函数形式便于展示动态数量等内容。 */
53
+ const resolveTabLabel = (tab) => typeof tab.label === "function" ? tab.label() : tab.label;
54
+ const services = useServices();
55
+ const { editorService, dataSourceService, codeBlockService, historyService, propsService, stageOverlayService } = services;
56
+ /**
57
+ * 数据源 / 代码块功能可被业务方通过 `disabledDataSource` / `disabledCodeBlock` 禁用,
58
+ * 禁用后对应的历史记录 tab 不再展示。若当前激活的 tab 恰好被禁用,则回退到「页面」tab。
59
+ */
60
+ const disabledDataSource = computed(() => propsService.getDisabledDataSource());
61
+ const disabledCodeBlock = computed(() => propsService.getDisabledCodeBlock());
62
+ watch([disabledDataSource, disabledCodeBlock], ([dsDisabled, cbDisabled]) => {
63
+ if (activeTab.value === "data-source" && dsDisabled || activeTab.value === "code-block" && cbDisabled) activeTab.value = "page";
64
+ });
44
65
  /**
45
66
  * 通过 inject 拿到 Editor 顶层注入的 `extendFormState`,转交给 HistoryDiffDialog
46
67
  * 内部的 CompareForm,使差异对比表单的 filterFunction 能拿到完整的业务上下文。
47
68
  * 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
48
69
  */
49
70
  const extendFormState = inject("extendFormState", void 0);
71
+ const getPropsPanelFormState = inject("getPropsPanelFormState", void 0);
50
72
  const { expanded, toggleGroup, pageGroups, dataSourceGroups, codeBlockGroups, pageGroupsDisplay, dataSourceGroupsByTarget, codeBlockGroupsByTarget } = useHistoryList();
73
+ /**
74
+ * 当前活动页的「加载/初始」标记记录(设置 root 时生成),透传给 PageTab 的底部初始行展示。
75
+ * 基于 historyService 的 reactive state 派生,活动页切换或标记写入后自动刷新。
76
+ */
77
+ const pageMarker = computed(() => historyService.getMarker("page", editorService.get("page")?.id));
78
+ /**
79
+ * 各历史类型的展示名称(页面 / 数据源 / 代码块),由 historyService.state.stepNames 配置,
80
+ * 业务方可通过 historyService.setStepName / registerStepType 覆盖。基于 reactive state 派生,配置变更后自动刷新。
81
+ */
82
+ const pageName = computed(() => historyService.getStepName("page"));
83
+ const dataSourceName = computed(() => historyService.getStepName("dataSource"));
84
+ const codeBlockName = computed(() => historyService.getStepName("codeBlock"));
85
+ /** 代码块 step 仅 update(前后 content 都存在)时可查看差异。 */
86
+ const isStepDiffable = (step) => Boolean(step.diff?.[0]?.oldSchema && step.diff?.[0]?.newSchema);
87
+ /**
88
+ * 数据源 / 代码块两类 bucket 历史的整体渲染配置:把 title / prefix 与各自的描述、
89
+ * 可差异、可回滚判定收敛为单一对象整体注入 BucketTab,组件内部按需读取。
90
+ * title / 描述回退名取自可配置的展示名称,故用 computed 使其随 stepNames 变更刷新。
91
+ */
92
+ const dataSourceConfig = computed(() => ({
93
+ title: dataSourceName.value,
94
+ prefix: "ds",
95
+ describeStep: (step) => describeStep(step, (schema) => schema?.title, dataSourceName.value),
96
+ isStepDiffable,
97
+ isStepRevertable: isSingleDiffStepRevertable
98
+ }));
99
+ const codeBlockConfig = computed(() => ({
100
+ title: codeBlockName.value,
101
+ prefix: "cb",
102
+ describeStep: (step) => describeStep(step, (content) => content?.name, codeBlockName.value),
103
+ isStepDiffable,
104
+ isStepRevertable: isSingleDiffStepRevertable
105
+ }));
51
106
  /** 把"目标 step 索引"翻译成"目标 cursor"(已应用步骤数量)。 */
52
107
  const indexToCursor = (index) => index + 1;
53
108
  const onPageGoto = (index) => {
54
109
  editorService.gotoPageStep(indexToCursor(index));
55
110
  };
111
+ /**
112
+ * 点击页面历史记录行:选中该记录对应的画布节点。
113
+ * - 从目标 step 的 diff 中取节点 id(优先 newSchema,回退 oldSchema),按出现顺序找到第一个当前仍存在的节点;
114
+ * - 与图层树点击选中一致:editorService.select + 画布 / overlay 画布 select 三者联动;
115
+ * - 该 step 涉及的节点都已不存在(如删除记录、被撤销的新增)时给出提示,不做选中。
116
+ */
117
+ const onPageSelect = async (index) => {
118
+ const step = historyService.getStepList("page", editorService.get("page")?.id)[index]?.step;
119
+ if (!step) return;
120
+ const targetId = (step.diff ?? []).map((item) => item.newSchema?.id ?? item.oldSchema?.id).find((id) => id !== void 0 && id !== null && editorService.getNodeById(id, false));
121
+ if (targetId === void 0 || targetId === null) {
122
+ tMagicMessage.warning("该记录对应的节点已不存在,无法选中");
123
+ return;
124
+ }
125
+ const node = editorService.getNodeById(targetId, false);
126
+ if (!node) return;
127
+ await editorService.select(node);
128
+ editorService.get("stage")?.select(targetId);
129
+ stageOverlayService.get("stage")?.select(targetId);
130
+ };
56
131
  const onDataSourceGoto = (id, index) => {
57
132
  dataSourceService.goto(id, indexToCursor(index));
58
133
  };
@@ -73,93 +148,49 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
73
148
  codeBlockService.goto(id, 0);
74
149
  };
75
150
  /**
76
- * 「回滚」入口:把目标历史步骤的修改作为一次新操作反向应用(类 git revert),
77
- * 不破坏原有栈结构。各 service 内部完成反向 + 入栈,并自带描述用于面板展示。
151
+ * 「单步回滚」与「查看差异」的完整逻辑收敛到 useHistoryRevert,面板与业务方共用:
152
+ * 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
153
+ * 业务方亦可直接 import useHistoryRevert(options, services) 调用,无需自行挂载任何弹窗。
78
154
  */
79
- const onPageRevert = (index) => {
80
- editorService.revertPageStep(index);
81
- };
82
- const onDataSourceRevert = (id, index) => {
83
- dataSourceService.revert(id, index);
84
- };
85
- const onCodeBlockRevert = (id, index) => {
86
- codeBlockService.revert(id, index);
87
- };
88
- const diffDialogRef = useTemplateRef("diffDialog");
155
+ const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert({
156
+ extendState: extendFormState,
157
+ getPropsPanelFormState
158
+ }, services);
89
159
  /**
90
- * 页面 step 差异:仅 update 单节点修改可对比,传入旧/新节点。
91
- * 节点类型 `type` 优先取 newNode.type,再回退 oldNode.type。
92
- * `currentValue` 取自 editorService 中该节点当前实际值,用于支持「与当前对比」。
160
+ * 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,
161
+ * 使本地持久化的那份与内存保持一致——即「连同本地保存的一并删除」。
162
+ * 不支持 IndexedDB 或写入失败时静默忽略(内存清空已生效)。
93
163
  */
94
- const onPageDiff = (index) => {
95
- const groups = historyService.getPageHistoryGroups();
96
- for (const group of groups) {
97
- const entry = group.steps.find((s) => s.index === index);
98
- if (!entry) continue;
99
- const item = entry.step.updatedItems?.[0];
100
- if (!item?.oldNode || !item?.newNode) return;
101
- const type = item.newNode.type || item.oldNode.type || "";
102
- const nodeId = item.newNode.id ?? item.oldNode.id;
103
- const currentNode = nodeId !== void 0 ? editorService.getNodeById(nodeId) : null;
104
- diffDialogRef.value?.open({
105
- category: "node",
106
- type,
107
- lastValue: item.oldNode,
108
- value: item.newNode,
109
- currentValue: currentNode || null,
110
- targetLabel: item.newNode.name || item.oldNode.name || type,
111
- id: nodeId
112
- });
113
- return;
164
+ const syncIndexedDB = async () => {
165
+ try {
166
+ await historyService.saveToIndexedDB();
167
+ } catch (e) {}
168
+ };
169
+ const onPageClear = async () => {
170
+ if (await confirmHistoryAction("确定清空当前页面的历史记录吗?清空后将无法撤销/重做之前的操作,本地保存的记录也会一并删除。")) {
171
+ historyService.clear("page", editorService.get("page")?.id);
172
+ await syncIndexedDB();
114
173
  }
115
174
  };
116
- const onDataSourceDiff = (id, index) => {
117
- const groups = historyService.getDataSourceHistoryGroups();
118
- for (const group of groups) {
119
- if (group.id !== id) continue;
120
- const entry = group.steps.find((s) => s.index === index);
121
- if (!entry) continue;
122
- const { oldSchema, newSchema } = entry.step;
123
- if (!oldSchema || !newSchema) return;
124
- const currentSchema = dataSourceService.getDataSourceById(`${id}`);
125
- diffDialogRef.value?.open({
126
- category: "data-source",
127
- type: newSchema.type || oldSchema.type || "base",
128
- lastValue: oldSchema,
129
- value: newSchema,
130
- currentValue: currentSchema || null,
131
- targetLabel: newSchema.title || oldSchema.title || `${id}`,
132
- id
133
- });
134
- return;
175
+ const onDataSourceClear = async () => {
176
+ if (await confirmHistoryAction("确定清空数据源的历史记录吗?清空后将无法撤销/重做之前的操作,本地保存的记录也会一并删除。")) {
177
+ historyService.clear("dataSource");
178
+ await syncIndexedDB();
135
179
  }
136
180
  };
137
- const onCodeBlockDiff = (id, index) => {
138
- const groups = historyService.getCodeBlockHistoryGroups();
139
- for (const group of groups) {
140
- if (group.id !== id) continue;
141
- const entry = group.steps.find((s) => s.index === index);
142
- if (!entry) continue;
143
- const { oldContent, newContent } = entry.step;
144
- if (!oldContent || !newContent) return;
145
- const currentContent = codeBlockService.getCodeContentById(id);
146
- diffDialogRef.value?.open({
147
- category: "code-block",
148
- lastValue: oldContent,
149
- value: newContent,
150
- currentValue: currentContent || null,
151
- targetLabel: newContent.name || oldContent.name || `${id}`,
152
- id
153
- });
154
- return;
181
+ const onCodeBlockClear = async () => {
182
+ if (await confirmHistoryAction("确定清空代码块的历史记录吗?清空后将无法撤销/重做之前的操作,本地保存的记录也会一并删除。")) {
183
+ historyService.clear("codeBlock");
184
+ await syncIndexedDB();
155
185
  }
156
186
  };
157
187
  return (_ctx, _cache) => {
158
- return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(TMagicPopover), {
188
+ return openBlock(), createBlock(unref(TMagicPopover), {
159
189
  "popper-class": "m-editor-history-list-popover",
160
190
  placement: "bottom",
161
191
  trigger: "click",
162
192
  visible: visible.value,
193
+ "onUpdate:visible": _cache[3] || (_cache[3] = ($event) => visible.value = $event),
163
194
  width: 660
164
195
  }, {
165
196
  reference: withCtx(() => [createVNode(unref(TMagicTooltip), {
@@ -200,69 +231,95 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
200
231
  default: withCtx(() => [
201
232
  (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(guardReactiveProps(unref(tabPaneComponent)?.props({
202
233
  name: "page",
203
- label: `页面 (${unref(pageGroups).length})`
234
+ label: `${pageName.value} (${unref(pageGroups).length})`,
235
+ lazy: true
204
236
  }) || {})), {
205
237
  default: withCtx(() => [createVNode(PageTab_default, {
206
238
  list: unref(pageGroupsDisplay),
207
239
  expanded: unref(expanded),
240
+ marker: pageMarker.value,
208
241
  onToggle: unref(toggleGroup),
209
242
  onGoto: onPageGoto,
210
243
  onGotoInitial: onPageGotoInitial,
211
- onDiffStep: onPageDiff,
212
- onRevertStep: onPageRevert
244
+ onDiffStep: unref(onPageDiff),
245
+ onRevertStep: unref(onPageRevert),
246
+ onSelect: onPageSelect,
247
+ onClear: onPageClear
213
248
  }, null, 8, [
214
249
  "list",
215
250
  "expanded",
216
- "onToggle"
251
+ "marker",
252
+ "onToggle",
253
+ "onDiffStep",
254
+ "onRevertStep"
217
255
  ])]),
218
256
  _: 1
219
257
  }, 16)),
220
- (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(guardReactiveProps(unref(tabPaneComponent)?.props({
258
+ !disabledDataSource.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 0 }, unref(tabPaneComponent)?.props({
221
259
  name: "data-source",
222
- label: `数据源 (${unref(dataSourceGroups).length})`
260
+ label: `${dataSourceName.value} (${unref(dataSourceGroups).length})`,
261
+ lazy: true
223
262
  }) || {})), {
224
- default: withCtx(() => [createVNode(DataSourceTab_default, {
263
+ default: withCtx(() => [createVNode(BucketTab_default, {
264
+ config: dataSourceConfig.value,
225
265
  buckets: unref(dataSourceGroupsByTarget),
226
266
  expanded: unref(expanded),
227
267
  onToggle: unref(toggleGroup),
228
268
  onGoto: onDataSourceGoto,
229
269
  onGotoInitial: onDataSourceGotoInitial,
230
- onDiffStep: onDataSourceDiff,
231
- onRevertStep: onDataSourceRevert
270
+ onDiffStep: unref(onDataSourceDiff),
271
+ onRevertStep: unref(onDataSourceRevert),
272
+ onClear: onDataSourceClear
232
273
  }, null, 8, [
274
+ "config",
233
275
  "buckets",
234
276
  "expanded",
235
- "onToggle"
277
+ "onToggle",
278
+ "onDiffStep",
279
+ "onRevertStep"
236
280
  ])]),
237
281
  _: 1
238
- }, 16)),
239
- (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(guardReactiveProps(unref(tabPaneComponent)?.props({
282
+ }, 16)) : createCommentVNode("v-if", true),
283
+ !disabledCodeBlock.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 1 }, unref(tabPaneComponent)?.props({
240
284
  name: "code-block",
241
- label: `代码块 (${unref(codeBlockGroups).length})`
285
+ label: `${codeBlockName.value} (${unref(codeBlockGroups).length})`,
286
+ lazy: true
242
287
  }) || {})), {
243
- default: withCtx(() => [createVNode(CodeBlockTab_default, {
288
+ default: withCtx(() => [createVNode(BucketTab_default, {
289
+ config: codeBlockConfig.value,
244
290
  buckets: unref(codeBlockGroupsByTarget),
245
291
  expanded: unref(expanded),
246
292
  onToggle: unref(toggleGroup),
247
293
  onGoto: onCodeBlockGoto,
248
294
  onGotoInitial: onCodeBlockGotoInitial,
249
- onDiffStep: onCodeBlockDiff,
250
- onRevertStep: onCodeBlockRevert
295
+ onDiffStep: unref(onCodeBlockDiff),
296
+ onRevertStep: unref(onCodeBlockRevert),
297
+ onClear: onCodeBlockClear
251
298
  }, null, 8, [
299
+ "config",
252
300
  "buckets",
253
301
  "expanded",
254
- "onToggle"
302
+ "onToggle",
303
+ "onDiffStep",
304
+ "onRevertStep"
255
305
  ])]),
256
306
  _: 1
257
- }, 16))
307
+ }, 16)) : createCommentVNode("v-if", true),
308
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(extraTabs), (tab) => {
309
+ return openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), mergeProps({ key: tab.name }, { ref_for: true }, unref(tabPaneComponent)?.props({
310
+ name: tab.name,
311
+ label: resolveTabLabel(tab),
312
+ lazy: true
313
+ }) || {}), {
314
+ default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tab.component), mergeProps({ ref_for: true }, tab.props || {}, toHandlers(tab.listeners || {})), null, 16))]),
315
+ _: 2
316
+ }, 1040);
317
+ }), 128))
258
318
  ]),
259
319
  _: 1
260
320
  }, 8, ["modelValue"])])]),
261
321
  _: 1
262
- }, 8, ["visible"]), createVNode(HistoryDiffDialog_default, {
263
- ref: "diffDialog",
264
- "extend-state": unref(extendFormState)
265
- }, null, 8, ["extend-state"])], 64);
322
+ }, 8, ["visible"]);
266
323
  };
267
324
  }
268
325
  });
@@ -1,24 +1,50 @@
1
- import { createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock } from "vue";
1
+ import { formatHistoryFullTime, formatHistoryTime } from "./composables.js";
2
+ import { computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, toDisplayString, withModifiers } from "vue";
2
3
  //#region packages/editor/src/layouts/history-list/InitialRow.vue?vue&type=script&setup=true&lang.ts
3
4
  var _hoisted_1 = ["title"];
4
- var _hoisted_2 = {
5
+ var _hoisted_2 = { class: "m-editor-history-list-item-desc" };
6
+ var _hoisted_3 = {
5
7
  key: 0,
6
- class: "m-editor-history-list-item-current"
8
+ class: "m-editor-history-list-item-saved",
9
+ title: "该记录为最近一次保存的状态"
7
10
  };
8
- var InitialRow_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
11
+ var _hoisted_4 = {
12
+ key: 1,
13
+ class: "m-editor-history-list-item-actions"
14
+ };
15
+ var _hoisted_5 = ["title"];
16
+ var InitialRow_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
17
  name: "MEditorHistoryListInitialRow",
10
18
  __name: "InitialRow",
11
- props: { isCurrent: { type: Boolean } },
19
+ props: {
20
+ isCurrent: { type: Boolean },
21
+ gotoEnabled: {
22
+ type: Boolean,
23
+ default: true
24
+ },
25
+ marker: { default: void 0 }
26
+ },
12
27
  emits: ["goto-initial"],
13
28
  setup(__props, { emit: __emit }) {
14
29
  /**
15
30
  * 「初始状态」记录行:渲染于历史列表底部,作为整个栈的"零点"。
16
31
  * - 点击该行会把对应栈撤销到 cursor === 0(即没有任何已应用步骤),等同于回到所有修改之前。
17
32
  * - 当对应栈本身已处于 cursor === 0 时(isCurrent=true),用户已在初始状态,点击不再触发动作。
33
+ * - 当上层传入 `marker`(设置 root 时为该页生成的「未修改的初始状态」标记)时,
34
+ * 用标记的文案与时间渲染本行;标记不进入撤销/重做栈,仅作为该页基线展示。
18
35
  *
19
36
  * 该行不是真实 step,仅作为 UI 入口;上层负责把"点击"翻译为 `service.goto*(0)`。
20
37
  */
21
38
  const props = __props;
39
+ const desc = computed(() => props.marker?.historyDescription || "未修改的初始状态");
40
+ /** 基线(初始状态)是否为最近一次保存点:仅页面栈的 `initial` 基线 step 会被 markSaved 标记。 */
41
+ const saved = computed(() => Boolean(props.marker?.saved));
42
+ const time = computed(() => formatHistoryTime(props.marker?.timestamp));
43
+ const timeTitle = computed(() => formatHistoryFullTime(props.marker?.timestamp));
44
+ const rowTitle = computed(() => {
45
+ const base = props.marker?.historyDescription || "未修改的初始状态";
46
+ return props.isCurrent ? `当前已回到${base}` : `点击回到${base}`;
47
+ });
22
48
  const emit = __emit;
23
49
  const onClick = () => {
24
50
  if (props.isCurrent) return;
@@ -30,16 +56,25 @@ var InitialRow_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
30
56
  "is-current": __props.isCurrent,
31
57
  "is-clickable": !__props.isCurrent
32
58
  }]),
33
- title: __props.isCurrent ? "当前已回到未修改的初始状态" : "点击回到未修改的初始状态",
34
- onClick
59
+ title: rowTitle.value
35
60
  }, [
36
61
  _cache[0] || (_cache[0] = createElementVNode("span", {
37
62
  class: "m-editor-history-list-item-index",
38
63
  title: "历史步骤编号 #0(未修改的初始状态)"
39
64
  }, "#0", -1)),
40
65
  _cache[1] || (_cache[1] = createElementVNode("span", { class: "m-editor-history-list-item-op op-initial" }, "初始", -1)),
41
- _cache[2] || (_cache[2] = createElementVNode("span", { class: "m-editor-history-list-item-desc" }, "未修改的初始状态", -1)),
42
- __props.isCurrent ? (openBlock(), createElementBlock("span", _hoisted_2, "当前")) : createCommentVNode("v-if", true)
66
+ createElementVNode("span", _hoisted_2, toDisplayString(desc.value), 1),
67
+ saved.value ? (openBlock(), createElementBlock("span", _hoisted_3, "已保存")) : createCommentVNode("v-if", true),
68
+ __props.gotoEnabled && !__props.isCurrent ? (openBlock(), createElementBlock("span", _hoisted_4, [createElementVNode("span", {
69
+ class: "m-editor-history-list-item-goto",
70
+ title: "回到该记录",
71
+ onClick: withModifiers(onClick, ["stop"])
72
+ }, "回到")])) : createCommentVNode("v-if", true),
73
+ time.value ? (openBlock(), createElementBlock("span", {
74
+ key: 2,
75
+ class: "m-editor-history-list-item-time",
76
+ title: timeTitle.value
77
+ }, toDisplayString(time.value), 9, _hoisted_5)) : createCommentVNode("v-if", true)
43
78
  ], 10, _hoisted_1);
44
79
  };
45
80
  }
@@ -1,4 +1,4 @@
1
- import { describePageGroup, describePageStep } from "./composables.js";
1
+ import { describePageGroup, describePageStep, isHistoryGroupExpanded, isPageStepRevertable, toRowGroup } from "./composables.js";
2
2
  import GroupRow_default from "./GroupRow.js";
3
3
  import InitialRow_default from "./InitialRow.js";
4
4
  import { TMagicScrollbar } from "@tmagic/design";
@@ -8,90 +8,86 @@ var _hoisted_1 = {
8
8
  key: 0,
9
9
  class: "m-editor-history-list-empty"
10
10
  };
11
- var _hoisted_2 = { class: "m-editor-history-list-ul" };
12
- var PageTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
11
+ var _hoisted_2 = {
12
+ key: 0,
13
+ class: "m-editor-history-list-toolbar"
14
+ };
15
+ var _hoisted_3 = { class: "m-editor-history-list-ul" };
16
+ var PageTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
13
17
  name: "MEditorHistoryListPageTab",
14
18
  __name: "PageTab",
15
19
  props: {
16
20
  list: {},
17
- expanded: {}
21
+ expanded: {},
22
+ marker: {}
18
23
  },
19
24
  emits: [
20
25
  "toggle",
21
26
  "goto",
22
27
  "goto-initial",
23
28
  "diff-step",
24
- "revert-step"
29
+ "revert-step",
30
+ "select",
31
+ "clear"
25
32
  ],
26
33
  setup(__props) {
27
34
  const props = __props;
28
35
  /**
29
36
  * 当前 step 是否可查看差异:
30
37
  * - 仅 update 操作;
31
- * - 单节点更新(updatedItems.length === 1),且 oldNode / newNode 都存在。
38
+ * - 单节点更新(diff.length === 1),且 oldSchema / newSchema 都存在。
32
39
  * 多节点更新难以选定单一对比目标,统一不展示差异入口。
33
40
  */
34
41
  const isPageStepDiffable = (step) => {
35
42
  if (step.opType !== "update") return false;
36
- const items = step.updatedItems ?? [];
43
+ const items = step.diff ?? [];
37
44
  if (items.length !== 1) return false;
38
- return Boolean(items[0]?.oldNode && items[0]?.newNode);
45
+ return Boolean(items[0]?.oldSchema && items[0]?.newSchema);
46
+ };
47
+ /** 页面历史的描述 / 可操作性判定集合,注入给统一的 `toRowGroup`。 */
48
+ const descriptor = {
49
+ describeGroup: describePageGroup,
50
+ describeStep: describePageStep,
51
+ isStepDiffable: isPageStepDiffable,
52
+ isStepRevertable: isPageStepRevertable
39
53
  };
54
+ const rowKey = (group) => `pg-${group.steps[0]?.index}`;
55
+ const toRow = (group) => toRowGroup(group, rowKey(group), descriptor);
40
56
  /**
41
57
  * 是否处于"初始状态"——即对应页面历史栈 cursor===0:
42
- * 当 list 中所有 group 的 applied 都为 false 时即为该状态。
43
- * 没有任何 group 的情况由外层"暂无操作记录"分支兜底,本计算可以不考虑。
58
+ * 当 list 中所有 group 的 applied 都为 false 时即为该状态(空列表 `every` 返回 true,
59
+ * 即仅有 marker、无任何操作记录时也视为处于初始状态)。
44
60
  */
45
- const isInitial = computed(() => props.list.length > 0 && props.list.every((g) => !g.applied));
61
+ const isInitial = computed(() => props.list.every((g) => !g.applied));
46
62
  return (_ctx, _cache) => {
47
- return !__props.list.length ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createBlock(unref(TMagicScrollbar), {
48
- key: 1,
49
- "max-height": "360px"
50
- }, {
51
- default: withCtx(() => [createElementVNode("ul", _hoisted_2, [
52
- (openBlock(true), createElementBlock(Fragment, null, renderList(__props.list, (group, gIdx) => {
63
+ return !__props.list.length && !__props.marker ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [__props.list.length ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("span", {
64
+ class: "m-editor-history-list-clear",
65
+ title: "清空当前页面的历史记录",
66
+ onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("clear"))
67
+ }, "清空")])) : createCommentVNode("v-if", true), createVNode(unref(TMagicScrollbar), { "max-height": "360px" }, {
68
+ default: withCtx(() => [createElementVNode("ul", _hoisted_3, [
69
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.list, (group) => {
53
70
  return openBlock(), createBlock(GroupRow_default, {
54
- key: `pg-${gIdx}`,
55
- "group-key": `pg-${gIdx}`,
56
- applied: group.applied,
57
- merged: group.steps.length > 1,
58
- "op-type": group.opType,
59
- desc: unref(describePageGroup)(group),
60
- "step-count": group.steps.length,
61
- "sub-steps": group.steps.map((s) => ({
62
- index: s.index,
63
- applied: s.applied,
64
- isCurrent: s.isCurrent,
65
- desc: unref(describePageStep)(s.step),
66
- diffable: isPageStepDiffable(s.step),
67
- revertable: s.applied
68
- })),
69
- "is-current": group.isCurrent,
70
- expanded: !!__props.expanded[`pg-${gIdx}`],
71
- onToggle: _cache[0] || (_cache[0] = (key) => _ctx.$emit("toggle", key)),
72
- onGoto: _cache[1] || (_cache[1] = (index) => _ctx.$emit("goto", index)),
73
- onDiffStep: _cache[2] || (_cache[2] = (index) => _ctx.$emit("diff-step", index)),
74
- onRevertStep: _cache[3] || (_cache[3] = (index) => _ctx.$emit("revert-step", index))
75
- }, null, 8, [
76
- "group-key",
77
- "applied",
78
- "merged",
79
- "op-type",
80
- "desc",
81
- "step-count",
82
- "sub-steps",
83
- "is-current",
84
- "expanded"
85
- ]);
71
+ key: rowKey(group),
72
+ group: toRow(group),
73
+ expanded: unref(isHistoryGroupExpanded)(__props.expanded, rowKey(group)),
74
+ "select-enabled": true,
75
+ onToggle: _cache[1] || (_cache[1] = (key) => _ctx.$emit("toggle", key)),
76
+ onGoto: _cache[2] || (_cache[2] = (index) => _ctx.$emit("goto", index)),
77
+ onDiffStep: _cache[3] || (_cache[3] = (index) => _ctx.$emit("diff-step", index)),
78
+ onRevertStep: _cache[4] || (_cache[4] = (index) => _ctx.$emit("revert-step", index)),
79
+ onSelect: _cache[5] || (_cache[5] = (index) => _ctx.$emit("select", index))
80
+ }, null, 8, ["group", "expanded"]);
86
81
  }), 128)),
87
- createCommentVNode("\n 初始状态项:永远位于列表底部(页面 tab 倒序展示,最底部=最早),\n 作为\"未修改\"零点。当所有 group 都未 applied 时它即为当前位置。\n "),
82
+ createCommentVNode("\n 初始状态项:永远位于列表底部(页面 tab 倒序展示,最底部=最早),\n 作为\"未修改\"零点。当所有 group 都未 applied 时它即为当前位置。\n 设置 root 时生成的「未修改的初始状态」标记(marker)会作为该行的文案与时间来源。\n "),
88
83
  createVNode(InitialRow_default, {
89
84
  "is-current": isInitial.value,
90
- onGotoInitial: _cache[4] || (_cache[4] = ($event) => _ctx.$emit("goto-initial"))
91
- }, null, 8, ["is-current"])
85
+ marker: __props.marker,
86
+ onGotoInitial: _cache[6] || (_cache[6] = ($event) => _ctx.$emit("goto-initial"))
87
+ }, null, 8, ["is-current", "marker"])
92
88
  ])]),
93
89
  _: 1
94
- }));
90
+ })], 64));
95
91
  };
96
92
  }
97
93
  });