@tmagic/editor 1.8.0-beta.2 → 1.8.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +43 -9
- package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +8 -4
- package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +22 -98
- package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +32 -9
- package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +68 -17
- package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ScrollBar.js +0 -1
- package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/ViewForm.js +5 -0
- package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +58 -0
- package/dist/es/editorProps.js +9 -1
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +16 -5
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +81 -44
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +10 -3
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
- package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +13 -6
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +11 -8
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +39 -12
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +11 -20
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +11 -6
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +30 -14
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +11 -4
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +38 -6
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +156 -155
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +8 -10
- package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +28 -6
- package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
- package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +7 -7
- package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +6 -3
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +29 -6
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +32 -6
- package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
- package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
- package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +11 -3
- package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +11 -3
- package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +11 -3
- package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +11 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +17 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +19 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +19 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +37 -3
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +33 -3
- package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
- package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
- package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
- package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +56 -30
- package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +7 -4
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +35 -26
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +76 -48
- package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -23
- package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +7 -4
- package/dist/es/fields/UISelect.js +0 -1
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/hooks/use-code-block-edit.js +6 -3
- package/dist/es/hooks/use-compare-form.js +119 -0
- package/dist/es/hooks/use-data-source-edit.js +5 -2
- package/dist/es/hooks/use-stage.js +9 -4
- package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/icons/DatasourceIcon.js +17 -0
- package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/index.js +24 -10
- package/dist/es/initService.js +19 -13
- package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +24 -12
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +25 -18
- package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +25 -38
- package/dist/es/layouts/history-list/BucketTab.js +5 -0
- package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +177 -88
- package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +139 -37
- package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +164 -107
- package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +44 -9
- package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +49 -53
- package/dist/es/layouts/history-list/composables.js +138 -108
- package/dist/es/layouts/history-list/useHistoryList.js +56 -0
- package/dist/es/layouts/history-list/useHistoryRevert.js +317 -0
- package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
- package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -7
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +33 -13
- package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
- package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +26 -38
- package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
- package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +23 -6
- package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +27 -5
- package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
- package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
- package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
- package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
- package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
- package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
- package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/es/plugin.js +5 -2
- package/dist/es/services/codeBlock.js +137 -56
- package/dist/es/services/dataSource.js +122 -52
- package/dist/es/services/dep.js +162 -41
- package/dist/es/services/editor.js +613 -179
- package/dist/es/services/events.js +2 -2
- package/dist/es/services/history.js +350 -386
- package/dist/es/services/keybinding.js +6 -6
- package/dist/es/services/props.js +3 -2
- package/dist/es/services/storage.js +2 -2
- package/dist/es/services/ui.js +10 -2
- package/dist/es/style.css +549 -113
- package/dist/es/utils/config.js +4 -1
- package/dist/es/utils/const.js +2 -2
- package/dist/es/utils/content-menu.js +19 -11
- package/dist/es/utils/data-source/index.js +34 -11
- package/dist/es/utils/dep/collect-worker-client.js +114 -0
- package/dist/es/utils/dep/idle-task.js +70 -22
- package/dist/es/utils/dep/worker.js +1 -1
- package/dist/es/utils/editor.js +103 -49
- package/dist/es/utils/event.js +135 -0
- package/dist/es/utils/history.js +220 -0
- package/dist/es/utils/indexed-db.js +86 -0
- package/dist/es/utils/monaco-editor.js +22 -6
- package/dist/es/utils/operator.js +2 -2
- package/dist/es/utils/props.js +114 -33
- package/dist/es/utils/type-match-rules.js +367 -0
- package/dist/es/utils/undo-redo.js +60 -1
- package/dist/style.css +549 -113
- package/dist/themes/magic-admin.css +3028 -0
- package/dist/tmagic-editor.umd.cjs +14403 -10121
- package/package.json +8 -8
- package/src/Editor.vue +43 -2
- package/src/components/CodeBlockEditor.vue +3 -0
- package/src/components/CompareForm.vue +18 -146
- package/src/components/ContentMenu.vue +44 -8
- package/src/components/FloatingBox.vue +84 -9
- package/src/components/ScrollBar.vue +0 -67
- package/src/components/ToolButton.vue +2 -2
- package/src/components/ViewForm.vue +55 -0
- package/src/editorProps.ts +30 -0
- package/src/fields/Code.vue +10 -2
- package/src/fields/CodeLink.vue +2 -5
- package/src/fields/CodeSelect.vue +54 -40
- package/src/fields/CodeSelectCol.vue +8 -1
- package/src/fields/CondOpSelect.vue +2 -24
- package/src/fields/DataSourceFieldSelect/FieldSelect.vue +16 -2
- package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
- package/src/fields/DataSourceFields.vue +42 -8
- package/src/fields/DataSourceInput.vue +10 -28
- package/src/fields/DataSourceMethodSelect.vue +9 -4
- package/src/fields/DataSourceMethods.vue +42 -21
- package/src/fields/DataSourceMocks.vue +3 -0
- package/src/fields/DisplayConds.vue +18 -1
- package/src/fields/EventSelect.vue +152 -166
- package/src/fields/StyleSetter/Index.vue +3 -12
- package/src/fields/StyleSetter/components/Border.vue +15 -6
- package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
- package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
- package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
- package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
- package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
- package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
- package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
- package/src/fields/StyleSetter/pro/Background.vue +99 -55
- package/src/fields/StyleSetter/pro/Border.vue +9 -11
- package/src/fields/StyleSetter/pro/Font.vue +66 -64
- package/src/fields/StyleSetter/pro/Layout.vue +211 -139
- package/src/fields/StyleSetter/pro/Position.vue +69 -67
- package/src/fields/StyleSetter/pro/Transform.vue +23 -25
- package/src/fields/UISelect.vue +0 -12
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-code-block-edit.ts +4 -3
- package/src/hooks/use-compare-form.ts +187 -0
- package/src/hooks/use-data-source-edit.ts +2 -2
- package/src/hooks/use-stage.ts +5 -3
- package/src/icons/DatasourceIcon.vue +7 -0
- package/src/index.ts +12 -0
- package/src/initService.ts +26 -16
- package/src/layouts/CodeEditor.vue +34 -11
- package/src/layouts/Framework.vue +15 -8
- package/src/layouts/NavMenu.vue +3 -3
- package/src/layouts/history-list/Bucket.vue +33 -41
- package/src/layouts/history-list/BucketTab.vue +72 -0
- package/src/layouts/history-list/GroupRow.vue +190 -93
- package/src/layouts/history-list/HistoryDiffDialog.vue +169 -90
- package/src/layouts/history-list/HistoryListPanel.vue +191 -95
- package/src/layouts/history-list/InitialRow.vue +38 -8
- package/src/layouts/history-list/PageTab.vue +67 -43
- package/src/layouts/history-list/composables.ts +239 -125
- package/src/layouts/history-list/useHistoryList.ts +60 -0
- package/src/layouts/history-list/useHistoryRevert.ts +425 -0
- package/src/layouts/page-bar/PageBar.vue +4 -2
- package/src/layouts/props-panel/FormPanel.vue +72 -6
- package/src/layouts/props-panel/PropsPanel.vue +62 -18
- package/src/layouts/props-panel/use-style-panel.ts +4 -3
- package/src/layouts/sidebar/ComponentListPanel.vue +10 -6
- package/src/layouts/sidebar/Sidebar.vue +13 -6
- package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
- package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
- package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
- package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +34 -2
- package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +29 -4
- package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
- package/src/layouts/sidebar/layer/LayerMenu.vue +21 -13
- package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
- package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
- package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
- package/src/layouts/sidebar/layer/use-click.ts +3 -3
- package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
- package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
- package/src/layouts/workspace/viewer/Stage.vue +1 -1
- package/src/layouts/workspace/viewer/ViewerMenu.vue +15 -15
- package/src/plugin.ts +6 -3
- package/src/services/codeBlock.ts +152 -47
- package/src/services/dataSource.ts +120 -41
- package/src/services/dep.ts +292 -47
- package/src/services/editor.ts +820 -224
- package/src/services/events.ts +3 -3
- package/src/services/history.ts +449 -412
- package/src/services/keybinding.ts +6 -6
- package/src/services/ui.ts +33 -5
- package/src/theme/code-block.scss +37 -0
- package/src/theme/common/var.scss +1 -1
- package/src/theme/component-list-panel.scss +2 -2
- package/src/theme/data-source-field.scss +4 -0
- package/src/theme/display-conds.scss +11 -0
- package/src/theme/event.scss +70 -1
- package/src/theme/floating-box.scss +9 -1
- package/src/theme/framework.scss +4 -1
- package/src/theme/history-list-panel.scss +157 -23
- package/src/theme/layer-node-content.scss +14 -0
- package/src/theme/nav-menu.scss +5 -1
- package/src/theme/page-bar.scss +0 -4
- package/src/theme/props-panel.scss +5 -4
- package/src/theme/scroll-bar.scss +64 -0
- package/src/theme/style-setter/border.scss +17 -5
- package/src/theme/theme.scss +4 -0
- package/src/theme/themes/magic-admin/index.scss +214 -0
- package/src/theme/ui-select.scss +9 -0
- package/src/type.ts +668 -124
- package/src/utils/config.ts +9 -1
- package/src/utils/const.ts +3 -2
- package/src/utils/content-menu.ts +20 -11
- package/src/utils/data-source/index.ts +32 -12
- package/src/utils/dep/collect-worker-client.ts +149 -0
- package/src/utils/dep/idle-task.ts +104 -35
- package/src/utils/dep/worker.ts +113 -9
- package/src/utils/editor.ts +166 -60
- package/src/utils/event.ts +237 -0
- package/src/utils/history.ts +286 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/indexed-db.ts +122 -0
- package/src/utils/monaco-editor.ts +27 -0
- package/src/utils/operator.ts +2 -2
- package/src/utils/props.ts +114 -11
- package/src/utils/type-match-rules.ts +684 -0
- package/src/utils/undo-redo.ts +88 -0
- package/types/index.d.ts +1990 -517
- package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
- package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +0 -62
- package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
- package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
- package/src/layouts/history-list/CodeBlockTab.vue +0 -61
- package/src/layouts/history-list/DataSourceTab.vue +0 -61
package/src/type.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* limitations under the License.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import type { Component } from 'vue';
|
|
19
|
+
import type { AppContext, Component } from 'vue';
|
|
20
20
|
import type EventEmitter from 'events';
|
|
21
21
|
import type * as Monaco from 'monaco-editor';
|
|
22
22
|
import type { default as Sortable, Options, SortableEvent } from 'sortablejs';
|
|
@@ -33,7 +33,8 @@ import type {
|
|
|
33
33
|
MPage,
|
|
34
34
|
MPageFragment,
|
|
35
35
|
} from '@tmagic/core';
|
|
36
|
-
import type {
|
|
36
|
+
import type { FieldSize } from '@tmagic/design';
|
|
37
|
+
import type { ChangeRecord, FormConfig, FormState, TableColumnConfig, TypeFunction } from '@tmagic/form';
|
|
37
38
|
import type StageCore from '@tmagic/stage';
|
|
38
39
|
import type {
|
|
39
40
|
CanDropIn,
|
|
@@ -56,7 +57,7 @@ import type { PropsService } from './services/props';
|
|
|
56
57
|
import type { StageOverlayService } from './services/stageOverlay';
|
|
57
58
|
import type { StorageService } from './services/storage';
|
|
58
59
|
import type { UiService } from './services/ui';
|
|
59
|
-
import type { UndoRedo } from './utils/undo-redo';
|
|
60
|
+
import type { SerializedUndoRedo, UndoRedo } from './utils/undo-redo';
|
|
60
61
|
|
|
61
62
|
export type EditorSlots = FrameworkSlots &
|
|
62
63
|
WorkspaceSlots &
|
|
@@ -76,7 +77,7 @@ export interface FrameworkSlots {
|
|
|
76
77
|
empty(props: {}): any;
|
|
77
78
|
workspace(props: {}): any;
|
|
78
79
|
'props-panel'(props: {}): any;
|
|
79
|
-
|
|
80
|
+
footer(props: {}): any;
|
|
80
81
|
'page-bar'(props: {}): any;
|
|
81
82
|
'page-bar-add-button'(props: {}): any;
|
|
82
83
|
'page-bar-title'(props: { page: MPage | MPageFragment }): any;
|
|
@@ -139,6 +140,7 @@ export type BeforeAdd = (config: MNode, parent: MContainer) => Promise<MNode> |
|
|
|
139
140
|
export type GetConfig = (config: FormConfig) => Promise<FormConfig> | FormConfig;
|
|
140
141
|
|
|
141
142
|
export interface EditorInstallOptions {
|
|
143
|
+
flat?: boolean;
|
|
142
144
|
parseDSL: <T = any>(dsl: string) => T;
|
|
143
145
|
customCreateMonacoEditor: (
|
|
144
146
|
monaco: typeof import('monaco-editor'),
|
|
@@ -176,6 +178,11 @@ export interface StageOptions {
|
|
|
176
178
|
containerHighlightClassName?: string;
|
|
177
179
|
containerHighlightDuration?: number;
|
|
178
180
|
containerHighlightType?: ContainerHighlightType;
|
|
181
|
+
/**
|
|
182
|
+
* 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
|
|
183
|
+
* 开启后在画布中拖动已有组件不会识别容器,默认 false
|
|
184
|
+
*/
|
|
185
|
+
containerHighlightAddOnly?: boolean;
|
|
179
186
|
disabledDragStart?: boolean;
|
|
180
187
|
render?: (stage: StageCore) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
|
|
181
188
|
moveableOptions?: CustomizeMoveableOptions;
|
|
@@ -199,11 +206,32 @@ export interface StageOptions {
|
|
|
199
206
|
*/
|
|
200
207
|
alwaysMultiSelect?: boolean;
|
|
201
208
|
disabledRule?: boolean;
|
|
209
|
+
/**
|
|
210
|
+
* 禁用「非点击画布选中组件时(如从图层树、面包屑等外部选中),对选中区域做高亮闪烁提示」,
|
|
211
|
+
* 默认 false(即默认开启闪烁)
|
|
212
|
+
*/
|
|
213
|
+
disabledFlashTip?: boolean;
|
|
202
214
|
zoom?: number;
|
|
203
215
|
/** 画布双击前的钩子函数,返回 false 则阻止默认的双击行为 */
|
|
204
216
|
beforeDblclick?: (event: MouseEvent) => Promise<boolean | void> | boolean | void;
|
|
205
217
|
}
|
|
206
218
|
|
|
219
|
+
/**
|
|
220
|
+
* 节点校验错误信息,按来源(属性表单 / 样式表单)分别保存错误文案。
|
|
221
|
+
* 属性表单与样式表单是两个独立的 FormPanel,均指向同一节点,故以来源为键,
|
|
222
|
+
* 避免某个面板校验通过时误清另一个面板记录的错误。
|
|
223
|
+
* 节点视为存在错误当且仅当任一来源存在非空文本。
|
|
224
|
+
*/
|
|
225
|
+
export interface NodeInvalidInfo {
|
|
226
|
+
/** 属性表单校验错误文案(可能为包含 <br> 的 HTML) */
|
|
227
|
+
props?: string;
|
|
228
|
+
/** 样式表单校验错误文案(可能为包含 <br> 的 HTML) */
|
|
229
|
+
style?: string;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** 节点校验错误来源 */
|
|
233
|
+
export type NodeInvalidSource = keyof NodeInvalidInfo;
|
|
234
|
+
|
|
207
235
|
export interface StoreState {
|
|
208
236
|
root: MApp | null;
|
|
209
237
|
page: MPage | MPageFragment | null;
|
|
@@ -214,6 +242,8 @@ export interface StoreState {
|
|
|
214
242
|
stage: StageCore | null;
|
|
215
243
|
stageLoading: boolean;
|
|
216
244
|
modifiedNodeIds: Map<Id, Id>;
|
|
245
|
+
/** 校验失败的节点错误信息,按节点 id 存储,供组件树标记与保存拦截读取 */
|
|
246
|
+
invalidNodeIds: Map<Id, NodeInvalidInfo>;
|
|
217
247
|
pageLength: number;
|
|
218
248
|
pageFragmentLength: number;
|
|
219
249
|
disabledMultiSelect: boolean;
|
|
@@ -291,6 +321,12 @@ export interface UiState {
|
|
|
291
321
|
stageRect: StageRect;
|
|
292
322
|
/** 编辑器列布局每一列的宽度,分为左中右三列 */
|
|
293
323
|
columnWidth: GetColumnWidth;
|
|
324
|
+
/** 编辑器列布局左侧列最小宽度 */
|
|
325
|
+
minLeftColumnWidth: number;
|
|
326
|
+
/** 编辑器列布局中间列最小宽度 */
|
|
327
|
+
minCenterColumnWidth: number;
|
|
328
|
+
/** 编辑器列布局右侧列最小宽度 */
|
|
329
|
+
minRightColumnWidth: number;
|
|
294
330
|
/** 是否显示画布参考线,true: 显示,false: 不显示,默认为true */
|
|
295
331
|
showGuides: boolean;
|
|
296
332
|
/** 画布上是否存在参考线 */
|
|
@@ -307,6 +343,8 @@ export interface UiState {
|
|
|
307
343
|
hideSlideBar: boolean;
|
|
308
344
|
/** 侧边栏面板配置 */
|
|
309
345
|
sideBarItems: SideComponent[];
|
|
346
|
+
/** 当前激活的侧边栏面板 */
|
|
347
|
+
sideBarActiveTabName: string;
|
|
310
348
|
|
|
311
349
|
// navMenu 的宽高
|
|
312
350
|
navMenuRect: {
|
|
@@ -328,6 +366,7 @@ export interface EditorNodeInfo {
|
|
|
328
366
|
node: MNode | null;
|
|
329
367
|
parent: MContainer | null;
|
|
330
368
|
page: MPage | MPageFragment | null;
|
|
369
|
+
path: MNode[];
|
|
331
370
|
}
|
|
332
371
|
// #endregion EditorNodeInfo
|
|
333
372
|
|
|
@@ -385,6 +424,9 @@ export interface MenuButton {
|
|
|
385
424
|
items?: MenuButton[];
|
|
386
425
|
/** 唯一标识,用于高亮 */
|
|
387
426
|
id?: string | number;
|
|
427
|
+
buttonProps?: {
|
|
428
|
+
type?: string;
|
|
429
|
+
};
|
|
388
430
|
}
|
|
389
431
|
// #endregion MenuButton
|
|
390
432
|
|
|
@@ -475,6 +517,115 @@ export interface SideComponent extends MenuComponent {
|
|
|
475
517
|
}
|
|
476
518
|
// #endregion SideComponent
|
|
477
519
|
|
|
520
|
+
// #region HistoryListExtraTab
|
|
521
|
+
/**
|
|
522
|
+
* 历史记录面板(HistoryListPanel)的自定义扩展 tab。
|
|
523
|
+
*
|
|
524
|
+
* 业务方可通过 Editor 的 `historyListExtraTabs` 注入额外的历史记录 tab,
|
|
525
|
+
* 例如某个自定义模块维护自己的操作历史时,可以在历史记录面板中增加一个
|
|
526
|
+
* 独立的 tab 来展示与回滚。内置的「页面 / 数据源 / 代码块」三个 tab 之后
|
|
527
|
+
* 会依次追加这些扩展 tab。
|
|
528
|
+
*/
|
|
529
|
+
export interface HistoryListExtraTab {
|
|
530
|
+
/** tab 唯一标识,作为 TMagicTabs 的 name */
|
|
531
|
+
name: string;
|
|
532
|
+
/** tab 显示文案,支持传入函数以展示动态内容(如记录数量) */
|
|
533
|
+
label: string | (() => string);
|
|
534
|
+
/** tab 内容区渲染的组件(Vue 组件或字符串标签) */
|
|
535
|
+
component: any;
|
|
536
|
+
/** 传入内容组件的 props */
|
|
537
|
+
props?: Record<string, any>;
|
|
538
|
+
/** 内容组件的事件监听 */
|
|
539
|
+
listeners?: Record<string, (..._args: any[]) => any>;
|
|
540
|
+
}
|
|
541
|
+
// #endregion HistoryListExtraTab
|
|
542
|
+
|
|
543
|
+
// #region CompareForm
|
|
544
|
+
/**
|
|
545
|
+
* 对比表单(CompareForm)的对比类型:
|
|
546
|
+
* - node: 节点组件,按 `type` 从 propsService 获取属性表单配置
|
|
547
|
+
* - data-source: 数据源,按 `type`(base/http/...) 从 dataSourceService 获取数据源表单配置
|
|
548
|
+
* - code-block: 数据源代码块,使用内置的代码块表单配置
|
|
549
|
+
*/
|
|
550
|
+
export type CompareCategory = 'node' | 'data-source' | 'code-block' | string;
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* 自定义 `loadConfig` 时回传的上下文,聚合了组件当前的对比入参,
|
|
554
|
+
* 方便调用方在外部按需拼装 FormConfig。
|
|
555
|
+
*/
|
|
556
|
+
export interface CompareFormLoadConfigContext {
|
|
557
|
+
/** 对比类型,见 CompareCategory */
|
|
558
|
+
category: string;
|
|
559
|
+
/** 节点 / 数据源类型 */
|
|
560
|
+
type?: string;
|
|
561
|
+
/** 数据源代码块场景下的数据源类型 */
|
|
562
|
+
dataSourceType?: string;
|
|
563
|
+
/**
|
|
564
|
+
* 内置的默认 FormConfig 加载逻辑(按 `category` 从 propsService / dataSourceService /
|
|
565
|
+
* 代码块工具取配置)。自定义 `loadConfig` 可调用它复用默认结果,再做二次加工。
|
|
566
|
+
*/
|
|
567
|
+
defaultLoadConfig: () => Promise<FormConfig>;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* 自定义 FormConfig 加载逻辑。传入后将接管内置的按 `category` 取配置逻辑,
|
|
572
|
+
* 可通过 `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
|
|
573
|
+
*/
|
|
574
|
+
export type CompareFormLoadConfig = (ctx: CompareFormLoadConfigContext) => FormConfig | Promise<FormConfig>;
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* CompareForm / ViewForm 共用的基础 props。
|
|
578
|
+
* 两者都基于同一套「按 category 加载 FormConfig + 注入 services/stage」的逻辑(见 useCompareForm),
|
|
579
|
+
* 差异仅在于是否做新旧值对比。这里抽出公共字段避免重复定义。
|
|
580
|
+
*/
|
|
581
|
+
export interface CompareFormBaseProps {
|
|
582
|
+
/** 当前值(对比场景下为修改后的值) */
|
|
583
|
+
value: Partial<MNode> | Partial<DataSourceSchema> | Partial<CodeBlockContent> | Record<string, any>;
|
|
584
|
+
/**
|
|
585
|
+
* 类型说明:
|
|
586
|
+
* - `category` 为 `node` 时,`type` 为节点组件的类型,例如 'text'、'button'、'page'、'container' 等
|
|
587
|
+
* - `category` 为 `data-source` 时,`type` 为数据源类型,例如 'base'、'http'
|
|
588
|
+
* - `category` 为 `code-block` 时,`type` 可不传
|
|
589
|
+
*/
|
|
590
|
+
type?: string;
|
|
591
|
+
/** 表单配置类别,决定从哪里取 FormConfig */
|
|
592
|
+
category?: CompareCategory;
|
|
593
|
+
/** 数据源代码块场景下的数据源类型(base/http),用于代码块表单中"执行时机"展示 */
|
|
594
|
+
dataSourceType?: string;
|
|
595
|
+
labelWidth?: string;
|
|
596
|
+
/**
|
|
597
|
+
* 外层容器高度。设置后表单内容超出时会在组件内部出现滚动条,
|
|
598
|
+
* 避免 dialog / 面板使用方需要自行处理滚动。可传任意 CSS 长度,例如 `60vh` / `400px` / `100%`。
|
|
599
|
+
*/
|
|
600
|
+
height?: string;
|
|
601
|
+
/**
|
|
602
|
+
* 用户自定义注入到 MForm.formState 的扩展字段,与 Editor 顶层的 `extendFormState`、
|
|
603
|
+
* PropsPanel 的 `extend-state` 语义一致。表单 item 的 `display` / `disabled` 等
|
|
604
|
+
* filterFunction 经常依赖这里注入的字段(如 stage、自定义业务上下文等),
|
|
605
|
+
* 因此在对比 / 展示场景下也需要透传,避免出现 `formState.xxx is undefined` 的运行时错误。
|
|
606
|
+
*/
|
|
607
|
+
extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
|
|
608
|
+
/**
|
|
609
|
+
* 外部透传的基础 formState(通常来自 PropsPanel 主属性表单)。
|
|
610
|
+
* 组件会提取其中的扩展字段覆盖到自己的 formState,保证 filterFunction 上下文一致。
|
|
611
|
+
*/
|
|
612
|
+
baseFormState?: FormState;
|
|
613
|
+
/**
|
|
614
|
+
* 表单内组件的尺寸(透传给 MForm 的 `size`),可选 'large' | 'default' | 'small'。
|
|
615
|
+
* 缺省时使用 MForm 内置默认尺寸。
|
|
616
|
+
*/
|
|
617
|
+
size?: FieldSize;
|
|
618
|
+
/**
|
|
619
|
+
* 自定义 FormConfig 加载逻辑。传入后将接管内置的按 `category`(node/data-source/code-block)
|
|
620
|
+
* 取配置逻辑,调用方可根据业务自行返回(或异步返回)表单配置。可通过
|
|
621
|
+
* `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
|
|
622
|
+
*/
|
|
623
|
+
loadConfig?: CompareFormLoadConfig;
|
|
624
|
+
/** 编辑器服务集合,由调用方传入(不再通过 inject('services') 获取)。 */
|
|
625
|
+
services?: Services;
|
|
626
|
+
}
|
|
627
|
+
// #endregion CompareForm
|
|
628
|
+
|
|
478
629
|
// #region SideItemKey
|
|
479
630
|
export enum SideItemKey {
|
|
480
631
|
COMPONENT_LIST = 'component-list',
|
|
@@ -618,114 +769,289 @@ export interface CodeParamStatement {
|
|
|
618
769
|
}
|
|
619
770
|
|
|
620
771
|
// #region HistoryOpType
|
|
621
|
-
|
|
772
|
+
/**
|
|
773
|
+
* 历史记录操作类型:
|
|
774
|
+
* - `add` / `remove` / `update`:普通可撤销/重做的节点变更;
|
|
775
|
+
* - `initial`:页面「未修改的初始状态」基线(设置 root 时生成),作为页面栈 index 0 的固定底线 step。
|
|
776
|
+
* 该 step 不可被撤销/回滚(cursor 不会低于它),仅用于历史面板底部的初始行展示。
|
|
777
|
+
*/
|
|
778
|
+
export type HistoryOpType = 'add' | 'remove' | 'update' | 'initial';
|
|
622
779
|
// #endregion HistoryOpType
|
|
623
780
|
|
|
624
|
-
// #region
|
|
625
|
-
|
|
626
|
-
|
|
781
|
+
// #region HistoryOpSource
|
|
782
|
+
/**
|
|
783
|
+
* 历史记录的「操作途径」——标记本次变更由哪条交互入口触发,仅用于历史面板展示 / 业务埋点,
|
|
784
|
+
* 不影响 undo/redo 行为。缺省(未传)时 UI 视为「未知」。
|
|
785
|
+
*
|
|
786
|
+
* - `stage`:画布(拖拽 / 缩放 / 排序等舞台直接操作)
|
|
787
|
+
* - `tree`:树形面板(图层 / 数据源 / 代码块等树形结构里的拖拽 / 菜单操作)
|
|
788
|
+
* - `component-panel`:组件面板(左侧组件列表点击 / 拖拽新增组件)
|
|
789
|
+
* - `props`:配置面板表单(属性表单字段编辑)
|
|
790
|
+
* - `code`:源码编辑器(配置面板「源码」面板里直接编辑 JSON/代码后保存)
|
|
791
|
+
* - `stage-contextmenu`:画布右键菜单(舞台上节点的右键上下文菜单)
|
|
792
|
+
* - `tree-contextmenu`:树面板右键菜单(图层 / 数据源 / 代码块等树形列表上的右键上下文菜单)
|
|
793
|
+
* - `toolbar`:工具栏菜单(顶部导航工具栏按钮)
|
|
794
|
+
* - `shortcut`:键盘快捷键
|
|
795
|
+
* - `rollback`:历史回滚(历史面板里对某条历史「回滚」,反向应用为一条新记录,类 git revert)
|
|
796
|
+
* - `api`:代码 / 接口调用(程序化触发)
|
|
797
|
+
* - `ai`:AI 生成 / 智能助手触发的变更
|
|
798
|
+
* - `unknown`:未知来源
|
|
799
|
+
*
|
|
800
|
+
* 通过 `(string & {})` 允许业务侧扩展自定义途径字符串,同时保留内置值的自动补全。
|
|
801
|
+
*/
|
|
802
|
+
export type HistoryOpSource =
|
|
803
|
+
| 'initial'
|
|
804
|
+
| 'stage'
|
|
805
|
+
| 'tree'
|
|
806
|
+
| 'component-panel'
|
|
807
|
+
| 'props'
|
|
808
|
+
| 'code'
|
|
809
|
+
| 'root-code'
|
|
810
|
+
| 'stage-contextmenu'
|
|
811
|
+
| 'tree-contextmenu'
|
|
812
|
+
| 'toolbar'
|
|
813
|
+
| 'shortcut'
|
|
814
|
+
| 'rollback'
|
|
815
|
+
| 'api'
|
|
816
|
+
| 'ai'
|
|
817
|
+
// 同步
|
|
818
|
+
| 'sync'
|
|
819
|
+
| 'unknown'
|
|
820
|
+
| (string & {});
|
|
821
|
+
// #endregion HistoryOpSource
|
|
822
|
+
|
|
823
|
+
// #region DslOpWithHistoryIdsResult
|
|
824
|
+
/** *AndGetHistoryId 系列方法返回值:原操作结果 + 本次写入历史记录的 uuid 列表(未入栈时为 `[]`)。 */
|
|
825
|
+
export type DslOpWithHistoryIdsResult<T> = {
|
|
826
|
+
result: T;
|
|
827
|
+
historyIds: string[];
|
|
828
|
+
};
|
|
829
|
+
// #endregion DslOpWithHistoryIdsResult
|
|
830
|
+
|
|
831
|
+
// #region StepDiffItem
|
|
832
|
+
/**
|
|
833
|
+
* 单条变更的 diff 描述,统一表达「页面节点 / 代码块 / 数据源」的变化内容,
|
|
834
|
+
* 被 {@link StepValue} / {@link CodeBlockStepValue} / {@link DataSourceStepValue} 的 `diff` 复用。
|
|
835
|
+
*
|
|
836
|
+
* 按 `opType` 区分携带的字段:
|
|
837
|
+
* - `add`:仅 `newSchema`(页面节点还带 `parentId` / `index`);
|
|
838
|
+
* - `remove`:仅 `oldSchema`(页面节点还带 `parentId` / `index`);
|
|
839
|
+
* - `update`:`oldSchema` + `newSchema`,并可带 `changeRecords` 做局部更新。
|
|
840
|
+
*
|
|
841
|
+
* 泛型 `T` 为变化内容的快照类型:页面节点为 `MNode`,代码块为 `CodeBlockContent`,数据源为 `DataSourceSchema`。
|
|
842
|
+
*/
|
|
843
|
+
export interface StepDiffItem<T = unknown> {
|
|
844
|
+
/** 变更后的内容快照。`opType` 为 `add` / `update` 时有,`remove` 时无。 */
|
|
845
|
+
newSchema?: T;
|
|
846
|
+
/** 变更前的内容快照。`opType` 为 `remove` / `update` 时有,`add` 时无。 */
|
|
847
|
+
oldSchema?: T;
|
|
848
|
+
/** 父节点 id。仅页面节点有(数据源 / 代码块没有父节点)。 */
|
|
849
|
+
parentId?: Id;
|
|
850
|
+
/** 在父节点 items 数组中的索引。仅页面节点有(数据源 / 代码块无需排序)。 */
|
|
851
|
+
index?: number;
|
|
852
|
+
/**
|
|
853
|
+
* form 端 propPath/value 变更列表,仅 `opType` 为 `update` 时有;
|
|
854
|
+
* 撤销/重做时若有则按 propPath 局部更新,缺省才退化为整内容替换。
|
|
855
|
+
*/
|
|
856
|
+
changeRecords?: ChangeRecord[];
|
|
857
|
+
}
|
|
858
|
+
// #endregion StepDiffItem
|
|
859
|
+
|
|
860
|
+
// #region BaseStepValue
|
|
861
|
+
/**
|
|
862
|
+
* 历史记录条目公共字段,被 {@link StepValue} / {@link CodeBlockStepValue} / {@link DataSourceStepValue} 复用。
|
|
863
|
+
*
|
|
864
|
+
* 泛型 `T` 为 `diff` 中变化内容的快照类型(页面节点 `MNode` / 代码块 `CodeBlockContent` / 数据源 `DataSourceSchema`)。
|
|
865
|
+
*/
|
|
866
|
+
export interface BaseStepValue<T = unknown, U extends Record<string, any> = {}> {
|
|
867
|
+
/**
|
|
868
|
+
* 历史记录唯一标识(uuid)。入栈时自动写入(若调用方未指定),
|
|
869
|
+
* 用于精确定位 / 引用某一条历史记录(如 revert、埋点、跨端同步等)。
|
|
870
|
+
* 注意与 `data.id`(关联的页面 / 代码块 / 数据源 id)区分。
|
|
871
|
+
*/
|
|
872
|
+
uuid: string;
|
|
873
|
+
/**
|
|
874
|
+
* 关联目标信息:`id` 为关联的页面 / 代码块 / 数据源等资源 id(也是历史栈的分组 key),
|
|
875
|
+
* `name` 为展示名。所有历史类型统一携带。
|
|
876
|
+
*/
|
|
627
877
|
data: { name: string; id: Id };
|
|
878
|
+
/** 操作类型:新增 / 删除 / 更新(三类历史记录统一携带)。 */
|
|
628
879
|
opType: HistoryOpType;
|
|
629
|
-
/** 操作前选中的节点 ID,用于撤销后恢复选择状态 */
|
|
630
|
-
selectedBefore: Id[];
|
|
631
|
-
/** 操作后选中的节点 ID,用于重做后恢复选择状态 */
|
|
632
|
-
selectedAfter: Id[];
|
|
633
|
-
modifiedNodeIds: Map<Id, Id>;
|
|
634
|
-
/** opType 'add': 新增的节点 */
|
|
635
|
-
nodes?: MNode[];
|
|
636
|
-
/** opType 'add': 父节点 ID */
|
|
637
|
-
parentId?: Id;
|
|
638
|
-
/** opType 'add': 每个新增节点在父节点 items 中的索引 */
|
|
639
|
-
indexMap?: Record<string, number>;
|
|
640
|
-
/** opType 'remove': 被删除的节点及其位置信息 */
|
|
641
|
-
removedItems?: { node: MNode; parentId: Id; index: number }[];
|
|
642
880
|
/**
|
|
643
|
-
*
|
|
644
|
-
*
|
|
645
|
-
* `changeRecords` 来自 form 端的 propPath/value 列表,撤销/重做时只对这些 propPath 做局部更新;
|
|
646
|
-
* 缺省(未传 / 空数组)才退化为整节点替换。
|
|
881
|
+
* 本次变更的内容(统一 diff 表达),每项见 {@link StepDiffItem}。
|
|
882
|
+
* 页面节点(add/remove 多节点、update 多节点)会有多项,代码块 / 数据源通常只有一项。
|
|
647
883
|
*/
|
|
648
|
-
|
|
884
|
+
diff: StepDiffItem<T>[];
|
|
649
885
|
/**
|
|
650
886
|
* 调用方可选传入的人类可读描述(如「调整按钮颜色」),用于历史面板展示。
|
|
651
887
|
* 不影响 undo/redo 行为;缺省时面板会根据节点 / propPath 自动生成描述。
|
|
652
888
|
*/
|
|
653
889
|
historyDescription?: string;
|
|
890
|
+
/**
|
|
891
|
+
* 操作途径:标记本次变更由哪条交互入口触发,取值见 {@link HistoryOpSource}
|
|
892
|
+
* (画布 / 树面板 / 组件面板 / 配置面板 / 源码编辑器 / 右键菜单 / 工具栏 / 快捷键 / 回滚 / 接口 等)。
|
|
893
|
+
* 仅用于历史面板展示与业务埋点,不影响 undo/redo 行为;缺省时面板视为「未知」。
|
|
894
|
+
*/
|
|
895
|
+
source?: HistoryOpSource;
|
|
896
|
+
/**
|
|
897
|
+
* 入栈时间戳(毫秒)。入栈时自动写入(若调用方未指定),仅用于历史面板展示。
|
|
898
|
+
*/
|
|
899
|
+
timestamp?: number;
|
|
900
|
+
/**
|
|
901
|
+
* 是否为「已保存」记录:DSL 落库(如保存到后端 / 本地)时由 historyService.markSaved 标记。
|
|
902
|
+
* 同一栈内任意时刻最多只有一条记录为 true;从 IndexedDB 恢复时游标会被定位到最近一条已保存记录之后。
|
|
903
|
+
*/
|
|
904
|
+
saved?: boolean;
|
|
905
|
+
/**
|
|
906
|
+
* 是否为「整体设置 root」(set root)产生的记录(由 {@link Editor.pushRootDiffHistory} 写入)。
|
|
907
|
+
* 用于「连续 set root 合并」:当某页栈最新一条已是 root 记录时,下一条 set root 会替换它而非新增,
|
|
908
|
+
* 避免源码反复保存 / 外部重设 DSL 时堆积多条 root 记录。
|
|
909
|
+
*/
|
|
910
|
+
rootStep?: boolean;
|
|
911
|
+
/** 操作人 */
|
|
912
|
+
operator?: string;
|
|
913
|
+
/** 扩展信息 */
|
|
914
|
+
extra?: U;
|
|
654
915
|
}
|
|
916
|
+
// #endregion BaseStepValue
|
|
917
|
+
|
|
918
|
+
// #region StepExtra
|
|
919
|
+
/**
|
|
920
|
+
* 历史记录的扩展上下文({@link BaseStepValue.extra})。
|
|
921
|
+
* 内置字段供 `page` 类型在撤销 / 重做时恢复选区与受影响节点;扩展类型可自由附加其它键。
|
|
922
|
+
*/
|
|
923
|
+
export interface StepExtra {
|
|
924
|
+
/** 操作前选中的节点 ID,用于撤销后恢复选择状态(page 类型) */
|
|
925
|
+
selectedBefore?: Id[];
|
|
926
|
+
/** 操作后选中的节点 ID,用于重做后恢复选择状态(page 类型) */
|
|
927
|
+
selectedAfter?: Id[];
|
|
928
|
+
/** 本次操作涉及的节点 id 集合(page 类型) */
|
|
929
|
+
modifiedNodeIds?: Map<Id, Id>;
|
|
930
|
+
/** 操作前的节点校验错误快照,撤销后还原(使撤销一个「校验失败」的改动后错误消失) */
|
|
931
|
+
invalidNodeIdsBefore?: Map<Id, NodeInvalidInfo>;
|
|
932
|
+
/** 操作后的节点校验错误快照,重做后还原(使重做后错误恢复) */
|
|
933
|
+
invalidNodeIdsAfter?: Map<Id, NodeInvalidInfo>;
|
|
934
|
+
[key: string]: any;
|
|
935
|
+
}
|
|
936
|
+
// #endregion StepExtra
|
|
937
|
+
|
|
938
|
+
// #region StepValue
|
|
939
|
+
/**
|
|
940
|
+
* 页面节点历史记录条目(`diff` 内容为 {@link MNode})。结构已与代码块 / 数据源统一收敛到
|
|
941
|
+
* {@link BaseStepValue}:关联 id 见 `data.id`,选区等上下文见 `extra`。
|
|
942
|
+
*/
|
|
943
|
+
export type StepValue = BaseStepValue<MNode, StepExtra>;
|
|
655
944
|
// #endregion StepValue
|
|
656
945
|
|
|
657
946
|
// #region CodeBlockStepValue
|
|
658
947
|
/**
|
|
659
|
-
*
|
|
660
|
-
*
|
|
661
|
-
*
|
|
662
|
-
* - 删除:newContent = null,oldContent = 删除前内容
|
|
948
|
+
* 代码块历史记录条目(`diff` 内容为 {@link CodeBlockContent}),按 `data.id`(codeBlock.id)
|
|
949
|
+
* 分组保存到 historyState.steps.codeBlock。结构与 {@link StepValue} / {@link DataSourceStepValue}
|
|
950
|
+
* 一致,仅 `diff` 快照类型不同。
|
|
663
951
|
*/
|
|
664
|
-
export
|
|
665
|
-
/** 关联的代码块 id */
|
|
666
|
-
id: Id;
|
|
667
|
-
/** 变更前的代码块内容,新增时为 null */
|
|
668
|
-
oldContent: CodeBlockContent | null;
|
|
669
|
-
/** 变更后的代码块内容,删除时为 null */
|
|
670
|
-
newContent: CodeBlockContent | null;
|
|
671
|
-
/**
|
|
672
|
-
* form 端 propPath/value 列表。撤销/重做时若有则按 propPath 局部更新;
|
|
673
|
-
* 缺省才退化为整内容替换。新增/删除场景通常无 changeRecords。
|
|
674
|
-
*/
|
|
675
|
-
changeRecords?: ChangeRecord[];
|
|
676
|
-
/** 调用方可选传入的人类可读描述,用于历史面板展示;不影响 undo/redo 行为。 */
|
|
677
|
-
historyDescription?: string;
|
|
678
|
-
}
|
|
952
|
+
export type CodeBlockStepValue = BaseStepValue<CodeBlockContent>;
|
|
679
953
|
// #endregion CodeBlockStepValue
|
|
680
954
|
|
|
681
955
|
// #region DataSourceStepValue
|
|
682
956
|
/**
|
|
683
|
-
*
|
|
684
|
-
*
|
|
685
|
-
*
|
|
686
|
-
* - 删除:newSchema = null,oldSchema = 删除前 schema
|
|
957
|
+
* 数据源历史记录条目(`diff` 内容为 {@link DataSourceSchema}),按 `data.id`(dataSource.id)
|
|
958
|
+
* 分组保存到 historyState.steps.dataSource。结构与 {@link StepValue} / {@link CodeBlockStepValue}
|
|
959
|
+
* 一致,仅 `diff` 快照类型不同。
|
|
687
960
|
*/
|
|
688
|
-
export
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
961
|
+
export type DataSourceStepValue = BaseStepValue<DataSourceSchema>;
|
|
962
|
+
// #endregion DataSourceStepValue
|
|
963
|
+
|
|
964
|
+
// #region HistorySteps
|
|
965
|
+
/**
|
|
966
|
+
* 历史记录类型标识:内置 `page` / `codeBlock` / `dataSource`,并允许业务扩展自定义类型。
|
|
967
|
+
* `(string & {})` 保留对内置字面量的智能提示,同时不限制扩展取值。
|
|
968
|
+
*/
|
|
969
|
+
export type HistoryStepType = 'page' | 'codeBlock' | 'dataSource' | (string & {});
|
|
970
|
+
|
|
971
|
+
/**
|
|
972
|
+
* 全部历史栈的统一容器,按「类型 -> id -> UndoRedo 栈」两级分组。
|
|
973
|
+
*
|
|
974
|
+
* - `page`:页面历史栈,按 page.id 分组(每页一份 UndoRedo);
|
|
975
|
+
* - `codeBlock`:代码块历史栈,按 codeBlock.id 分组;
|
|
976
|
+
* - `dataSource`:数据源历史栈,按 dataSource.id 分组;
|
|
977
|
+
* - 其余键:业务通过 {@link HistoryService.registerStepType} 注册的自定义历史类型。
|
|
978
|
+
*
|
|
979
|
+
* 所有类型(含扩展类型)一视同仁:均按 id 独立分栈、独立 undo/redo,且都可通过
|
|
980
|
+
* {@link HistoryService.setMarker} 在 index 0 种入 `initial` 基线(撤销 / 回滚不会越过该基线)。
|
|
981
|
+
*/
|
|
982
|
+
export interface HistorySteps {
|
|
983
|
+
page: Record<Id, UndoRedo<StepValue>>;
|
|
984
|
+
codeBlock: Record<Id, UndoRedo<CodeBlockStepValue>>;
|
|
985
|
+
dataSource: Record<Id, UndoRedo<DataSourceStepValue>>;
|
|
986
|
+
/** 扩展历史类型:按 id 分组的 UndoRedo 栈。 */
|
|
987
|
+
[stepType: string]: Record<Id, UndoRedo<any>>;
|
|
988
|
+
}
|
|
989
|
+
// #endregion HistorySteps
|
|
990
|
+
|
|
991
|
+
export interface HistoryState {
|
|
695
992
|
/**
|
|
696
|
-
*
|
|
697
|
-
*
|
|
993
|
+
* 全部历史栈的统一容器(页面 / 代码块 / 数据源 / 扩展类型),见 {@link HistorySteps}。
|
|
994
|
+
* 各类型互不影响,支持按 id 独立 undo/redo;是否可撤销 / 重做改用 {@link HistoryService.canUndo} /
|
|
995
|
+
* {@link HistoryService.canRedo}(按 stepType + id 查询)替代旧的全局 canUndo / canRedo 字段。
|
|
698
996
|
*/
|
|
699
|
-
|
|
700
|
-
/**
|
|
701
|
-
|
|
997
|
+
steps: HistorySteps;
|
|
998
|
+
/**
|
|
999
|
+
* 各历史类型的展示名称,用于历史面板({@link HistorySteps} 的 tab / 分组标题等)。
|
|
1000
|
+
* 内置 `page` / `codeBlock` / `dataSource` 有默认中文名(页面 / 代码块 / 数据源),
|
|
1001
|
+
* 扩展类型可通过 {@link HistoryService.registerStepType} 的 `name` 选项或
|
|
1002
|
+
* {@link HistoryService.setStepName} 登记;读取请用 {@link HistoryService.getStepName}。
|
|
1003
|
+
*/
|
|
1004
|
+
stepNames: Record<string, string>;
|
|
702
1005
|
}
|
|
703
|
-
// #endregion DataSourceStepValue
|
|
704
1006
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
1007
|
+
// #region PersistedHistoryState
|
|
1008
|
+
/**
|
|
1009
|
+
* 历史记录的可持久化快照。由 historyService.saveToIndexedDB 写入 IndexedDB,
|
|
1010
|
+
* 再由 historyService.restoreFromIndexedDB 读出并重建各 UndoRedo 栈。
|
|
1011
|
+
*/
|
|
1012
|
+
export interface PersistedHistoryState {
|
|
1013
|
+
/** 快照结构版本号,便于后续兼容升级。 */
|
|
1014
|
+
version: number;
|
|
710
1015
|
/**
|
|
711
|
-
*
|
|
712
|
-
*
|
|
1016
|
+
* 全部历史栈的序列化快照,按「类型 -> id」两级分组,与 {@link HistorySteps} 对应。
|
|
1017
|
+
* 内置 `page` / `codeBlock` / `dataSource`,并包含业务注册的扩展类型。
|
|
713
1018
|
*/
|
|
714
|
-
|
|
1019
|
+
steps: {
|
|
1020
|
+
page: Record<Id, SerializedUndoRedo<StepValue>>;
|
|
1021
|
+
codeBlock: Record<Id, SerializedUndoRedo<CodeBlockStepValue>>;
|
|
1022
|
+
dataSource: Record<Id, SerializedUndoRedo<DataSourceStepValue>>;
|
|
1023
|
+
[stepType: string]: Record<Id, SerializedUndoRedo<any>>;
|
|
1024
|
+
};
|
|
1025
|
+
/** 保存时间戳(毫秒)。 */
|
|
1026
|
+
savedAt: number;
|
|
1027
|
+
}
|
|
1028
|
+
// #endregion PersistedHistoryState
|
|
1029
|
+
|
|
1030
|
+
// #region HistoryPersistOptions
|
|
1031
|
+
/** historyService 持久化相关 API 的可选配置。 */
|
|
1032
|
+
export interface HistoryPersistOptions {
|
|
1033
|
+
/** IndexedDB 数据库名,默认 `tmagic-editor`(最终库名会拼上当前 DSL app id)。 */
|
|
1034
|
+
dbName?: string;
|
|
1035
|
+
/** objectStore 名,默认 `history`。 */
|
|
1036
|
+
storeName?: string;
|
|
1037
|
+
/** 记录 key,用于区分不同活动页 / 项目,默认 `default`。 */
|
|
1038
|
+
key?: IDBValidKey;
|
|
715
1039
|
/**
|
|
716
|
-
*
|
|
717
|
-
*
|
|
1040
|
+
* 显式指定用于库名隔离的 DSL app id。
|
|
1041
|
+
* 缺省时回退到当前 editorService 的 `root.id`;在「先恢复历史再 set root」场景下 root 尚未设置,
|
|
1042
|
+
* 需由调用方(如从待加载 DSL 取 id)显式传入,否则会读 / 写到未按 app 隔离的默认库。
|
|
718
1043
|
*/
|
|
719
|
-
|
|
1044
|
+
appId?: Id;
|
|
720
1045
|
}
|
|
1046
|
+
// #endregion HistoryPersistOptions
|
|
721
1047
|
|
|
722
1048
|
// #region HistoryListEntry
|
|
723
1049
|
/**
|
|
724
1050
|
* 历史面板用:当前页面的一条历史步骤(包含位置和是否已应用)。
|
|
725
1051
|
*/
|
|
726
|
-
export interface
|
|
1052
|
+
export interface HistoryStepEntry<T> {
|
|
727
1053
|
/** 步骤内容 */
|
|
728
|
-
step:
|
|
1054
|
+
step: T;
|
|
729
1055
|
/** 在所属栈中的索引(0 为最早) */
|
|
730
1056
|
index: number;
|
|
731
1057
|
/** 是否处于"已应用"段(即位于栈游标之前)。撤销后变为 false。 */
|
|
@@ -735,63 +1061,39 @@ export interface PageHistoryStepEntry {
|
|
|
735
1061
|
}
|
|
736
1062
|
|
|
737
1063
|
/**
|
|
738
|
-
*
|
|
739
|
-
*
|
|
740
|
-
*
|
|
741
|
-
* - targetId
|
|
1064
|
+
* 历史面板分组(页面 / 数据源 / 代码块 / 扩展类型统一结构)。
|
|
1065
|
+
*
|
|
1066
|
+
* 把指定历史栈的步骤列表按"目标"做相邻合并:
|
|
1067
|
+
* - 连续修改同一目标(单实体 update,targetId 一致)的多步合并成一组,组内可展开查看每步;
|
|
1068
|
+
* - add / remove / 多实体 update 始终独立成组(无法明确归属单一目标);
|
|
1069
|
+
* - targetId 为 undefined 表示"无明确目标",不参与合并。
|
|
1070
|
+
*
|
|
1071
|
+
* 各类型仅 `kind` 与 step 快照类型不同,统一由泛型描述:
|
|
1072
|
+
* - 页面:`HistoryGroup<StepValue>`,`kind: 'page'`,`id` 为 pageId,`targetId` 为被改节点 id;
|
|
1073
|
+
* - 数据源:`HistoryGroup<DataSourceStepValue>`,`kind: 'data-source'`,`id` 为 dataSource.id;
|
|
1074
|
+
* - 代码块:`HistoryGroup<CodeBlockStepValue>`,`kind: 'code-block'`,`id` 为 codeBlock.id。
|
|
742
1075
|
*/
|
|
743
|
-
export interface
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
pageId
|
|
747
|
-
|
|
1076
|
+
export interface HistoryGroup<T extends BaseStepValue = BaseStepValue> {
|
|
1077
|
+
/** 历史类型标识:page / code-block / data-source(扩展类型同理)。 */
|
|
1078
|
+
kind: string;
|
|
1079
|
+
/** 所属栈 id(page 为 pageId,代码块 / 数据源为对应资源 id)。 */
|
|
1080
|
+
id: Id;
|
|
1081
|
+
/** 该分组的操作类型。 */
|
|
748
1082
|
opType: HistoryOpType;
|
|
749
1083
|
/**
|
|
750
|
-
*
|
|
751
|
-
* undefined 表示该分组不可被合并(add / remove /
|
|
1084
|
+
* 合并的目标 id:仅"单实体 update"有值,并按此与相邻同 id 的 update 合并。
|
|
1085
|
+
* undefined 表示该分组不可被合并(add / remove / 多实体 update)。
|
|
752
1086
|
*/
|
|
753
1087
|
targetId?: Id;
|
|
754
|
-
/**
|
|
1088
|
+
/** 目标可读名(取最后一步快照的 name/type/id)。 */
|
|
755
1089
|
targetName?: string;
|
|
756
|
-
/**
|
|
757
|
-
steps:
|
|
758
|
-
/**
|
|
1090
|
+
/** 组内所有步骤,按时间正序。 */
|
|
1091
|
+
steps: { step: T; index: number; applied: boolean; isCurrent?: boolean }[];
|
|
1092
|
+
/** 组内最后一步是否已应用。 */
|
|
759
1093
|
applied: boolean;
|
|
760
1094
|
/** 是否为当前所在的分组(包含栈中最近一次已应用步骤的那一组)。 */
|
|
761
1095
|
isCurrent?: boolean;
|
|
762
1096
|
}
|
|
763
|
-
|
|
764
|
-
/**
|
|
765
|
-
* 代码块历史面板分组。
|
|
766
|
-
* - 同一 codeBlockId 的栈内,相邻的 'update' 操作会合并成一个 group;
|
|
767
|
-
* - 'add' / 'remove' 始终独立成组(语义上是一次性事件)。
|
|
768
|
-
*/
|
|
769
|
-
export interface CodeBlockHistoryGroup {
|
|
770
|
-
kind: 'code-block';
|
|
771
|
-
/** 关联的 codeBlock id */
|
|
772
|
-
id: Id;
|
|
773
|
-
/** 该分组的操作类型 */
|
|
774
|
-
opType: HistoryOpType;
|
|
775
|
-
/** 组内所有步骤,按时间正序 */
|
|
776
|
-
steps: { step: CodeBlockStepValue; index: number; applied: boolean; isCurrent?: boolean }[];
|
|
777
|
-
/** 组内最后一步是否已应用,用于整组的状态展示 */
|
|
778
|
-
applied: boolean;
|
|
779
|
-
/** 是否为当前所在的分组(包含该栈最近一次已应用步骤的那一组)。 */
|
|
780
|
-
isCurrent?: boolean;
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
/**
|
|
784
|
-
* 数据源历史面板分组,结构同 CodeBlockHistoryGroup。
|
|
785
|
-
*/
|
|
786
|
-
export interface DataSourceHistoryGroup {
|
|
787
|
-
kind: 'data-source';
|
|
788
|
-
id: Id;
|
|
789
|
-
opType: HistoryOpType;
|
|
790
|
-
steps: { step: DataSourceStepValue; index: number; applied: boolean; isCurrent?: boolean }[];
|
|
791
|
-
applied: boolean;
|
|
792
|
-
/** 是否为当前所在的分组(包含该栈最近一次已应用步骤的那一组)。 */
|
|
793
|
-
isCurrent?: boolean;
|
|
794
|
-
}
|
|
795
1097
|
// #endregion HistoryListEntry
|
|
796
1098
|
|
|
797
1099
|
export enum KeyBindingCommand {
|
|
@@ -956,6 +1258,8 @@ export type SyncHookPlugin<
|
|
|
956
1258
|
|
|
957
1259
|
export interface EventBusEvent {
|
|
958
1260
|
'edit-data-source': [id: string];
|
|
1261
|
+
'edit-data-source-method': [id: string, methodName: string];
|
|
1262
|
+
'edit-data-source-field': [id: string, fieldPath: string[]];
|
|
959
1263
|
'remove-data-source': [id: string];
|
|
960
1264
|
'edit-code': [id: string];
|
|
961
1265
|
}
|
|
@@ -983,13 +1287,32 @@ export interface PageBarSortOptions extends PartSortableOptions {
|
|
|
983
1287
|
}
|
|
984
1288
|
// #endregion PageBarSortOptions
|
|
985
1289
|
|
|
1290
|
+
/**
|
|
1291
|
+
* 右键菜单当前目标(侧栏树节点等)。
|
|
1292
|
+
* 数据源 / 代码块面板通过 `customContentMenu` 的 `getTarget` 暴露,业务在 handler 内自行读取。
|
|
1293
|
+
*/
|
|
1294
|
+
export interface ContentMenuTarget {
|
|
1295
|
+
/** 目标 ID */
|
|
1296
|
+
id: string;
|
|
1297
|
+
/** 原始节点数据(树节点等) */
|
|
1298
|
+
data?: TreeNodeData;
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
export type ContentMenuType = 'layer' | 'data-source' | 'viewer' | 'code-block';
|
|
1302
|
+
|
|
986
1303
|
export type CustomContentMenuFunction = (
|
|
987
1304
|
menus: (MenuButton | MenuComponent)[],
|
|
988
|
-
type:
|
|
1305
|
+
type: ContentMenuType,
|
|
1306
|
+
/** 读取当前右键目标;数据源 / 代码块面板会传入,图层 / 画布一般不需要 */
|
|
1307
|
+
getTarget?: () => ContentMenuTarget | null,
|
|
989
1308
|
) => (MenuButton | MenuComponent)[];
|
|
990
1309
|
|
|
991
1310
|
export interface EditorEvents {
|
|
992
|
-
'root-change': [
|
|
1311
|
+
'root-change': [
|
|
1312
|
+
value: StoreState['root'],
|
|
1313
|
+
preValue?: StoreState['root'],
|
|
1314
|
+
options?: { historySource?: HistoryOpSource },
|
|
1315
|
+
];
|
|
993
1316
|
select: [node: MNode | null];
|
|
994
1317
|
add: [nodes: MNode[]];
|
|
995
1318
|
remove: [nodes: MNode[]];
|
|
@@ -997,6 +1320,82 @@ export interface EditorEvents {
|
|
|
997
1320
|
'move-layer': [offset: number | LayerOffset];
|
|
998
1321
|
'drag-to': [data: { targetIndex: number; configs: MNode | MNode[]; targetParent: MContainer }];
|
|
999
1322
|
'history-change': [data: MPage | MPageFragment];
|
|
1323
|
+
/**
|
|
1324
|
+
* DSL 发生变更后统一触发,免去分别监听 add / remove / update / move-layer / drag-to。
|
|
1325
|
+
* 回调参数为 {@link EditorChangeEvent},按 `type` 区分操作类型并携带各自的操作内容(payload)
|
|
1326
|
+
* 以及变更所在的当前 page(可能为 null)。撤销 / 重做内部同样会经由
|
|
1327
|
+
* add / remove / update 触发本事件;如需区分「用户操作」与「撤销重做」请配合 `history-change`。
|
|
1328
|
+
*/
|
|
1329
|
+
change: [event: EditorChangeEvent];
|
|
1330
|
+
/** 节点校验错误状态发生变化时触发,携带当前完整的错误 Map(供非响应式消费方订阅) */
|
|
1331
|
+
'invalid-node-change': [invalidNodeIds: Map<Id, NodeInvalidInfo>];
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
// #region EditorChangeEvent
|
|
1335
|
+
/** `change` 事件中单个变更项:变更的 node 及其所属的 page(可能为 null)。 */
|
|
1336
|
+
export interface EditorChangeItem {
|
|
1337
|
+
node: MNode;
|
|
1338
|
+
page: StoreState['page'];
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
/** `update` 类型变更项:node 为前后快照及 form 端变更记录,page 为其所属页面。 */
|
|
1342
|
+
export interface EditorUpdateChangeItem {
|
|
1343
|
+
node: { newNode: MNode; oldNode: MNode; changeRecords?: ChangeRecord[] };
|
|
1344
|
+
page: StoreState['page'];
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
/** {@link EditorEvents.change} 各操作类型共有的历史相关字段。 */
|
|
1348
|
+
export interface EditorChangeEventHistoryMeta {
|
|
1349
|
+
/**
|
|
1350
|
+
* 本次变更的「历史来源」(调用 DSL 操作时传入的 {@link HistoryOpOptions.historySource},
|
|
1351
|
+
* 撤销 / 重做时则为被应用 step 上记录的 `source`),未携带时为 undefined。
|
|
1352
|
+
*/
|
|
1353
|
+
historySource?: HistoryOpSource;
|
|
1354
|
+
/**
|
|
1355
|
+
* 本次操作是否未写入历史记录(即调用时传入的 {@link HistoryOpOptions.doNotPushHistory},缺省为 false);
|
|
1356
|
+
* 撤销 / 重做路径补发的事件恒为 true(撤销/重做本身不再入栈)。
|
|
1357
|
+
*/
|
|
1358
|
+
doNotPushHistory?: boolean;
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
/**
|
|
1362
|
+
* {@link EditorEvents.change} 的回调参数:以 `type` 区分操作类型,并携带对应的操作内容。
|
|
1363
|
+
* `data` 为本次变更的节点列表,每项包含 node 及其所属的 page(可能为 null);
|
|
1364
|
+
* `move-layer` 额外带层级偏移 `offset`,`drag-to` 额外带目标位置 `targetIndex` / `targetParent`;
|
|
1365
|
+
* 历史相关字段(historySource / doNotPushHistory)见 {@link EditorChangeEventHistoryMeta}。
|
|
1366
|
+
*/
|
|
1367
|
+
export type EditorChangeEvent =
|
|
1368
|
+
| ({ type: 'add'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
|
|
1369
|
+
| ({ type: 'remove'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
|
|
1370
|
+
| ({ type: 'update'; data: EditorUpdateChangeItem[] } & EditorChangeEventHistoryMeta)
|
|
1371
|
+
| ({ type: 'move-layer'; data: EditorChangeItem[]; offset: number | LayerOffset } & EditorChangeEventHistoryMeta)
|
|
1372
|
+
| ({
|
|
1373
|
+
type: 'drag-to';
|
|
1374
|
+
data: EditorChangeItem[];
|
|
1375
|
+
targetIndex: number;
|
|
1376
|
+
targetParent: MContainer;
|
|
1377
|
+
} & EditorChangeEventHistoryMeta);
|
|
1378
|
+
// #endregion EditorChangeEvent
|
|
1379
|
+
|
|
1380
|
+
export interface HistoryEvents {
|
|
1381
|
+
change: [
|
|
1382
|
+
state: BaseStepValue | StepValue | CodeBlockStepValue | DataSourceStepValue,
|
|
1383
|
+
stepType: HistoryStepType,
|
|
1384
|
+
id: Id,
|
|
1385
|
+
];
|
|
1386
|
+
'code-block-history-change': [id: Id, state: CodeBlockStepValue];
|
|
1387
|
+
'data-source-history-change': [id: Id, state: DataSourceStepValue];
|
|
1388
|
+
'restore-from-indexed-db': [snapshot: PersistedHistoryState | null];
|
|
1389
|
+
'save-to-indexed-db': [snapshot: PersistedHistoryState];
|
|
1390
|
+
'mark-saved': [{ kind: HistoryStepType; id?: Id }];
|
|
1391
|
+
clear: [{ id: Id; stepType: HistoryStepType }];
|
|
1392
|
+
'marker-change': [{ id: Id; marker: StepValue; stepType: HistoryStepType }];
|
|
1393
|
+
/**
|
|
1394
|
+
* 页面 / 页面片结构变更(新增 / 删除)时派发,见 {@link HistoryService.notifyPageStructureChange}。
|
|
1395
|
+
* 一次操作(add / remove / setRoot 整体替换)涉及多个页面时合并为**一个**事件;
|
|
1396
|
+
* `add` / `remove` 分别为本次新增与删除的页面列表(其一可为空数组)。
|
|
1397
|
+
*/
|
|
1398
|
+
'page-structure-change': [change: { add: (MPage | MPageFragment)[]; remove: (MPage | MPageFragment)[] }];
|
|
1000
1399
|
}
|
|
1001
1400
|
|
|
1002
1401
|
export const canUsePluginMethods = {
|
|
@@ -1029,16 +1428,21 @@ export const canUsePluginMethods = {
|
|
|
1029
1428
|
|
|
1030
1429
|
export type AsyncMethodName = Writable<(typeof canUsePluginMethods)['async']>;
|
|
1031
1430
|
|
|
1431
|
+
// #region HistoryOpOptions
|
|
1032
1432
|
/**
|
|
1033
1433
|
* 历史记录写入相关的通用配置(codeBlock / dataSource / editor 共用)
|
|
1034
1434
|
* - doNotPushHistory: 操作完成后是否不要将本次操作压入历史栈(撤销/重做记录),默认 false
|
|
1035
1435
|
* - historyDescription: 入栈时附带的人类可读描述,用于历史面板展示;不影响 undo/redo 行为,缺省时面板会自动生成描述
|
|
1436
|
+
* - historySource: 操作途径,取值见 {@link HistoryOpSource}(画布 / 树面板 / 组件面板 / 配置面板 / 源码编辑器 / 右键菜单 / 工具栏 / 快捷键 / 回滚 / 接口 等),用于历史面板展示与埋点;不影响 undo/redo 行为
|
|
1036
1437
|
*/
|
|
1037
1438
|
export interface HistoryOpOptions {
|
|
1038
1439
|
doNotPushHistory?: boolean;
|
|
1039
1440
|
historyDescription?: string;
|
|
1441
|
+
historySource?: HistoryOpSource;
|
|
1040
1442
|
}
|
|
1443
|
+
// #endregion HistoryOpOptions
|
|
1041
1444
|
|
|
1445
|
+
// #region HistoryOpOptionsWithChangeRecords
|
|
1042
1446
|
/**
|
|
1043
1447
|
* 在 HistoryOpOptions 基础上携带 form 端 propPath/value 变更记录,
|
|
1044
1448
|
* 用于历史记录的精细化撤销/重做(按 propPath 局部 patch)。
|
|
@@ -1046,7 +1450,9 @@ export interface HistoryOpOptions {
|
|
|
1046
1450
|
export interface HistoryOpOptionsWithChangeRecords extends HistoryOpOptions {
|
|
1047
1451
|
changeRecords?: ChangeRecord[];
|
|
1048
1452
|
}
|
|
1453
|
+
// #endregion HistoryOpOptionsWithChangeRecords
|
|
1049
1454
|
|
|
1455
|
+
// #region DslOpOptions
|
|
1050
1456
|
/**
|
|
1051
1457
|
* DSL 修改类操作的通用配置
|
|
1052
1458
|
* - doNotSelect: 操作后是否不要自动触发选中(不调用 this.select / this.multiSelect / stage.select / stage.multiSelect)
|
|
@@ -1056,3 +1462,141 @@ export interface DslOpOptions extends HistoryOpOptions {
|
|
|
1056
1462
|
doNotSelect?: boolean;
|
|
1057
1463
|
doNotSwitchPage?: boolean;
|
|
1058
1464
|
}
|
|
1465
|
+
// #endregion DslOpOptions
|
|
1466
|
+
|
|
1467
|
+
/** 差异对话框的入参 */
|
|
1468
|
+
export interface DiffDialogPayload {
|
|
1469
|
+
/** 表单类别 */
|
|
1470
|
+
category?: CompareCategory;
|
|
1471
|
+
/** 节点类型 / 数据源类型 */
|
|
1472
|
+
type?: string;
|
|
1473
|
+
/** 代码块场景下的数据源类型 */
|
|
1474
|
+
dataSourceType?: string;
|
|
1475
|
+
/** 该 step 修改前的值(oldNode / oldSchema / oldContent) */
|
|
1476
|
+
lastValue: Record<string, any>;
|
|
1477
|
+
/** 该 step 修改后的值(newNode / newSchema / newContent) */
|
|
1478
|
+
value: Record<string, any>;
|
|
1479
|
+
/** 当前编辑器中实际的最新值;不传或为 null 时禁用「与当前对比」 */
|
|
1480
|
+
currentValue?: Record<string, any> | null;
|
|
1481
|
+
/** 用于标题展示的目标名称 */
|
|
1482
|
+
targetLabel?: string;
|
|
1483
|
+
/** 用于标题展示的目标 id */
|
|
1484
|
+
id?: string | number;
|
|
1485
|
+
/**
|
|
1486
|
+
* 指定打开时的初始对比模式:
|
|
1487
|
+
* - before:该步骤修改前 vs 修改后
|
|
1488
|
+
* - current:该步骤修改后 vs 当前最新值
|
|
1489
|
+
* 不传时按是否存在「修改后的值」/「当前值」自动推断。
|
|
1490
|
+
* 若指定的模式当前不可用(对应数据缺失),将回退到自动推断结果。
|
|
1491
|
+
*/
|
|
1492
|
+
mode?: 'before' | 'current';
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
/**
|
|
1496
|
+
* 一组「描述 + 可操作性」的判定函数集合。页面 / 数据源 / 代码块及业务自定义历史
|
|
1497
|
+
* 各自实现一份,作为整体注入,避免把 describe* / isStep* 拆成多个独立 props 反复透传。
|
|
1498
|
+
*/
|
|
1499
|
+
export interface HistoryRowDescriptor<T extends BaseStepValue = BaseStepValue> {
|
|
1500
|
+
/**
|
|
1501
|
+
* 组级描述文案生成器,接收一个 group,返回展示文本。
|
|
1502
|
+
* 不传时回退到对组内最后一步调用 {@link describeStep}(适用于不做相邻合并、每组恒为单步的历史,如数据源/代码块)。
|
|
1503
|
+
*/
|
|
1504
|
+
describeGroup?: (_group: any) => string;
|
|
1505
|
+
/** 单步描述文案生成器,接收一个 step,返回展示文本(合并组展开后的子步列表用)。 */
|
|
1506
|
+
describeStep: (_step: T) => string;
|
|
1507
|
+
/** 判断某个 step 是否可查看差异(前后值都存在)。不传则一律不展示差异入口。 */
|
|
1508
|
+
isStepDiffable?: (_step: T) => boolean;
|
|
1509
|
+
/** 判断某个 step 是否支持回滚(如更新需带 changeRecords)。不传则已应用即可回滚。 */
|
|
1510
|
+
isStepRevertable?: (_step: T) => boolean;
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
/**
|
|
1514
|
+
* 通用 bucket(数据源 / 代码块 / 业务自定义历史)的整体渲染配置。
|
|
1515
|
+
* 把原先散落在 Bucket / BucketTab 上的 title / prefix / describe* / isStep* / showInitial / gotoEnabled
|
|
1516
|
+
* 收敛成一个对象作为单一 prop 传递,调用方一次配齐、组件内部按需读取。
|
|
1517
|
+
*/
|
|
1518
|
+
export interface HistoryBucketConfig<T extends BaseStepValue = BaseStepValue> extends HistoryRowDescriptor<T> {
|
|
1519
|
+
/** bucket 头部标题,例如 "数据源" / "代码块"。 */
|
|
1520
|
+
title: string;
|
|
1521
|
+
/** 子项 key 的命名空间前缀(`ds` 数据源 / `cb` 代码块 / 业务自定义如 `mod`)。 */
|
|
1522
|
+
prefix: string;
|
|
1523
|
+
/** 是否展示底部「回到初始状态」入口,默认 true。无 undo cursor 语义的自定义历史可传 false。 */
|
|
1524
|
+
showInitial?: boolean;
|
|
1525
|
+
/** 是否支持「跳转到该记录」(goto),默认 true。 */
|
|
1526
|
+
gotoEnabled?: boolean;
|
|
1527
|
+
/** 是否展示顶部「清空」按钮,默认 true。无需提供清空能力的自定义历史可传 false。 */
|
|
1528
|
+
showClear?: boolean;
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
export interface UseHistoryRevertOptions {
|
|
1532
|
+
/**
|
|
1533
|
+
* 父级应用上下文,用于让动态挂载的「差异确认弹窗」继承全局组件 / 指令 / provide / 插件
|
|
1534
|
+
* (Element Plus、@tmagic/form 字段组件等)。未显式传入时,会自动取调用方所在组件的 appContext
|
|
1535
|
+
* (`getCurrentInstance()?.appContext`)。业务方若在组件 setup 之外调用,需手动传入(如 `editorApp._context`)。
|
|
1536
|
+
*/
|
|
1537
|
+
appContext?: AppContext | null;
|
|
1538
|
+
/**
|
|
1539
|
+
* 透传给差异确认弹窗的 `extendState`(即 Editor 的 `extendFormState`),
|
|
1540
|
+
* 使对比表单中依赖业务上下文的 `display` / `disabled` 等 filterFunction 正常工作。
|
|
1541
|
+
*/
|
|
1542
|
+
extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
|
|
1543
|
+
/**
|
|
1544
|
+
* 返回 PropsPanel 主属性表单(FormPanel -> MForm)的 formState。
|
|
1545
|
+
* 仅页面历史「查看差异 / 回滚确认」场景会使用该 formState 覆盖 CompareForm 中同名扩展字段,
|
|
1546
|
+
* 以保证两处 filterFunction 读取到一致的运行态上下文。
|
|
1547
|
+
*/
|
|
1548
|
+
getPropsPanelFormState?: () => FormState | undefined;
|
|
1549
|
+
/**
|
|
1550
|
+
* 内置页面 / 数据源 / 代码块的差异 / 回滚确认弹窗默认宽度(透传给 TMagicDialog 的 `width`),
|
|
1551
|
+
* 如 `'1200px'` / `'80%'`。缺省时使用弹窗内置默认宽度(900px)。
|
|
1552
|
+
* 业务自有历史(`viewDiff` / `confirmAndRevert`)可在调用时通过各自入参的 `width` 单独覆盖。
|
|
1553
|
+
*/
|
|
1554
|
+
dialogWidth?: string;
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
/**
|
|
1558
|
+
* 业务自有历史(如管理台「模块」)做差异对比时所需的额外渲染入参。
|
|
1559
|
+
* 内置的页面 / 数据源 / 代码块按 `category` 自动取表单配置,无需传这些;
|
|
1560
|
+
* 业务自有类别可通过 `loadConfig` 注入自定义表单配置加载逻辑。
|
|
1561
|
+
*/
|
|
1562
|
+
export interface CustomDiffFormOptions {
|
|
1563
|
+
/**
|
|
1564
|
+
* 自定义差异表单配置加载逻辑(如「模块」按 c_type 重建表单配置),
|
|
1565
|
+
* 透传给弹窗内部的 CompareForm;缺省时按 `category` 走内置加载。
|
|
1566
|
+
*/
|
|
1567
|
+
loadConfig?: CompareFormLoadConfig;
|
|
1568
|
+
/** 需要走 self diff 的字段类型(如模块的 mod-cond)。 */
|
|
1569
|
+
selfDiffFieldTypes?: string[];
|
|
1570
|
+
/**
|
|
1571
|
+
* 可选:外部提供的 formState(通常来自 PropsPanel 主表单),
|
|
1572
|
+
* 对比弹窗会用它覆盖 CompareForm 中同名扩展字段,避免上下文不一致。
|
|
1573
|
+
*/
|
|
1574
|
+
compareFormState?: FormState;
|
|
1575
|
+
/**
|
|
1576
|
+
* 差异 / 确认回滚弹窗宽度(透传给 HistoryDiffDialog 的 TMagicDialog `width`),
|
|
1577
|
+
* 如 `'1200px'` / `'80%'`。缺省时使用弹窗内置默认宽度(900px)。
|
|
1578
|
+
*/
|
|
1579
|
+
width?: string;
|
|
1580
|
+
/**
|
|
1581
|
+
* 差异 / 确认回滚弹窗内 form 表单的尺寸(透传给 CompareForm 的 `size`),
|
|
1582
|
+
* 可选 `'large' | 'default' | 'small'`,缺省时使用表单内置默认尺寸。
|
|
1583
|
+
*/
|
|
1584
|
+
size?: FieldSize;
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
/**
|
|
1588
|
+
* 业务自有历史复用「单步回滚」交互({@link useHistoryRevert} 的 `confirmAndRevert`)的入参。
|
|
1589
|
+
* 与内置页面 / 数据源 / 代码块回滚共用「目标校验 → 差异/二次确认弹窗 → 反向回滚」流程,
|
|
1590
|
+
* 业务方只需提供:差异弹窗入参(可选)、表单配置加载(可选)、实际回滚执行函数。
|
|
1591
|
+
*/
|
|
1592
|
+
export interface ConfirmAndRevertOptions<T = unknown> extends CustomDiffFormOptions {
|
|
1593
|
+
/**
|
|
1594
|
+
* 差异确认弹窗入参;可对比的步骤(单实体 update)传入后弹差异确认弹窗,
|
|
1595
|
+
* 传 null / 省略则退化为普通二次确认框(add / remove / 不可对比)。
|
|
1596
|
+
*/
|
|
1597
|
+
diffPayload?: DiffDialogPayload | null;
|
|
1598
|
+
/** 回滚前置校验:返回 true 表示目标数据已删除等不可回滚,给出统一提示并中止。 */
|
|
1599
|
+
isTargetMissing?: () => boolean;
|
|
1600
|
+
/** 用户确认后执行的实际回滚逻辑。 */
|
|
1601
|
+
revert: () => T | Promise<T>;
|
|
1602
|
+
}
|