@tmagic/editor 1.8.0-beta.1 → 1.8.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +31 -5
- package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +21 -113
- package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -1
- package/dist/es/components/CompareForm.js +5 -0
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +196 -0
- package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +2 -2
- 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.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/editorProps.js +2 -0
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +20 -4
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +3 -6
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +19 -3
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +42 -8
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +14 -6
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +41 -16
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +9 -5
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +40 -19
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +17 -9
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -2
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +59 -12
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +12 -7
- package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
- 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/background-repeat/NoRepeat.js +1 -1
- package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
- 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 +1 -1
- package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
- package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
- package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
- package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
- 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 +1 -1
- package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +9 -6
- package/dist/es/hooks/use-code-block-edit.js +7 -4
- package/dist/es/hooks/use-data-source-edit.js +5 -2
- package/dist/es/hooks/use-stage.js +22 -10
- 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/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/index.js +14 -3
- package/dist/es/initService.js +7 -7
- 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 +7 -6
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -9
- package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +12 -4
- package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/Bucket.js +5 -0
- package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +71 -0
- 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.js +5 -0
- package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +269 -0
- package/dist/es/layouts/history-list/HistoryDiffDialog.js +5 -0
- package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +294 -0
- package/dist/es/layouts/history-list/HistoryListPanel.js +5 -0
- package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +327 -0
- package/dist/es/layouts/history-list/InitialRow.js +5 -0
- package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/es/layouts/history-list/PageTab.js +5 -0
- package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +95 -0
- package/dist/es/layouts/history-list/composables.js +184 -0
- package/dist/es/layouts/history-list/useHistoryList.js +56 -0
- package/dist/es/layouts/history-list/useHistoryRevert.js +313 -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 +1 -1
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +8 -4
- 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 +2 -2
- package/dist/es/layouts/sidebar/code-block/useContentMenu.js +1 -1
- 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 +19 -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 +25 -3
- package/dist/es/layouts/sidebar/data-source/useContentMenu.js +1 -1
- package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +6 -6
- 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 +1 -1
- package/dist/es/layouts/sidebar/layer/use-node-status.js +1 -1
- 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 +1 -1
- 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 +9 -9
- package/dist/es/services/BaseService.js +31 -68
- package/dist/es/services/codeBlock.js +286 -8
- package/dist/es/services/componentList.js +2 -2
- package/dist/es/services/dataSource.js +287 -8
- package/dist/es/services/dep.js +21 -9
- package/dist/es/services/editor.js +655 -194
- package/dist/es/services/events.js +2 -2
- package/dist/es/services/history.js +390 -47
- package/dist/es/services/keybinding.js +5 -5
- package/dist/es/services/props.js +8 -8
- package/dist/es/services/stageOverlay.js +2 -2
- package/dist/es/services/storage.js +2 -2
- package/dist/es/services/ui.js +5 -2
- package/dist/es/style.css +456 -8
- package/dist/es/utils/code-block.js +122 -0
- package/dist/es/utils/content-menu.js +19 -12
- package/dist/es/utils/data-source/index.js +2 -0
- package/dist/es/utils/dep/worker.js +1 -1
- package/dist/es/utils/editor.js +105 -51
- package/dist/es/utils/history.js +220 -0
- package/dist/es/utils/indexed-db.js +86 -0
- package/dist/es/utils/undo-redo.js +80 -1
- package/dist/style.css +456 -8
- package/dist/tmagic-editor.umd.cjs +11149 -6646
- package/package.json +8 -8
- package/src/Editor.vue +25 -1
- package/src/components/CodeBlockEditor.vue +20 -109
- package/src/components/CodeParams.vue +6 -0
- package/src/components/CompareForm.vue +277 -0
- package/src/components/ToolButton.vue +2 -2
- package/src/editorProps.ts +9 -0
- package/src/fields/Code.vue +19 -3
- package/src/fields/CodeLink.vue +2 -5
- package/src/fields/CodeSelect.vue +17 -1
- package/src/fields/CodeSelectCol.vue +37 -3
- package/src/fields/DataSourceFieldSelect/FieldSelect.vue +23 -3
- package/src/fields/DataSourceFieldSelect/Index.vue +2 -2
- package/src/fields/DataSourceFields.vue +48 -10
- package/src/fields/DataSourceInput.vue +3 -3
- package/src/fields/DataSourceMethodSelect.vue +12 -4
- package/src/fields/DataSourceMethods.vue +55 -24
- package/src/fields/DataSourceMocks.vue +13 -3
- package/src/fields/DataSourceSelect.vue +4 -1
- package/src/fields/EventSelect.vue +57 -8
- package/src/fields/KeyValue.vue +17 -4
- package/src/fields/StyleSetter/components/Border.vue +15 -6
- package/src/fields/UISelect.vue +5 -2
- package/src/hooks/use-code-block-edit.ts +9 -5
- package/src/hooks/use-data-source-edit.ts +2 -2
- package/src/hooks/use-stage.ts +26 -9
- package/src/index.ts +8 -0
- package/src/initService.ts +1 -1
- package/src/layouts/CodeEditor.vue +17 -5
- package/src/layouts/Framework.vue +11 -6
- package/src/layouts/NavMenu.vue +12 -3
- package/src/layouts/history-list/Bucket.vue +91 -0
- package/src/layouts/history-list/BucketTab.vue +72 -0
- package/src/layouts/history-list/GroupRow.vue +304 -0
- package/src/layouts/history-list/HistoryDiffDialog.vue +281 -0
- package/src/layouts/history-list/HistoryListPanel.vue +367 -0
- package/src/layouts/history-list/InitialRow.vue +71 -0
- package/src/layouts/history-list/PageTab.vue +118 -0
- package/src/layouts/history-list/composables.ts +309 -0
- package/src/layouts/history-list/useHistoryList.ts +60 -0
- package/src/layouts/history-list/useHistoryRevert.ts +421 -0
- package/src/layouts/page-bar/PageBar.vue +4 -2
- package/src/layouts/props-panel/PropsPanel.vue +5 -1
- package/src/layouts/sidebar/ComponentListPanel.vue +9 -5
- package/src/layouts/sidebar/Sidebar.vue +8 -3
- package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
- package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
- package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
- package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +31 -2
- package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +27 -2
- package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
- package/src/layouts/sidebar/layer/LayerMenu.vue +19 -11
- package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
- package/src/layouts/sidebar/layer/use-node-status.ts +9 -6
- package/src/layouts/workspace/viewer/Stage.vue +1 -1
- package/src/layouts/workspace/viewer/ViewerMenu.vue +8 -8
- package/src/services/BaseService.ts +35 -86
- package/src/services/codeBlock.ts +361 -5
- package/src/services/dataSource.ts +336 -6
- package/src/services/dep.ts +32 -9
- package/src/services/editor.ts +834 -194
- package/src/services/history.ts +509 -49
- package/src/services/keybinding.ts +3 -3
- package/src/services/props.ts +2 -2
- package/src/services/ui.ts +7 -0
- package/src/theme/history-list-panel.scss +557 -0
- package/src/theme/page-bar.scss +0 -4
- package/src/theme/props-panel.scss +3 -3
- package/src/theme/style-setter/border.scss +4 -1
- package/src/theme/theme.scss +1 -0
- package/src/type.ts +613 -31
- package/src/utils/code-block.ts +150 -0
- package/src/utils/content-menu.ts +25 -13
- package/src/utils/data-source/index.ts +2 -0
- package/src/utils/dep/worker.ts +5 -3
- package/src/utils/editor.ts +166 -60
- package/src/utils/history.ts +286 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/indexed-db.ts +122 -0
- package/src/utils/undo-redo.ts +111 -0
- package/types/index.d.ts +3197 -896
- package/dist/es/utils/compose.js +0 -44
- package/dist/es/utils/editor-history.js +0 -100
- package/src/utils/compose.ts +0 -52
- package/src/utils/editor-history.ts +0 -138
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { formatHistoryFullTime, formatHistoryTime } from "./composables.js";
|
|
2
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, toDisplayString, withModifiers } from "vue";
|
|
3
|
+
//#region packages/editor/src/layouts/history-list/InitialRow.vue?vue&type=script&setup=true&lang.ts
|
|
4
|
+
var _hoisted_1 = ["title"];
|
|
5
|
+
var _hoisted_2 = { class: "m-editor-history-list-item-desc" };
|
|
6
|
+
var _hoisted_3 = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "m-editor-history-list-item-saved",
|
|
9
|
+
title: "该记录为最近一次保存的状态"
|
|
10
|
+
};
|
|
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({
|
|
17
|
+
name: "MEditorHistoryListInitialRow",
|
|
18
|
+
__name: "InitialRow",
|
|
19
|
+
props: {
|
|
20
|
+
isCurrent: { type: Boolean },
|
|
21
|
+
gotoEnabled: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
default: true
|
|
24
|
+
},
|
|
25
|
+
marker: { default: void 0 }
|
|
26
|
+
},
|
|
27
|
+
emits: ["goto-initial"],
|
|
28
|
+
setup(__props, { emit: __emit }) {
|
|
29
|
+
/**
|
|
30
|
+
* 「初始状态」记录行:渲染于历史列表底部,作为整个栈的"零点"。
|
|
31
|
+
* - 点击该行会把对应栈撤销到 cursor === 0(即没有任何已应用步骤),等同于回到所有修改之前。
|
|
32
|
+
* - 当对应栈本身已处于 cursor === 0 时(isCurrent=true),用户已在初始状态,点击不再触发动作。
|
|
33
|
+
* - 当上层传入 `marker`(设置 root 时为该页生成的「未修改的初始状态」标记)时,
|
|
34
|
+
* 用标记的文案与时间渲染本行;标记不进入撤销/重做栈,仅作为该页基线展示。
|
|
35
|
+
*
|
|
36
|
+
* 该行不是真实 step,仅作为 UI 入口;上层负责把"点击"翻译为 `service.goto*(0)`。
|
|
37
|
+
*/
|
|
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
|
+
});
|
|
48
|
+
const emit = __emit;
|
|
49
|
+
const onClick = () => {
|
|
50
|
+
if (props.isCurrent) return;
|
|
51
|
+
emit("goto-initial");
|
|
52
|
+
};
|
|
53
|
+
return (_ctx, _cache) => {
|
|
54
|
+
return openBlock(), createElementBlock("li", {
|
|
55
|
+
class: normalizeClass(["m-editor-history-list-item m-editor-history-list-initial", {
|
|
56
|
+
"is-current": __props.isCurrent,
|
|
57
|
+
"is-clickable": !__props.isCurrent
|
|
58
|
+
}]),
|
|
59
|
+
title: rowTitle.value
|
|
60
|
+
}, [
|
|
61
|
+
_cache[0] || (_cache[0] = createElementVNode("span", {
|
|
62
|
+
class: "m-editor-history-list-item-index",
|
|
63
|
+
title: "历史步骤编号 #0(未修改的初始状态)"
|
|
64
|
+
}, "#0", -1)),
|
|
65
|
+
_cache[1] || (_cache[1] = createElementVNode("span", { class: "m-editor-history-list-item-op op-initial" }, "初始", -1)),
|
|
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)
|
|
78
|
+
], 10, _hoisted_1);
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
//#endregion
|
|
83
|
+
export { InitialRow_vue_vue_type_script_setup_true_lang_default as default };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import PageTab_vue_vue_type_script_setup_true_lang_default from "./PageTab.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
//#region packages/editor/src/layouts/history-list/PageTab.vue
|
|
3
|
+
var PageTab_default = PageTab_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { PageTab_default as default };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describePageGroup, describePageStep, isHistoryGroupExpanded, isPageStepRevertable, toRowGroup } from "./composables.js";
|
|
2
|
+
import GroupRow_default from "./GroupRow.js";
|
|
3
|
+
import InitialRow_default from "./InitialRow.js";
|
|
4
|
+
import { TMagicScrollbar } from "@tmagic/design";
|
|
5
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
|
|
6
|
+
//#region packages/editor/src/layouts/history-list/PageTab.vue?vue&type=script&setup=true&lang.ts
|
|
7
|
+
var _hoisted_1 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "m-editor-history-list-empty"
|
|
10
|
+
};
|
|
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({
|
|
17
|
+
name: "MEditorHistoryListPageTab",
|
|
18
|
+
__name: "PageTab",
|
|
19
|
+
props: {
|
|
20
|
+
list: {},
|
|
21
|
+
expanded: {},
|
|
22
|
+
marker: {}
|
|
23
|
+
},
|
|
24
|
+
emits: [
|
|
25
|
+
"toggle",
|
|
26
|
+
"goto",
|
|
27
|
+
"goto-initial",
|
|
28
|
+
"diff-step",
|
|
29
|
+
"revert-step",
|
|
30
|
+
"select",
|
|
31
|
+
"clear"
|
|
32
|
+
],
|
|
33
|
+
setup(__props) {
|
|
34
|
+
const props = __props;
|
|
35
|
+
/**
|
|
36
|
+
* 当前 step 是否可查看差异:
|
|
37
|
+
* - 仅 update 操作;
|
|
38
|
+
* - 单节点更新(diff.length === 1),且 oldSchema / newSchema 都存在。
|
|
39
|
+
* 多节点更新难以选定单一对比目标,统一不展示差异入口。
|
|
40
|
+
*/
|
|
41
|
+
const isPageStepDiffable = (step) => {
|
|
42
|
+
if (step.opType !== "update") return false;
|
|
43
|
+
const items = step.diff ?? [];
|
|
44
|
+
if (items.length !== 1) return false;
|
|
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
|
|
53
|
+
};
|
|
54
|
+
const rowKey = (group) => `pg-${group.steps[0]?.index}`;
|
|
55
|
+
const toRow = (group) => toRowGroup(group, rowKey(group), descriptor);
|
|
56
|
+
/**
|
|
57
|
+
* 是否处于"初始状态"——即对应页面历史栈 cursor===0:
|
|
58
|
+
* 当 list 中所有 group 的 applied 都为 false 时即为该状态(空列表 `every` 返回 true,
|
|
59
|
+
* 即仅有 marker、无任何操作记录时也视为处于初始状态)。
|
|
60
|
+
*/
|
|
61
|
+
const isInitial = computed(() => props.list.every((g) => !g.applied));
|
|
62
|
+
return (_ctx, _cache) => {
|
|
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) => {
|
|
70
|
+
return openBlock(), createBlock(GroupRow_default, {
|
|
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"]);
|
|
81
|
+
}), 128)),
|
|
82
|
+
createCommentVNode("\n 初始状态项:永远位于列表底部(页面 tab 倒序展示,最底部=最早),\n 作为\"未修改\"零点。当所有 group 都未 applied 时它即为当前位置。\n 设置 root 时生成的「未修改的初始状态」标记(marker)会作为该行的文案与时间来源。\n "),
|
|
83
|
+
createVNode(InitialRow_default, {
|
|
84
|
+
"is-current": isInitial.value,
|
|
85
|
+
marker: __props.marker,
|
|
86
|
+
onGotoInitial: _cache[6] || (_cache[6] = ($event) => _ctx.$emit("goto-initial"))
|
|
87
|
+
}, null, 8, ["is-current", "marker"])
|
|
88
|
+
])]),
|
|
89
|
+
_: 1
|
|
90
|
+
})], 64));
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
//#endregion
|
|
95
|
+
export { PageTab_vue_vue_type_script_setup_true_lang_default as default };
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { datetimeFormatter } from "@tmagic/form";
|
|
2
|
+
import { tMagicMessageBox } from "@tmagic/design";
|
|
3
|
+
//#region packages/editor/src/layouts/history-list/composables.ts
|
|
4
|
+
/** 合并组默认展开;仅当 expanded[key] === false 时为收起。 */
|
|
5
|
+
var isHistoryGroupExpanded = (expanded, key) => expanded[key] !== false;
|
|
6
|
+
/**
|
|
7
|
+
* 历史面板的时间展示:
|
|
8
|
+
* - 当天的记录只显示 `HH:mm:ss`;
|
|
9
|
+
* - 跨天的记录显示 `MM-DD HH:mm:ss`。
|
|
10
|
+
* 无时间戳(旧数据 / 未写入)时返回空串,UI 据此不渲染时间。
|
|
11
|
+
*/
|
|
12
|
+
var formatHistoryTime = (timestamp) => {
|
|
13
|
+
if (!timestamp) return "";
|
|
14
|
+
return `${datetimeFormatter(new Date(timestamp), "", "YYYY-MM-DD") === datetimeFormatter(/* @__PURE__ */ new Date(), "", "YYYY-MM-DD") ? datetimeFormatter(new Date(timestamp), "", "HH:mm:ss") : datetimeFormatter(new Date(timestamp), "", "MM-DD HH:mm:ss")}`;
|
|
15
|
+
};
|
|
16
|
+
/** 完整时间(含年份与秒),用于 title 悬浮提示。无时间戳时返回空串。 */
|
|
17
|
+
var formatHistoryFullTime = (timestamp) => timestamp ? `${datetimeFormatter(new Date(timestamp), "", "YYYY-MM-DD HH:mm:ss")}` : "";
|
|
18
|
+
/** 取一组历史步骤里最后一步(最近一次)的时间戳,用于组头部展示。 */
|
|
19
|
+
var groupTimestamp = (group) => group.steps[group.steps.length - 1]?.step.timestamp;
|
|
20
|
+
var opLabel = (op) => {
|
|
21
|
+
switch (op) {
|
|
22
|
+
case "add": return "新增";
|
|
23
|
+
case "remove": return "删除";
|
|
24
|
+
default: return "修改";
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/** 内置操作途径的中文文案;自定义来源直接回显原值,未知 / 缺省返回空串(UI 据此不渲染)。 */
|
|
28
|
+
var HISTORY_SOURCE_LABELS = {
|
|
29
|
+
stage: "画布",
|
|
30
|
+
tree: "树面板",
|
|
31
|
+
"component-panel": "组件面板",
|
|
32
|
+
props: "配置面板",
|
|
33
|
+
code: "源码",
|
|
34
|
+
"root-code": "DSL源码",
|
|
35
|
+
"stage-contextmenu": "画布菜单",
|
|
36
|
+
"tree-contextmenu": "树菜单",
|
|
37
|
+
toolbar: "工具栏",
|
|
38
|
+
shortcut: "快捷键",
|
|
39
|
+
rollback: "回滚",
|
|
40
|
+
api: "接口",
|
|
41
|
+
ai: "AI",
|
|
42
|
+
initial: "初始值",
|
|
43
|
+
sync: "同步",
|
|
44
|
+
unknown: "未知"
|
|
45
|
+
};
|
|
46
|
+
/** 操作途径文案:用于历史面板展示「画布 / 树面板 / 配置面板…」标签。 */
|
|
47
|
+
var sourceLabel = (source = "unknown") => {
|
|
48
|
+
return HISTORY_SOURCE_LABELS[source] ?? `${source}`;
|
|
49
|
+
};
|
|
50
|
+
/** 取一组历史步骤里最后一步(最近一次)的操作途径,用于组头部展示。 */
|
|
51
|
+
var groupSource = (group) => group.steps[group.steps.length - 1]?.step.source;
|
|
52
|
+
/** 取一组历史步骤里最后一步(最近一次)的操作人,用于组头部展示。 */
|
|
53
|
+
var groupOperator = (group) => group.steps[group.steps.length - 1]?.step.operator;
|
|
54
|
+
/**
|
|
55
|
+
* 把一个历史分组(页面 / bucket)派生为 GroupRow 直接消费的视图模型 {@link HistoryRowGroup}。
|
|
56
|
+
* 统一了原先 PageTab / Bucket 各自内联的 sub-steps 映射逻辑:描述、可差异、可回滚、时间、途径
|
|
57
|
+
* 全部在此一次性算好,组件层只负责渲染。
|
|
58
|
+
*/
|
|
59
|
+
var toRowGroup = (group, key, descriptor) => {
|
|
60
|
+
const { describeGroup, describeStep, isStepDiffable, isStepRevertable } = descriptor;
|
|
61
|
+
const timestamp = groupTimestamp(group);
|
|
62
|
+
const lastStep = group.steps[group.steps.length - 1]?.step;
|
|
63
|
+
return {
|
|
64
|
+
key,
|
|
65
|
+
applied: group.applied,
|
|
66
|
+
isCurrent: Boolean(group.isCurrent),
|
|
67
|
+
opType: group.opType,
|
|
68
|
+
desc: describeGroup ? describeGroup(group) : describeStep(lastStep),
|
|
69
|
+
source: groupSource(group),
|
|
70
|
+
operator: groupOperator(group),
|
|
71
|
+
time: formatHistoryTime(timestamp),
|
|
72
|
+
timeTitle: formatHistoryFullTime(timestamp),
|
|
73
|
+
subSteps: group.steps.map((s) => ({
|
|
74
|
+
index: s.index,
|
|
75
|
+
applied: s.applied,
|
|
76
|
+
isCurrent: Boolean(s.isCurrent),
|
|
77
|
+
saved: s.step.saved,
|
|
78
|
+
desc: describeStep(s.step),
|
|
79
|
+
diffable: isStepDiffable ? isStepDiffable(s.step) : false,
|
|
80
|
+
revertable: s.applied && (isStepRevertable ? isStepRevertable(s.step) : true),
|
|
81
|
+
source: s.step.source,
|
|
82
|
+
operator: s.step.operator,
|
|
83
|
+
time: formatHistoryTime(s.step.timestamp),
|
|
84
|
+
timeTitle: formatHistoryFullTime(s.step.timestamp)
|
|
85
|
+
}))
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
var nameOf = (node) => node?.name || node?.type || `${node?.id ?? ""}`;
|
|
89
|
+
/**
|
|
90
|
+
* 默认描述里展示「名称 (id: xxx)」,便于区分同名实体。
|
|
91
|
+
* - 当未传入 id,或 label 本身就是 id 字符串(即没有 name/type/title 可用)时,仅展示 label,避免出现「123 (id: 123)」。
|
|
92
|
+
*/
|
|
93
|
+
var labelWithId = (label, id) => {
|
|
94
|
+
const labelStr = label === void 0 || label === null ? "" : `${label}`;
|
|
95
|
+
if (id === void 0 || id === null || id === "") return labelStr;
|
|
96
|
+
if (labelStr === "" || labelStr === `${id}`) return `${id}`;
|
|
97
|
+
return `${labelStr} (id: ${id})`;
|
|
98
|
+
};
|
|
99
|
+
/** 从一组可选 historyDescription 中取最后一条非空值;都为空时返回 undefined。 */
|
|
100
|
+
var pickLastDescription = (descs) => {
|
|
101
|
+
for (let i = descs.length - 1; i >= 0; i--) if (descs[i]) return descs[i];
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* 页面 / 数据源 / 代码块三类历史共用的单步描述核心。
|
|
105
|
+
* 各类型只在「取展示名」与「实体单位名」上有差异,通过参数注入,文案模板完全一致:
|
|
106
|
+
* - 新增 / 删除:单实体展示「label」,多实体(仅页面可能出现)退化为「N 个X」;
|
|
107
|
+
* - 修改:展示「label · propPath」,无 diff 时兜底「X」,多实体退化为「N 个X」。
|
|
108
|
+
* 操作类型(新增 / 删除 / 修改)已由列表行的 op 徽标单独展示,故描述文案不再重复动词。
|
|
109
|
+
* 展示 id 统一取 schema.id;调用方显式传入的 historyDescription 永远优先。
|
|
110
|
+
*/
|
|
111
|
+
var describeStep = (step, getLabel, unit) => {
|
|
112
|
+
if (step.historyDescription) return step.historyDescription;
|
|
113
|
+
const items = step.diff ?? [];
|
|
114
|
+
const label = (schema) => labelWithId(getLabel(schema), schema?.id);
|
|
115
|
+
if (step.opType === "add") {
|
|
116
|
+
const node = items[0]?.newSchema;
|
|
117
|
+
return items.length === 1 && node ? label(node) : `${items.length} 个${unit}`;
|
|
118
|
+
}
|
|
119
|
+
if (step.opType === "remove") {
|
|
120
|
+
const node = items[0]?.oldSchema;
|
|
121
|
+
return items.length === 1 && node ? label(node) : `${items.length} 个${unit}`;
|
|
122
|
+
}
|
|
123
|
+
if (!items.length) return unit;
|
|
124
|
+
if (items.length === 1) {
|
|
125
|
+
const { newSchema, oldSchema, changeRecords } = items[0];
|
|
126
|
+
const propPath = changeRecords?.map((changeRecord) => changeRecord.propPath).join(",");
|
|
127
|
+
const target = label(newSchema ?? oldSchema);
|
|
128
|
+
return propPath ? `${target} · ${propPath}` : target;
|
|
129
|
+
}
|
|
130
|
+
return `${items.length} 个${unit}`;
|
|
131
|
+
};
|
|
132
|
+
var describePageStep = (step) => describeStep(step, (node) => nameOf(node), "节点");
|
|
133
|
+
/**
|
|
134
|
+
* 合并组的展示文案:
|
|
135
|
+
* - 若组内任一步显式提供了 historyDescription:取最后一条非空 historyDescription(最近一次的描述更准确);
|
|
136
|
+
* - 单步组:复用 describePageStep;
|
|
137
|
+
* - 多步组(连续修改同一节点):展示节点名 + 涉及的前几个 propPath。
|
|
138
|
+
*/
|
|
139
|
+
var describePageGroup = (group) => {
|
|
140
|
+
const lastDesc = pickLastDescription(group.steps.map((s) => s.step.historyDescription));
|
|
141
|
+
if (lastDesc) return lastDesc;
|
|
142
|
+
if (group.steps.length === 1) return describePageStep(group.steps[0].step);
|
|
143
|
+
return labelWithId(group.targetName ?? (group.targetId !== void 0 ? `${group.targetId}` : "节点"), group.targetId);
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* 页面 step 是否支持「回滚」(类 git revert):
|
|
147
|
+
* - 新增 / 删除:不依赖 changeRecords,反向应用即删除 / 加回,始终可回滚;
|
|
148
|
+
* - 更新:必须每个被更新节点都带有 changeRecords,才支持按 propPath 局部反向 patch。
|
|
149
|
+
* 缺失 changeRecords 的更新只能整节点替换,会冲掉该节点后续的无关变更,因此不支持回滚。
|
|
150
|
+
*/
|
|
151
|
+
var isPageStepRevertable = (step) => {
|
|
152
|
+
if (step.opType !== "update") return true;
|
|
153
|
+
const items = step.diff ?? [];
|
|
154
|
+
if (!items.length) return false;
|
|
155
|
+
return items.every((item) => Boolean(item.changeRecords?.length));
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* 单 diff 项历史(数据源 / 代码块)是否支持「回滚」:
|
|
159
|
+
* - 新增(无 oldSchema)/ 删除(无 newSchema):不依赖 changeRecords,始终可回滚;
|
|
160
|
+
* - 更新(前后内容都存在):必须有 changeRecords 才支持局部反向 patch,否则不支持回滚。
|
|
161
|
+
*/
|
|
162
|
+
var isSingleDiffStepRevertable = (step) => {
|
|
163
|
+
const item = step.diff?.[0];
|
|
164
|
+
if (!item?.oldSchema || !item?.newSchema) return true;
|
|
165
|
+
return Boolean(item.changeRecords?.length);
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* 通用二次确认弹窗:清空历史 / 无法差异对比的回滚等会改变状态的操作,先弹出确认框,
|
|
169
|
+
* 用户点击「确定」返回 true,取消(confirm reject)时返回 false 并静默忽略。
|
|
170
|
+
*/
|
|
171
|
+
var confirmHistoryAction = async (message) => {
|
|
172
|
+
try {
|
|
173
|
+
await tMagicMessageBox.confirm(message, "提示", {
|
|
174
|
+
confirmButtonText: "确定",
|
|
175
|
+
cancelButtonText: "取消",
|
|
176
|
+
type: "warning"
|
|
177
|
+
});
|
|
178
|
+
return true;
|
|
179
|
+
} catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
//#endregion
|
|
184
|
+
export { confirmHistoryAction, describePageGroup, describePageStep, describeStep, formatHistoryFullTime, formatHistoryTime, isHistoryGroupExpanded, isPageStepRevertable, isSingleDiffStepRevertable, opLabel, sourceLabel, toRowGroup };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { useServices } from "../../hooks/use-services.js";
|
|
2
|
+
import { computed, reactive } from "vue";
|
|
3
|
+
//#region packages/editor/src/layouts/history-list/useHistoryList.ts
|
|
4
|
+
/**
|
|
5
|
+
* 历史记录面板共享逻辑:
|
|
6
|
+
* - 暴露三类历史的聚合数据(页面 / 数据源 / 代码块);
|
|
7
|
+
* - 提供折叠状态管理;
|
|
8
|
+
* - 提供操作描述文案生成器。
|
|
9
|
+
*
|
|
10
|
+
* 所有数据基于 historyService 的 reactive state 派生,自动跟随历史变化刷新。
|
|
11
|
+
*/
|
|
12
|
+
var useHistoryList = () => {
|
|
13
|
+
const { editorService, historyService } = useServices();
|
|
14
|
+
/**
|
|
15
|
+
* 折叠状态:key 形如 `pg-${组内首步 index}` / `ds-${id}-${组内首步 index}` / `cb-${id}-${组内首步 index}`。
|
|
16
|
+
* 用组内首步的稳定 index(而非展示位置)作为 key,确保历史数据更新后已展开的分组状态保持不变。
|
|
17
|
+
* 合并组默认展开;仅当值为 `false` 时表示收起。
|
|
18
|
+
*/
|
|
19
|
+
const expanded = reactive({});
|
|
20
|
+
const toggleGroup = (key) => {
|
|
21
|
+
expanded[key] = expanded[key] === false;
|
|
22
|
+
};
|
|
23
|
+
const pageGroups = computed(() => historyService.getHistoryGroups("page", editorService.get("page")?.id));
|
|
24
|
+
const dataSourceGroups = computed(() => historyService.getHistoryGroups("dataSource"));
|
|
25
|
+
const codeBlockGroups = computed(() => historyService.getHistoryGroups("codeBlock"));
|
|
26
|
+
/** 页面 tab 倒序展示(最新一组在最上面)。 */
|
|
27
|
+
const pageGroupsDisplay = computed(() => pageGroups.value.slice().reverse());
|
|
28
|
+
/**
|
|
29
|
+
* 把按时间正序的 group 列表,再按 id 聚拢成 bucket(同 id 的所有分组放一起)。
|
|
30
|
+
* 每个 bucket 内部仍然按时间倒序展示(最近的操作最先看到)。
|
|
31
|
+
*/
|
|
32
|
+
const groupByTarget = (groups) => {
|
|
33
|
+
const map = /* @__PURE__ */ new Map();
|
|
34
|
+
groups.forEach((g) => {
|
|
35
|
+
const list = map.get(g.id) ?? [];
|
|
36
|
+
list.push(g);
|
|
37
|
+
map.set(g.id, list);
|
|
38
|
+
});
|
|
39
|
+
return Array.from(map.entries()).map(([id, gs]) => ({
|
|
40
|
+
id,
|
|
41
|
+
groups: gs.slice().reverse()
|
|
42
|
+
}));
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
expanded,
|
|
46
|
+
toggleGroup,
|
|
47
|
+
pageGroups,
|
|
48
|
+
dataSourceGroups,
|
|
49
|
+
codeBlockGroups,
|
|
50
|
+
pageGroupsDisplay,
|
|
51
|
+
dataSourceGroupsByTarget: computed(() => groupByTarget(dataSourceGroups.value)),
|
|
52
|
+
codeBlockGroupsByTarget: computed(() => groupByTarget(codeBlockGroups.value))
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { useHistoryList };
|