@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
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2025 Tencent. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 属性面板列表字段共用的吸底全宽「添加」按钮与吸顶标题,展开到 group-list 配置上。
|
|
21
|
+
*
|
|
22
|
+
* 吸底按钮会盖住列表底部,吸顶标题会盖住列表顶部,新增的项必须同时滚进视口才看得见。
|
|
23
|
+
*/
|
|
24
|
+
export const stickyAddButton = (text: string) => ({
|
|
25
|
+
scrollLastItemIntoView: true as const,
|
|
26
|
+
header: { sticky: true as const },
|
|
27
|
+
addButtonConfig: {
|
|
28
|
+
sticky: true as const,
|
|
29
|
+
text,
|
|
30
|
+
props: { type: 'primary', plain: true, text: false },
|
|
31
|
+
},
|
|
32
|
+
});
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2025 Tencent. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
type DisplayCondsConfig,
|
|
21
|
+
type EventSelectConfig,
|
|
22
|
+
type FieldInnerConfig,
|
|
23
|
+
type FieldMountValueEffect,
|
|
24
|
+
filterFunction,
|
|
25
|
+
type FormItemConfig,
|
|
26
|
+
type HeadlessFieldOptions,
|
|
27
|
+
} from '@tmagic/form/headless';
|
|
28
|
+
import type { StyleSchema } from '@tmagic/schema';
|
|
29
|
+
|
|
30
|
+
import { editorTypeMatchRules, validateDataSourceFieldSelect } from '@editor/utils/type-match-rules';
|
|
31
|
+
|
|
32
|
+
import { createCodeSelectConfig, normalizeCodeSelectValue } from './configs/codeSelect';
|
|
33
|
+
import { createDisplayCondsConfig } from './configs/displayConds';
|
|
34
|
+
import { createEventSelectConfig, isLegacyEventValue } from './configs/eventSelect';
|
|
35
|
+
import { createStyleSetterConfig } from './StyleSetter/configs';
|
|
36
|
+
|
|
37
|
+
const getName = (config: FormItemConfig): string => `${(config as any).name ?? ''}`;
|
|
38
|
+
|
|
39
|
+
/** `code-select` 旧数据兼容:空值改写成 `{ hookType, hookData }`。 */
|
|
40
|
+
const codeSelectEffect: FieldMountValueEffect = ({ config, model }) => {
|
|
41
|
+
normalizeCodeSelectValue(model, getName(config));
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** `event-select`:表单 init 对未声明 defaultValue 的自定义 type 会写成空串,统一收成数组。 */
|
|
45
|
+
const eventSelectEffect: FieldMountValueEffect = ({ config, model }) => {
|
|
46
|
+
const name = getName(config);
|
|
47
|
+
if (model && !Array.isArray(model[name])) {
|
|
48
|
+
model[name] = [];
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* `code-select` 的内部配置。
|
|
54
|
+
*
|
|
55
|
+
* 对应 `fields/CodeSelect.vue` 内部
|
|
56
|
+
* `<MContainer :config="codeConfig" :model="model[name]" :prop="prop">`。
|
|
57
|
+
*
|
|
58
|
+
* @param ctx - innerConfig 回调入参
|
|
59
|
+
* @returns 内部容器的 config / model / prop
|
|
60
|
+
*/
|
|
61
|
+
const codeSelectInnerConfig: FieldInnerConfig = ({ config, model, prop }) => {
|
|
62
|
+
const name = getName(config);
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
config: createCodeSelectConfig(config as any),
|
|
66
|
+
model: model?.[name],
|
|
67
|
+
prop,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* `display-conds` 的内部配置。
|
|
73
|
+
*
|
|
74
|
+
* 对应 `fields/DisplayConds.vue` 内部把同一份 groupList 配置交给 `MGroupList`。
|
|
75
|
+
*
|
|
76
|
+
* @param ctx - innerConfig 回调入参
|
|
77
|
+
* @returns 内部 group-list 配置;prop 基准为 parentProp,避免 name 被拼两次
|
|
78
|
+
*/
|
|
79
|
+
const displayCondsInnerConfig: FieldInnerConfig = ({ config, model, prop, parentProp, mForm }) => {
|
|
80
|
+
const name = getName(config);
|
|
81
|
+
const parentFields =
|
|
82
|
+
filterFunction<string[]>(mForm, (config as DisplayCondsConfig).parentFields, {
|
|
83
|
+
model,
|
|
84
|
+
config,
|
|
85
|
+
prop,
|
|
86
|
+
}) || [];
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
config: createDisplayCondsConfig(config as DisplayCondsConfig, name, parentFields),
|
|
90
|
+
// 内部 group-list 复用了字段自身的 name,prop 基准要退回父级,否则 name 会被拼两次
|
|
91
|
+
prop: parentProp,
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* `event-select` 的内部配置。
|
|
97
|
+
*
|
|
98
|
+
* 对应 `fields/EventSelect.vue`:列表走 group-list,事件名渲染在 title slot,
|
|
99
|
+
* 无渲染校验仍把事件名当作列表项字段,路径为 `<prop>.<index>.name`。
|
|
100
|
+
*
|
|
101
|
+
* @param ctx - innerConfig 回调入参
|
|
102
|
+
* @returns 合成的 group-list 配置;旧数据格式返回 null,不参与校验
|
|
103
|
+
*/
|
|
104
|
+
const eventSelectInnerConfig: FieldInnerConfig = ({ config, model, parentProp }) => {
|
|
105
|
+
const name = getName(config);
|
|
106
|
+
const events = model?.[name];
|
|
107
|
+
|
|
108
|
+
// 旧数据格式走的是另一套表格配置,其中不含任何 rules,不参与校验
|
|
109
|
+
if (!Array.isArray(events) || isLegacyEventValue(events)) return null;
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
config: createEventSelectConfig(config as EventSelectConfig, name, { includeEventName: true }),
|
|
113
|
+
prop: parentProp,
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* `style-setter` 的内部配置。
|
|
119
|
+
*
|
|
120
|
+
* 对应 `fields/StyleSetter/Index.vue`:6 个面板共用 `:values="model[name]"`、`:prop="prop || name"`。
|
|
121
|
+
* `theme` 按 `useTheme` 缺省空串传入,只改 flexWrap 的 UI childType,不影响校验字段。
|
|
122
|
+
*
|
|
123
|
+
* @param ctx - innerConfig 回调入参
|
|
124
|
+
* @returns style 面板配置及 styleModel
|
|
125
|
+
*/
|
|
126
|
+
const styleSetterInnerConfig: FieldInnerConfig = ({ config, model, prop }) => {
|
|
127
|
+
const name = getName(config);
|
|
128
|
+
const styleModel = (model?.[name] ?? {}) as Partial<StyleSchema>;
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
config: createStyleSetterConfig(styleModel, '', validateDataSourceFieldSelect),
|
|
132
|
+
model: styleModel,
|
|
133
|
+
prop,
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 编辑器字段的无渲染登记表(不含 Vue 组件)。
|
|
139
|
+
*
|
|
140
|
+
* Node 里 `registerFields(editorFields)` 即可配合 `validateForm` / `submitForm`。
|
|
141
|
+
* 安装编辑器时由 plugin 把 `component` 叠上去再传给 `@tmagic/form`。
|
|
142
|
+
*
|
|
143
|
+
* - 叶子:内部只渲染叶子 UI,或把子表单渲染在独立的 MForm / MFormBox 实例里
|
|
144
|
+
* - innerConfig:内部再渲染 MContainer / MPanel / MGroupList,把运行期配置交出来
|
|
145
|
+
* - typeMatch:该 type 自身的类型匹配校验
|
|
146
|
+
*
|
|
147
|
+
* innerConfig 返回的 config / model / prop 与组件模板里传给内部容器的那一组保持一一对应,
|
|
148
|
+
* 且配置本身与组件共用同一份工厂(`fields/configs/`)。
|
|
149
|
+
*/
|
|
150
|
+
export const editorFields: Record<string, HeadlessFieldOptions> = {
|
|
151
|
+
'vs-code': {},
|
|
152
|
+
'code-link': {},
|
|
153
|
+
'ui-select': { typeMatch: editorTypeMatchRules['ui-select'] },
|
|
154
|
+
'cond-op-select': { typeMatch: editorTypeMatchRules['cond-op-select'] },
|
|
155
|
+
'page-fragment-select': { typeMatch: editorTypeMatchRules['page-fragment-select'] },
|
|
156
|
+
'data-source-select': { typeMatch: editorTypeMatchRules['data-source-select'] },
|
|
157
|
+
'data-source-input': { typeMatch: editorTypeMatchRules['data-source-input'] },
|
|
158
|
+
'key-value': { typeMatch: editorTypeMatchRules['key-value'] },
|
|
159
|
+
'code-select-col': { typeMatch: editorTypeMatchRules['code-select-col'] },
|
|
160
|
+
'data-source-fields': { typeMatch: editorTypeMatchRules['data-source-fields'] },
|
|
161
|
+
'data-source-mocks': { typeMatch: editorTypeMatchRules['data-source-mocks'] },
|
|
162
|
+
'data-source-methods': { typeMatch: editorTypeMatchRules['data-source-methods'] },
|
|
163
|
+
'data-source-method-select': { typeMatch: editorTypeMatchRules['data-source-method-select'] },
|
|
164
|
+
'data-source-field-select': { typeMatch: editorTypeMatchRules['data-source-field-select'] },
|
|
165
|
+
'code-select': {
|
|
166
|
+
effect: codeSelectEffect,
|
|
167
|
+
innerConfig: codeSelectInnerConfig,
|
|
168
|
+
typeMatch: editorTypeMatchRules['code-select'],
|
|
169
|
+
},
|
|
170
|
+
'display-conds': { innerConfig: displayCondsInnerConfig, typeMatch: editorTypeMatchRules['display-conds'] },
|
|
171
|
+
'event-select': {
|
|
172
|
+
effect: eventSelectEffect,
|
|
173
|
+
innerConfig: eventSelectInnerConfig,
|
|
174
|
+
typeMatch: editorTypeMatchRules['event-select'],
|
|
175
|
+
},
|
|
176
|
+
'style-setter': { innerConfig: styleSetterInnerConfig, typeMatch: editorTypeMatchRules['style-setter'] },
|
|
177
|
+
};
|
package/src/headless.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2025 Tencent. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @fileoverview `@tmagic/editor/headless`:编辑器字段的无渲染登记表。
|
|
21
|
+
*
|
|
22
|
+
* 不加载编辑器界面(Editor.vue、各面板、monaco 等),可在无 DOM 的 Node 里 import。
|
|
23
|
+
* 配合 `@tmagic/form/headless`:`registerBuiltInFields(builtInFields); registerFields(editorFields);`
|
|
24
|
+
*
|
|
25
|
+
* 注意这里不是「零 Vue 依赖」:`style-setter` 的字段配置与编辑器 UI 共用同一份工厂
|
|
26
|
+
* (`fields/StyleSetter/configs.ts`),配置里的 `icon` / `component` 会带进来若干图标
|
|
27
|
+
* SFC;typeMatch 的提示文案要读画布与数据源,也会带进 editor services。这些都只在
|
|
28
|
+
* import 时定义、不访问 DOM,但产物体积明显大于 `@tmagic/form/headless`。
|
|
29
|
+
*
|
|
30
|
+
* @module @tmagic/editor/headless
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
export { editorFields } from './fields/headless-validation';
|
package/src/hooks/index.ts
CHANGED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2025 Tencent. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { computed, type ComputedRef, inject, provide, type Ref, ref, useTemplateRef, watch } from 'vue';
|
|
20
|
+
|
|
21
|
+
import type { CodeBlockContent, MNode } from '@tmagic/core';
|
|
22
|
+
import { type FormConfig, type FormContext, type FormValue, MForm } from '@tmagic/form';
|
|
23
|
+
|
|
24
|
+
import { useEditorFormContext } from '@editor/hooks/use-form-context';
|
|
25
|
+
import type { CompareFormBaseProps } from '@editor/type';
|
|
26
|
+
import { getCodeBlockFormConfig } from '@editor/utils/code-block';
|
|
27
|
+
|
|
28
|
+
export interface UseCompareFormReturn {
|
|
29
|
+
config: Ref<FormConfig>;
|
|
30
|
+
currentValues: ComputedRef<FormValue>;
|
|
31
|
+
wrapperStyle: ComputedRef<Record<string, string> | undefined>;
|
|
32
|
+
formContext: ComputedRef<FormContext>;
|
|
33
|
+
loadConfig: () => Promise<void>;
|
|
34
|
+
formRef: Readonly<Ref<InstanceType<typeof MForm> | null>>;
|
|
35
|
+
normalizeCodeBlockValue: (v: Partial<CodeBlockContent> | Record<string, any> | undefined) => Record<string, any>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* CompareForm / ViewForm 共用逻辑:
|
|
40
|
+
* - 按 `category`(node / data-source / code-block) 加载 FormConfig(支持自定义 `loadConfig`);
|
|
41
|
+
* - 代码块 `content` 归一化为字符串;
|
|
42
|
+
* - 外层容器固定高度 + 内部滚动的 `wrapperStyle`;
|
|
43
|
+
* - 将 services / stage 作为 form context 传给 MForm,保证 filterFunction 上下文一致。
|
|
44
|
+
*
|
|
45
|
+
* 两个组件的差异仅在于是否做新旧值对比,这部分逻辑保留在各自组件中。
|
|
46
|
+
*/
|
|
47
|
+
export const useCompareForm = (props: CompareFormBaseProps): UseCompareFormReturn => {
|
|
48
|
+
provide('services', props.services);
|
|
49
|
+
|
|
50
|
+
const config = ref<FormConfig>([]);
|
|
51
|
+
|
|
52
|
+
/** vs-code 编辑器的 monaco 配置项,沿用 Editor 顶层 provide('codeOptions', ...) 的注入。 */
|
|
53
|
+
const codeOptions = inject<Record<string, any>>('codeOptions', {});
|
|
54
|
+
|
|
55
|
+
/** 将代码块的 content 字段统一成字符串,便于在表单 / 对比中展示 */
|
|
56
|
+
const normalizeCodeBlockValue = (
|
|
57
|
+
v: Partial<CodeBlockContent> | Record<string, any> | undefined,
|
|
58
|
+
): Record<string, any> => {
|
|
59
|
+
if (!v) return {};
|
|
60
|
+
const next: Record<string, any> = { ...v };
|
|
61
|
+
if (next.content && typeof next.content !== 'string') {
|
|
62
|
+
try {
|
|
63
|
+
next.content = next.content.toString();
|
|
64
|
+
} catch {
|
|
65
|
+
next.content = '';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return next;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const currentValues = computed<FormValue>(() => {
|
|
72
|
+
if (props.category === 'code-block') {
|
|
73
|
+
return normalizeCodeBlockValue(props.value as Partial<CodeBlockContent>);
|
|
74
|
+
}
|
|
75
|
+
return (props.value || {}) as FormValue;
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 外层包裹层的样式:当传入 `height` 时启用固定高度 + 内部滚动,
|
|
80
|
+
* 这样滚动条会出现在组件内部,避免父容器(如 Dialog)自身也产生滚动。
|
|
81
|
+
*/
|
|
82
|
+
const wrapperStyle = computed(() => {
|
|
83
|
+
if (!props.height) return undefined;
|
|
84
|
+
const style: Record<string, string> = {
|
|
85
|
+
height: props.height,
|
|
86
|
+
overflow: 'auto',
|
|
87
|
+
};
|
|
88
|
+
return style;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const formContext = useEditorFormContext(() => props.services);
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
|
|
95
|
+
* 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
|
|
96
|
+
*/
|
|
97
|
+
const defaultLoadConfig = async (): Promise<FormConfig> => {
|
|
98
|
+
if (!props.services) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
switch (props.category) {
|
|
103
|
+
case 'node': {
|
|
104
|
+
if (!props.type) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
return props.services.propsService.getPropsConfig(props.type, { node: props.value as unknown as MNode });
|
|
108
|
+
}
|
|
109
|
+
case 'data-source': {
|
|
110
|
+
const config = props.services.dataSourceService.getFormConfig(props.type || 'base');
|
|
111
|
+
// 数据源表单外层 tab 的「数据定义」项 status 为 'fields',tab-pane name 随之为 'fields'。
|
|
112
|
+
// 未显式设置 active 时,Tabs 默认取 '0',与 'fields' 不匹配会导致打开弹窗时无默认激活项,
|
|
113
|
+
// 这里与 DataSourceConfigPanel 保持一致,默认激活「数据定义」tab。
|
|
114
|
+
return config.map((item) => ('type' in item && item.type === 'tab' ? { ...item, active: 'fields' } : item));
|
|
115
|
+
}
|
|
116
|
+
case 'code-block': {
|
|
117
|
+
return getCodeBlockFormConfig({
|
|
118
|
+
paramColConfig: props.services.codeBlockService.getParamsColConfig(),
|
|
119
|
+
// 通过传入 dataSourceType 间接表达"是数据源代码块"——在对比 / 展示场景下 props.dataSourceType
|
|
120
|
+
// 由调用方按 step 上下文显式传入,未传则视为普通代码块,「执行时机」字段隐藏。
|
|
121
|
+
isDataSource: () => Boolean(props.dataSourceType),
|
|
122
|
+
dataSourceType: () => props.dataSourceType,
|
|
123
|
+
codeOptions,
|
|
124
|
+
// 对比 / 展示模式只读,不需要校验/语法检查
|
|
125
|
+
editable: false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
default:
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const loadConfig = async () => {
|
|
134
|
+
if (props.loadConfig) {
|
|
135
|
+
config.value = await props.loadConfig({
|
|
136
|
+
category: props.category as string,
|
|
137
|
+
type: props.type,
|
|
138
|
+
dataSourceType: props.dataSourceType,
|
|
139
|
+
defaultLoadConfig,
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
config.value = await defaultLoadConfig();
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
watch(
|
|
148
|
+
[() => props.category, () => props.type, () => props.dataSourceType, () => props.loadConfig],
|
|
149
|
+
() => {
|
|
150
|
+
loadConfig();
|
|
151
|
+
},
|
|
152
|
+
{ immediate: true },
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const formRef = useTemplateRef<InstanceType<typeof MForm>>('form');
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
config,
|
|
159
|
+
currentValues,
|
|
160
|
+
wrapperStyle,
|
|
161
|
+
formContext,
|
|
162
|
+
loadConfig,
|
|
163
|
+
formRef,
|
|
164
|
+
normalizeCodeBlockValue,
|
|
165
|
+
};
|
|
166
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2025 Tencent. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { computed, type ComputedRef, inject, unref } from 'vue';
|
|
20
|
+
|
|
21
|
+
import { FORM_CONTEXT_KEY, type FormContext, mergeFormContexts } from '@tmagic/form';
|
|
22
|
+
|
|
23
|
+
import type { Services } from '@editor/type';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 编辑器注入给表单的业务上下文:`services` 与当前画布 `stage`。
|
|
27
|
+
*
|
|
28
|
+
* 由 `Editor.vue`(provide `FORM_CONTEXT_KEY`)、`FormPanel.vue` 与 `useCompareForm`
|
|
29
|
+
* 共用。`stage` 走 computed 而非快照,保证切换画布后配置回调读到的是最新实例。
|
|
30
|
+
*
|
|
31
|
+
* 宿主可能在 `<MEditor>` 外层 provide 了自己的业务字段,这里必须把那一层合并进来:
|
|
32
|
+
* 否则编辑器再 provide 一次会把宿主整层遮蔽掉,属性面板、对比表单里的配置回调就
|
|
33
|
+
* 读不到宿主字段了。`services` / `stage` 由编辑器兜底,优先级高于宿主同名字段。
|
|
34
|
+
*
|
|
35
|
+
* 字段类型见 `@editor/type` 里对 `@tmagic/form-schema` 的 `FormContext` 模块增强。
|
|
36
|
+
*/
|
|
37
|
+
export const useEditorFormContext = (getServices: () => Services | undefined): ComputedRef<FormContext> => {
|
|
38
|
+
// inject 只能在 setup 期取值,因此本 hook 必须在 setup 中调用(`use` 前缀即此约定)。
|
|
39
|
+
// 返回的 computed 可以随便传递,但 hook 本身不能延迟到事件回调或 onMounted 里再调。
|
|
40
|
+
const hostContext = inject(FORM_CONTEXT_KEY, undefined);
|
|
41
|
+
|
|
42
|
+
return computed(() => {
|
|
43
|
+
const services = getServices();
|
|
44
|
+
const host = unref(hostContext);
|
|
45
|
+
|
|
46
|
+
// 上层(通常是 Editor.vue)已经用同一份 services 合并过了。FormPanel / useCompareForm
|
|
47
|
+
// 都是它的后代,再合并一次只会多套一层 Proxy,让每次属性 miss 多一轮线性查找。
|
|
48
|
+
// services 相同即可判定 stage 也相同——两边都是从同一个 editorService 读的。
|
|
49
|
+
if (host && host.services === services) return host;
|
|
50
|
+
|
|
51
|
+
return mergeFormContexts(host, {
|
|
52
|
+
services,
|
|
53
|
+
stage: services?.editorService.get('stage'),
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
};
|
package/src/hooks/use-stage.ts
CHANGED
|
@@ -28,6 +28,7 @@ export const useStage = (stageOptions: StageOptions) => {
|
|
|
28
28
|
containerHighlightClassName: stageOptions.containerHighlightClassName,
|
|
29
29
|
containerHighlightDuration: stageOptions.containerHighlightDuration,
|
|
30
30
|
containerHighlightType: stageOptions.containerHighlightType,
|
|
31
|
+
containerHighlightAddOnly: stageOptions.containerHighlightAddOnly,
|
|
31
32
|
disabledDragStart: stageOptions.disabledDragStart,
|
|
32
33
|
renderType: stageOptions.renderType,
|
|
33
34
|
canSelect: (el, event, stop) => {
|
package/src/index.ts
CHANGED
|
@@ -32,6 +32,9 @@ export { DepTargetType } from '@tmagic/core';
|
|
|
32
32
|
export * from './type';
|
|
33
33
|
export * from './hooks';
|
|
34
34
|
export * from './utils';
|
|
35
|
+
// `isGlobalFlat` 同时在 `@tmagic/design` 和 `./utils/config` 中存在,
|
|
36
|
+
// 通过显式重导一次消除 `export *` 带来的歧义,并固定使用 editor 自己那份。
|
|
37
|
+
export { isGlobalFlat } from './utils/config';
|
|
35
38
|
export { default as TMagicEditor } from './Editor.vue';
|
|
36
39
|
export { default as TMagicCodeEditor } from './layouts/CodeEditor.vue';
|
|
37
40
|
export { default as editorService } from './services/editor';
|
|
@@ -44,8 +47,11 @@ export { default as stageOverlayService } from './services/stageOverlay';
|
|
|
44
47
|
export { default as uiService } from './services/ui';
|
|
45
48
|
export { default as codeBlockService } from './services/codeBlock';
|
|
46
49
|
export { default as depService } from './services/dep';
|
|
50
|
+
export { default as componentListService } from './services/componentList';
|
|
51
|
+
export { default as keybindingService } from './services/keybinding';
|
|
47
52
|
export { default as ComponentListPanel } from './layouts/sidebar/ComponentListPanel.vue';
|
|
48
53
|
export { default as LayerPanel } from './layouts/sidebar/layer/LayerPanel.vue';
|
|
54
|
+
export { default as LayerNodeContent } from './layouts/sidebar/layer/LayerNodeContent.vue';
|
|
49
55
|
export { default as CodeSelect } from './fields/CodeSelect.vue';
|
|
50
56
|
export { default as CodeSelectCol } from './fields/CodeSelectCol.vue';
|
|
51
57
|
export { default as DataSourceFields } from './fields/DataSourceFields.vue';
|
|
@@ -71,6 +77,7 @@ export { default as SplitView } from './components/SplitView.vue';
|
|
|
71
77
|
export { default as Resizer } from './components/Resizer.vue';
|
|
72
78
|
export { default as CodeBlockEditor } from './components/CodeBlockEditor.vue';
|
|
73
79
|
export { default as CompareForm } from './components/CompareForm.vue';
|
|
80
|
+
export { default as ViewForm } from './components/ViewForm.vue';
|
|
74
81
|
export { default as HistoryListBucket } from './layouts/history-list/Bucket.vue';
|
|
75
82
|
export { default as HistoryListBucketTab } from './layouts/history-list/BucketTab.vue';
|
|
76
83
|
export { default as HistoryDiffDialog } from './layouts/history-list/HistoryDiffDialog.vue';
|
|
@@ -84,4 +91,6 @@ export { default as DisplayConds } from './fields/DisplayConds.vue';
|
|
|
84
91
|
export { default as CondOpSelect } from './fields/CondOpSelect.vue';
|
|
85
92
|
export { default as StyleSetter } from './fields/StyleSetter/Index.vue';
|
|
86
93
|
|
|
94
|
+
export { editorFields } from './fields/headless-validation';
|
|
95
|
+
|
|
87
96
|
export { default } from './plugin';
|