@tmagic/editor 1.8.0-beta.2 → 1.8.0-beta.20
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.
- package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +43 -9
- package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +8 -4
- package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +22 -98
- package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +32 -9
- package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +68 -17
- package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ScrollBar.js +0 -1
- package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ViewForm.js +5 -0
- package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +58 -0
- package/dist/es/editorProps.js +9 -1
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +16 -5
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +81 -44
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +10 -3
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
- package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +13 -6
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +11 -8
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +39 -12
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +11 -20
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +11 -6
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +30 -14
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +11 -4
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +38 -6
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +151 -153
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +8 -10
- package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +28 -6
- package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
- package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +7 -7
- package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +6 -3
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +29 -6
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +32 -6
- package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
- package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +11 -3
- package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +11 -3
- package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +11 -3
- package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +11 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +17 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +19 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +19 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +37 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +33 -3
- package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
- package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
- package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
- package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +56 -30
- package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +7 -4
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +35 -26
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +76 -48
- package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -23
- package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +7 -4
- package/dist/es/fields/UISelect.js +0 -1
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/hooks/use-code-block-edit.js +6 -3
- package/dist/es/hooks/use-compare-form.js +119 -0
- package/dist/es/hooks/use-data-source-edit.js +5 -2
- package/dist/es/hooks/use-stage.js +9 -4
- package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/icons/DatasourceIcon.js +17 -0
- package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/index.js +24 -10
- package/dist/es/initService.js +19 -13
- package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +24 -12
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +25 -18
- package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +25 -38
- package/dist/es/layouts/history-list/BucketTab.js +5 -0
- package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +177 -88
- package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +139 -37
- package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +164 -107
- package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +44 -9
- package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +49 -53
- package/dist/es/layouts/history-list/composables.js +138 -108
- package/dist/es/layouts/history-list/useHistoryList.js +56 -0
- package/dist/es/layouts/history-list/useHistoryRevert.js +317 -0
- package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
- package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -7
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +33 -13
- package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
- package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +26 -38
- package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
- package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +23 -6
- package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +27 -5
- package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
- package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
- package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
- package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
- package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
- package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
- package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/es/plugin.js +5 -2
- package/dist/es/services/codeBlock.js +137 -56
- package/dist/es/services/dataSource.js +122 -52
- package/dist/es/services/dep.js +162 -41
- package/dist/es/services/editor.js +613 -179
- package/dist/es/services/history.js +350 -386
- package/dist/es/services/keybinding.js +6 -6
- package/dist/es/services/props.js +3 -2
- package/dist/es/services/storage.js +2 -2
- package/dist/es/services/ui.js +10 -2
- package/dist/es/style.css +549 -113
- package/dist/es/utils/config.js +4 -1
- package/dist/es/utils/const.js +2 -2
- package/dist/es/utils/content-menu.js +19 -11
- package/dist/es/utils/data-source/index.js +34 -11
- package/dist/es/utils/dep/collect-worker-client.js +114 -0
- package/dist/es/utils/dep/idle-task.js +47 -22
- package/dist/es/utils/dep/worker.js +1 -1
- package/dist/es/utils/editor.js +103 -49
- package/dist/es/utils/event.js +123 -0
- package/dist/es/utils/history.js +220 -0
- package/dist/es/utils/indexed-db.js +86 -0
- package/dist/es/utils/monaco-editor.js +22 -6
- package/dist/es/utils/operator.js +2 -2
- package/dist/es/utils/props.js +114 -33
- package/dist/es/utils/type-match-rules.js +367 -0
- package/dist/es/utils/undo-redo.js +60 -1
- package/dist/style.css +549 -113
- package/dist/themes/magic-admin.css +3028 -0
- package/dist/tmagic-editor.umd.cjs +14273 -10029
- package/package.json +8 -8
- package/src/Editor.vue +43 -2
- package/src/components/CodeBlockEditor.vue +3 -0
- package/src/components/CompareForm.vue +18 -146
- package/src/components/ContentMenu.vue +44 -8
- package/src/components/FloatingBox.vue +84 -9
- package/src/components/ScrollBar.vue +0 -67
- package/src/components/ToolButton.vue +2 -2
- package/src/components/ViewForm.vue +55 -0
- package/src/editorProps.ts +30 -0
- package/src/fields/Code.vue +10 -2
- package/src/fields/CodeLink.vue +2 -5
- package/src/fields/CodeSelect.vue +54 -40
- package/src/fields/CodeSelectCol.vue +8 -1
- package/src/fields/CondOpSelect.vue +2 -24
- package/src/fields/DataSourceFieldSelect/FieldSelect.vue +16 -2
- package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
- package/src/fields/DataSourceFields.vue +42 -8
- package/src/fields/DataSourceInput.vue +10 -28
- package/src/fields/DataSourceMethodSelect.vue +9 -4
- package/src/fields/DataSourceMethods.vue +42 -21
- package/src/fields/DataSourceMocks.vue +3 -0
- package/src/fields/DisplayConds.vue +18 -1
- package/src/fields/EventSelect.vue +145 -161
- package/src/fields/StyleSetter/Index.vue +3 -12
- package/src/fields/StyleSetter/components/Border.vue +15 -6
- package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
- package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
- package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
- package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
- package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
- package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
- package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
- package/src/fields/StyleSetter/pro/Background.vue +99 -55
- package/src/fields/StyleSetter/pro/Border.vue +9 -11
- package/src/fields/StyleSetter/pro/Font.vue +66 -64
- package/src/fields/StyleSetter/pro/Layout.vue +211 -139
- package/src/fields/StyleSetter/pro/Position.vue +69 -67
- package/src/fields/StyleSetter/pro/Transform.vue +23 -25
- package/src/fields/UISelect.vue +0 -12
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-code-block-edit.ts +4 -3
- package/src/hooks/use-compare-form.ts +187 -0
- package/src/hooks/use-data-source-edit.ts +2 -2
- package/src/hooks/use-stage.ts +5 -3
- package/src/icons/DatasourceIcon.vue +7 -0
- package/src/index.ts +12 -0
- package/src/initService.ts +26 -16
- package/src/layouts/CodeEditor.vue +34 -11
- package/src/layouts/Framework.vue +15 -8
- package/src/layouts/NavMenu.vue +3 -3
- package/src/layouts/history-list/Bucket.vue +33 -41
- package/src/layouts/history-list/BucketTab.vue +72 -0
- package/src/layouts/history-list/GroupRow.vue +190 -93
- package/src/layouts/history-list/HistoryDiffDialog.vue +169 -90
- package/src/layouts/history-list/HistoryListPanel.vue +191 -95
- package/src/layouts/history-list/InitialRow.vue +38 -8
- package/src/layouts/history-list/PageTab.vue +67 -43
- package/src/layouts/history-list/composables.ts +239 -125
- package/src/layouts/history-list/useHistoryList.ts +60 -0
- package/src/layouts/history-list/useHistoryRevert.ts +425 -0
- package/src/layouts/page-bar/PageBar.vue +4 -2
- package/src/layouts/props-panel/FormPanel.vue +72 -6
- package/src/layouts/props-panel/PropsPanel.vue +62 -18
- package/src/layouts/props-panel/use-style-panel.ts +4 -3
- package/src/layouts/sidebar/ComponentListPanel.vue +10 -6
- package/src/layouts/sidebar/Sidebar.vue +13 -6
- package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
- package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
- package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
- package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +34 -2
- package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +29 -4
- package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
- package/src/layouts/sidebar/layer/LayerMenu.vue +21 -13
- package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
- package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
- package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
- package/src/layouts/sidebar/layer/use-click.ts +3 -3
- package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
- package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
- package/src/layouts/workspace/viewer/Stage.vue +1 -1
- package/src/layouts/workspace/viewer/ViewerMenu.vue +15 -15
- package/src/plugin.ts +6 -3
- package/src/services/codeBlock.ts +152 -47
- package/src/services/dataSource.ts +120 -41
- package/src/services/dep.ts +292 -47
- package/src/services/editor.ts +820 -224
- package/src/services/history.ts +449 -412
- package/src/services/keybinding.ts +6 -6
- package/src/services/ui.ts +33 -5
- package/src/theme/code-block.scss +37 -0
- package/src/theme/common/var.scss +1 -1
- package/src/theme/component-list-panel.scss +2 -2
- package/src/theme/data-source-field.scss +4 -0
- package/src/theme/display-conds.scss +11 -0
- package/src/theme/event.scss +70 -1
- package/src/theme/floating-box.scss +9 -1
- package/src/theme/framework.scss +4 -1
- package/src/theme/history-list-panel.scss +157 -23
- package/src/theme/layer-node-content.scss +14 -0
- package/src/theme/nav-menu.scss +5 -1
- package/src/theme/page-bar.scss +0 -4
- package/src/theme/props-panel.scss +5 -4
- package/src/theme/scroll-bar.scss +64 -0
- package/src/theme/style-setter/border.scss +17 -5
- package/src/theme/theme.scss +4 -0
- package/src/theme/themes/magic-admin/index.scss +214 -0
- package/src/theme/ui-select.scss +9 -0
- package/src/type.ts +668 -124
- package/src/utils/config.ts +9 -1
- package/src/utils/const.ts +3 -2
- package/src/utils/content-menu.ts +20 -11
- package/src/utils/data-source/index.ts +32 -12
- package/src/utils/dep/collect-worker-client.ts +149 -0
- package/src/utils/dep/idle-task.ts +72 -35
- package/src/utils/dep/worker.ts +113 -9
- package/src/utils/editor.ts +166 -60
- package/src/utils/event.ts +224 -0
- package/src/utils/history.ts +286 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/indexed-db.ts +122 -0
- package/src/utils/monaco-editor.ts +27 -0
- package/src/utils/operator.ts +2 -2
- package/src/utils/props.ts +114 -11
- package/src/utils/type-match-rules.ts +684 -0
- package/src/utils/undo-redo.ts +88 -0
- package/types/index.d.ts +1979 -515
- package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
- package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +0 -62
- package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
- package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
- package/src/layouts/history-list/CodeBlockTab.vue +0 -61
- package/src/layouts/history-list/DataSourceTab.vue +0 -61
|
@@ -1,33 +1,18 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="m-editor-history-list-bucket">
|
|
3
3
|
<div class="m-editor-history-list-bucket-title">
|
|
4
|
-
<span>{{ title }}</span>
|
|
4
|
+
<span>{{ config.title }}</span>
|
|
5
5
|
<code>{{ String(bucketId) }}</code>
|
|
6
6
|
<span class="m-editor-history-list-bucket-count">{{ groups.length }} 组</span>
|
|
7
7
|
</div>
|
|
8
8
|
|
|
9
9
|
<ul class="m-editor-history-list-ul">
|
|
10
10
|
<GroupRow
|
|
11
|
-
v-for="
|
|
12
|
-
:key="
|
|
13
|
-
:group
|
|
14
|
-
:
|
|
15
|
-
:
|
|
16
|
-
:op-type="group.opType"
|
|
17
|
-
:desc="describeGroup(group)"
|
|
18
|
-
:step-count="group.steps.length"
|
|
19
|
-
:sub-steps="
|
|
20
|
-
group.steps.map((s: any) => ({
|
|
21
|
-
index: s.index,
|
|
22
|
-
applied: s.applied,
|
|
23
|
-
isCurrent: s.isCurrent,
|
|
24
|
-
desc: describeStep(s.step),
|
|
25
|
-
diffable: isStepDiffable ? isStepDiffable(s.step) : false,
|
|
26
|
-
revertable: s.applied,
|
|
27
|
-
}))
|
|
28
|
-
"
|
|
29
|
-
:is-current="group.isCurrent"
|
|
30
|
-
:expanded="!!expanded[`${prefix}-${bucketId}-${gIdx}`]"
|
|
11
|
+
v-for="group in groups"
|
|
12
|
+
:key="rowKey(group)"
|
|
13
|
+
:group="toRow(group)"
|
|
14
|
+
:expanded="isHistoryGroupExpanded(expanded, rowKey(group))"
|
|
15
|
+
:goto-enabled="config.gotoEnabled"
|
|
31
16
|
@toggle="(key: string) => $emit('toggle', key)"
|
|
32
17
|
@goto="(index: number) => $emit('goto', bucketId, index)"
|
|
33
18
|
@diff-step="(index: number) => $emit('diff-step', bucketId, index)"
|
|
@@ -36,17 +21,25 @@
|
|
|
36
21
|
<!--
|
|
37
22
|
初始状态项:永远位于该 bucket 列表底部(同样按倒序展示,最底部 = 最早状态)。
|
|
38
23
|
当 bucket 内所有 group 都未 applied 时即为当前位置。
|
|
24
|
+
config.showInitial=false 时不展示(用于没有"撤销到初始状态"语义的自定义历史,如业务模块历史)。
|
|
39
25
|
-->
|
|
40
|
-
<InitialRow
|
|
26
|
+
<InitialRow
|
|
27
|
+
v-if="config.showInitial !== false"
|
|
28
|
+
:is-current="isInitial"
|
|
29
|
+
:goto-enabled="config.gotoEnabled"
|
|
30
|
+
@goto-initial="$emit('goto-initial', bucketId)"
|
|
31
|
+
/>
|
|
41
32
|
</ul>
|
|
42
33
|
</div>
|
|
43
34
|
</template>
|
|
44
35
|
|
|
45
|
-
<script lang="ts" setup>
|
|
36
|
+
<script lang="ts" setup generic="T extends BaseStepValue = BaseStepValue">
|
|
46
37
|
import { computed } from 'vue';
|
|
47
38
|
|
|
48
|
-
import type {
|
|
39
|
+
import type { BaseStepValue, HistoryBucketConfig } from '@editor/type';
|
|
49
40
|
|
|
41
|
+
import type { HistoryBucketGroup, HistoryRowGroup } from './composables';
|
|
42
|
+
import { isHistoryGroupExpanded, toRowGroup } from './composables';
|
|
50
43
|
import GroupRow from './GroupRow.vue';
|
|
51
44
|
import InitialRow from './InitialRow.vue';
|
|
52
45
|
|
|
@@ -55,26 +48,16 @@ defineOptions({
|
|
|
55
48
|
});
|
|
56
49
|
|
|
57
50
|
const props = defineProps<{
|
|
58
|
-
/**
|
|
59
|
-
|
|
51
|
+
/**
|
|
52
|
+
* 该类历史的整体渲染配置(title / prefix / describe* / isStep* / showInitial / gotoEnabled)。
|
|
53
|
+
* 由父组件按业务类型注入,组件内部按需读取,避免逐项透传多个 props。
|
|
54
|
+
*/
|
|
55
|
+
config: HistoryBucketConfig<T>;
|
|
60
56
|
/** 当前 bucket 对应的目标 id(dataSource.id 或 codeBlock.id),同时用于组装子项的 key。 */
|
|
61
57
|
bucketId: string | number;
|
|
62
|
-
/** 子项 key 的命名空间前缀:`ds` 表示数据源,`cb` 表示代码块。与上层折叠状态 key 保持一致。 */
|
|
63
|
-
prefix: 'ds' | 'cb';
|
|
64
58
|
/** 当前 bucket 下的所有历史分组,按时间倒序展示(最近的操作在前)。 */
|
|
65
|
-
groups:
|
|
66
|
-
|
|
67
|
-
isCurrent?: boolean;
|
|
68
|
-
opType: HistoryOpType;
|
|
69
|
-
steps: { index: number; applied: boolean; isCurrent?: boolean; step: any }[];
|
|
70
|
-
}[];
|
|
71
|
-
/** 组级描述文案生成器,接收一个 group,返回展示文本。由父组件按业务类型注入。 */
|
|
72
|
-
describeGroup: (_group: any) => string;
|
|
73
|
-
/** 单步描述文案生成器,接收一个 step,返回展示文本。用于合并组展开后的子步列表。 */
|
|
74
|
-
describeStep: (_step: any) => string;
|
|
75
|
-
/** 判断某个 step 是否可查看差异(前后值都存在)。由父组件按业务类型注入;不传则一律不展示差异入口。 */
|
|
76
|
-
isStepDiffable?: (_step: any) => boolean;
|
|
77
|
-
/** 共享的折叠状态表(key -> 是否展开),由顶层 panel 统一维护以便跨 tab 复用。 */
|
|
59
|
+
groups: HistoryBucketGroup<T>[];
|
|
60
|
+
/** 共享的折叠状态表(key -> 是否展开,缺省或 true 为展开、false 为收起),由顶层 panel 统一维护以便跨 tab 复用。 */
|
|
78
61
|
expanded: Record<string, boolean>;
|
|
79
62
|
}>();
|
|
80
63
|
|
|
@@ -94,6 +77,15 @@ defineEmits<{
|
|
|
94
77
|
(_e: 'revert-step', _bucketId: string | number, _index: number): void;
|
|
95
78
|
}>();
|
|
96
79
|
|
|
80
|
+
/**
|
|
81
|
+
* 子项 / 折叠状态 key:`${prefix}-${bucketId}-${组内首步 index}`。
|
|
82
|
+
* 以稳定的 step 索引(而非展示位置)标识分组,历史数据更新后已展开的分组状态仍能正确保持。
|
|
83
|
+
*/
|
|
84
|
+
const rowKey = (group: HistoryBucketGroup<T>) => `${props.config.prefix}-${props.bucketId}-${group.steps[0]?.index}`;
|
|
85
|
+
|
|
86
|
+
/** 把原始分组派生为 GroupRow 直接消费的视图模型。 */
|
|
87
|
+
const toRow = (group: HistoryBucketGroup<T>): HistoryRowGroup => toRowGroup(group, rowKey(group), props.config);
|
|
88
|
+
|
|
97
89
|
/** 该 bucket 是否处于初始状态(栈 cursor=0),等价于全部 group 都未 applied。 */
|
|
98
90
|
const isInitial = computed(() => props.groups.length > 0 && props.groups.every((g) => !g.applied));
|
|
99
91
|
</script>
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="!buckets.length" class="m-editor-history-list-empty">暂无操作记录</div>
|
|
3
|
+
<template v-else>
|
|
4
|
+
<div v-if="config.showClear !== false" class="m-editor-history-list-toolbar">
|
|
5
|
+
<span class="m-editor-history-list-clear" :title="`清空${config.title}的历史记录`" @click="$emit('clear')"
|
|
6
|
+
>清空</span
|
|
7
|
+
>
|
|
8
|
+
</div>
|
|
9
|
+
<TMagicScrollbar max-height="360px">
|
|
10
|
+
<Bucket
|
|
11
|
+
v-for="bucket in buckets"
|
|
12
|
+
:key="`${config.prefix}-${bucket.id}`"
|
|
13
|
+
:config="config"
|
|
14
|
+
:bucket-id="bucket.id"
|
|
15
|
+
:groups="bucket.groups"
|
|
16
|
+
:expanded="expanded"
|
|
17
|
+
@toggle="(key: string) => $emit('toggle', key)"
|
|
18
|
+
@goto="(id: string | number, index: number) => $emit('goto', id, index)"
|
|
19
|
+
@goto-initial="(id: string | number) => $emit('goto-initial', id)"
|
|
20
|
+
@diff-step="(id: string | number, index: number) => $emit('diff-step', id, index)"
|
|
21
|
+
@revert-step="(id: string | number, index: number) => $emit('revert-step', id, index)"
|
|
22
|
+
/>
|
|
23
|
+
</TMagicScrollbar>
|
|
24
|
+
</template>
|
|
25
|
+
</template>
|
|
26
|
+
|
|
27
|
+
<script lang="ts" setup generic="T extends BaseStepValue = BaseStepValue">
|
|
28
|
+
import { TMagicScrollbar } from '@tmagic/design';
|
|
29
|
+
|
|
30
|
+
import type { BaseStepValue, HistoryBucketConfig } from '@editor/type';
|
|
31
|
+
|
|
32
|
+
import Bucket from './Bucket.vue';
|
|
33
|
+
import type { HistoryBucketGroup } from './composables';
|
|
34
|
+
|
|
35
|
+
defineOptions({
|
|
36
|
+
name: 'MEditorHistoryListBucketTab',
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
defineProps<{
|
|
40
|
+
/**
|
|
41
|
+
* 该类历史的整体渲染配置(title / prefix / describe* / isStep* / showInitial / gotoEnabled / showClear),
|
|
42
|
+
* 由父组件按业务类型注入并整体透传给 Bucket,避免逐项透传多个 props。
|
|
43
|
+
*/
|
|
44
|
+
config: HistoryBucketConfig<T>;
|
|
45
|
+
/**
|
|
46
|
+
* 已按目标 id 聚拢成的 bucket 列表,每个 bucket 内部的 groups 已按时间倒序排好。
|
|
47
|
+
* 空数组时显示空态。
|
|
48
|
+
*/
|
|
49
|
+
buckets: { id: string | number; groups: HistoryBucketGroup<T>[] }[];
|
|
50
|
+
/**
|
|
51
|
+
* 共享的折叠状态表(key -> 是否展开),由顶层 panel 统一维护。
|
|
52
|
+
* key 形如 `${prefix}-${id}-${组内首步 index}`——以稳定的 step 索引而非展示位置标识分组,
|
|
53
|
+
* 这样历史数据更新后已展开的分组状态仍能正确保持。
|
|
54
|
+
*/
|
|
55
|
+
expanded: Record<string, boolean>;
|
|
56
|
+
}>();
|
|
57
|
+
|
|
58
|
+
defineEmits<{
|
|
59
|
+
/** 透传子组件 Bucket 的 toggle 事件给上层 panel,由其更新 expanded。 */
|
|
60
|
+
(_e: 'toggle', _key: string): void;
|
|
61
|
+
/** 透传 Bucket 的 goto 事件,携带目标 id 与目标 step 索引。 */
|
|
62
|
+
(_e: 'goto', _targetId: string | number, _index: number): void;
|
|
63
|
+
/** 透传 Bucket 的 goto-initial 事件,携带目标 id(回到该目标未修改时的状态)。 */
|
|
64
|
+
(_e: 'goto-initial', _targetId: string | number): void;
|
|
65
|
+
/** 透传 Bucket 的 diff-step 事件,携带目标 id 与 step 索引。 */
|
|
66
|
+
(_e: 'diff-step', _targetId: string | number, _index: number): void;
|
|
67
|
+
/** 透传 Bucket 的 revert-step 事件,携带目标 id 与 step 索引(类 git revert)。 */
|
|
68
|
+
(_e: 'revert-step', _targetId: string | number, _index: number): void;
|
|
69
|
+
/** 用户点击"清空"按钮,请求清空该类(数据源 / 代码块)的全部历史记录(由上层弹窗二次确认后执行)。 */
|
|
70
|
+
(_e: 'clear'): void;
|
|
71
|
+
}>();
|
|
72
|
+
</script>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<li
|
|
3
3
|
class="m-editor-history-list-item m-editor-history-list-group"
|
|
4
|
-
:class="{ 'is-undone': !applied, 'is-merged': merged, 'is-current': isCurrent }"
|
|
4
|
+
:class="{ 'is-undone': !group.applied, 'is-merged': merged, 'is-current': group.isCurrent }"
|
|
5
5
|
>
|
|
6
6
|
<div
|
|
7
7
|
class="m-editor-history-list-group-head"
|
|
@@ -10,24 +10,60 @@
|
|
|
10
10
|
@click="onHeadClick"
|
|
11
11
|
>
|
|
12
12
|
<span class="m-editor-history-list-item-index" :title="headIndexTitle">{{ headIndexLabel }}</span>
|
|
13
|
-
<span class="m-editor-history-list-item-op" :class="`op-${opType}`">{{ opLabel(opType) }}</span>
|
|
14
|
-
<span class="m-editor-history-list-item-desc">{{ desc }}</span>
|
|
15
|
-
|
|
13
|
+
<span class="m-editor-history-list-item-op" :class="`op-${group.opType}`">{{ opLabel(group.opType) }}</span>
|
|
14
|
+
<span class="m-editor-history-list-item-desc">{{ group.desc }}</span>
|
|
15
|
+
|
|
16
|
+
<span v-if="headSaved" class="m-editor-history-list-item-saved" title="该记录为最近一次保存的状态">已保存</span>
|
|
17
|
+
|
|
16
18
|
<span
|
|
17
|
-
v-if="!merged && headDiffable"
|
|
18
|
-
class="m-editor-history-list-item-
|
|
19
|
-
title="查看修改差异"
|
|
20
|
-
@click.stop="onDiffClick(subSteps[0].index)"
|
|
21
|
-
>查看差异</span
|
|
19
|
+
v-if="!merged && (headRevertable || headDiffable || canHeadGoto)"
|
|
20
|
+
class="m-editor-history-list-item-actions"
|
|
22
21
|
>
|
|
23
|
-
|
|
22
|
+
<span
|
|
23
|
+
v-if="headRevertable"
|
|
24
|
+
class="m-editor-history-list-item-revert"
|
|
25
|
+
title="将该步骤的修改作为一次新操作反向应用(不影响后续历史)"
|
|
26
|
+
@click.stop="onRevertClick(group.subSteps[0].index)"
|
|
27
|
+
>回滚</span
|
|
28
|
+
>
|
|
29
|
+
<span
|
|
30
|
+
v-if="canHeadGoto"
|
|
31
|
+
class="m-editor-history-list-item-goto"
|
|
32
|
+
title="回到该记录"
|
|
33
|
+
@click.stop="onGotoClick(group.subSteps[0].index)"
|
|
34
|
+
>回到</span
|
|
35
|
+
>
|
|
36
|
+
<span
|
|
37
|
+
v-if="headDiffable"
|
|
38
|
+
class="m-editor-history-list-item-diff"
|
|
39
|
+
title="查看修改差异"
|
|
40
|
+
@click.stop="onDiffClick(group.subSteps[0].index)"
|
|
41
|
+
>查看差异</span
|
|
42
|
+
>
|
|
43
|
+
</span>
|
|
44
|
+
|
|
45
|
+
<span
|
|
46
|
+
v-if="!merged && sourceLabel(group.source)"
|
|
47
|
+
class="m-editor-history-list-item-source"
|
|
48
|
+
:title="`操作途径:${sourceLabel(group.source)}`"
|
|
49
|
+
>{{ sourceLabel(group.source) }}</span
|
|
50
|
+
>
|
|
51
|
+
|
|
24
52
|
<span
|
|
25
|
-
v-if="!merged &&
|
|
26
|
-
class="m-editor-history-list-item-
|
|
27
|
-
title="
|
|
28
|
-
|
|
29
|
-
>回滚</span
|
|
53
|
+
v-if="!merged && group.operator"
|
|
54
|
+
class="m-editor-history-list-item-operator"
|
|
55
|
+
:title="`操作人:${group.operator}`"
|
|
56
|
+
>{{ group.operator }}</span
|
|
30
57
|
>
|
|
58
|
+
|
|
59
|
+
<span
|
|
60
|
+
v-if="!merged && group.time"
|
|
61
|
+
class="m-editor-history-list-item-time"
|
|
62
|
+
:title="group.timeTitle || group.time"
|
|
63
|
+
>{{ group.time }}</span
|
|
64
|
+
>
|
|
65
|
+
|
|
66
|
+
<span v-if="merged" class="m-editor-history-list-item-merge">合并 {{ stepCount }} 步</span>
|
|
31
67
|
<span v-if="merged" class="m-editor-history-list-group-toggle" :class="{ 'is-expanded': expanded }">▾</span>
|
|
32
68
|
</div>
|
|
33
69
|
|
|
@@ -35,27 +71,49 @@
|
|
|
35
71
|
<li
|
|
36
72
|
v-for="s in subStepsDisplay"
|
|
37
73
|
:key="s.index"
|
|
38
|
-
:class="{ 'is-undone': !s.applied, 'is-current': s.isCurrent, 'is-clickable':
|
|
39
|
-
:title="s
|
|
40
|
-
@click="onSubStepClick(s)"
|
|
74
|
+
:class="{ 'is-undone': !s.applied, 'is-current': s.isCurrent, 'is-clickable': selectEnabled }"
|
|
75
|
+
:title="subStepTitle(s)"
|
|
76
|
+
@click="onSubStepClick(s.index)"
|
|
41
77
|
>
|
|
42
78
|
<span class="m-editor-history-list-item-index">#{{ s.index + 1 }}</span>
|
|
43
79
|
<span class="m-editor-history-list-substep-desc">{{ s.desc }}</span>
|
|
44
|
-
<span v-if="s.
|
|
80
|
+
<span v-if="s.saved" class="m-editor-history-list-item-saved" title="该记录为最近一次保存的状态">已保存</span>
|
|
45
81
|
<span
|
|
46
|
-
v-if="s.diffable"
|
|
47
|
-
class="m-editor-history-list-item-
|
|
48
|
-
title="查看修改差异"
|
|
49
|
-
@click.stop="onDiffClick(s.index)"
|
|
50
|
-
>查看差异</span
|
|
82
|
+
v-if="s.revertable || s.diffable || (gotoEnabled && !s.isCurrent)"
|
|
83
|
+
class="m-editor-history-list-item-actions"
|
|
51
84
|
>
|
|
85
|
+
<span
|
|
86
|
+
v-if="s.revertable"
|
|
87
|
+
class="m-editor-history-list-item-revert"
|
|
88
|
+
title="将该步骤的修改作为一次新操作反向应用(不影响后续历史)"
|
|
89
|
+
@click.stop="onRevertClick(s.index)"
|
|
90
|
+
>回滚</span
|
|
91
|
+
>
|
|
92
|
+
<span
|
|
93
|
+
v-if="gotoEnabled && !s.isCurrent"
|
|
94
|
+
class="m-editor-history-list-item-goto"
|
|
95
|
+
title="回到该记录"
|
|
96
|
+
@click.stop="onGotoClick(s.index)"
|
|
97
|
+
>回到</span
|
|
98
|
+
>
|
|
99
|
+
<span
|
|
100
|
+
v-if="s.diffable"
|
|
101
|
+
class="m-editor-history-list-item-diff"
|
|
102
|
+
title="查看修改差异"
|
|
103
|
+
@click.stop="onDiffClick(s.index)"
|
|
104
|
+
>查看差异</span
|
|
105
|
+
>
|
|
106
|
+
</span>
|
|
52
107
|
<span
|
|
53
|
-
v-if="s.
|
|
54
|
-
class="m-editor-history-list-item-
|
|
55
|
-
title="
|
|
56
|
-
|
|
57
|
-
>回滚</span
|
|
108
|
+
v-if="sourceLabel(s.source)"
|
|
109
|
+
class="m-editor-history-list-item-source"
|
|
110
|
+
:title="`操作途径:${sourceLabel(s.source)}`"
|
|
111
|
+
>{{ sourceLabel(s.source) }}</span
|
|
58
112
|
>
|
|
113
|
+
<span v-if="s.operator" class="m-editor-history-list-item-operator" :title="`操作人:${s.operator}`">{{
|
|
114
|
+
s.operator
|
|
115
|
+
}}</span>
|
|
116
|
+
<span v-if="s.time" class="m-editor-history-list-item-time" :title="s.timeTitle || s.time">{{ s.time }}</span>
|
|
59
117
|
</li>
|
|
60
118
|
</ul>
|
|
61
119
|
</li>
|
|
@@ -64,53 +122,51 @@
|
|
|
64
122
|
<script lang="ts" setup>
|
|
65
123
|
import { computed } from 'vue';
|
|
66
124
|
|
|
67
|
-
import type {
|
|
68
|
-
|
|
69
|
-
import { opLabel } from './composables';
|
|
125
|
+
import type { HistoryRowGroup, HistoryRowStep } from './composables';
|
|
126
|
+
import { opLabel, sourceLabel } from './composables';
|
|
70
127
|
|
|
71
128
|
defineOptions({
|
|
72
129
|
name: 'MEditorHistoryListGroupRow',
|
|
73
130
|
});
|
|
74
131
|
|
|
75
|
-
const props =
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}>();
|
|
132
|
+
const props = withDefaults(
|
|
133
|
+
defineProps<{
|
|
134
|
+
/**
|
|
135
|
+
* 该组的视图模型(由 `toRowGroup` 统一派生):包含 key、应用状态、操作类型、描述、
|
|
136
|
+
* 来源 / 时间等头部信息以及子步列表。原先散落的十余个扁平 props 收敛于此单一对象。
|
|
137
|
+
*/
|
|
138
|
+
group: HistoryRowGroup;
|
|
139
|
+
/** 当前组是否处于展开状态(合并组默认展开)。仅在合并组(子步数 > 1)时生效,控制子步列表是否渲染。 */
|
|
140
|
+
expanded: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* 是否支持「跳转到该记录」(goto)。默认 true。
|
|
143
|
+
* 为 false 时:单步组头部与子步条目都不再可点击跳转、也不会触发 goto 事件,
|
|
144
|
+
* 仅保留合并组头部的展开 / 收起能力,以及查看差异、回滚等其它入口。
|
|
145
|
+
*/
|
|
146
|
+
gotoEnabled?: boolean;
|
|
147
|
+
/**
|
|
148
|
+
* 是否支持「点击记录选中对应节点」。默认 false(仅页面 tab 启用,数据源 / 代码块无节点概念)。
|
|
149
|
+
* 为 true 时:点击单步组头部、子步条目或合并组头部都会发出 `select` 事件(携带对应 step 索引),
|
|
150
|
+
* 由上层解析出节点 id 并在画布选中;合并组头部同时保留展开 / 收起能力。
|
|
151
|
+
*/
|
|
152
|
+
selectEnabled?: boolean;
|
|
153
|
+
}>(),
|
|
154
|
+
{
|
|
155
|
+
gotoEnabled: true,
|
|
156
|
+
selectEnabled: false,
|
|
157
|
+
},
|
|
158
|
+
);
|
|
103
159
|
|
|
104
160
|
const emit = defineEmits<{
|
|
105
161
|
/**
|
|
106
|
-
* 用户点击合并组头部时触发,携带
|
|
162
|
+
* 用户点击合并组头部时触发,携带 group.key;上层用其切换 expanded 状态。
|
|
107
163
|
* 对单步组(非合并)头部点击不会发该事件——因为单步组没有"展开"的概念。
|
|
108
164
|
*/
|
|
109
165
|
(_e: 'toggle', _key: string): void;
|
|
110
166
|
/**
|
|
111
167
|
* 用户希望跳转到该记录时触发,携带"目标 step 在所属栈中的索引"——上层据此计算目标 cursor (= index + 1)。
|
|
112
168
|
* 触发场景:
|
|
113
|
-
* -
|
|
169
|
+
* - 单步组(非合并)头部:取该唯一 step 的 index;
|
|
114
170
|
* - 子步条目:取该子步的 index。
|
|
115
171
|
* 合并组头部不再触发 goto,避免与展开/收起冲突;用户应展开后点具体子步精准跳转。
|
|
116
172
|
* 当前所在的步骤(isCurrent)始终不会触发 goto。
|
|
@@ -118,7 +174,7 @@ const emit = defineEmits<{
|
|
|
118
174
|
(_e: 'goto', _index: number): void;
|
|
119
175
|
/**
|
|
120
176
|
* 用户希望查看该 step 的修改差异(旧值 vs 新值)。
|
|
121
|
-
* 只在 step 满足"前后值都存在"(如 update / 数据源、代码块的 update
|
|
177
|
+
* 只在 step 满足"前后值都存在"(如 update / 数据源、代码块的 update)时由 `toRowGroup` 标记 `diffable=true`。
|
|
122
178
|
* payload 为该 step 在所属栈中的索引,由上层根据 index 取 step 内容并展示对比。
|
|
123
179
|
*/
|
|
124
180
|
(_e: 'diff-step', _index: number): void;
|
|
@@ -127,74 +183,115 @@ const emit = defineEmits<{
|
|
|
127
183
|
* payload 为该 step 在所属栈中的索引。仅在单步组头部(headRevertable)或合并组的可回滚子步上触发。
|
|
128
184
|
*/
|
|
129
185
|
(_e: 'revert-step', _index: number): void;
|
|
186
|
+
/**
|
|
187
|
+
* 用户希望「选中该记录对应的节点」。payload 为该 step 在所属栈中的索引,
|
|
188
|
+
* 由上层据 index 取出 step、解析出节点 id 并在画布选中。仅在 `selectEnabled` 为 true 时触发。
|
|
189
|
+
*/
|
|
190
|
+
(_e: 'select', _index: number): void;
|
|
130
191
|
}>();
|
|
131
192
|
|
|
132
|
-
/**
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
193
|
+
/** 子步数大于 1 即为合并组:决定是否展示合并标记与可展开的子步列表。 */
|
|
194
|
+
const merged = computed(() => props.group.subSteps.length > 1);
|
|
195
|
+
|
|
196
|
+
/** 组内 step 总数,仅在合并组时显示为 "合并 N 步"。 */
|
|
197
|
+
const stepCount = computed(() => props.group.subSteps.length);
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 头部可点击的场景:
|
|
201
|
+
* - 合并组:点击切换展开 / 收起;
|
|
202
|
+
* - 开启 `selectEnabled`(页面 tab):点击选中对应节点。
|
|
203
|
+
* 单步组的跳转仍由头部的「回到」按钮触发。
|
|
204
|
+
*/
|
|
205
|
+
const isHeadClickable = computed(() => merged.value || props.selectEnabled);
|
|
137
206
|
|
|
138
207
|
const headTitle = computed(() => {
|
|
139
|
-
if (
|
|
140
|
-
|
|
141
|
-
|
|
208
|
+
if (merged.value) {
|
|
209
|
+
const expandHint = props.expanded ? '点击收起子步' : '点击展开子步';
|
|
210
|
+
return props.selectEnabled ? `${expandHint}(并选中该节点)` : expandHint;
|
|
211
|
+
}
|
|
212
|
+
if (props.selectEnabled) return '点击选中该节点';
|
|
213
|
+
if (props.group.isCurrent) return '当前所在记录';
|
|
214
|
+
return '';
|
|
142
215
|
});
|
|
143
216
|
|
|
144
217
|
/**
|
|
145
|
-
*
|
|
146
|
-
* -
|
|
147
|
-
* -
|
|
218
|
+
* 头部点击行为:
|
|
219
|
+
* - 开启 selectEnabled 时,发出 select(携带组内首步 index,上层据此选中节点);
|
|
220
|
+
* - 合并组同时切换展开 / 收起。
|
|
148
221
|
*/
|
|
149
222
|
const onHeadClick = () => {
|
|
150
|
-
if (props.
|
|
151
|
-
emit('
|
|
152
|
-
return;
|
|
223
|
+
if (props.selectEnabled && props.group.subSteps.length) {
|
|
224
|
+
emit('select', props.group.subSteps[0].index);
|
|
153
225
|
}
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
|
|
226
|
+
if (merged.value) {
|
|
227
|
+
emit('toggle', props.group.key);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const onGotoClick = (index: number) => {
|
|
232
|
+
if (!props.gotoEnabled) return;
|
|
233
|
+
emit('goto', index);
|
|
157
234
|
};
|
|
158
235
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
236
|
+
/** 点击子步行:开启 selectEnabled 时选中该子步对应的节点。 */
|
|
237
|
+
const onSubStepClick = (index: number) => {
|
|
238
|
+
if (!props.selectEnabled) return;
|
|
239
|
+
emit('select', index);
|
|
162
240
|
};
|
|
163
241
|
|
|
242
|
+
const subStepTitle = (s: { isCurrent?: boolean }) => {
|
|
243
|
+
if (props.selectEnabled) return '点击选中该节点';
|
|
244
|
+
if (s.isCurrent) return '当前所在记录';
|
|
245
|
+
return '';
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* 头部是否展示「已保存」标记:
|
|
250
|
+
* - 单步组:取该唯一子步的 saved;
|
|
251
|
+
* - 合并组:组内任一子步为已保存即在头部提示(具体落在哪一步可展开查看)。
|
|
252
|
+
*/
|
|
253
|
+
const headSaved = computed(() =>
|
|
254
|
+
merged.value ? props.group.subSteps.some((s) => s.saved) : Boolean(props.group.subSteps[0]?.saved),
|
|
255
|
+
);
|
|
256
|
+
|
|
164
257
|
/** 单步组头部是否展示"查看差异"入口:要求该唯一子步本身可对比。 */
|
|
165
|
-
const headDiffable = computed(() => !
|
|
258
|
+
const headDiffable = computed(() => !merged.value && Boolean(props.group.subSteps[0]?.diffable));
|
|
166
259
|
|
|
167
260
|
/** 单步组头部是否展示"回滚"入口:要求该唯一子步本身可回滚(已应用)。 */
|
|
168
|
-
const headRevertable = computed(() => !
|
|
261
|
+
const headRevertable = computed(() => !merged.value && Boolean(props.group.subSteps[0]?.revertable));
|
|
262
|
+
|
|
263
|
+
/** 单步组头部是否展示"回到"入口:可跳转、非当前、且存在唯一子步。 */
|
|
264
|
+
const canHeadGoto = computed(
|
|
265
|
+
() => !merged.value && props.gotoEnabled && !props.group.isCurrent && props.group.subSteps.length > 0,
|
|
266
|
+
);
|
|
169
267
|
|
|
170
268
|
/**
|
|
171
269
|
* 合并组展开后的子步渲染顺序:与外层分组列表保持一致——倒序展示(最新的子步在最上方)。
|
|
172
270
|
* 外层 page tab / bucket 都已对 groups 做了 reverse,子步沿用同样的视觉规则更直观。
|
|
173
271
|
* 注意:仅用于渲染,原 `subSteps` 保持时间正序,`headIndexLabel` 等基于首尾索引的展示语义不变。
|
|
174
272
|
*/
|
|
175
|
-
const subStepsDisplay = computed(() => props.subSteps.slice().reverse());
|
|
273
|
+
const subStepsDisplay = computed<HistoryRowStep[]>(() => props.group.subSteps.slice().reverse());
|
|
176
274
|
|
|
177
275
|
/**
|
|
178
276
|
* 头部索引展示:
|
|
179
|
-
* -
|
|
277
|
+
* - 单步组(非合并):显示该唯一 step 的编号,如 `#5`;
|
|
180
278
|
* - 合并组:显示组内 step 的编号范围,如 `#3-#7`(首尾相同则退化为 `#5`)。
|
|
181
279
|
*
|
|
182
280
|
* 这里展示的是 step.index + 1(与子步列表 `#{{ s.index + 1 }}` 保持一致),从 1 起编号更符合直觉。
|
|
183
281
|
*/
|
|
184
282
|
const headIndexLabel = computed(() => {
|
|
185
|
-
const list = props.subSteps;
|
|
283
|
+
const list = props.group.subSteps;
|
|
186
284
|
if (!list.length) return '';
|
|
187
285
|
const first = list[0].index + 1;
|
|
188
286
|
const last = list[list.length - 1].index + 1;
|
|
189
|
-
if (!
|
|
287
|
+
if (!merged.value || first === last) return `#${first}`;
|
|
190
288
|
return `#${first}-#${last}`;
|
|
191
289
|
});
|
|
192
290
|
|
|
193
291
|
const headIndexTitle = computed(() => {
|
|
194
|
-
|
|
195
|
-
return
|
|
196
|
-
|
|
197
|
-
} 共 ${props.subSteps.length} 条历史步骤`;
|
|
292
|
+
const list = props.group.subSteps;
|
|
293
|
+
if (!merged.value) return `历史步骤编号 #${list[0]?.index + 1}`;
|
|
294
|
+
return `合并了第 ${list[0]?.index + 1} 至第 ${list[list.length - 1]?.index + 1} 共 ${list.length} 条历史步骤`;
|
|
198
295
|
});
|
|
199
296
|
|
|
200
297
|
const onDiffClick = (index: number) => {
|