@tmagic/editor 1.8.0-manmanyu.10 → 1.8.0-manmanyu.12
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 +9 -1
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +20 -13
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/index.js +3 -1
- package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +7 -4
- package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +18 -6
- package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +14 -6
- package/dist/es/layouts/history-list/useHistoryRevert.js +23 -21
- package/dist/es/services/codeBlock.js +3 -0
- package/dist/es/services/dataSource.js +3 -0
- package/dist/es/services/editor.js +52 -0
- package/dist/es/style.css +1 -0
- package/dist/style.css +1 -0
- package/dist/themes/magic-admin.css +20 -0
- package/dist/tmagic-editor.umd.cjs +155 -104
- package/package.json +7 -7
- package/src/Editor.vue +10 -1
- package/src/components/CompareForm.vue +24 -13
- package/src/fields/DataSourceInput.vue +3 -3
- package/src/index.ts +2 -0
- package/src/layouts/history-list/BucketTab.vue +2 -2
- package/src/layouts/history-list/HistoryDiffDialog.vue +16 -6
- package/src/layouts/history-list/HistoryListPanel.vue +17 -7
- package/src/layouts/history-list/useHistoryRevert.ts +34 -29
- package/src/services/codeBlock.ts +4 -0
- package/src/services/dataSource.ts +3 -0
- package/src/services/editor.ts +37 -0
- package/src/type.ts +46 -0
- package/types/index.d.ts +172 -53
|
@@ -19,7 +19,7 @@ import stageOverlay_default from "./services/stageOverlay.js";
|
|
|
19
19
|
import { defaultEditorProps } from "./editorProps.js";
|
|
20
20
|
import { initServiceEvents, initServiceState } from "./initService.js";
|
|
21
21
|
import { M_THEME_KEY } from "@tmagic/design";
|
|
22
|
-
import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, renderSlot, unref, withCtx } from "vue";
|
|
22
|
+
import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, ref, renderSlot, unref, withCtx } from "vue";
|
|
23
23
|
import { EventEmitter } from "events";
|
|
24
24
|
//#region packages/editor/src/Editor.vue?vue&type=script&setup=true&lang.ts
|
|
25
25
|
var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
@@ -127,6 +127,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
|
|
|
127
127
|
beforeDblclick: props.beforeDblclick
|
|
128
128
|
};
|
|
129
129
|
stageOverlay_default.set("stageOptions", stageOptions);
|
|
130
|
+
const propsPanelRef = ref(null);
|
|
130
131
|
provide("services", services);
|
|
131
132
|
provide("codeOptions", props.codeOptions);
|
|
132
133
|
provide("stageOptions", stageOptions);
|
|
@@ -137,6 +138,11 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
|
|
|
137
138
|
*/
|
|
138
139
|
provide("extendFormState", props.extendFormState);
|
|
139
140
|
/**
|
|
141
|
+
* 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
|
|
142
|
+
* 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
|
|
143
|
+
*/
|
|
144
|
+
provide("getPropsPanelFormState", () => propsPanelRef.value?.configForm?.formState);
|
|
145
|
+
/**
|
|
140
146
|
* 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
|
|
141
147
|
* 以 markRaw component 形式渲染,无法直接通过 props 透传)。业务方可借此在历史记录
|
|
142
148
|
* 面板内追加自定义模块的历史 tab。
|
|
@@ -150,9 +156,11 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
|
|
|
150
156
|
*/
|
|
151
157
|
provide(M_THEME_KEY, computed(() => props.theme ?? ""));
|
|
152
158
|
const propsPanelMountedHandler = (e) => {
|
|
159
|
+
propsPanelRef.value = e;
|
|
153
160
|
emit("props-panel-mounted", e);
|
|
154
161
|
};
|
|
155
162
|
const propsPanelUnmountedHandler = () => {
|
|
163
|
+
propsPanelRef.value = null;
|
|
156
164
|
emit("props-panel-unmounted");
|
|
157
165
|
};
|
|
158
166
|
const propsPanelSubmitErrorHandler = (e) => {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { useServices } from "../hooks/use-services.js";
|
|
2
1
|
import { getCodeBlockFormConfig } from "../utils/code-block.js";
|
|
3
2
|
import { MForm } from "@tmagic/form";
|
|
4
3
|
import { HookType } from "@tmagic/core";
|
|
@@ -16,13 +15,17 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
16
15
|
dataSourceType: {},
|
|
17
16
|
labelWidth: { default: "120px" },
|
|
18
17
|
height: {},
|
|
19
|
-
extendState: {
|
|
18
|
+
extendState: {
|
|
19
|
+
type: Function,
|
|
20
|
+
default: (state) => state
|
|
21
|
+
},
|
|
22
|
+
baseFormState: {},
|
|
23
|
+
selfDiffFieldTypes: {},
|
|
20
24
|
loadConfig: {},
|
|
21
|
-
services: {
|
|
25
|
+
services: {}
|
|
22
26
|
},
|
|
23
27
|
setup(__props, { expose: __expose }) {
|
|
24
28
|
const props = __props;
|
|
25
|
-
const { propsService, dataSourceService, codeBlockService, editorService } = props.services;
|
|
26
29
|
provide("services", props.services);
|
|
27
30
|
const config = ref([]);
|
|
28
31
|
/** vs-code 编辑器的 monaco 配置项,沿用 Editor 顶层 provide('codeOptions', ...) 的注入。 */
|
|
@@ -94,21 +97,25 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
94
97
|
})
|
|
95
98
|
};
|
|
96
99
|
});
|
|
100
|
+
const mergedExtendState = (state) => {
|
|
101
|
+
return props.extendState(props.baseFormState || state);
|
|
102
|
+
};
|
|
97
103
|
/**
|
|
98
104
|
* 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
|
|
99
105
|
* 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
|
|
100
106
|
*/
|
|
101
107
|
const defaultLoadConfig = async () => {
|
|
108
|
+
if (!props.services) return [];
|
|
102
109
|
switch (props.category) {
|
|
103
110
|
case "node":
|
|
104
111
|
if (!props.type) return [];
|
|
105
|
-
return removeStyleDisplayConfig(await propsService.getPropsConfig(props.type, { node: props.value }));
|
|
106
|
-
case "data-source": return dataSourceService.getFormConfig(props.type || "base").map((item) => "type" in item && item.type === "tab" ? {
|
|
112
|
+
return removeStyleDisplayConfig(await props.services.propsService.getPropsConfig(props.type, { node: props.value }));
|
|
113
|
+
case "data-source": return props.services.dataSourceService.getFormConfig(props.type || "base").map((item) => "type" in item && item.type === "tab" ? {
|
|
107
114
|
...item,
|
|
108
115
|
active: "fields"
|
|
109
116
|
} : item);
|
|
110
117
|
case "code-block": return getCodeBlockFormConfig({
|
|
111
|
-
paramColConfig: codeBlockService.getParamsColConfig(),
|
|
118
|
+
paramColConfig: props.services.codeBlockService.getParamsColConfig(),
|
|
112
119
|
isDataSource: () => Boolean(props.dataSourceType),
|
|
113
120
|
dataSourceType: () => props.dataSourceType,
|
|
114
121
|
codeOptions,
|
|
@@ -147,10 +154,9 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
147
154
|
* - services:整个 useServices() 返回的服务集合;
|
|
148
155
|
* - stage:当前 editorService.get('stage') 的最新值。
|
|
149
156
|
*/
|
|
150
|
-
const stage = computed(() => editorService.get("stage"));
|
|
151
157
|
watchEffect(() => {
|
|
152
|
-
if (formRef.value) {
|
|
153
|
-
formRef.value.formState.stage = stage
|
|
158
|
+
if (formRef.value && props.services) {
|
|
159
|
+
formRef.value.formState.stage = props.services.editorService.get("stage");
|
|
154
160
|
formRef.value.formState.services = props.services;
|
|
155
161
|
}
|
|
156
162
|
});
|
|
@@ -173,14 +179,15 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
173
179
|
"is-compare": true,
|
|
174
180
|
disabled: true,
|
|
175
181
|
"label-width": __props.labelWidth,
|
|
176
|
-
"extend-state":
|
|
177
|
-
"show-diff": showDiff
|
|
182
|
+
"extend-state": mergedExtendState,
|
|
183
|
+
"show-diff": showDiff,
|
|
184
|
+
"self-diff-field-types": __props.selfDiffFieldTypes
|
|
178
185
|
}, null, 8, [
|
|
179
186
|
"config",
|
|
180
187
|
"init-values",
|
|
181
188
|
"last-values",
|
|
182
189
|
"label-width",
|
|
183
|
-
"
|
|
190
|
+
"self-diff-field-types"
|
|
184
191
|
])) : createCommentVNode("v-if", true)], 4);
|
|
185
192
|
};
|
|
186
193
|
}
|
|
@@ -230,7 +230,7 @@ var DataSourceInput_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
230
230
|
onSelect: selectHandler
|
|
231
231
|
}), {
|
|
232
232
|
suffix: withCtx(() => [createVNode(Icon_default, { icon: unref(Coin) }, null, 8, ["icon"])]),
|
|
233
|
-
default: withCtx((
|
|
233
|
+
default: withCtx((slotProps) => [createElementVNode("div", _hoisted_1, [createElementVNode("div", null, toDisplayString(slotProps?.item?.text || ""), 1), createElementVNode("span", _hoisted_2, toDisplayString(slotProps?.item?.value || ""), 1)])]),
|
|
234
234
|
_: 1
|
|
235
235
|
}, 16, ["modelValue"])) : (openBlock(), createElementBlock("div", {
|
|
236
236
|
key: 2,
|
package/dist/es/index.js
CHANGED
|
@@ -52,9 +52,11 @@ import DataSourceConfigPanel_default from "./layouts/sidebar/data-source/DataSou
|
|
|
52
52
|
import LayerPanel_default from "./layouts/sidebar/layer/LayerPanel.js";
|
|
53
53
|
import ComponentListPanel_default from "./layouts/sidebar/ComponentListPanel.js";
|
|
54
54
|
import codeBlock_default from "./services/codeBlock.js";
|
|
55
|
+
import componentList_default from "./services/componentList.js";
|
|
55
56
|
import dataSource_default from "./services/dataSource.js";
|
|
56
57
|
import dep_default from "./services/dep.js";
|
|
57
58
|
import events_default from "./services/events.js";
|
|
59
|
+
import keybinding_default from "./services/keybinding.js";
|
|
58
60
|
import stageOverlay_default from "./services/stageOverlay.js";
|
|
59
61
|
import Editor_default from "./Editor.js";
|
|
60
62
|
import CodeSelect_default from "./fields/CodeSelect.js";
|
|
@@ -85,4 +87,4 @@ export * from "@tmagic/table";
|
|
|
85
87
|
export * from "@tmagic/stage";
|
|
86
88
|
export * from "@tmagic/design";
|
|
87
89
|
export * from "@tmagic/utils";
|
|
88
|
-
export { CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, BucketTab_default as HistoryListBucketTab, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectRelatedNodes, confirmHistoryAction, createStackStep, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, describeRevertStep, describeStepForRevert, deserializeStacks, designPlugin, detectStackOpType, detectTargetId, detectTargetName, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isIncludeDataSource, isIndexedDBSupported, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, numberOptions, openIndexedDB, props_default as propsService, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
|
|
90
|
+
export { CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, BucketTab_default as HistoryListBucketTab, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectRelatedNodes, componentList_default as componentListService, confirmHistoryAction, createStackStep, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, describeRevertStep, describeStepForRevert, deserializeStacks, designPlugin, detectStackOpType, detectTargetId, detectTargetName, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isIncludeDataSource, isIndexedDBSupported, keybinding_default as keybindingService, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, numberOptions, openIndexedDB, props_default as propsService, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import Bucket_default from "./Bucket.js";
|
|
2
2
|
import { TMagicScrollbar } from "@tmagic/design";
|
|
3
|
-
import { Fragment, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
|
|
3
|
+
import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
|
|
4
4
|
//#region packages/editor/src/layouts/history-list/BucketTab.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var _hoisted_1 = {
|
|
6
6
|
key: 0,
|
|
7
7
|
class: "m-editor-history-list-empty"
|
|
8
8
|
};
|
|
9
|
-
var _hoisted_2 = {
|
|
9
|
+
var _hoisted_2 = {
|
|
10
|
+
key: 0,
|
|
11
|
+
class: "m-editor-history-list-toolbar"
|
|
12
|
+
};
|
|
10
13
|
var _hoisted_3 = ["title"];
|
|
11
14
|
var BucketTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
12
15
|
name: "MEditorHistoryListBucketTab",
|
|
@@ -26,11 +29,11 @@ var BucketTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
|
|
|
26
29
|
],
|
|
27
30
|
setup(__props) {
|
|
28
31
|
return (_ctx, _cache) => {
|
|
29
|
-
return !__props.buckets.length ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
32
|
+
return !__props.buckets.length ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [__props.config.showClear !== false ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("span", {
|
|
30
33
|
class: "m-editor-history-list-clear",
|
|
31
34
|
title: `清空${__props.config.title}的历史记录`,
|
|
32
35
|
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("clear"))
|
|
33
|
-
}, "清空", 8, _hoisted_3)]), createVNode(unref(TMagicScrollbar), { "max-height": "360px" }, {
|
|
36
|
+
}, "清空", 8, _hoisted_3)])) : createCommentVNode("v-if", true), createVNode(unref(TMagicScrollbar), { "max-height": "360px" }, {
|
|
34
37
|
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.buckets, (bucket) => {
|
|
35
38
|
return openBlock(), createBlock(Bucket_default, {
|
|
36
39
|
key: `${__props.config.prefix}-${bucket.id}`,
|
package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { useServices } from "../../hooks/use-services.js";
|
|
2
1
|
import CodeEditor_default from "../CodeEditor.js";
|
|
3
2
|
import CompareForm_default from "../../components/CompareForm.js";
|
|
4
3
|
import { TMagicButton, TMagicDialog, TMagicRadioButton, TMagicRadioGroup, TMagicTag } from "@tmagic/design";
|
|
@@ -25,13 +24,14 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
25
24
|
name: "MEditorHistoryDiffDialog",
|
|
26
25
|
__name: "HistoryDiffDialog",
|
|
27
26
|
props: {
|
|
28
|
-
services: {
|
|
27
|
+
services: {},
|
|
29
28
|
extendState: {},
|
|
30
29
|
loadConfig: {},
|
|
31
30
|
width: { default: "900px" },
|
|
32
31
|
isConfirm: { type: Boolean },
|
|
33
32
|
onConfirm: {},
|
|
34
|
-
selfDiffFieldTypes: {}
|
|
33
|
+
selfDiffFieldTypes: {},
|
|
34
|
+
compareFormState: {}
|
|
35
35
|
},
|
|
36
36
|
emits: ["close"],
|
|
37
37
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
@@ -65,6 +65,13 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
65
65
|
};
|
|
66
66
|
const dialogTitle = computed(() => props.onConfirm ? "确认回滚" : "查看修改差异");
|
|
67
67
|
const hasCurrent = computed(() => payload.value?.currentValue !== void 0 && payload.value?.currentValue !== null);
|
|
68
|
+
/** 是否存在该步「修改后的值」:不存在(如仅删除)时「与修改前对比」无意义,置灰禁用。 */
|
|
69
|
+
const hasValue = computed(() => payload.value?.value !== void 0 && payload.value?.value !== null);
|
|
70
|
+
/**
|
|
71
|
+
* 计算 open 时的初始对比模式:
|
|
72
|
+
* 没有「修改后的值」但有当前值时(「与修改前对比」不可用),默认进入「与当前对比」;否则默认「与修改前对比」。
|
|
73
|
+
*/
|
|
74
|
+
const resolveInitialMode = () => !hasValue.value && hasCurrent.value ? "current" : "before";
|
|
68
75
|
/** 左侧(旧/参照)值 */
|
|
69
76
|
const leftValue = computed(() => {
|
|
70
77
|
if (!payload.value) return {};
|
|
@@ -107,7 +114,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
107
114
|
});
|
|
108
115
|
const open = (p) => {
|
|
109
116
|
payload.value = p;
|
|
110
|
-
mode.value =
|
|
117
|
+
mode.value = resolveInitialMode();
|
|
111
118
|
viewMode.value = "form";
|
|
112
119
|
visible.value = true;
|
|
113
120
|
};
|
|
@@ -199,10 +206,13 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
199
206
|
size: "small",
|
|
200
207
|
class: "m-editor-history-diff-dialog-mode"
|
|
201
208
|
}, {
|
|
202
|
-
default: withCtx(() => [createVNode(unref(TMagicRadioButton), {
|
|
209
|
+
default: withCtx(() => [createVNode(unref(TMagicRadioButton), {
|
|
210
|
+
value: "before",
|
|
211
|
+
disabled: !hasValue.value
|
|
212
|
+
}, {
|
|
203
213
|
default: withCtx(() => [..._cache[7] || (_cache[7] = [createTextVNode("与修改前对比", -1)])]),
|
|
204
214
|
_: 1
|
|
205
|
-
}), createVNode(unref(TMagicRadioButton), {
|
|
215
|
+
}, 8, ["disabled"]), createVNode(unref(TMagicRadioButton), {
|
|
206
216
|
value: "current",
|
|
207
217
|
disabled: !hasCurrent.value
|
|
208
218
|
}, {
|
|
@@ -236,6 +246,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
236
246
|
"data-source-type": payload.value.dataSourceType,
|
|
237
247
|
value: rightValue.value,
|
|
238
248
|
"last-value": leftValue.value,
|
|
249
|
+
"base-form-state": __props.compareFormState,
|
|
239
250
|
"extend-state": __props.extendState,
|
|
240
251
|
"load-config": __props.loadConfig,
|
|
241
252
|
"self-diff-field-types": __props.selfDiffFieldTypes,
|
|
@@ -247,6 +258,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
247
258
|
"data-source-type",
|
|
248
259
|
"value",
|
|
249
260
|
"last-value",
|
|
261
|
+
"base-form-state",
|
|
250
262
|
"extend-state",
|
|
251
263
|
"load-config",
|
|
252
264
|
"self-diff-field-types",
|
package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js
CHANGED
|
@@ -68,6 +68,7 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
68
68
|
* 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
|
|
69
69
|
*/
|
|
70
70
|
const extendFormState = inject("extendFormState", void 0);
|
|
71
|
+
const getPropsPanelFormState = inject("getPropsPanelFormState", void 0);
|
|
71
72
|
const { expanded, toggleGroup, pageGroups, dataSourceGroups, codeBlockGroups, pageGroupsDisplay, dataSourceGroupsByTarget, codeBlockGroupsByTarget } = useHistoryList();
|
|
72
73
|
/**
|
|
73
74
|
* 当前活动页的「加载/初始」标记记录(设置 root 时生成),透传给 PageTab 的底部初始行展示。
|
|
@@ -149,9 +150,12 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
149
150
|
/**
|
|
150
151
|
* 「单步回滚」与「查看差异」的完整逻辑收敛到 useHistoryRevert,面板与业务方共用:
|
|
151
152
|
* 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
|
|
152
|
-
* 业务方亦可直接 import useHistoryRevert(services) 调用,无需自行挂载任何弹窗。
|
|
153
|
+
* 业务方亦可直接 import useHistoryRevert(options, services) 调用,无需自行挂载任何弹窗。
|
|
153
154
|
*/
|
|
154
|
-
const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert(
|
|
155
|
+
const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert({
|
|
156
|
+
extendState: extendFormState,
|
|
157
|
+
getPropsPanelFormState
|
|
158
|
+
}, services);
|
|
155
159
|
/**
|
|
156
160
|
* 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,
|
|
157
161
|
* 使本地持久化的那份与内存保持一致——即「连同本地保存的一并删除」。
|
|
@@ -227,7 +231,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
227
231
|
default: withCtx(() => [
|
|
228
232
|
(openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(guardReactiveProps(unref(tabPaneComponent)?.props({
|
|
229
233
|
name: "page",
|
|
230
|
-
label: `${pageName.value} (${unref(pageGroups).length})
|
|
234
|
+
label: `${pageName.value} (${unref(pageGroups).length})`,
|
|
235
|
+
lazy: true
|
|
231
236
|
}) || {})), {
|
|
232
237
|
default: withCtx(() => [createVNode(PageTab_default, {
|
|
233
238
|
list: unref(pageGroupsDisplay),
|
|
@@ -252,7 +257,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
252
257
|
}, 16)),
|
|
253
258
|
!disabledDataSource.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 0 }, unref(tabPaneComponent)?.props({
|
|
254
259
|
name: "data-source",
|
|
255
|
-
label: `${dataSourceName.value} (${unref(dataSourceGroups).length})
|
|
260
|
+
label: `${dataSourceName.value} (${unref(dataSourceGroups).length})`,
|
|
261
|
+
lazy: true
|
|
256
262
|
}) || {})), {
|
|
257
263
|
default: withCtx(() => [createVNode(BucketTab_default, {
|
|
258
264
|
config: dataSourceConfig.value,
|
|
@@ -276,7 +282,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
276
282
|
}, 16)) : createCommentVNode("v-if", true),
|
|
277
283
|
!disabledCodeBlock.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 1 }, unref(tabPaneComponent)?.props({
|
|
278
284
|
name: "code-block",
|
|
279
|
-
label: `${codeBlockName.value} (${unref(codeBlockGroups).length})
|
|
285
|
+
label: `${codeBlockName.value} (${unref(codeBlockGroups).length})`,
|
|
286
|
+
lazy: true
|
|
280
287
|
}) || {})), {
|
|
281
288
|
default: withCtx(() => [createVNode(BucketTab_default, {
|
|
282
289
|
config: codeBlockConfig.value,
|
|
@@ -301,7 +308,8 @@ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
301
308
|
(openBlock(true), createElementBlock(Fragment, null, renderList(unref(extraTabs), (tab) => {
|
|
302
309
|
return openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), mergeProps({ key: tab.name }, { ref_for: true }, unref(tabPaneComponent)?.props({
|
|
303
310
|
name: tab.name,
|
|
304
|
-
label: resolveTabLabel(tab)
|
|
311
|
+
label: resolveTabLabel(tab),
|
|
312
|
+
lazy: true
|
|
305
313
|
}) || {}), {
|
|
306
314
|
default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tab.component), mergeProps({ ref_for: true }, tab.props || {}, toHandlers(tab.listeners || {})), null, 16))]),
|
|
307
315
|
_: 2
|
|
@@ -46,6 +46,7 @@ var mountHistoryDiffDialog = async (options) => {
|
|
|
46
46
|
extendState: options.extendState,
|
|
47
47
|
loadConfig: options.loadConfig,
|
|
48
48
|
selfDiffFieldTypes: options.selfDiffFieldTypes,
|
|
49
|
+
compareFormState: options.compareFormState,
|
|
49
50
|
onClose: options.onClose
|
|
50
51
|
});
|
|
51
52
|
if (options.appContext) Object.assign(app._context, options.appContext);
|
|
@@ -59,6 +60,7 @@ var mountHistoryDiffDialog = async (options) => {
|
|
|
59
60
|
}, 300);
|
|
60
61
|
};
|
|
61
62
|
return {
|
|
63
|
+
app,
|
|
62
64
|
instance,
|
|
63
65
|
destroy
|
|
64
66
|
};
|
|
@@ -116,15 +118,14 @@ var viewHistoryDiffDialog = async (payload, options) => {
|
|
|
116
118
|
* ```ts
|
|
117
119
|
* import { useHistoryRevert } from '@tmagic/editor';
|
|
118
120
|
*
|
|
119
|
-
* const { onPageRevert, onPageDiff } = useHistoryRevert(editorRef.value); // editorRef.value 即 Editor 暴露的 services
|
|
121
|
+
* const { onPageRevert, onPageDiff } = useHistoryRevert({}, editorRef.value); // editorRef.value 即 Editor 暴露的 services
|
|
120
122
|
* await onPageRevert(index); // 弹出差异 / 二次确认弹窗后回滚
|
|
121
123
|
* onPageDiff(index); // 弹出只读差异弹窗查看前后值差异
|
|
122
124
|
* ```
|
|
123
125
|
*/
|
|
124
|
-
var useHistoryRevert = (
|
|
125
|
-
const { editorService, dataSourceService, codeBlockService, historyService } = services;
|
|
126
|
+
var useHistoryRevert = (options = {}, services) => {
|
|
126
127
|
const appContext = options.appContext ?? getCurrentInstance()?.appContext ?? null;
|
|
127
|
-
const { extendState } = options;
|
|
128
|
+
const { extendState, getPropsPanelFormState } = options;
|
|
128
129
|
/** 目标数据已被删除、无法回滚时的统一提示。 */
|
|
129
130
|
const showRevertTargetMissing = () => {
|
|
130
131
|
tMagicMessage.error("回滚失败:该记录对应的数据已被删除");
|
|
@@ -151,22 +152,22 @@ var useHistoryRevert = (services, options = {}) => {
|
|
|
151
152
|
};
|
|
152
153
|
const buildPageDiffPayload = (index) => buildDiffPayload({
|
|
153
154
|
category: "node",
|
|
154
|
-
groups: () => historyService.getHistoryGroups("page", editorService.get("page")?.id),
|
|
155
|
-
getCurrent: (id) => editorService.getNodeById(id),
|
|
155
|
+
groups: () => services?.historyService.getHistoryGroups("page", services?.editorService.get("page")?.id) ?? [],
|
|
156
|
+
getCurrent: (id) => services?.editorService.getNodeById(id),
|
|
156
157
|
resolveType: (n, o) => n.type || o.type || "",
|
|
157
158
|
resolveLabel: (n, o) => n.name || o.name || n.type || o.type || ""
|
|
158
159
|
}, index);
|
|
159
160
|
const buildDataSourceDiffPayload = (id, index) => buildDiffPayload({
|
|
160
161
|
category: "data-source",
|
|
161
|
-
groups: () => historyService.getHistoryGroups("dataSource"),
|
|
162
|
-
getCurrent: (id) => dataSourceService.getDataSourceById(`${id}`),
|
|
162
|
+
groups: () => services?.historyService.getHistoryGroups("dataSource") ?? [],
|
|
163
|
+
getCurrent: (id) => services?.dataSourceService.getDataSourceById(`${id}`),
|
|
163
164
|
resolveType: (n, o) => n.type || o.type || "base",
|
|
164
165
|
resolveLabel: (n, o, id) => n.title || o.title || `${id}`
|
|
165
166
|
}, index, id);
|
|
166
167
|
const buildCodeBlockDiffPayload = (id, index) => buildDiffPayload({
|
|
167
168
|
category: "code-block",
|
|
168
|
-
groups: () => historyService.getHistoryGroups("codeBlock"),
|
|
169
|
-
getCurrent: (id) => codeBlockService.getCodeContentById(id),
|
|
169
|
+
groups: () => services?.historyService.getHistoryGroups("codeBlock") ?? [],
|
|
170
|
+
getCurrent: (id) => services?.codeBlockService.getCodeContentById(id),
|
|
170
171
|
resolveLabel: (n, o, id) => n.name || o.name || `${id}`
|
|
171
172
|
}, index, id);
|
|
172
173
|
/**
|
|
@@ -176,45 +177,45 @@ var useHistoryRevert = (services, options = {}) => {
|
|
|
176
177
|
* add(回滚即删除)即使目标已不在,也已达成「删除」目的,不视为失败。
|
|
177
178
|
*/
|
|
178
179
|
const isPageRevertTargetMissing = (index) => {
|
|
179
|
-
const step = historyService.getStepList("page", editorService.get("page")?.id)[index]?.step;
|
|
180
|
+
const step = services?.historyService.getStepList("page", services?.editorService.get("page")?.id)[index]?.step;
|
|
180
181
|
if (!step) return false;
|
|
181
182
|
if (step.opType === "update") return (step.diff ?? []).some((item) => {
|
|
182
183
|
const id = item.newSchema?.id ?? item.oldSchema?.id;
|
|
183
|
-
return id !== void 0 && !editorService.getNodeById(id, false);
|
|
184
|
+
return id !== void 0 && !services?.editorService.getNodeById(id, false);
|
|
184
185
|
});
|
|
185
|
-
if (step.opType === "remove") return (step.diff ?? []).some((item) => item.parentId !== void 0 && !editorService.getNodeById(item.parentId, false));
|
|
186
|
+
if (step.opType === "remove") return (step.diff ?? []).some((item) => item.parentId !== void 0 && !services?.editorService.getNodeById(item.parentId, false));
|
|
186
187
|
return false;
|
|
187
188
|
};
|
|
188
189
|
/** 数据源 update 步骤回滚时,对应数据源必须仍存在(已删除则无处写回旧值)。 */
|
|
189
190
|
const isDataSourceRevertTargetMissing = (id, index) => {
|
|
190
|
-
const step = historyService.getStepList("dataSource", id)[index]?.step;
|
|
191
|
-
return Boolean(step?.opType === "update" && !dataSourceService.getDataSourceById(`${id}`));
|
|
191
|
+
const step = services?.historyService.getStepList("dataSource", id)[index]?.step;
|
|
192
|
+
return Boolean(step?.opType === "update" && !services?.dataSourceService.getDataSourceById(`${id}`));
|
|
192
193
|
};
|
|
193
194
|
/** 代码块 update 步骤回滚时,对应代码块必须仍存在(已删除则无处写回旧值)。 */
|
|
194
195
|
const isCodeBlockRevertTargetMissing = (id, index) => {
|
|
195
|
-
const step = historyService.getStepList("codeBlock", id)[index]?.step;
|
|
196
|
-
return Boolean(step?.opType === "update" && !codeBlockService.getCodeContentById(id));
|
|
196
|
+
const step = services?.historyService.getStepList("codeBlock", id)[index]?.step;
|
|
197
|
+
return Boolean(step?.opType === "update" && !services?.codeBlockService.getCodeContentById(id));
|
|
197
198
|
};
|
|
198
199
|
const onPageRevert = (index) => {
|
|
199
200
|
if (isPageRevertTargetMissing(index)) {
|
|
200
201
|
showRevertTargetMissing();
|
|
201
202
|
return Promise.resolve(null);
|
|
202
203
|
}
|
|
203
|
-
return runRevert(buildPageDiffPayload(index)).then((result) => result ? editorService.revertPageStep(index) : null);
|
|
204
|
+
return runRevert(buildPageDiffPayload(index), { compareFormState: getPropsPanelFormState?.() }).then((result) => result ? services?.editorService.revertPageStep(index) : null);
|
|
204
205
|
};
|
|
205
206
|
const onDataSourceRevert = (id, index) => {
|
|
206
207
|
if (isDataSourceRevertTargetMissing(id, index)) {
|
|
207
208
|
showRevertTargetMissing();
|
|
208
209
|
return Promise.resolve(null);
|
|
209
210
|
}
|
|
210
|
-
return runRevert(buildDataSourceDiffPayload(id, index)).then((result) => result ? dataSourceService.revert(id, index) : null);
|
|
211
|
+
return runRevert(buildDataSourceDiffPayload(id, index)).then((result) => result ? services?.dataSourceService.revert(id, index) : null);
|
|
211
212
|
};
|
|
212
213
|
const onCodeBlockRevert = (id, index) => {
|
|
213
214
|
if (isCodeBlockRevertTargetMissing(id, index)) {
|
|
214
215
|
showRevertTargetMissing();
|
|
215
216
|
return Promise.resolve(null);
|
|
216
217
|
}
|
|
217
|
-
return runRevert(buildCodeBlockDiffPayload(id, index)).then((result) => result ? codeBlockService.revert(id, index) : null);
|
|
218
|
+
return runRevert(buildCodeBlockDiffPayload(id, index)).then((result) => result ? services?.codeBlockService.revert(id, index) : null);
|
|
218
219
|
};
|
|
219
220
|
/**
|
|
220
221
|
* 「查看差异」:可差异对比的步骤(单实体 update)动态挂载只读 HistoryDiffDialog 展示前后值差异,
|
|
@@ -225,7 +226,8 @@ var useHistoryRevert = (services, options = {}) => {
|
|
|
225
226
|
if (payload) return viewHistoryDiffDialog(payload, {
|
|
226
227
|
appContext,
|
|
227
228
|
extendState,
|
|
228
|
-
services
|
|
229
|
+
services,
|
|
230
|
+
compareFormState: getPropsPanelFormState?.()
|
|
229
231
|
});
|
|
230
232
|
};
|
|
231
233
|
const onDataSourceDiff = (id, index) => {
|
|
@@ -56,6 +56,7 @@ var CodeBlock = class extends BaseService {
|
|
|
56
56
|
async setCodeDsl(codeDsl) {
|
|
57
57
|
this.state.codeDsl = codeDsl;
|
|
58
58
|
this.emit("code-dsl-change", this.state.codeDsl);
|
|
59
|
+
this.emit("change", this.state.codeDsl);
|
|
59
60
|
}
|
|
60
61
|
/**
|
|
61
62
|
* 获取活动的代码块dsl数据源(默认从dsl中的codeBlocks字段读取)
|
|
@@ -132,6 +133,7 @@ var CodeBlock = class extends BaseService {
|
|
|
132
133
|
this.lastPushedHistoryId = (step ? history_default.push("codeBlock", step, id) : null)?.uuid ?? null;
|
|
133
134
|
}
|
|
134
135
|
this.emit("addOrUpdate", id, codeDsl[id]);
|
|
136
|
+
this.emit("change", this.getCodeDsl());
|
|
135
137
|
}
|
|
136
138
|
/**
|
|
137
139
|
* 根据代码块id数组获取代码dsl
|
|
@@ -229,6 +231,7 @@ var CodeBlock = class extends BaseService {
|
|
|
229
231
|
}
|
|
230
232
|
this.emit("remove", id);
|
|
231
233
|
});
|
|
234
|
+
this.emit("change", this.getCodeDsl());
|
|
232
235
|
}
|
|
233
236
|
/**
|
|
234
237
|
* 下列 *AndGetHistoryId 方法与对应的写入方法行为完全一致,
|
|
@@ -102,6 +102,7 @@ var DataSource = class extends BaseService {
|
|
|
102
102
|
this.lastPushedHistoryId = (step ? history_default.push("dataSource", step, newConfig.id) : null)?.uuid ?? null;
|
|
103
103
|
}
|
|
104
104
|
this.emit("add", newConfig);
|
|
105
|
+
this.emit("change", this.get("dataSources"));
|
|
105
106
|
return newConfig;
|
|
106
107
|
}
|
|
107
108
|
/**
|
|
@@ -132,6 +133,7 @@ var DataSource = class extends BaseService {
|
|
|
132
133
|
oldConfig,
|
|
133
134
|
changeRecords
|
|
134
135
|
});
|
|
136
|
+
this.emit("change", this.get("dataSources"));
|
|
135
137
|
return newConfig;
|
|
136
138
|
}
|
|
137
139
|
/**
|
|
@@ -156,6 +158,7 @@ var DataSource = class extends BaseService {
|
|
|
156
158
|
this.lastPushedHistoryId = (step ? history_default.push("dataSource", step, id) : null)?.uuid ?? null;
|
|
157
159
|
}
|
|
158
160
|
this.emit("remove", id);
|
|
161
|
+
this.emit("change", this.get("dataSources"));
|
|
159
162
|
}
|
|
160
163
|
/**
|
|
161
164
|
* 下列 *AndGetHistoryId 方法与对应的 add / update / remove 行为完全一致,
|
|
@@ -335,6 +335,13 @@ var Editor = class extends BaseService {
|
|
|
335
335
|
} else this.selectionBeforeOp = null;
|
|
336
336
|
}
|
|
337
337
|
this.emit("add", newNodes);
|
|
338
|
+
this.emit("change", {
|
|
339
|
+
type: "add",
|
|
340
|
+
data: newNodes.map((node) => ({
|
|
341
|
+
node,
|
|
342
|
+
page: this.getPageOfNode(node.id)
|
|
343
|
+
}))
|
|
344
|
+
});
|
|
338
345
|
return Array.isArray(addNode) ? newNodes : newNodes[0];
|
|
339
346
|
}
|
|
340
347
|
async doRemove(node, { doNotSelect = false, doNotSwitchPage = false } = {}) {
|
|
@@ -398,6 +405,10 @@ var Editor = class extends BaseService {
|
|
|
398
405
|
async remove(nodeOrNodeList, { doNotSelect = false, doNotSwitchPage = false, doNotPushHistory = false, historyDescription, historySource } = {}) {
|
|
399
406
|
this.captureSelectionBeforeOp();
|
|
400
407
|
const nodes = Array.isArray(nodeOrNodeList) ? nodeOrNodeList : [nodeOrNodeList];
|
|
408
|
+
const changeItems = nodes.map((node) => ({
|
|
409
|
+
node,
|
|
410
|
+
page: this.getPageOfNode(node.id)
|
|
411
|
+
}));
|
|
401
412
|
const removedItems = [];
|
|
402
413
|
let pageForOp = null;
|
|
403
414
|
if (!(isPage(nodes[0]) || isPageFragment(nodes[0]))) for (const n of nodes) {
|
|
@@ -427,6 +438,10 @@ var Editor = class extends BaseService {
|
|
|
427
438
|
});
|
|
428
439
|
else this.selectionBeforeOp = null;
|
|
429
440
|
this.emit("remove", nodes);
|
|
441
|
+
this.emit("change", {
|
|
442
|
+
type: "remove",
|
|
443
|
+
data: changeItems
|
|
444
|
+
});
|
|
430
445
|
}
|
|
431
446
|
async doUpdate(config, { changeRecords = [], historySource } = {}) {
|
|
432
447
|
if (!this.get("root")) throw new Error("root为空");
|
|
@@ -512,6 +527,13 @@ var Editor = class extends BaseService {
|
|
|
512
527
|
} else this.selectionBeforeOp = null;
|
|
513
528
|
}
|
|
514
529
|
this.emit("update", updateData);
|
|
530
|
+
this.emit("change", {
|
|
531
|
+
type: "update",
|
|
532
|
+
data: updateData.map((node) => ({
|
|
533
|
+
node,
|
|
534
|
+
page: this.getPageOfNode(node.newNode.id)
|
|
535
|
+
}))
|
|
536
|
+
});
|
|
515
537
|
return Array.isArray(config) ? updateData.map((item) => item.newNode) : updateData[0].newNode;
|
|
516
538
|
}
|
|
517
539
|
/**
|
|
@@ -677,6 +699,14 @@ var Editor = class extends BaseService {
|
|
|
677
699
|
});
|
|
678
700
|
} else this.selectionBeforeOp = null;
|
|
679
701
|
this.emit("move-layer", offset);
|
|
702
|
+
this.emit("change", {
|
|
703
|
+
type: "move-layer",
|
|
704
|
+
data: [{
|
|
705
|
+
node,
|
|
706
|
+
page: this.getPageOfNode(node.id)
|
|
707
|
+
}],
|
|
708
|
+
offset
|
|
709
|
+
});
|
|
680
710
|
}
|
|
681
711
|
/**
|
|
682
712
|
* 移动一个或多个节点到指定容器中。
|
|
@@ -806,6 +836,15 @@ var Editor = class extends BaseService {
|
|
|
806
836
|
configs,
|
|
807
837
|
targetParent
|
|
808
838
|
});
|
|
839
|
+
this.emit("change", {
|
|
840
|
+
type: "drag-to",
|
|
841
|
+
data: configs.map((node) => ({
|
|
842
|
+
node,
|
|
843
|
+
page: this.getPageOfNode(node.id)
|
|
844
|
+
})),
|
|
845
|
+
targetIndex,
|
|
846
|
+
targetParent
|
|
847
|
+
});
|
|
809
848
|
}
|
|
810
849
|
/**
|
|
811
850
|
* 下列 *AndGetHistoryId 方法与对应的普通操作(add / remove / update ...)行为完全一致,
|
|
@@ -1064,6 +1103,19 @@ var Editor = class extends BaseService {
|
|
|
1064
1103
|
addModifiedNodeId(id) {
|
|
1065
1104
|
this.get("modifiedNodeIds").set(id, id);
|
|
1066
1105
|
}
|
|
1106
|
+
/**
|
|
1107
|
+
* 获取指定节点所属的页面 / 页面片:
|
|
1108
|
+
* - 普通节点返回其所在的 page;
|
|
1109
|
+
* - 节点本身就是 page / pageFragment 时返回它自己;
|
|
1110
|
+
* - 找不到时返回 null。
|
|
1111
|
+
* 供 `change` 事件携带「变更节点对应的 page」(而非编辑器当前选中页)。
|
|
1112
|
+
*/
|
|
1113
|
+
getPageOfNode(id) {
|
|
1114
|
+
const { node, page } = this.getNodeInfo(id, false);
|
|
1115
|
+
if (page) return page;
|
|
1116
|
+
if (node && (isPage(node) || isPageFragment(node))) return node;
|
|
1117
|
+
return null;
|
|
1118
|
+
}
|
|
1067
1119
|
captureSelectionBeforeOp() {
|
|
1068
1120
|
if (this.selectionBeforeOp) return;
|
|
1069
1121
|
this.selectionBeforeOp = this.get("nodes").map((n) => n.id);
|
package/dist/es/style.css
CHANGED