@tmagic/editor 1.8.0-manmanyu.8 → 1.8.0
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 +22 -13
- package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +10 -5
- package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -6
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +21 -119
- package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +21 -5
- package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +62 -16
- 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 +3 -2
- package/dist/es/components/ScrollBar.js +0 -1
- package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +5 -4
- 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 +1 -1
- package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ViewForm.js +5 -0
- package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/es/editorProps.js +7 -1
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +30 -113
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
- package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +7 -6
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +4 -2
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +12 -4
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +9 -20
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +2 -2
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +5 -3
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +9 -4
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +10 -110
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +52 -363
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +1 -1
- 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 +3 -6
- 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 +4 -35
- package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/fields/StyleSetter/configs.js +663 -0
- package/dist/es/fields/StyleSetter/icons/align-items/Center.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.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 +29 -106
- package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +8 -11
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +30 -89
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +29 -297
- package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -82
- package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +8 -24
- package/dist/es/fields/UISelect.js +0 -1
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/configs/codeSelect.js +98 -0
- package/dist/es/fields/configs/displayConds.js +158 -0
- package/dist/es/fields/configs/eventSelect.js +225 -0
- package/dist/es/fields/configs/stickyAddButton.js +21 -0
- package/dist/es/fields/headless-validation.js +139 -0
- package/dist/es/headless.js +2 -0
- package/dist/es/hooks/use-code-block-edit.js +4 -2
- package/dist/es/hooks/use-compare-form.js +101 -0
- package/dist/es/hooks/use-form-context.js +29 -0
- package/dist/es/hooks/use-stage.js +1 -0
- package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/icons/DatasourceIcon.js +1 -1
- package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/index.js +17 -9
- package/dist/es/initService.js +52 -16
- 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 +26 -10
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +11 -8
- package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +8 -5
- package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +26 -10
- package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +36 -28
- package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/composables.js +1 -1
- package/dist/es/layouts/history-list/useHistoryList.js +4 -4
- package/dist/es/layouts/history-list/useHistoryRevert.js +38 -33
- 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 +1 -1
- package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -20
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +53 -35
- package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
- package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +21 -36
- package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
- package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +9 -4
- 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 +4 -4
- package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
- package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
- package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
- package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +6 -4
- package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
- package/dist/es/layouts/sidebar/layer/use-drag.js +11 -10
- package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
- package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
- package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +55 -9
- 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 +8 -8
- package/dist/es/plugin.js +35 -23
- package/dist/es/services/codeBlock.js +40 -31
- package/dist/es/services/dataSource.js +46 -34
- package/dist/es/services/dep.js +162 -41
- package/dist/es/services/editor.js +373 -137
- package/dist/es/services/events.js +4 -4
- package/dist/es/services/history.js +275 -392
- package/dist/es/services/keybinding.js +3 -3
- package/dist/es/services/props.js +2 -1
- package/dist/es/services/storage.js +2 -2
- package/dist/es/services/ui.js +7 -2
- package/dist/es/style.css +277 -114
- package/dist/es/utils/code-block.js +14 -7
- package/dist/es/utils/config.js +4 -1
- package/dist/es/utils/const.js +2 -2
- package/dist/es/utils/content-menu.js +2 -2
- package/dist/es/utils/data-source/index.js +34 -12
- package/dist/es/utils/dep/collect-worker-client.js +154 -0
- package/dist/es/utils/dep/idle-task.js +70 -22
- package/dist/es/utils/dep/worker.js +1 -1
- package/dist/es/utils/editor.js +4 -2
- package/dist/es/utils/event.js +135 -0
- package/dist/es/utils/history.js +35 -47
- package/dist/es/utils/monaco-editor.js +22 -6
- package/dist/es/utils/operator.js +2 -2
- package/dist/es/utils/props.js +50 -106
- package/dist/es/utils/type-match-rules.js +356 -0
- package/dist/style.css +277 -114
- package/dist/themes/magic-admin.css +978 -175
- package/dist/tmagic-editor-headless.umd.cjs +10880 -0
- package/dist/tmagic-editor.umd.cjs +13047 -11363
- package/package.json +18 -13
- package/src/Editor.vue +23 -6
- package/src/components/CodeBlockEditor.vue +3 -0
- package/src/components/CodeParams.vue +10 -4
- package/src/components/CompareForm.vue +20 -190
- package/src/components/ContentMenu.vue +34 -6
- package/src/components/FloatingBox.vue +71 -7
- package/src/components/ScrollBar.vue +0 -67
- package/src/components/ViewForm.vue +54 -0
- package/src/editorProps.ts +23 -10
- package/src/fields/Code.vue +1 -1
- package/src/fields/CodeSelect.vue +20 -113
- package/src/fields/CodeSelectCol.vue +1 -1
- package/src/fields/CondOpSelect.vue +5 -26
- package/src/fields/DataSourceFieldSelect/FieldSelect.vue +2 -2
- package/src/fields/DataSourceFieldSelect/Index.vue +4 -1
- package/src/fields/DataSourceFields.vue +5 -1
- package/src/fields/DataSourceInput.vue +10 -28
- package/src/fields/DataSourceMethodSelect.vue +1 -1
- package/src/fields/DataSourceMethods.vue +6 -2
- package/src/fields/DataSourceMocks.vue +3 -0
- package/src/fields/DataSourceSelect.vue +1 -1
- package/src/fields/DisplayConds.vue +17 -139
- package/src/fields/EventSelect.vue +29 -416
- package/src/fields/KeyValue.vue +1 -1
- package/src/fields/StyleSetter/Index.vue +2 -8
- package/src/fields/StyleSetter/components/Border.vue +4 -38
- package/src/fields/StyleSetter/components/Box.vue +1 -1
- package/src/fields/StyleSetter/components/Position.vue +1 -1
- package/src/fields/StyleSetter/configs.ts +690 -0
- package/src/fields/StyleSetter/pro/Background.vue +9 -64
- package/src/fields/StyleSetter/pro/Border.vue +5 -16
- package/src/fields/StyleSetter/pro/Font.vue +11 -71
- package/src/fields/StyleSetter/pro/Layout.vue +10 -230
- package/src/fields/StyleSetter/pro/Position.vue +11 -82
- package/src/fields/StyleSetter/pro/Transform.vue +6 -34
- package/src/fields/UISelect.vue +0 -12
- package/src/fields/configs/codeSelect.ts +127 -0
- package/src/fields/configs/displayConds.ts +184 -0
- package/src/fields/configs/eventSelect.ts +309 -0
- package/src/fields/configs/stickyAddButton.ts +32 -0
- package/src/fields/headless-validation.ts +177 -0
- package/src/headless.ts +33 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-compare-form.ts +166 -0
- package/src/hooks/use-form-context.ts +56 -0
- package/src/hooks/use-stage.ts +1 -0
- package/src/index.ts +9 -0
- package/src/initService.ts +73 -18
- package/src/layouts/CodeEditor.vue +32 -6
- package/src/layouts/Framework.vue +7 -6
- package/src/layouts/history-list/BucketTab.vue +2 -2
- package/src/layouts/history-list/HistoryDiffDialog.vue +33 -15
- package/src/layouts/history-list/HistoryListPanel.vue +16 -18
- package/src/layouts/history-list/useHistoryRevert.ts +57 -41
- package/src/layouts/props-panel/FormPanel.vue +75 -20
- package/src/layouts/props-panel/PropsPanel.vue +81 -30
- package/src/layouts/props-panel/use-style-panel.ts +4 -3
- package/src/layouts/sidebar/ComponentListPanel.vue +6 -2
- package/src/layouts/sidebar/Sidebar.vue +5 -3
- package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
- package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
- package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
- package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +3 -3
- package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
- package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
- package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
- package/src/layouts/sidebar/layer/LayerPanel.vue +5 -2
- package/src/layouts/sidebar/layer/use-click.ts +3 -3
- package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
- package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
- package/src/layouts/workspace/viewer/Stage.vue +80 -10
- package/src/layouts/workspace/viewer/ViewerMenu.vue +7 -7
- package/src/plugin.ts +35 -25
- package/src/services/codeBlock.ts +4 -0
- package/src/services/dataSource.ts +3 -0
- package/src/services/dep.ts +292 -47
- package/src/services/editor.ts +383 -120
- package/src/services/events.ts +8 -7
- package/src/services/history.ts +22 -1
- package/src/services/keybinding.ts +3 -3
- package/src/services/ui.ts +26 -5
- package/src/theme/code-block.scss +0 -37
- package/src/theme/display-conds.scss +4 -0
- package/src/theme/event.scss +25 -33
- package/src/theme/floating-box.scss +9 -1
- package/src/theme/framework.scss +4 -1
- package/src/theme/layer-node-content.scss +14 -0
- package/src/theme/nav-menu.scss +5 -1
- package/src/theme/props-panel.scss +17 -3
- package/src/theme/scroll-bar.scss +64 -0
- package/src/theme/theme.scss +3 -0
- package/src/theme/themes/magic-admin/index.scss +109 -9
- package/src/theme/ui-select.scss +9 -0
- package/src/type.ts +216 -6
- package/src/utils/code-block.ts +1 -0
- package/src/utils/config.ts +9 -1
- package/src/utils/const.ts +3 -3
- package/src/utils/content-menu.ts +2 -2
- package/src/utils/data-source/index.ts +31 -12
- package/src/utils/dep/collect-worker-client.ts +215 -0
- package/src/utils/dep/idle-task.ts +104 -35
- package/src/utils/dep/worker.ts +113 -9
- package/src/utils/event.ts +237 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/monaco-editor.ts +27 -0
- package/src/utils/operator.ts +2 -2
- package/src/utils/props.ts +61 -122
- package/src/utils/type-match-rules.ts +697 -0
- package/types/headless.d.ts +17 -0
- package/types/index.d.ts +1494 -978
- package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
package/src/initService.ts
CHANGED
|
@@ -29,6 +29,7 @@ import { getDepNodeIds, getNodes, isPage, isValueIncludeDataSource } from '@tmag
|
|
|
29
29
|
|
|
30
30
|
import PropsPanel from './layouts/PropsPanel.vue';
|
|
31
31
|
import { isIncludeDataSource } from './utils/editor';
|
|
32
|
+
import { error as logError } from './utils/logger';
|
|
32
33
|
import { EditorProps } from './editorProps';
|
|
33
34
|
import { Services } from './type';
|
|
34
35
|
|
|
@@ -36,6 +37,19 @@ export declare type LooseRequired<T> = {
|
|
|
36
37
|
[P in string & keyof T]: T[P];
|
|
37
38
|
};
|
|
38
39
|
|
|
40
|
+
/**
|
|
41
|
+
* select 为异步串行执行,节点不可选中(如已从 DSL 中移除)时会抛错。
|
|
42
|
+
* 在 watch 回调中调用不能把拒绝抛回调用方,否则会变成 Vue 的「Unhandled error during execution of watcher callback」,
|
|
43
|
+
* 这里统一兜底成日志。
|
|
44
|
+
*/
|
|
45
|
+
const selectNode = async (editorService: Services['editorService'], id: Id) => {
|
|
46
|
+
try {
|
|
47
|
+
await editorService.select(id);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
logError(e);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
39
53
|
export const initServiceState = (
|
|
40
54
|
props: EditorProps,
|
|
41
55
|
{
|
|
@@ -193,9 +207,17 @@ export const initServiceState = (
|
|
|
193
207
|
},
|
|
194
208
|
);
|
|
195
209
|
|
|
210
|
+
// defaultSelected 可能早于 modelValue 到位(immediate 首次执行时 root 还是空的,或节点尚未出现在 DSL 中),
|
|
211
|
+
// 此时 select 会因为「获取不到组件信息」而抛错,交由 root-change 中的选中逻辑在 root 就绪后补上即可。
|
|
196
212
|
watch(
|
|
197
213
|
() => props.defaultSelected,
|
|
198
|
-
(defaultSelected) =>
|
|
214
|
+
(defaultSelected) => {
|
|
215
|
+
if (!defaultSelected || !editorService.getNodeById(defaultSelected)) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
selectNode(editorService, defaultSelected);
|
|
220
|
+
},
|
|
199
221
|
{
|
|
200
222
|
immediate: true,
|
|
201
223
|
},
|
|
@@ -232,6 +254,7 @@ export const initServiceState = (
|
|
|
232
254
|
uiService.resetState();
|
|
233
255
|
componentListService.resetState();
|
|
234
256
|
codeBlockService.resetState();
|
|
257
|
+
eventsService.resetState();
|
|
235
258
|
keybindingService.reset();
|
|
236
259
|
depService.reset();
|
|
237
260
|
});
|
|
@@ -333,11 +356,11 @@ export const initServiceEvents = (
|
|
|
333
356
|
Promise.all(
|
|
334
357
|
nodes.map((node) => {
|
|
335
358
|
if (node.type === NodeType.ROOT) {
|
|
336
|
-
return Promise.resolve();
|
|
359
|
+
return Promise.resolve(true);
|
|
337
360
|
}
|
|
338
361
|
return depService.collectIdle([node], { pageId: getPageIdByNode(node) }, deep, type);
|
|
339
362
|
}),
|
|
340
|
-
);
|
|
363
|
+
).then((results) => results.every(Boolean));
|
|
341
364
|
|
|
342
365
|
watch(
|
|
343
366
|
() => editorService.get('stage'),
|
|
@@ -351,7 +374,7 @@ export const initServiceEvents = (
|
|
|
351
374
|
|
|
352
375
|
if (!node) return;
|
|
353
376
|
|
|
354
|
-
await collectIdle([node], true, DepTargetType.DATA_SOURCE);
|
|
377
|
+
if (!(await collectIdle([node], true, DepTargetType.DATA_SOURCE))) return;
|
|
355
378
|
updateStageNode(node);
|
|
356
379
|
});
|
|
357
380
|
},
|
|
@@ -404,12 +427,26 @@ export const initServiceEvents = (
|
|
|
404
427
|
});
|
|
405
428
|
};
|
|
406
429
|
|
|
430
|
+
/**
|
|
431
|
+
* root 是否已经不是编辑器当前的 root。
|
|
432
|
+
*
|
|
433
|
+
* `editorService.set('root', v)` 是同步赋值后再派发 `root-change`,因此派发那一刻 `v` 一定
|
|
434
|
+
* 就是当前 root;但处理 `root-change` 要等 stage / runtime / 依赖收集等异步过程,期间 root
|
|
435
|
+
* 可能被新的一次整体替换(外部重设 DSL、更新 root 节点、源码保存等)顶掉,此时手上的 `v`
|
|
436
|
+
* 已是过期快照,继续用它刷画布或回写给外部都会与新 root 互相覆盖。
|
|
437
|
+
*/
|
|
438
|
+
const isStaleRoot = (value: MApp | null) => toRaw(editorService.get('root')) !== toRaw(value);
|
|
439
|
+
|
|
407
440
|
const updateStageDsl = async (value: MApp | null) => {
|
|
408
441
|
const stage = await getStage();
|
|
409
442
|
|
|
410
443
|
const runtime = await stage.renderer?.getRuntime();
|
|
411
444
|
const app = await getTMagicApp();
|
|
412
445
|
|
|
446
|
+
// 等 stage / runtime 就绪期间 root 已被替换:新 root 的刷新可能已经完成,
|
|
447
|
+
// 再把旧 dsl 推给 runtime 会让画布回退到旧内容
|
|
448
|
+
if (isStaleRoot(value)) return;
|
|
449
|
+
|
|
413
450
|
if (!app?.dataSourceManager) {
|
|
414
451
|
runtime?.updateRootConfig?.(cloneDeep(toRaw(value))!);
|
|
415
452
|
}
|
|
@@ -426,6 +463,8 @@ export const initServiceEvents = (
|
|
|
426
463
|
|
|
427
464
|
await (typeof Worker === 'undefined' ? collectIdle(value.items, true) : depService.collectByWorker(value));
|
|
428
465
|
|
|
466
|
+
if (isStaleRoot(value)) return;
|
|
467
|
+
|
|
429
468
|
const dsl = cloneDeep(toRaw(value));
|
|
430
469
|
if (dsl.dataSources && dsl.dataSourceDeps && app?.dataSourceManager) {
|
|
431
470
|
for (const node of getNodes(getDepNodeIds(dsl.dataSourceDeps), dsl.items)) {
|
|
@@ -443,7 +482,7 @@ export const initServiceEvents = (
|
|
|
443
482
|
depService.addTarget(createDataSourceCondTarget(ds, reactive({})));
|
|
444
483
|
};
|
|
445
484
|
|
|
446
|
-
const rootChangeHandler = (value: MApp | null
|
|
485
|
+
const rootChangeHandler = (value: MApp | null) => {
|
|
447
486
|
if (!value) return;
|
|
448
487
|
|
|
449
488
|
value.codeBlocks = value.codeBlocks || {};
|
|
@@ -486,7 +525,13 @@ export const initServiceEvents = (
|
|
|
486
525
|
editorService.set('page', null);
|
|
487
526
|
}
|
|
488
527
|
|
|
489
|
-
|
|
528
|
+
// 上面的 select 是异步的,期间 root 可能已被替换,过期快照不能再回写给外部:
|
|
529
|
+
// 两次整体替换各自持有一个快照时,回写会把对方的 root 顶掉,外部 modelValue 变化又会
|
|
530
|
+
// 重新 set root,两条链路无休止地交替下去(表现为编辑器卡死)
|
|
531
|
+
if (isStaleRoot(value)) return;
|
|
532
|
+
|
|
533
|
+
// 外部已经持有这个 root(如本次变化就是 modelValue 传进来的)时无需回写
|
|
534
|
+
if (toRaw(props.modelValue) !== toRaw(value)) {
|
|
490
535
|
emit('update:modelValue', value);
|
|
491
536
|
}
|
|
492
537
|
})();
|
|
@@ -494,8 +539,10 @@ export const initServiceEvents = (
|
|
|
494
539
|
|
|
495
540
|
// 新增节点,收集依赖
|
|
496
541
|
const nodeAddHandler = (nodes: MComponent[]) => {
|
|
497
|
-
collectIdle(nodes, true).then(() => {
|
|
498
|
-
|
|
542
|
+
collectIdle(nodes, true).then((completed) => {
|
|
543
|
+
if (completed) {
|
|
544
|
+
updateStageNodes(nodes);
|
|
545
|
+
}
|
|
499
546
|
});
|
|
500
547
|
};
|
|
501
548
|
|
|
@@ -549,8 +596,8 @@ export const initServiceEvents = (
|
|
|
549
596
|
if (needRecollectNodes.length) {
|
|
550
597
|
// 有数据源依赖,需要等依赖重新收集完才更新stage
|
|
551
598
|
const handler = async () => {
|
|
552
|
-
await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE);
|
|
553
|
-
await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND);
|
|
599
|
+
if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE))) return;
|
|
600
|
+
if (!(await collectIdle(needRecollectNodes, true, DepTargetType.DATA_SOURCE_COND))) return;
|
|
554
601
|
updateStageNodes(needRecollectNodes);
|
|
555
602
|
};
|
|
556
603
|
handler();
|
|
@@ -572,8 +619,10 @@ export const initServiceEvents = (
|
|
|
572
619
|
|
|
573
620
|
// 历史记录变化时,需要重新收集依赖
|
|
574
621
|
const historyChangeHandler = (page: MPage | MPageFragment) => {
|
|
575
|
-
collectIdle([page], true).then(() => {
|
|
576
|
-
|
|
622
|
+
collectIdle([page], true).then((completed) => {
|
|
623
|
+
if (completed) {
|
|
624
|
+
updateStageNode(page);
|
|
625
|
+
}
|
|
577
626
|
});
|
|
578
627
|
};
|
|
579
628
|
|
|
@@ -654,7 +703,7 @@ export const initServiceEvents = (
|
|
|
654
703
|
if (Array.isArray(root?.items)) {
|
|
655
704
|
depService.clearIdleTasks();
|
|
656
705
|
|
|
657
|
-
let collectIdlePromises: Promise<
|
|
706
|
+
let collectIdlePromises: Promise<boolean>[] = [];
|
|
658
707
|
if (isModifyField) {
|
|
659
708
|
depService.removeTarget(config.id, DepTargetType.DATA_SOURCE);
|
|
660
709
|
depService.removeTarget(config.id, DepTargetType.DATA_SOURCE_COND);
|
|
@@ -679,10 +728,15 @@ export const initServiceEvents = (
|
|
|
679
728
|
|
|
680
729
|
collectIdlePromises = [collectIdle(root.items, true, DepTargetType.DATA_SOURCE_METHOD)];
|
|
681
730
|
}
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
.
|
|
685
|
-
|
|
731
|
+
const handler = async () => {
|
|
732
|
+
const results = await Promise.all(collectIdlePromises);
|
|
733
|
+
if (!results.every(Boolean)) return;
|
|
734
|
+
|
|
735
|
+
updateDataSourceSchema();
|
|
736
|
+
await updateDsData();
|
|
737
|
+
updateStageNodes(root.items);
|
|
738
|
+
};
|
|
739
|
+
handler();
|
|
686
740
|
}
|
|
687
741
|
} else if (root?.dataSources) {
|
|
688
742
|
updateDsData();
|
|
@@ -706,11 +760,12 @@ export const initServiceEvents = (
|
|
|
706
760
|
const nodeIds = Object.keys(root.dataSourceDeps?.[id] || {});
|
|
707
761
|
const nodes = getNodes(nodeIds, root.items);
|
|
708
762
|
|
|
709
|
-
await Promise.all([
|
|
763
|
+
const results = await Promise.all([
|
|
710
764
|
collectIdle(nodes, false, DepTargetType.DATA_SOURCE),
|
|
711
765
|
collectIdle(nodes, false, DepTargetType.DATA_SOURCE_COND),
|
|
712
766
|
collectIdle(nodes, false, DepTargetType.DATA_SOURCE_METHOD),
|
|
713
767
|
]);
|
|
768
|
+
if (!results.every(Boolean)) return;
|
|
714
769
|
|
|
715
770
|
updateDataSourceSchema();
|
|
716
771
|
|
|
@@ -194,6 +194,9 @@ const values = ref('');
|
|
|
194
194
|
const loading = ref(false);
|
|
195
195
|
const codeEditorEl = useTemplateRef<HTMLDivElement>('codeEditor');
|
|
196
196
|
|
|
197
|
+
// 组件是否已卸载,避免异步初始化过程中组件被销毁后继续创建编辑器
|
|
198
|
+
let destroyed = false;
|
|
199
|
+
|
|
197
200
|
const resizeObserver = new globalThis.ResizeObserver(
|
|
198
201
|
throttle((): void => {
|
|
199
202
|
vsEditor?.layout();
|
|
@@ -254,11 +257,18 @@ const handleKeyDown = (e: KeyboardEvent) => {
|
|
|
254
257
|
}
|
|
255
258
|
};
|
|
256
259
|
|
|
260
|
+
// 判断容器是否仍然有效:组件未卸载、ref 存在且已挂载到文档树中
|
|
261
|
+
// Monaco 在创建编辑器时会向上遍历 parentNode 判断是否处于 shadow DOM,
|
|
262
|
+
// 若容器为 null 或已从文档树脱离,将抛出 "Cannot read properties of null (reading 'parentNode')"
|
|
263
|
+
const isEditorElValid = () => !destroyed && !!codeEditorEl.value && codeEditorEl.value.isConnected;
|
|
264
|
+
|
|
257
265
|
const init = async () => {
|
|
258
|
-
if (!
|
|
266
|
+
if (!isEditorElValid()) return;
|
|
259
267
|
|
|
260
|
-
if (codeEditorEl.value
|
|
268
|
+
if (codeEditorEl.value!.clientHeight === 0) {
|
|
261
269
|
await nextTick();
|
|
270
|
+
// await 期间组件可能已被卸载或容器被移除
|
|
271
|
+
if (!isEditorElValid()) return;
|
|
262
272
|
}
|
|
263
273
|
|
|
264
274
|
// 重置缓存的额外高度,因为编辑器重新初始化
|
|
@@ -266,6 +276,11 @@ const init = async () => {
|
|
|
266
276
|
|
|
267
277
|
monaco = await loadMonaco();
|
|
268
278
|
|
|
279
|
+
// 加载 monaco 是异步过程,期间组件可能已被卸载或容器被移除
|
|
280
|
+
if (!isEditorElValid()) return;
|
|
281
|
+
|
|
282
|
+
const editorEl = codeEditorEl.value!;
|
|
283
|
+
|
|
269
284
|
const options = {
|
|
270
285
|
value: values.value,
|
|
271
286
|
language: props.language,
|
|
@@ -275,7 +290,7 @@ const init = async () => {
|
|
|
275
290
|
};
|
|
276
291
|
|
|
277
292
|
if (props.type === 'diff') {
|
|
278
|
-
vsDiffEditor = await getEditorConfig('customCreateMonacoDiffEditor')(monaco!,
|
|
293
|
+
vsDiffEditor = await getEditorConfig('customCreateMonacoDiffEditor')(monaco!, editorEl, options);
|
|
279
294
|
|
|
280
295
|
// 监听diff编辑器内容变化
|
|
281
296
|
vsDiffEditor.getModifiedEditor().onDidChangeModelContent(() => {
|
|
@@ -285,7 +300,7 @@ const init = async () => {
|
|
|
285
300
|
}
|
|
286
301
|
});
|
|
287
302
|
} else {
|
|
288
|
-
vsEditor = await getEditorConfig('customCreateMonacoEditor')(monaco!,
|
|
303
|
+
vsEditor = await getEditorConfig('customCreateMonacoEditor')(monaco!, editorEl, options);
|
|
289
304
|
|
|
290
305
|
// 监听编辑器内容变化
|
|
291
306
|
vsEditor.onDidChangeModelContent(() => {
|
|
@@ -296,10 +311,19 @@ const init = async () => {
|
|
|
296
311
|
});
|
|
297
312
|
}
|
|
298
313
|
|
|
314
|
+
// 编辑器创建可能是异步的,创建完成后若组件已卸载则立即销毁,避免内存泄漏
|
|
315
|
+
if (destroyed) {
|
|
316
|
+
vsEditor?.dispose();
|
|
317
|
+
vsDiffEditor?.dispose();
|
|
318
|
+
vsEditor = null;
|
|
319
|
+
vsDiffEditor = null;
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
299
323
|
setEditorValue(props.initValues, props.modifiedValues);
|
|
300
324
|
|
|
301
325
|
emit('initd', vsEditor);
|
|
302
|
-
|
|
326
|
+
editorEl.addEventListener('keydown', handleKeyDown);
|
|
303
327
|
|
|
304
328
|
if (props.type !== 'diff' && props.autoSave) {
|
|
305
329
|
vsEditor?.onDidBlurEditorWidget(() => {
|
|
@@ -311,7 +335,7 @@ const init = async () => {
|
|
|
311
335
|
});
|
|
312
336
|
}
|
|
313
337
|
|
|
314
|
-
resizeObserver.observe(
|
|
338
|
+
resizeObserver.observe(editorEl);
|
|
315
339
|
};
|
|
316
340
|
|
|
317
341
|
watch(
|
|
@@ -362,6 +386,8 @@ onMounted(async () => {
|
|
|
362
386
|
});
|
|
363
387
|
|
|
364
388
|
onBeforeUnmount(() => {
|
|
389
|
+
destroyed = true;
|
|
390
|
+
|
|
365
391
|
resizeObserver.disconnect();
|
|
366
392
|
|
|
367
393
|
vsEditor?.dispose();
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
right-class="m-editor-framework-right"
|
|
30
30
|
:left="hideSidebar ? undefined : columnWidth.left"
|
|
31
31
|
:right="columnWidth.right"
|
|
32
|
-
:min-left="hideSidebar ? 0 :
|
|
33
|
-
:min-right="
|
|
34
|
-
:min-center="
|
|
32
|
+
:min-left="hideSidebar ? 0 : minLeftColumnWidth"
|
|
33
|
+
:min-right="minRightColumnWidth"
|
|
34
|
+
:min-center="minCenterColumnWidth"
|
|
35
35
|
:width="frameworkRect.width"
|
|
36
36
|
@change="columnWidthChange"
|
|
37
37
|
>
|
|
@@ -82,9 +82,6 @@ import { getEditorConfig } from '@editor/utils/config';
|
|
|
82
82
|
import {
|
|
83
83
|
DEFAULT_LEFT_COLUMN_WIDTH,
|
|
84
84
|
LEFT_COLUMN_WIDTH_STORAGE_KEY,
|
|
85
|
-
MIN_CENTER_COLUMN_WIDTH,
|
|
86
|
-
MIN_LEFT_COLUMN_WIDTH,
|
|
87
|
-
MIN_RIGHT_COLUMN_WIDTH,
|
|
88
85
|
RIGHT_COLUMN_WIDTH_STORAGE_KEY,
|
|
89
86
|
} from '@editor/utils/const';
|
|
90
87
|
|
|
@@ -122,6 +119,10 @@ const showSrc = computed(() => uiService.get('showSrc'));
|
|
|
122
119
|
|
|
123
120
|
const columnWidth = computed(() => uiService.get('columnWidth'));
|
|
124
121
|
|
|
122
|
+
const minLeftColumnWidth = computed(() => uiService.get('minLeftColumnWidth'));
|
|
123
|
+
const minCenterColumnWidth = computed(() => uiService.get('minCenterColumnWidth'));
|
|
124
|
+
const minRightColumnWidth = computed(() => uiService.get('minRightColumnWidth'));
|
|
125
|
+
|
|
125
126
|
watch(pageLength, () => {
|
|
126
127
|
splitViewRef.value?.updateWidth();
|
|
127
128
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div v-if="!buckets.length" class="m-editor-history-list-empty">暂无操作记录</div>
|
|
3
3
|
<template v-else>
|
|
4
|
-
<div class="m-editor-history-list-toolbar">
|
|
4
|
+
<div v-if="config.showClear !== false" class="m-editor-history-list-toolbar">
|
|
5
5
|
<span class="m-editor-history-list-clear" :title="`清空${config.title}的历史记录`" @click="$emit('clear')"
|
|
6
6
|
>清空</span
|
|
7
7
|
>
|
|
@@ -38,7 +38,7 @@ defineOptions({
|
|
|
38
38
|
|
|
39
39
|
defineProps<{
|
|
40
40
|
/**
|
|
41
|
-
* 该类历史的整体渲染配置(title / prefix / describe* / isStep* / showInitial / gotoEnabled),
|
|
41
|
+
* 该类历史的整体渲染配置(title / prefix / describe* / isStep* / showInitial / gotoEnabled / showClear),
|
|
42
42
|
* 由父组件按业务类型注入并整体透传给 Bucket,避免逐项透传多个 props。
|
|
43
43
|
*/
|
|
44
44
|
config: HistoryBucketConfig<T>;
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
</TMagicRadioGroup>
|
|
22
22
|
|
|
23
23
|
<TMagicRadioGroup v-model="mode" size="small" class="m-editor-history-diff-dialog-mode">
|
|
24
|
-
<TMagicRadioButton value="before">与修改前对比</TMagicRadioButton>
|
|
24
|
+
<TMagicRadioButton value="before" :disabled="!hasValue">与修改前对比</TMagicRadioButton>
|
|
25
25
|
<TMagicRadioButton value="current" :disabled="!hasCurrent">与当前对比</TMagicRadioButton>
|
|
26
26
|
</TMagicRadioGroup>
|
|
27
27
|
</div>
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
:data-source-type="payload.dataSourceType"
|
|
44
44
|
:value="rightValue"
|
|
45
45
|
:last-value="leftValue"
|
|
46
|
-
:extend-state="extendState"
|
|
47
46
|
:load-config="loadConfig"
|
|
48
47
|
:self-diff-field-types="selfDiffFieldTypes"
|
|
49
48
|
:services="props.services"
|
|
49
|
+
:size="props.size"
|
|
50
50
|
height="70vh"
|
|
51
51
|
/>
|
|
52
52
|
|
|
@@ -76,11 +76,16 @@
|
|
|
76
76
|
import { computed, ref, watch } from 'vue';
|
|
77
77
|
import { isEqual } from 'lodash-es';
|
|
78
78
|
|
|
79
|
-
import {
|
|
80
|
-
|
|
79
|
+
import {
|
|
80
|
+
type FieldSize,
|
|
81
|
+
TMagicButton,
|
|
82
|
+
TMagicDialog,
|
|
83
|
+
TMagicRadioButton,
|
|
84
|
+
TMagicRadioGroup,
|
|
85
|
+
TMagicTag,
|
|
86
|
+
} from '@tmagic/design';
|
|
81
87
|
|
|
82
88
|
import CompareForm from '@editor/components/CompareForm.vue';
|
|
83
|
-
import { useServices } from '@editor/hooks/use-services';
|
|
84
89
|
import CodeEditor from '@editor/layouts/CodeEditor.vue';
|
|
85
90
|
import type { CompareCategory, CompareFormLoadConfig, DiffDialogPayload, Services } from '@editor/type';
|
|
86
91
|
|
|
@@ -91,25 +96,20 @@ defineOptions({
|
|
|
91
96
|
const props = withDefaults(
|
|
92
97
|
defineProps<{
|
|
93
98
|
/** 编辑器服务集合,由调用方传入(不再通过 inject('services') 获取)。 */
|
|
94
|
-
services
|
|
95
|
-
/**
|
|
96
|
-
* 来自 Editor 顶层的 `extendFormState`,用于扩展 MForm.formState。
|
|
97
|
-
* 透传给 CompareForm,从而让差异对比时表单 item 中依赖业务上下文的
|
|
98
|
-
* `display` / `disabled` 等 filterFunction 正常工作。
|
|
99
|
-
*/
|
|
100
|
-
extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
|
|
99
|
+
services?: Services;
|
|
101
100
|
/**
|
|
102
101
|
* 自定义 FormConfig 加载逻辑,透传给 CompareForm。传入后将接管内置的按 `category`
|
|
103
102
|
* 取配置逻辑,可通过 `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
|
|
104
103
|
*/
|
|
105
104
|
loadConfig?: CompareFormLoadConfig;
|
|
106
105
|
width?: string;
|
|
106
|
+
/** 差异对比表单内组件的尺寸(透传给 CompareForm 的 `size`),可选 'large' | 'default' | 'small'。 */
|
|
107
|
+
size?: FieldSize;
|
|
107
108
|
isConfirm?: boolean;
|
|
108
109
|
onConfirm?: () => void;
|
|
109
110
|
selfDiffFieldTypes?: string[];
|
|
110
111
|
}>(),
|
|
111
112
|
{
|
|
112
|
-
services: () => useServices(),
|
|
113
113
|
width: '900px',
|
|
114
114
|
},
|
|
115
115
|
);
|
|
@@ -159,6 +159,23 @@ const dialogTitle = computed(() => (props.onConfirm ? '确认回滚' : '查看
|
|
|
159
159
|
|
|
160
160
|
const hasCurrent = computed(() => payload.value?.currentValue !== undefined && payload.value?.currentValue !== null);
|
|
161
161
|
|
|
162
|
+
/** 是否存在该步「修改后的值」:不存在(如仅删除)时「与修改前对比」无意义,置灰禁用。 */
|
|
163
|
+
const hasValue = computed(() => payload.value?.value !== undefined && payload.value?.value !== null);
|
|
164
|
+
|
|
165
|
+
/** 指定模式当前是否可用:before 依赖「修改后的值」,current 依赖「当前值」。 */
|
|
166
|
+
const isModeAvailable = (m: DiffMode): boolean => (m === 'current' ? hasCurrent.value : hasValue.value);
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* 计算 open 时的初始对比模式:
|
|
170
|
+
* - 调用方通过 payload.mode 指定且该模式可用时,优先使用指定模式;
|
|
171
|
+
* - 否则没有「修改后的值」但有当前值时(「与修改前对比」不可用),默认进入「与当前对比」;
|
|
172
|
+
* - 其余情况默认「与修改前对比」。
|
|
173
|
+
*/
|
|
174
|
+
const resolveInitialMode = (specified?: DiffMode): DiffMode => {
|
|
175
|
+
if (specified && isModeAvailable(specified)) return specified;
|
|
176
|
+
return !hasValue.value && hasCurrent.value ? 'current' : 'before';
|
|
177
|
+
};
|
|
178
|
+
|
|
162
179
|
/** 左侧(旧/参照)值 */
|
|
163
180
|
const leftValue = computed<Record<string, any>>(() => {
|
|
164
181
|
if (!payload.value) return {};
|
|
@@ -212,8 +229,9 @@ const targetText = computed(() => {
|
|
|
212
229
|
|
|
213
230
|
const open = (p: DiffDialogPayload) => {
|
|
214
231
|
payload.value = p;
|
|
215
|
-
//
|
|
216
|
-
mode
|
|
232
|
+
// 每次打开按 payload 重置对比模式(hasValue / hasCurrent 依赖 payload,需先赋值):
|
|
233
|
+
// 优先使用 payload.mode 指定的模式;不可用或未指定时按数据自动推断。
|
|
234
|
+
mode.value = resolveInitialMode(p.mode);
|
|
217
235
|
// 默认回到表单对比形态,避免残留上一次选择的源码模式
|
|
218
236
|
viewMode.value = 'form';
|
|
219
237
|
visible.value = true;
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
<TMagicTabs v-model="activeTab" class="m-editor-history-list-tabs">
|
|
19
19
|
<component
|
|
20
20
|
:is="tabPaneComponent?.component || 'el-tab-pane'"
|
|
21
|
-
v-bind="
|
|
21
|
+
v-bind="
|
|
22
|
+
tabPaneComponent?.props({ name: 'page', label: `${pageName} (${pageGroups.length})`, lazy: true }) || {}
|
|
23
|
+
"
|
|
22
24
|
>
|
|
23
25
|
<PageTab
|
|
24
26
|
:list="pageGroupsDisplay"
|
|
@@ -38,8 +40,11 @@
|
|
|
38
40
|
v-if="!disabledDataSource"
|
|
39
41
|
:is="tabPaneComponent?.component || 'el-tab-pane'"
|
|
40
42
|
v-bind="
|
|
41
|
-
tabPaneComponent?.props({
|
|
42
|
-
|
|
43
|
+
tabPaneComponent?.props({
|
|
44
|
+
name: 'data-source',
|
|
45
|
+
label: `${dataSourceName} (${dataSourceGroups.length})`,
|
|
46
|
+
lazy: true,
|
|
47
|
+
}) || {}
|
|
43
48
|
"
|
|
44
49
|
>
|
|
45
50
|
<BucketTab
|
|
@@ -59,7 +64,11 @@
|
|
|
59
64
|
v-if="!disabledCodeBlock"
|
|
60
65
|
:is="tabPaneComponent?.component || 'el-tab-pane'"
|
|
61
66
|
v-bind="
|
|
62
|
-
tabPaneComponent?.props({
|
|
67
|
+
tabPaneComponent?.props({
|
|
68
|
+
name: 'code-block',
|
|
69
|
+
label: `${codeBlockName} (${codeBlockGroups.length})`,
|
|
70
|
+
lazy: true,
|
|
71
|
+
}) || {}
|
|
63
72
|
"
|
|
64
73
|
>
|
|
65
74
|
<BucketTab
|
|
@@ -79,7 +88,7 @@
|
|
|
79
88
|
v-for="tab in extraTabs"
|
|
80
89
|
:key="tab.name"
|
|
81
90
|
:is="tabPaneComponent?.component || 'el-tab-pane'"
|
|
82
|
-
v-bind="tabPaneComponent?.props({ name: tab.name, label: resolveTabLabel(tab) }) || {}"
|
|
91
|
+
v-bind="tabPaneComponent?.props({ name: tab.name, label: resolveTabLabel(tab), lazy: true }) || {}"
|
|
83
92
|
>
|
|
84
93
|
<component :is="tab.component" v-bind="tab.props || {}" v-on="tab.listeners || {}" />
|
|
85
94
|
</component>
|
|
@@ -124,7 +133,6 @@ import { computed, inject, markRaw, ref, watch } from 'vue';
|
|
|
124
133
|
import { Clock, Close } from '@element-plus/icons-vue';
|
|
125
134
|
|
|
126
135
|
import { getDesignConfig, TMagicButton, tMagicMessage, TMagicPopover, TMagicTabs, TMagicTooltip } from '@tmagic/design';
|
|
127
|
-
import type { FormState } from '@tmagic/form';
|
|
128
136
|
|
|
129
137
|
import MIcon from '@editor/components/Icon.vue';
|
|
130
138
|
import { useServices } from '@editor/hooks/use-services';
|
|
@@ -184,16 +192,6 @@ watch([disabledDataSource, disabledCodeBlock], ([dsDisabled, cbDisabled]) => {
|
|
|
184
192
|
}
|
|
185
193
|
});
|
|
186
194
|
|
|
187
|
-
/**
|
|
188
|
-
* 通过 inject 拿到 Editor 顶层注入的 `extendFormState`,转交给 HistoryDiffDialog
|
|
189
|
-
* 内部的 CompareForm,使差异对比表单的 filterFunction 能拿到完整的业务上下文。
|
|
190
|
-
* 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
|
|
191
|
-
*/
|
|
192
|
-
const extendFormState = inject<((_state: FormState) => Record<string, any> | Promise<Record<string, any>>) | undefined>(
|
|
193
|
-
'extendFormState',
|
|
194
|
-
undefined,
|
|
195
|
-
);
|
|
196
|
-
|
|
197
195
|
const {
|
|
198
196
|
expanded,
|
|
199
197
|
toggleGroup,
|
|
@@ -303,10 +301,10 @@ const onCodeBlockGotoInitial = (id: string | number) => {
|
|
|
303
301
|
/**
|
|
304
302
|
* 「单步回滚」与「查看差异」的完整逻辑收敛到 useHistoryRevert,面板与业务方共用:
|
|
305
303
|
* 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
|
|
306
|
-
* 业务方亦可直接 import useHistoryRevert(services) 调用,无需自行挂载任何弹窗。
|
|
304
|
+
* 业务方亦可直接 import useHistoryRevert(options, services) 调用,无需自行挂载任何弹窗。
|
|
307
305
|
*/
|
|
308
306
|
const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } =
|
|
309
|
-
useHistoryRevert(
|
|
307
|
+
useHistoryRevert({}, services);
|
|
310
308
|
|
|
311
309
|
/**
|
|
312
310
|
* 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,
|