@tmagic/editor 1.8.0-beta.1 → 1.8.0-beta.3
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 +20 -2
- package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +18 -110
- package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +6 -0
- package/dist/es/components/CompareForm.js +5 -0
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +171 -0
- package/dist/es/editorProps.js +2 -0
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +19 -3
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +2 -5
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +18 -2
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +37 -6
- package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +14 -6
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +3 -1
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +15 -7
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +14 -6
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +58 -11
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +11 -6
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +8 -5
- package/dist/es/hooks/use-code-block-edit.js +2 -2
- package/dist/es/hooks/use-stage.js +17 -8
- package/dist/es/index.js +5 -1
- package/dist/es/initService.js +6 -6
- package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +6 -5
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +12 -7
- package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +8 -0
- 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 +103 -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 +73 -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 +198 -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 +245 -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 +340 -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 +54 -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 +105 -0
- package/dist/es/layouts/history-list/composables.js +172 -0
- package/dist/es/layouts/sidebar/layer/use-node-status.js +1 -1
- package/dist/es/services/BaseService.js +31 -68
- package/dist/es/services/codeBlock.js +205 -8
- package/dist/es/services/componentList.js +2 -2
- package/dist/es/services/dataSource.js +217 -8
- package/dist/es/services/dep.js +21 -9
- package/dist/es/services/editor.js +350 -160
- package/dist/es/services/events.js +2 -2
- package/dist/es/services/history.js +410 -12
- package/dist/es/services/keybinding.js +2 -2
- 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 +2 -2
- package/dist/es/style.css +379 -1
- package/dist/es/utils/code-block.js +122 -0
- package/dist/es/utils/content-menu.js +4 -5
- package/dist/es/utils/dep/worker.js +1 -1
- package/dist/es/utils/editor.js +2 -2
- package/dist/es/utils/undo-redo.js +20 -0
- package/dist/style.css +379 -1
- package/dist/tmagic-editor.umd.cjs +3331 -787
- package/package.json +7 -7
- package/src/Editor.vue +15 -0
- package/src/components/CodeBlockEditor.vue +20 -109
- package/src/components/CodeParams.vue +6 -0
- package/src/components/CompareForm.vue +238 -0
- 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 +30 -2
- package/src/fields/DataSourceFieldSelect/FieldSelect.vue +7 -1
- package/src/fields/DataSourceFieldSelect/Index.vue +2 -2
- package/src/fields/DataSourceFields.vue +12 -3
- package/src/fields/DataSourceMethodSelect.vue +4 -1
- package/src/fields/DataSourceMethods.vue +14 -4
- 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/UISelect.vue +5 -2
- package/src/hooks/use-code-block-edit.ts +5 -2
- package/src/hooks/use-stage.ts +24 -7
- package/src/index.ts +3 -0
- package/src/layouts/CodeEditor.vue +17 -5
- package/src/layouts/Framework.vue +10 -5
- package/src/layouts/NavMenu.vue +9 -0
- package/src/layouts/history-list/Bucket.vue +124 -0
- package/src/layouts/history-list/BucketTab.vue +77 -0
- package/src/layouts/history-list/GroupRow.vue +242 -0
- package/src/layouts/history-list/HistoryDiffDialog.vue +231 -0
- package/src/layouts/history-list/HistoryListPanel.vue +380 -0
- package/src/layouts/history-list/InitialRow.vue +52 -0
- package/src/layouts/history-list/PageTab.vue +108 -0
- package/src/layouts/history-list/composables.ts +226 -0
- package/src/layouts/sidebar/layer/use-node-status.ts +9 -6
- package/src/services/BaseService.ts +35 -86
- package/src/services/codeBlock.ts +256 -5
- package/src/services/dataSource.ts +257 -6
- package/src/services/dep.ts +32 -9
- package/src/services/editor.ts +454 -171
- package/src/services/history.ts +455 -8
- package/src/services/props.ts +2 -2
- package/src/theme/history-list-panel.scss +462 -0
- package/src/theme/theme.scss +1 -0
- package/src/type.ts +269 -6
- package/src/utils/code-block.ts +150 -0
- package/src/utils/content-menu.ts +8 -5
- package/src/utils/dep/worker.ts +5 -3
- package/src/utils/index.ts +1 -0
- package/src/utils/undo-redo.ts +23 -0
- package/types/index.d.ts +2274 -819
- 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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getEditorConfig } from "../utils/config.js";
|
|
2
|
+
import { serializeConfig } from "../utils/editor.js";
|
|
2
3
|
import monaco_editor_default from "../utils/monaco-editor.js";
|
|
3
4
|
import Icon_default from "../components/Icon.js";
|
|
4
5
|
import { TMagicButton } from "@tmagic/design";
|
|
5
6
|
import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onUnmounted, openBlock, ref, unref, useTemplateRef, watch, withCtx } from "vue";
|
|
6
7
|
import { throttle } from "lodash-es";
|
|
7
|
-
import serialize from "serialize-javascript";
|
|
8
8
|
import { FullScreen } from "@element-plus/icons-vue";
|
|
9
9
|
//#region packages/editor/src/layouts/CodeEditor.vue?vue&type=script&setup=true&lang.ts
|
|
10
10
|
var _hoisted_1 = { class: "magic-code-editor" };
|
|
@@ -94,10 +94,7 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
94
94
|
const toString = (v, language) => {
|
|
95
95
|
let value;
|
|
96
96
|
if (typeof v !== "string") if (language === "json") value = JSON.stringify(v, null, 2);
|
|
97
|
-
else value =
|
|
98
|
-
space: 2,
|
|
99
|
-
unsafe: true
|
|
100
|
-
}).replace(/"(\w+)":\s/g, "$1: ");
|
|
97
|
+
else value = serializeConfig(v);
|
|
101
98
|
else value = v;
|
|
102
99
|
if (language === "javascript" && value.startsWith("{") && value.endsWith("}")) value = `(${value})`;
|
|
103
100
|
return value;
|
|
@@ -194,6 +191,10 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
194
191
|
deep: true,
|
|
195
192
|
immediate: true
|
|
196
193
|
});
|
|
194
|
+
watch(() => props.modifiedValues, (v, preV) => {
|
|
195
|
+
if (props.type !== "diff") return;
|
|
196
|
+
if (v !== preV) setEditorValue(props.initValues, props.modifiedValues);
|
|
197
|
+
}, { deep: true });
|
|
197
198
|
watch(() => props.options, (v) => {
|
|
198
199
|
vsEditor?.updateOptions(v);
|
|
199
200
|
vsDiffEditor?.updateOptions(v);
|
|
@@ -19,9 +19,11 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
|
|
|
19
19
|
props: {
|
|
20
20
|
disabledPageFragment: { type: Boolean },
|
|
21
21
|
pageBarSortOptions: {},
|
|
22
|
-
pageFilterFunction: { type: Function }
|
|
22
|
+
pageFilterFunction: { type: Function },
|
|
23
|
+
hideSidebar: { type: Boolean }
|
|
23
24
|
},
|
|
24
25
|
setup(__props) {
|
|
26
|
+
const props = __props;
|
|
25
27
|
const codeOptions = inject("codeOptions", {});
|
|
26
28
|
const { editorService, uiService, storageService } = useServices();
|
|
27
29
|
const contentEl = useTemplateRef("content");
|
|
@@ -41,7 +43,7 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
|
|
|
41
43
|
});
|
|
42
44
|
});
|
|
43
45
|
const columnWidthChange = (columnW) => {
|
|
44
|
-
storageService.setItem(LEFT_COLUMN_WIDTH_STORAGE_KEY, columnW.left, { protocol: Protocol.NUMBER });
|
|
46
|
+
if (!props.hideSidebar) storageService.setItem(LEFT_COLUMN_WIDTH_STORAGE_KEY, columnW.left, { protocol: Protocol.NUMBER });
|
|
45
47
|
storageService.setItem(RIGHT_COLUMN_WIDTH_STORAGE_KEY, columnW.right, { protocol: Protocol.NUMBER });
|
|
46
48
|
uiService.set("columnWidth", columnW);
|
|
47
49
|
};
|
|
@@ -87,15 +89,14 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
|
|
|
87
89
|
"left-class": "m-editor-framework-left",
|
|
88
90
|
"center-class": "m-editor-framework-center",
|
|
89
91
|
"right-class": "m-editor-framework-right",
|
|
90
|
-
left: columnWidth.value.left,
|
|
92
|
+
left: __props.hideSidebar ? void 0 : columnWidth.value.left,
|
|
91
93
|
right: columnWidth.value.right,
|
|
92
|
-
"min-left": unref(200),
|
|
94
|
+
"min-left": __props.hideSidebar ? 0 : unref(200),
|
|
93
95
|
"min-right": unref(300),
|
|
94
96
|
"min-center": unref(400),
|
|
95
97
|
width: frameworkRect.value.width,
|
|
96
98
|
onChange: columnWidthChange
|
|
97
99
|
}, createSlots({
|
|
98
|
-
left: withCtx(() => [renderSlot(_ctx.$slots, "sidebar")]),
|
|
99
100
|
center: withCtx(() => [page.value ? renderSlot(_ctx.$slots, "workspace", { key: 0 }) : renderSlot(_ctx.$slots, "empty", { key: 1 }, () => [createVNode(AddPageBox_default, { "disabled-page-fragment": __props.disabledPageFragment }, null, 8, ["disabled-page-fragment"])]), renderSlot(_ctx.$slots, "page-bar", {}, () => [createVNode(PageBar_default, {
|
|
100
101
|
"disabled-page-fragment": __props.disabledPageFragment,
|
|
101
102
|
"page-bar-sort-options": __props.pageBarSortOptions,
|
|
@@ -112,10 +113,14 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
|
|
|
112
113
|
"filter-function"
|
|
113
114
|
])])]),
|
|
114
115
|
_: 2
|
|
115
|
-
}, [
|
|
116
|
+
}, [!__props.hideSidebar ? {
|
|
117
|
+
name: "left",
|
|
118
|
+
fn: withCtx(() => [renderSlot(_ctx.$slots, "sidebar")]),
|
|
119
|
+
key: "0"
|
|
120
|
+
} : void 0, page.value ? {
|
|
116
121
|
name: "right",
|
|
117
122
|
fn: withCtx(() => [renderSlot(_ctx.$slots, "props-panel")]),
|
|
118
|
-
key: "
|
|
123
|
+
key: "1"
|
|
119
124
|
} : void 0]), 1032, [
|
|
120
125
|
"left",
|
|
121
126
|
"right",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ColumnLayout } from "../type.js";
|
|
2
2
|
import { useServices } from "../hooks/use-services.js";
|
|
3
|
+
import HistoryListPanel_default from "./history-list/HistoryListPanel.js";
|
|
3
4
|
import NavMenuColumn_default from "./NavMenuColumn.js";
|
|
4
5
|
import { NodeType } from "@tmagic/core";
|
|
5
6
|
import { Fragment, computed, createBlock, createElementBlock, defineComponent, markRaw, normalizeStyle, onBeforeUnmount, onMounted, openBlock, renderList, unref, useTemplateRef } from "vue";
|
|
@@ -68,6 +69,13 @@ var NavMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
|
|
|
68
69
|
handler: () => editorService.redo()
|
|
69
70
|
});
|
|
70
71
|
break;
|
|
72
|
+
case "history-list":
|
|
73
|
+
config.push({
|
|
74
|
+
type: "component",
|
|
75
|
+
className: "history-list",
|
|
76
|
+
component: markRaw(HistoryListPanel_default)
|
|
77
|
+
});
|
|
78
|
+
break;
|
|
71
79
|
case "zoom-in":
|
|
72
80
|
config.push({
|
|
73
81
|
type: "button",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import Bucket_vue_vue_type_script_setup_true_lang_default from "./Bucket.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
//#region packages/editor/src/layouts/history-list/Bucket.vue
|
|
3
|
+
var Bucket_default = Bucket_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { Bucket_default as default };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { formatHistoryFullTime, formatHistoryTime, groupTimestamp } from "./composables.js";
|
|
2
|
+
import GroupRow_default from "./GroupRow.js";
|
|
3
|
+
import InitialRow_default from "./InitialRow.js";
|
|
4
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, openBlock, renderList, toDisplayString, unref } from "vue";
|
|
5
|
+
//#region packages/editor/src/layouts/history-list/Bucket.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
var _hoisted_1 = { class: "m-editor-history-list-bucket" };
|
|
7
|
+
var _hoisted_2 = { class: "m-editor-history-list-bucket-title" };
|
|
8
|
+
var _hoisted_3 = { class: "m-editor-history-list-bucket-count" };
|
|
9
|
+
var _hoisted_4 = { class: "m-editor-history-list-ul" };
|
|
10
|
+
var Bucket_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
11
|
+
name: "MEditorHistoryListBucket",
|
|
12
|
+
__name: "Bucket",
|
|
13
|
+
props: {
|
|
14
|
+
title: {},
|
|
15
|
+
bucketId: {},
|
|
16
|
+
prefix: {},
|
|
17
|
+
showInitial: {
|
|
18
|
+
type: Boolean,
|
|
19
|
+
default: true
|
|
20
|
+
},
|
|
21
|
+
groups: {},
|
|
22
|
+
describeGroup: {},
|
|
23
|
+
describeStep: {},
|
|
24
|
+
isStepDiffable: {},
|
|
25
|
+
expanded: {},
|
|
26
|
+
gotoEnabled: {
|
|
27
|
+
type: Boolean,
|
|
28
|
+
default: true
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
emits: [
|
|
32
|
+
"toggle",
|
|
33
|
+
"goto",
|
|
34
|
+
"goto-initial",
|
|
35
|
+
"diff-step",
|
|
36
|
+
"revert-step"
|
|
37
|
+
],
|
|
38
|
+
setup(__props) {
|
|
39
|
+
const props = __props;
|
|
40
|
+
/** 该 bucket 是否处于初始状态(栈 cursor=0),等价于全部 group 都未 applied。 */
|
|
41
|
+
const isInitial = computed(() => props.groups.length > 0 && props.groups.every((g) => !g.applied));
|
|
42
|
+
return (_ctx, _cache) => {
|
|
43
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
|
|
44
|
+
createElementVNode("span", null, toDisplayString(__props.title), 1),
|
|
45
|
+
createElementVNode("code", null, toDisplayString(String(__props.bucketId)), 1),
|
|
46
|
+
createElementVNode("span", _hoisted_3, toDisplayString(__props.groups.length) + " 组", 1)
|
|
47
|
+
]), createElementVNode("ul", _hoisted_4, [
|
|
48
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.groups, (group) => {
|
|
49
|
+
return openBlock(), createBlock(GroupRow_default, {
|
|
50
|
+
key: `${__props.prefix}-${__props.bucketId}-${group.steps[0]?.index}`,
|
|
51
|
+
"group-key": `${__props.prefix}-${__props.bucketId}-${group.steps[0]?.index}`,
|
|
52
|
+
applied: group.applied,
|
|
53
|
+
merged: group.steps.length > 1,
|
|
54
|
+
"op-type": group.opType,
|
|
55
|
+
desc: __props.describeGroup(group),
|
|
56
|
+
time: unref(formatHistoryTime)(unref(groupTimestamp)(group)),
|
|
57
|
+
"time-title": unref(formatHistoryFullTime)(unref(groupTimestamp)(group)),
|
|
58
|
+
"step-count": group.steps.length,
|
|
59
|
+
"sub-steps": group.steps.map((s) => ({
|
|
60
|
+
index: s.index,
|
|
61
|
+
applied: s.applied,
|
|
62
|
+
isCurrent: s.isCurrent,
|
|
63
|
+
desc: __props.describeStep(s.step),
|
|
64
|
+
diffable: __props.isStepDiffable ? __props.isStepDiffable(s.step) : false,
|
|
65
|
+
revertable: s.applied,
|
|
66
|
+
time: unref(formatHistoryTime)(s.step.timestamp),
|
|
67
|
+
timeTitle: unref(formatHistoryFullTime)(s.step.timestamp)
|
|
68
|
+
})),
|
|
69
|
+
"is-current": group.isCurrent,
|
|
70
|
+
expanded: !!__props.expanded[`${__props.prefix}-${__props.bucketId}-${group.steps[0]?.index}`],
|
|
71
|
+
"goto-enabled": __props.gotoEnabled,
|
|
72
|
+
onToggle: _cache[0] || (_cache[0] = (key) => _ctx.$emit("toggle", key)),
|
|
73
|
+
onGoto: _cache[1] || (_cache[1] = (index) => _ctx.$emit("goto", __props.bucketId, index)),
|
|
74
|
+
onDiffStep: _cache[2] || (_cache[2] = (index) => _ctx.$emit("diff-step", __props.bucketId, index)),
|
|
75
|
+
onRevertStep: _cache[3] || (_cache[3] = (index) => _ctx.$emit("revert-step", __props.bucketId, index))
|
|
76
|
+
}, null, 8, [
|
|
77
|
+
"group-key",
|
|
78
|
+
"applied",
|
|
79
|
+
"merged",
|
|
80
|
+
"op-type",
|
|
81
|
+
"desc",
|
|
82
|
+
"time",
|
|
83
|
+
"time-title",
|
|
84
|
+
"step-count",
|
|
85
|
+
"sub-steps",
|
|
86
|
+
"is-current",
|
|
87
|
+
"expanded",
|
|
88
|
+
"goto-enabled"
|
|
89
|
+
]);
|
|
90
|
+
}), 128)),
|
|
91
|
+
createCommentVNode("\n 初始状态项:永远位于该 bucket 列表底部(同样按倒序展示,最底部 = 最早状态)。\n 当 bucket 内所有 group 都未 applied 时即为当前位置。\n showInitial=false 时不展示(用于没有\"撤销到初始状态\"语义的自定义历史,如业务模块历史)。\n "),
|
|
92
|
+
__props.showInitial !== false ? (openBlock(), createBlock(InitialRow_default, {
|
|
93
|
+
key: 0,
|
|
94
|
+
"is-current": isInitial.value,
|
|
95
|
+
"goto-enabled": __props.gotoEnabled,
|
|
96
|
+
onGotoInitial: _cache[4] || (_cache[4] = ($event) => _ctx.$emit("goto-initial", __props.bucketId))
|
|
97
|
+
}, null, 8, ["is-current", "goto-enabled"])) : createCommentVNode("v-if", true)
|
|
98
|
+
])]);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
//#endregion
|
|
103
|
+
export { Bucket_vue_vue_type_script_setup_true_lang_default as default };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import BucketTab_vue_vue_type_script_setup_true_lang_default from "./BucketTab.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
//#region packages/editor/src/layouts/history-list/BucketTab.vue
|
|
3
|
+
var BucketTab_default = BucketTab_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { BucketTab_default as default };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import Bucket_default from "./Bucket.js";
|
|
2
|
+
import { TMagicScrollbar } from "@tmagic/design";
|
|
3
|
+
import { Fragment, createBlock, createElementBlock, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
|
|
4
|
+
//#region packages/editor/src/layouts/history-list/BucketTab.vue?vue&type=script&setup=true&lang.ts
|
|
5
|
+
var _hoisted_1 = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "m-editor-history-list-empty"
|
|
8
|
+
};
|
|
9
|
+
var BucketTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
10
|
+
name: "MEditorHistoryListBucketTab",
|
|
11
|
+
__name: "BucketTab",
|
|
12
|
+
props: {
|
|
13
|
+
title: {},
|
|
14
|
+
prefix: {},
|
|
15
|
+
buckets: {},
|
|
16
|
+
describeGroup: {},
|
|
17
|
+
describeStep: {},
|
|
18
|
+
isStepDiffable: {},
|
|
19
|
+
expanded: {},
|
|
20
|
+
gotoEnabled: {
|
|
21
|
+
type: Boolean,
|
|
22
|
+
default: true
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
emits: [
|
|
26
|
+
"toggle",
|
|
27
|
+
"goto",
|
|
28
|
+
"goto-initial",
|
|
29
|
+
"diff-step",
|
|
30
|
+
"revert-step"
|
|
31
|
+
],
|
|
32
|
+
setup(__props) {
|
|
33
|
+
return (_ctx, _cache) => {
|
|
34
|
+
return !__props.buckets.length ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createBlock(unref(TMagicScrollbar), {
|
|
35
|
+
key: 1,
|
|
36
|
+
"max-height": "360px"
|
|
37
|
+
}, {
|
|
38
|
+
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.buckets, (bucket) => {
|
|
39
|
+
return openBlock(), createBlock(Bucket_default, {
|
|
40
|
+
key: `${__props.prefix}-${bucket.id}`,
|
|
41
|
+
title: __props.title,
|
|
42
|
+
"bucket-id": bucket.id,
|
|
43
|
+
prefix: __props.prefix,
|
|
44
|
+
groups: bucket.groups,
|
|
45
|
+
"describe-group": __props.describeGroup,
|
|
46
|
+
"describe-step": __props.describeStep,
|
|
47
|
+
"is-step-diffable": __props.isStepDiffable,
|
|
48
|
+
expanded: __props.expanded,
|
|
49
|
+
"goto-enabled": __props.gotoEnabled,
|
|
50
|
+
onToggle: _cache[0] || (_cache[0] = (key) => _ctx.$emit("toggle", key)),
|
|
51
|
+
onGoto: _cache[1] || (_cache[1] = (id, index) => _ctx.$emit("goto", id, index)),
|
|
52
|
+
onGotoInitial: _cache[2] || (_cache[2] = (id) => _ctx.$emit("goto-initial", id)),
|
|
53
|
+
onDiffStep: _cache[3] || (_cache[3] = (id, index) => _ctx.$emit("diff-step", id, index)),
|
|
54
|
+
onRevertStep: _cache[4] || (_cache[4] = (id, index) => _ctx.$emit("revert-step", id, index))
|
|
55
|
+
}, null, 8, [
|
|
56
|
+
"title",
|
|
57
|
+
"bucket-id",
|
|
58
|
+
"prefix",
|
|
59
|
+
"groups",
|
|
60
|
+
"describe-group",
|
|
61
|
+
"describe-step",
|
|
62
|
+
"is-step-diffable",
|
|
63
|
+
"expanded",
|
|
64
|
+
"goto-enabled"
|
|
65
|
+
]);
|
|
66
|
+
}), 128))]),
|
|
67
|
+
_: 1
|
|
68
|
+
}));
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
//#endregion
|
|
73
|
+
export { BucketTab_vue_vue_type_script_setup_true_lang_default as default };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import GroupRow_vue_vue_type_script_setup_true_lang_default from "./GroupRow.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
//#region packages/editor/src/layouts/history-list/GroupRow.vue
|
|
3
|
+
var GroupRow_default = GroupRow_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { GroupRow_default as default };
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { opLabel } from "./composables.js";
|
|
2
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, renderList, toDisplayString, unref, withModifiers } from "vue";
|
|
3
|
+
//#region packages/editor/src/layouts/history-list/GroupRow.vue?vue&type=script&setup=true&lang.ts
|
|
4
|
+
var _hoisted_1 = ["title"];
|
|
5
|
+
var _hoisted_2 = ["title"];
|
|
6
|
+
var _hoisted_3 = { class: "m-editor-history-list-item-desc" };
|
|
7
|
+
var _hoisted_4 = ["title"];
|
|
8
|
+
var _hoisted_5 = {
|
|
9
|
+
key: 1,
|
|
10
|
+
class: "m-editor-history-list-item-merge"
|
|
11
|
+
};
|
|
12
|
+
var _hoisted_6 = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "m-editor-history-list-substeps"
|
|
15
|
+
};
|
|
16
|
+
var _hoisted_7 = ["title"];
|
|
17
|
+
var _hoisted_8 = { class: "m-editor-history-list-item-index" };
|
|
18
|
+
var _hoisted_9 = { class: "m-editor-history-list-substep-desc" };
|
|
19
|
+
var _hoisted_10 = ["title"];
|
|
20
|
+
var _hoisted_11 = ["onClick"];
|
|
21
|
+
var _hoisted_12 = ["onClick"];
|
|
22
|
+
var _hoisted_13 = ["onClick"];
|
|
23
|
+
var GroupRow_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
24
|
+
name: "MEditorHistoryListGroupRow",
|
|
25
|
+
__name: "GroupRow",
|
|
26
|
+
props: {
|
|
27
|
+
groupKey: {},
|
|
28
|
+
applied: { type: Boolean },
|
|
29
|
+
merged: { type: Boolean },
|
|
30
|
+
opType: {},
|
|
31
|
+
desc: {},
|
|
32
|
+
time: {},
|
|
33
|
+
timeTitle: {},
|
|
34
|
+
stepCount: {},
|
|
35
|
+
subSteps: {},
|
|
36
|
+
expanded: { type: Boolean },
|
|
37
|
+
isCurrent: {
|
|
38
|
+
type: Boolean,
|
|
39
|
+
default: false
|
|
40
|
+
},
|
|
41
|
+
gotoEnabled: {
|
|
42
|
+
type: Boolean,
|
|
43
|
+
default: true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
emits: [
|
|
47
|
+
"toggle",
|
|
48
|
+
"goto",
|
|
49
|
+
"diff-step",
|
|
50
|
+
"revert-step"
|
|
51
|
+
],
|
|
52
|
+
setup(__props, { emit: __emit }) {
|
|
53
|
+
const props = __props;
|
|
54
|
+
const emit = __emit;
|
|
55
|
+
/**
|
|
56
|
+
* 仅合并组头部可点击(切换展开 / 收起);
|
|
57
|
+
* 单步组的跳转改由头部的「回退」按钮触发,整行不再可点击。
|
|
58
|
+
*/
|
|
59
|
+
const isHeadClickable = computed(() => props.merged);
|
|
60
|
+
const headTitle = computed(() => {
|
|
61
|
+
if (props.merged) return props.expanded ? "点击收起子步" : "点击展开子步";
|
|
62
|
+
if (props.isCurrent) return "当前所在记录";
|
|
63
|
+
return "";
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* 头部点击行为:仅合并组切换展开 / 收起;单步组不再响应整行点击。
|
|
67
|
+
*/
|
|
68
|
+
const onHeadClick = () => {
|
|
69
|
+
if (props.merged) emit("toggle", props.groupKey);
|
|
70
|
+
};
|
|
71
|
+
const onGotoClick = (index) => {
|
|
72
|
+
if (!props.gotoEnabled) return;
|
|
73
|
+
emit("goto", index);
|
|
74
|
+
};
|
|
75
|
+
const subStepTitle = (s) => {
|
|
76
|
+
if (s.isCurrent) return "当前所在记录";
|
|
77
|
+
return "";
|
|
78
|
+
};
|
|
79
|
+
/** 单步组头部是否展示"查看差异"入口:要求该唯一子步本身可对比。 */
|
|
80
|
+
const headDiffable = computed(() => !props.merged && Boolean(props.subSteps[0]?.diffable));
|
|
81
|
+
/** 单步组头部是否展示"回滚"入口:要求该唯一子步本身可回滚(已应用)。 */
|
|
82
|
+
const headRevertable = computed(() => !props.merged && Boolean(props.subSteps[0]?.revertable));
|
|
83
|
+
/**
|
|
84
|
+
* 合并组展开后的子步渲染顺序:与外层分组列表保持一致——倒序展示(最新的子步在最上方)。
|
|
85
|
+
* 外层 page tab / bucket 都已对 groups 做了 reverse,子步沿用同样的视觉规则更直观。
|
|
86
|
+
* 注意:仅用于渲染,原 `subSteps` 保持时间正序,`headIndexLabel` 等基于首尾索引的展示语义不变。
|
|
87
|
+
*/
|
|
88
|
+
const subStepsDisplay = computed(() => props.subSteps.slice().reverse());
|
|
89
|
+
/**
|
|
90
|
+
* 头部索引展示:
|
|
91
|
+
* - 单步组(merged=false):显示该唯一 step 的编号,如 `#5`;
|
|
92
|
+
* - 合并组:显示组内 step 的编号范围,如 `#3-#7`(首尾相同则退化为 `#5`)。
|
|
93
|
+
*
|
|
94
|
+
* 这里展示的是 step.index + 1(与子步列表 `#{{ s.index + 1 }}` 保持一致),从 1 起编号更符合直觉。
|
|
95
|
+
*/
|
|
96
|
+
const headIndexLabel = computed(() => {
|
|
97
|
+
const list = props.subSteps;
|
|
98
|
+
if (!list.length) return "";
|
|
99
|
+
const first = list[0].index + 1;
|
|
100
|
+
const last = list[list.length - 1].index + 1;
|
|
101
|
+
if (!props.merged || first === last) return `#${first}`;
|
|
102
|
+
return `#${first}-#${last}`;
|
|
103
|
+
});
|
|
104
|
+
const headIndexTitle = computed(() => {
|
|
105
|
+
if (!props.merged) return `历史步骤编号 #${props.subSteps[0]?.index + 1}`;
|
|
106
|
+
return `合并了第 ${props.subSteps[0]?.index + 1} 至第 ${props.subSteps[props.subSteps.length - 1]?.index + 1} 共 ${props.subSteps.length} 条历史步骤`;
|
|
107
|
+
});
|
|
108
|
+
const onDiffClick = (index) => {
|
|
109
|
+
emit("diff-step", index);
|
|
110
|
+
};
|
|
111
|
+
const onRevertClick = (index) => {
|
|
112
|
+
emit("revert-step", index);
|
|
113
|
+
};
|
|
114
|
+
return (_ctx, _cache) => {
|
|
115
|
+
return openBlock(), createElementBlock("li", { class: normalizeClass(["m-editor-history-list-item m-editor-history-list-group", {
|
|
116
|
+
"is-undone": !__props.applied,
|
|
117
|
+
"is-merged": __props.merged,
|
|
118
|
+
"is-current": __props.isCurrent
|
|
119
|
+
}]) }, [createElementVNode("div", {
|
|
120
|
+
class: normalizeClass(["m-editor-history-list-group-head", { "is-clickable": isHeadClickable.value }]),
|
|
121
|
+
title: headTitle.value,
|
|
122
|
+
onClick: onHeadClick
|
|
123
|
+
}, [
|
|
124
|
+
createElementVNode("span", {
|
|
125
|
+
class: "m-editor-history-list-item-index",
|
|
126
|
+
title: headIndexTitle.value
|
|
127
|
+
}, toDisplayString(headIndexLabel.value), 9, _hoisted_2),
|
|
128
|
+
createElementVNode("span", { class: normalizeClass(["m-editor-history-list-item-op", `op-${__props.opType}`]) }, toDisplayString(unref(opLabel)(__props.opType)), 3),
|
|
129
|
+
createElementVNode("span", _hoisted_3, toDisplayString(__props.desc), 1),
|
|
130
|
+
__props.time ? (openBlock(), createElementBlock("span", {
|
|
131
|
+
key: 0,
|
|
132
|
+
class: "m-editor-history-list-item-time",
|
|
133
|
+
title: __props.timeTitle || __props.time
|
|
134
|
+
}, toDisplayString(__props.time), 9, _hoisted_4)) : createCommentVNode("v-if", true),
|
|
135
|
+
__props.merged ? (openBlock(), createElementBlock("span", _hoisted_5, "合并 " + toDisplayString(__props.stepCount) + " 步", 1)) : createCommentVNode("v-if", true),
|
|
136
|
+
!__props.merged && headRevertable.value ? (openBlock(), createElementBlock("span", {
|
|
137
|
+
key: 2,
|
|
138
|
+
class: "m-editor-history-list-item-revert",
|
|
139
|
+
title: "将该步骤的修改作为一次新操作反向应用(不影响后续历史)",
|
|
140
|
+
onClick: _cache[0] || (_cache[0] = withModifiers(($event) => onRevertClick(__props.subSteps[0].index), ["stop"]))
|
|
141
|
+
}, "回滚")) : createCommentVNode("v-if", true),
|
|
142
|
+
!__props.merged && __props.gotoEnabled && !__props.isCurrent && __props.subSteps.length ? (openBlock(), createElementBlock("span", {
|
|
143
|
+
key: 3,
|
|
144
|
+
class: "m-editor-history-list-item-goto",
|
|
145
|
+
title: "回到该记录",
|
|
146
|
+
onClick: _cache[1] || (_cache[1] = withModifiers(($event) => onGotoClick(__props.subSteps[0].index), ["stop"]))
|
|
147
|
+
}, "回到")) : createCommentVNode("v-if", true),
|
|
148
|
+
!__props.merged && headDiffable.value ? (openBlock(), createElementBlock("span", {
|
|
149
|
+
key: 4,
|
|
150
|
+
class: "m-editor-history-list-item-diff",
|
|
151
|
+
title: "查看修改差异",
|
|
152
|
+
onClick: _cache[2] || (_cache[2] = withModifiers(($event) => onDiffClick(__props.subSteps[0].index), ["stop"]))
|
|
153
|
+
}, "查看差异")) : createCommentVNode("v-if", true),
|
|
154
|
+
__props.merged ? (openBlock(), createElementBlock("span", {
|
|
155
|
+
key: 5,
|
|
156
|
+
class: normalizeClass(["m-editor-history-list-group-toggle", { "is-expanded": __props.expanded }])
|
|
157
|
+
}, "▾", 2)) : createCommentVNode("v-if", true)
|
|
158
|
+
], 10, _hoisted_1), __props.merged && __props.expanded ? (openBlock(), createElementBlock("ul", _hoisted_6, [(openBlock(true), createElementBlock(Fragment, null, renderList(subStepsDisplay.value, (s) => {
|
|
159
|
+
return openBlock(), createElementBlock("li", {
|
|
160
|
+
key: s.index,
|
|
161
|
+
class: normalizeClass({
|
|
162
|
+
"is-undone": !s.applied,
|
|
163
|
+
"is-current": s.isCurrent
|
|
164
|
+
}),
|
|
165
|
+
title: subStepTitle(s)
|
|
166
|
+
}, [
|
|
167
|
+
createElementVNode("span", _hoisted_8, "#" + toDisplayString(s.index + 1), 1),
|
|
168
|
+
createElementVNode("span", _hoisted_9, toDisplayString(s.desc), 1),
|
|
169
|
+
s.time ? (openBlock(), createElementBlock("span", {
|
|
170
|
+
key: 0,
|
|
171
|
+
class: "m-editor-history-list-item-time",
|
|
172
|
+
title: s.timeTitle || s.time
|
|
173
|
+
}, toDisplayString(s.time), 9, _hoisted_10)) : createCommentVNode("v-if", true),
|
|
174
|
+
s.revertable ? (openBlock(), createElementBlock("span", {
|
|
175
|
+
key: 1,
|
|
176
|
+
class: "m-editor-history-list-item-revert",
|
|
177
|
+
title: "将该步骤的修改作为一次新操作反向应用(不影响后续历史)",
|
|
178
|
+
onClick: withModifiers(($event) => onRevertClick(s.index), ["stop"])
|
|
179
|
+
}, "回滚", 8, _hoisted_11)) : createCommentVNode("v-if", true),
|
|
180
|
+
__props.gotoEnabled && !s.isCurrent ? (openBlock(), createElementBlock("span", {
|
|
181
|
+
key: 2,
|
|
182
|
+
class: "m-editor-history-list-item-goto",
|
|
183
|
+
title: "回到该记录",
|
|
184
|
+
onClick: withModifiers(($event) => onGotoClick(s.index), ["stop"])
|
|
185
|
+
}, "回到", 8, _hoisted_12)) : createCommentVNode("v-if", true),
|
|
186
|
+
s.diffable ? (openBlock(), createElementBlock("span", {
|
|
187
|
+
key: 3,
|
|
188
|
+
class: "m-editor-history-list-item-diff",
|
|
189
|
+
title: "查看修改差异",
|
|
190
|
+
onClick: withModifiers(($event) => onDiffClick(s.index), ["stop"])
|
|
191
|
+
}, "查看差异", 8, _hoisted_13)) : createCommentVNode("v-if", true)
|
|
192
|
+
], 10, _hoisted_7);
|
|
193
|
+
}), 128))])) : createCommentVNode("v-if", true)], 2);
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
//#endregion
|
|
198
|
+
export { GroupRow_vue_vue_type_script_setup_true_lang_default as default };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default from "./HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
//#region packages/editor/src/layouts/history-list/HistoryDiffDialog.vue
|
|
3
|
+
var HistoryDiffDialog_default = HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { HistoryDiffDialog_default as default };
|