@tmagic/editor 1.8.0-manmanyu.9 → 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 -122
- 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 +16 -8
- 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 +1 -1
- 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 +11 -13
- 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/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 +8 -3
- package/dist/es/services/dataSource.js +3 -0
- package/dist/es/services/dep.js +162 -41
- package/dist/es/services/editor.js +344 -113
- package/dist/es/services/events.js +4 -4
- package/dist/es/services/history.js +17 -1
- 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/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 +12695 -10896
- 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 +1199 -724
- package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
package/dist/es/utils/props.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { tMagicMessage } from "@tmagic/design";
|
|
2
|
-
import { NODE_CONDS_KEY, NODE_CONDS_RESULT_KEY, NODE_DISABLE_CODE_BLOCK_KEY, NODE_DISABLE_DATA_SOURCE_KEY } from "@tmagic/core";
|
|
2
|
+
import { HookType, NODE_CONDS_KEY, NODE_CONDS_RESULT_KEY, NODE_DISABLE_CODE_BLOCK_KEY, NODE_DISABLE_DATA_SOURCE_KEY } from "@tmagic/core";
|
|
3
3
|
//#region packages/editor/src/utils/props.ts
|
|
4
4
|
var arrayOptions = [{
|
|
5
5
|
text: "包含",
|
|
@@ -41,10 +41,28 @@ var numberOptions = [
|
|
|
41
41
|
value: "not_between"
|
|
42
42
|
}
|
|
43
43
|
];
|
|
44
|
+
var booleanOptions = [{
|
|
45
|
+
text: "是",
|
|
46
|
+
value: "is"
|
|
47
|
+
}, {
|
|
48
|
+
text: "不是",
|
|
49
|
+
value: "not"
|
|
50
|
+
}];
|
|
51
|
+
/** 按字段类型返回条件运算符选项(UI 与 typeMatch 校验共用) */
|
|
52
|
+
var getCondOpOptionsByFieldType = (type) => {
|
|
53
|
+
if (type === "array") return arrayOptions;
|
|
54
|
+
if (type === "boolean" || type === "null") return booleanOptions;
|
|
55
|
+
if (type === "number") return [...eqOptions, ...numberOptions];
|
|
56
|
+
if (type === "string") return [...arrayOptions, ...eqOptions];
|
|
57
|
+
return [
|
|
58
|
+
...arrayOptions,
|
|
59
|
+
...eqOptions,
|
|
60
|
+
...numberOptions
|
|
61
|
+
];
|
|
62
|
+
};
|
|
44
63
|
var styleTabConfig = {
|
|
45
64
|
title: "样式",
|
|
46
|
-
|
|
47
|
-
display: ({ services }) => !(services.uiService.get("showStylePanel") ?? true),
|
|
65
|
+
display: ({ services }) => !(services?.uiService?.get("showStylePanel") ?? true),
|
|
48
66
|
items: [{
|
|
49
67
|
name: "style",
|
|
50
68
|
labelWidth: "100px",
|
|
@@ -108,145 +126,73 @@ var styleTabConfig = {
|
|
|
108
126
|
};
|
|
109
127
|
var eventTabConfig = {
|
|
110
128
|
title: "事件",
|
|
111
|
-
lazy: true,
|
|
112
129
|
items: [{
|
|
113
130
|
name: "events",
|
|
114
131
|
src: "component",
|
|
115
132
|
labelWidth: "100px",
|
|
116
|
-
type: "event-select"
|
|
133
|
+
type: "event-select",
|
|
134
|
+
defaultValue: [],
|
|
135
|
+
rules: [{ typeMatch: true }]
|
|
117
136
|
}]
|
|
118
137
|
};
|
|
119
|
-
var getReportTypeConfig = ({ reportType }) => {
|
|
120
|
-
return {
|
|
121
|
-
name: reportType,
|
|
122
|
-
style: {
|
|
123
|
-
backgroundColor: "#fff",
|
|
124
|
-
borderRadius: "4px",
|
|
125
|
-
padding: "16px",
|
|
126
|
-
marginBottom: "10px"
|
|
127
|
-
},
|
|
128
|
-
items: [
|
|
129
|
-
{
|
|
130
|
-
text: {
|
|
131
|
-
click: "点击",
|
|
132
|
-
expose: "曝光"
|
|
133
|
-
}[reportType],
|
|
134
|
-
static: true,
|
|
135
|
-
labelPosition: "left",
|
|
136
|
-
labelWidth: "200px",
|
|
137
|
-
className: "m-fields-title-container"
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
name: "f_module",
|
|
141
|
-
type: "data-source-field-select",
|
|
142
|
-
fieldConfig: { type: "text" },
|
|
143
|
-
checkStrictly: false,
|
|
144
|
-
dataSourceFieldType: ["string"],
|
|
145
|
-
disabled: (_vm, { formValue }) => !formValue?.report?.custom,
|
|
146
|
-
text: "f_module",
|
|
147
|
-
labelPosition: "left"
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
name: "f_resource",
|
|
151
|
-
type: "data-source-field-select",
|
|
152
|
-
fieldConfig: { type: "text" },
|
|
153
|
-
checkStrictly: false,
|
|
154
|
-
dataSourceFieldType: ["string"],
|
|
155
|
-
disabled: (_vm, { formValue }) => !formValue?.report?.custom,
|
|
156
|
-
text: "f_resource",
|
|
157
|
-
labelPosition: "left"
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
name: "f_type",
|
|
161
|
-
type: "data-source-field-select",
|
|
162
|
-
fieldConfig: { type: "text" },
|
|
163
|
-
checkStrictly: false,
|
|
164
|
-
dataSourceFieldType: ["string", "number"],
|
|
165
|
-
disabled: (_vm, { formValue }) => !formValue?.report?.custom,
|
|
166
|
-
text: "f_type",
|
|
167
|
-
labelPosition: "left"
|
|
168
|
-
}
|
|
169
|
-
]
|
|
170
|
-
};
|
|
171
|
-
};
|
|
172
138
|
var advancedTabConfig = {
|
|
173
139
|
title: "高级",
|
|
174
|
-
lazy: true,
|
|
175
140
|
items: [
|
|
176
|
-
{
|
|
177
|
-
type: "link",
|
|
178
|
-
displayText: "点击查看配置指南",
|
|
179
|
-
href: "https://iwiki.woa.com/pages/viewpage.action?pageId=827749220",
|
|
180
|
-
css: "color: #F56C6C;font-weight: bold"
|
|
181
|
-
},
|
|
182
141
|
{
|
|
183
142
|
name: NODE_DISABLE_CODE_BLOCK_KEY,
|
|
184
143
|
text: "禁用代码块",
|
|
185
144
|
type: "switch",
|
|
186
|
-
labelPosition: "left",
|
|
187
145
|
defaultValue: false,
|
|
188
|
-
extra: "开启后,配置的代码块将不会被执行"
|
|
189
|
-
style: { padding: "0 22px" }
|
|
146
|
+
extra: "开启后,配置的代码块将不会被执行"
|
|
190
147
|
},
|
|
191
148
|
{
|
|
192
149
|
name: NODE_DISABLE_DATA_SOURCE_KEY,
|
|
193
150
|
text: "禁用数据源",
|
|
194
151
|
type: "switch",
|
|
195
|
-
labelPosition: "left",
|
|
196
152
|
defaultValue: false,
|
|
197
|
-
extra: "开启后,组件内配置的数据源相关配置将不会被编译,显隐条件将失效"
|
|
198
|
-
style: { padding: "0 22px" }
|
|
153
|
+
extra: "开启后,组件内配置的数据源相关配置将不会被编译,显隐条件将失效"
|
|
199
154
|
},
|
|
200
155
|
{
|
|
201
156
|
name: "created",
|
|
202
157
|
text: "Created",
|
|
203
|
-
flat: true,
|
|
204
158
|
labelPosition: "top",
|
|
205
159
|
type: "code-select",
|
|
206
160
|
titleExtra: "组件初始化时执行",
|
|
207
|
-
|
|
161
|
+
rules: [{
|
|
162
|
+
typeMatch: true,
|
|
163
|
+
trigger: "change"
|
|
164
|
+
}, { validator: ({ value, callback }) => {
|
|
165
|
+
if (value && value.hookType !== HookType.CODE) return callback("hookType 必须是 code");
|
|
166
|
+
callback();
|
|
167
|
+
} }]
|
|
208
168
|
},
|
|
209
169
|
{
|
|
210
170
|
name: "mounted",
|
|
211
171
|
text: "Mounted",
|
|
212
172
|
labelPosition: "top",
|
|
213
|
-
flat: true,
|
|
214
173
|
type: "code-select",
|
|
215
174
|
titleExtra: "组件挂载到dom时执行",
|
|
216
|
-
|
|
175
|
+
rules: [{
|
|
176
|
+
typeMatch: true,
|
|
177
|
+
trigger: "change"
|
|
178
|
+
}, { validator: ({ value, callback }) => {
|
|
179
|
+
if (value && value.hookType !== HookType.CODE) return callback("hookType 必须是 code");
|
|
180
|
+
callback();
|
|
181
|
+
} }]
|
|
217
182
|
},
|
|
218
183
|
{
|
|
219
184
|
name: "display",
|
|
220
185
|
text: "Display",
|
|
221
|
-
flat: true,
|
|
222
186
|
titleExtra: "控制组件是否渲染,关系的代码块返回值为false时不渲染",
|
|
223
187
|
labelPosition: "top",
|
|
224
188
|
type: "code-select",
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
className: "no-border-fieldset",
|
|
233
|
-
style: { paddingTop: "10px" },
|
|
234
|
-
items: [
|
|
235
|
-
{
|
|
236
|
-
type: "row",
|
|
237
|
-
items: [{
|
|
238
|
-
type: "switch",
|
|
239
|
-
name: "custom",
|
|
240
|
-
labelPosition: "left",
|
|
241
|
-
defaultValue: false,
|
|
242
|
-
labelWidth: "120px",
|
|
243
|
-
text: "开启自定义",
|
|
244
|
-
extra: "开启自定义后可以手动修改上报内容,关闭后会自动生成上报内容"
|
|
245
|
-
}]
|
|
246
|
-
},
|
|
247
|
-
getReportTypeConfig({ reportType: "click" }),
|
|
248
|
-
getReportTypeConfig({ reportType: "expose" })
|
|
249
|
-
]
|
|
189
|
+
rules: [{
|
|
190
|
+
typeMatch: true,
|
|
191
|
+
trigger: "change"
|
|
192
|
+
}, { validator: ({ value, callback }) => {
|
|
193
|
+
if (value && value.hookType !== HookType.CODE) return callback("hookType 必须是 code");
|
|
194
|
+
callback();
|
|
195
|
+
} }]
|
|
250
196
|
}
|
|
251
197
|
]
|
|
252
198
|
};
|
|
@@ -277,10 +223,8 @@ var displayTabConfig = {
|
|
|
277
223
|
type: "display-conds",
|
|
278
224
|
name: NODE_CONDS_KEY,
|
|
279
225
|
titlePrefix: "条件组",
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
operateColWidth: 112,
|
|
283
|
-
defaultValue: []
|
|
226
|
+
defaultValue: [],
|
|
227
|
+
rules: [{ typeMatch: true }]
|
|
284
228
|
}
|
|
285
229
|
]
|
|
286
230
|
};
|
|
@@ -339,4 +283,4 @@ var fillConfig = (config = [], { labelWidth = "80px", disabledDataSource = false
|
|
|
339
283
|
return [tabConfig];
|
|
340
284
|
};
|
|
341
285
|
//#endregion
|
|
342
|
-
export { advancedTabConfig, arrayOptions, displayTabConfig, eqOptions, eventTabConfig, fillConfig, numberOptions, styleTabConfig };
|
|
286
|
+
export { advancedTabConfig, arrayOptions, booleanOptions, displayTabConfig, eqOptions, eventTabConfig, fillConfig, getCondOpOptionsByFieldType, numberOptions, styleTabConfig };
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { arrayOptions, booleanOptions, eqOptions, getCondOpOptionsByFieldType, numberOptions } from "./props.js";
|
|
2
|
+
import editor_default from "../services/editor.js";
|
|
3
|
+
import { getFieldType, resolveFieldByPath } from "./data-source/index.js";
|
|
4
|
+
import codeBlock_default from "../services/codeBlock.js";
|
|
5
|
+
import dataSource_default from "../services/dataSource.js";
|
|
6
|
+
import { DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX, DATA_SOURCE_SET_DATA_METHOD_NAME, dataSourceTemplateRegExp, getKeysArray, removeDataSourceFieldPrefix } from "@tmagic/utils";
|
|
7
|
+
import { NodeType } from "@tmagic/core";
|
|
8
|
+
import { appendValidateSuggestion } from "@tmagic/design/headless";
|
|
9
|
+
import { MAX_SUGGESTION_OPTIONS, optionSuggestion, stringifyExampleValue, validateTypeMatch } from "@tmagic/form/headless";
|
|
10
|
+
//#region packages/editor/src/utils/type-match-rules.ts
|
|
11
|
+
/** 复用 form 的可选项建议文案;额外过滤 null / 空串,避免业务侧无效枚举污染提示。 */
|
|
12
|
+
var listSuggestion = (values) => optionSuggestion(values.filter((item) => item !== null && item !== ""));
|
|
13
|
+
/**
|
|
14
|
+
* 列出当前可用数据源 id 的参考建议。
|
|
15
|
+
*/
|
|
16
|
+
var dataSourceIdSuggestion = () => listSuggestion(getDataSources().map((ds) => `${ds.id}`));
|
|
17
|
+
var SUGGESTION_STRING = "请参考以下示例值:\"文本内容\"";
|
|
18
|
+
var SUGGESTION_STRING_OR_NUMBER = "请参考以下示例值:\"文本内容\" 或 123";
|
|
19
|
+
var SUGGESTION_OBJECT = "请参考以下示例值:{ \"key\": \"value\" }";
|
|
20
|
+
var SUGGESTION_ARRAY = "请参考以下示例值:[]";
|
|
21
|
+
var SUGGESTION_STRING_ARRAY = "请参考以下示例值:[\"字段1\", \"字段2\"]";
|
|
22
|
+
var SUGGESTION_METHOD_TUPLE = "请参考以下示例值:[\"数据源ID\", \"方法名\"]";
|
|
23
|
+
var SUGGESTION_DS_BINDING = "请参考以下示例值:\"${数据源ID.字段名}\"";
|
|
24
|
+
var SUGGESTION_DS_BIND_OBJECT = "请参考以下示例值:{ \"isBindDataSource\": true, \"dataSourceId\": \"数据源ID\" }";
|
|
25
|
+
var SUGGESTION_UI_ID = "请参考以下示例值:画布中已存在组件的 id";
|
|
26
|
+
var SUGGESTION_FIELD_ITEM = "请参考以下示例值:{ \"name\": \"字段名\", \"type\": \"string\" }";
|
|
27
|
+
var SUGGESTION_CODE_SELECT = "请参考以下示例值:{ \"hookData\": [{ \"codeId\": \"代码块ID\", \"params\": {} }] }";
|
|
28
|
+
var SUGGESTION_HOOK_ITEM = "请参考以下示例值:{ \"codeId\": \"代码块ID\", \"params\": {} }";
|
|
29
|
+
var SUGGESTION_MOCK_ITEM = "请参考以下示例值:{ \"title\": \"mock 名称\", \"enable\": true, \"useInEditor\": false, \"data\": {} }";
|
|
30
|
+
var SUGGESTION_METHOD_ITEM = "请参考以下示例值:{ \"name\": \"方法名\", \"content\": \"() => {}\" }";
|
|
31
|
+
var SUGGESTION_EVENT_ITEM = "请参考以下示例值:{ \"name\": \"事件名\", \"actions\": [] }";
|
|
32
|
+
var SUGGESTION_DISPLAY_COND = "请参考以下示例值:[{ \"cond\": [{ \"field\": [\"数据源ID\", \"字段名\"], \"op\": \"==\" }] }]";
|
|
33
|
+
/**
|
|
34
|
+
* 返回最终错误文案。
|
|
35
|
+
*
|
|
36
|
+
* - 传入了自定义 `message` 时,直接使用自定义文案(不追加建议);
|
|
37
|
+
* - 否则使用默认文案 `fallback`,并在其后拼接「参考建议」。
|
|
38
|
+
* 参考建议给出一个可参考的示例值(如可选项列表、示例数据),仅用于错误汇总展示;
|
|
39
|
+
* form-item 行内错误不展示建议(由 @tmagic/design FormItem 在渲染时截断建议)。
|
|
40
|
+
* 主文案与建议的拼接/截断统一复用 @tmagic/design 的 `appendValidateSuggestion`。
|
|
41
|
+
*/
|
|
42
|
+
var defaultMessage = (message, fallback, suggestion) => {
|
|
43
|
+
if (message) return message;
|
|
44
|
+
return appendValidateSuggestion(fallback, suggestion);
|
|
45
|
+
};
|
|
46
|
+
var isPlainObject = (value) => Object.prototype.toString.call(value) === "[object Object]";
|
|
47
|
+
var isId = (value) => typeof value === "string" || typeof value === "number";
|
|
48
|
+
var DATA_SOURCE_FIELD_TYPES = /* @__PURE__ */ new Set([
|
|
49
|
+
"null",
|
|
50
|
+
"boolean",
|
|
51
|
+
"object",
|
|
52
|
+
"array",
|
|
53
|
+
"number",
|
|
54
|
+
"string",
|
|
55
|
+
"any"
|
|
56
|
+
]);
|
|
57
|
+
var ALL_COND_OPS = /* @__PURE__ */ new Set([
|
|
58
|
+
...arrayOptions.map((item) => item.value),
|
|
59
|
+
...eqOptions.map((item) => item.value),
|
|
60
|
+
...numberOptions.map((item) => item.value),
|
|
61
|
+
...booleanOptions.map((item) => item.value)
|
|
62
|
+
]);
|
|
63
|
+
var getCondOpsByFieldType = (type) => new Set(getCondOpOptionsByFieldType(type).map((item) => item.value));
|
|
64
|
+
var getDataSources = () => dataSource_default.get("dataSources") || [];
|
|
65
|
+
var findDataSource = (id) => getDataSources().find((ds) => `${ds.id}` === `${id}`);
|
|
66
|
+
var getMethodNamesForDataSource = (ds) => {
|
|
67
|
+
const names = /* @__PURE__ */ new Set([DATA_SOURCE_SET_DATA_METHOD_NAME]);
|
|
68
|
+
(dataSource_default.getFormMethod(ds.type) || []).forEach((item) => {
|
|
69
|
+
if (item?.value) names.add(item.value);
|
|
70
|
+
});
|
|
71
|
+
(ds.methods || []).forEach((method) => {
|
|
72
|
+
if (method?.name) names.add(method.name);
|
|
73
|
+
});
|
|
74
|
+
return names;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 递归收集画布中真实存在的组件 id。
|
|
78
|
+
*/
|
|
79
|
+
var collectNodeIds = (limit = MAX_SUGGESTION_OPTIONS) => {
|
|
80
|
+
const ids = [];
|
|
81
|
+
const walk = (nodes) => {
|
|
82
|
+
for (const node of nodes || []) {
|
|
83
|
+
if (typeof node?.id !== "undefined") {
|
|
84
|
+
ids.push(node.id);
|
|
85
|
+
if (ids.length >= limit) return true;
|
|
86
|
+
}
|
|
87
|
+
if (Array.isArray(node?.items) && walk(node.items)) return true;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
};
|
|
91
|
+
walk(editor_default.get("root")?.items);
|
|
92
|
+
return ids;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* 取数据源的第一个字段名,用于拼接真实的字段路径示例。
|
|
96
|
+
*/
|
|
97
|
+
var firstDataSourceFieldName = (ds) => (ds?.fields || []).find((item) => typeof item?.name === "string")?.name;
|
|
98
|
+
/**
|
|
99
|
+
* 列出画布中真实存在的组件 id 作为参考建议;无组件时回退到通用示例。
|
|
100
|
+
*/
|
|
101
|
+
var uiIdSuggestion = () => listSuggestion(collectNodeIds().map((id) => `${id}`)) || SUGGESTION_UI_ID;
|
|
102
|
+
/**
|
|
103
|
+
* 用真实数据源 id、字段名拼接数据源绑定表达式示例;无数据源时回退到通用示例。
|
|
104
|
+
*/
|
|
105
|
+
var dataSourceBindingSuggestion = () => {
|
|
106
|
+
const ds = getDataSources()[0];
|
|
107
|
+
if (!ds) return SUGGESTION_DS_BINDING;
|
|
108
|
+
const field = firstDataSourceFieldName(ds);
|
|
109
|
+
return `请参考以下示例值:"\${${field ? `${ds.id}.${field}` : `${ds.id}`}}"`;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* 用真实数据源 id 拼接数据源绑定对象示例;无数据源时回退到通用示例。
|
|
113
|
+
*/
|
|
114
|
+
var dataSourceBindObjectSuggestion = (dataSources = getDataSources()) => {
|
|
115
|
+
const ds = dataSources[0];
|
|
116
|
+
if (!ds) return SUGGESTION_DS_BIND_OBJECT;
|
|
117
|
+
return `请参考以下示例值:${stringifyExampleValue({
|
|
118
|
+
isBindDataSource: true,
|
|
119
|
+
dataSourceId: `${ds.id}`
|
|
120
|
+
})}`;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* 用真实数据源 id、字段名拼接字段路径数组示例;无数据源时回退到通用示例。
|
|
124
|
+
*/
|
|
125
|
+
var dataSourceFieldPathSuggestion = () => {
|
|
126
|
+
const ds = getDataSources()[0];
|
|
127
|
+
if (!ds) return SUGGESTION_STRING_ARRAY;
|
|
128
|
+
const field = firstDataSourceFieldName(ds);
|
|
129
|
+
return `请参考以下示例值:${stringifyExampleValue(field ? [`${ds.id}`, field] : [`${ds.id}`])}`;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* 用真实数据源 id、方法名拼接方法元组示例;无数据源时回退到通用示例。
|
|
133
|
+
*/
|
|
134
|
+
var methodTupleSuggestion = () => {
|
|
135
|
+
const ds = getDataSources()[0];
|
|
136
|
+
if (!ds) return SUGGESTION_METHOD_TUPLE;
|
|
137
|
+
const [methodName] = [...getMethodNamesForDataSource(ds)];
|
|
138
|
+
return `请参考以下示例值:${stringifyExampleValue([`${ds.id}`, methodName])}`;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* 用真实数据源 id、字段名拼接显示条件结构示例;无数据源时回退到通用示例。
|
|
142
|
+
*/
|
|
143
|
+
var displayCondSuggestion = () => {
|
|
144
|
+
const ds = getDataSources()[0];
|
|
145
|
+
if (!ds) return SUGGESTION_DISPLAY_COND;
|
|
146
|
+
const field = firstDataSourceFieldName(ds);
|
|
147
|
+
const fieldPath = field ? [`${ds.id}`, field] : [`${ds.id}`];
|
|
148
|
+
return `请参考以下示例值:${stringifyExampleValue([{ cond: [{
|
|
149
|
+
field: fieldPath,
|
|
150
|
+
op: "=="
|
|
151
|
+
}] }])}`;
|
|
152
|
+
};
|
|
153
|
+
var validateDataSourceFieldPath = (path, options = {}) => {
|
|
154
|
+
if (!getDataSources().length) return;
|
|
155
|
+
const dsId = options.dataSourceId;
|
|
156
|
+
if (!dsId) return defaultMessage(options.message, "数据源不存在", dataSourceIdSuggestion());
|
|
157
|
+
const ds = findDataSource(`${dsId}`);
|
|
158
|
+
if (!ds) return defaultMessage(options.message, `数据源(${dsId})不存在`, dataSourceIdSuggestion());
|
|
159
|
+
if (!path.length) return;
|
|
160
|
+
const { field, ok, fields, failedName } = resolveFieldByPath(ds.fields, path);
|
|
161
|
+
if (!ok) return defaultMessage(options.message, `数据源字段(${failedName})不存在`, listSuggestion(fields.map((item) => item.name)));
|
|
162
|
+
const allowedTypes = options.dataSourceFieldType || ["any"];
|
|
163
|
+
if (!allowedTypes.length || allowedTypes.includes("any")) return;
|
|
164
|
+
const leafType = field?.type || "any";
|
|
165
|
+
if (leafType !== "any" && !allowedTypes.includes(leafType)) {
|
|
166
|
+
const fieldName = field?.name || path[path.length - 1];
|
|
167
|
+
return defaultMessage(options.message, `请选择类型为${allowedTypes.join("或")}的字段,字段(${fieldName})的类型为${leafType}`);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
var validateDataSourceMethodTuple = (value, message) => {
|
|
171
|
+
if (!Array.isArray(value) || value.length !== 2 || value.some((item) => typeof item !== "string")) return defaultMessage(message, `${value}类型应为长度为 2 的字符串数组`, methodTupleSuggestion());
|
|
172
|
+
if (!getDataSources().length) return;
|
|
173
|
+
const [dsId, methodName] = value;
|
|
174
|
+
const ds = findDataSource(dsId);
|
|
175
|
+
if (!ds) return defaultMessage(message, `数据源(${dsId})不存在`, dataSourceIdSuggestion());
|
|
176
|
+
if (!getMethodNamesForDataSource(ds).has(methodName)) return defaultMessage(message, `数据源方法(${methodName})不存在`, listSuggestion([...getMethodNamesForDataSource(ds)]));
|
|
177
|
+
};
|
|
178
|
+
var validateDataSourceTemplateBindings = (value, message) => {
|
|
179
|
+
if (!getDataSources().length) return;
|
|
180
|
+
const matches = value.matchAll(dataSourceTemplateRegExp);
|
|
181
|
+
for (const match of matches) {
|
|
182
|
+
const keys = getKeysArray(match[1]);
|
|
183
|
+
if (!keys.length) return defaultMessage(message, `数据源绑定(${value})不合法`, dataSourceBindingSuggestion());
|
|
184
|
+
const [dsId, ...fieldNames] = keys;
|
|
185
|
+
const ds = findDataSource(`${dsId}`);
|
|
186
|
+
if (!ds) return defaultMessage(message, `数据源绑定(${value})不合法`, dataSourceBindingSuggestion());
|
|
187
|
+
const { ok } = resolveFieldByPath(ds.fields, fieldNames, { skipNumberIndices: true });
|
|
188
|
+
if (!ok) return defaultMessage(message, `数据源绑定(${value})不合法`, dataSourceBindingSuggestion());
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
var validateDataSourceFieldsItem = (item, message) => {
|
|
192
|
+
if (!isPlainObject(item) || typeof item.name !== "string") return defaultMessage(message, "字段项结构不合法", SUGGESTION_FIELD_ITEM);
|
|
193
|
+
if (typeof item.type !== "undefined" && !DATA_SOURCE_FIELD_TYPES.has(item.type)) return defaultMessage(message, "字段类型不合法", listSuggestion([...DATA_SOURCE_FIELD_TYPES]));
|
|
194
|
+
if (typeof item.fields !== "undefined") {
|
|
195
|
+
if (!Array.isArray(item.fields)) return defaultMessage(message, "字段项结构不合法", SUGGESTION_FIELD_ITEM);
|
|
196
|
+
for (const child of item.fields) {
|
|
197
|
+
const error = validateDataSourceFieldsItem(child, message);
|
|
198
|
+
if (error) return error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
var validateKeyValue = (value, { message, props }) => {
|
|
203
|
+
if (props.config?.advanced && typeof value === "function") return;
|
|
204
|
+
if (!isPlainObject(value)) return defaultMessage(message, "值类型应为对象", SUGGESTION_OBJECT);
|
|
205
|
+
};
|
|
206
|
+
var validateStyleSetter = (value, { message }) => {
|
|
207
|
+
if (!isPlainObject(value)) return defaultMessage(message, "值类型应为对象", SUGGESTION_OBJECT);
|
|
208
|
+
};
|
|
209
|
+
var validateCondOpSelect = (value, { message, props }) => {
|
|
210
|
+
if (typeof value !== "string") return defaultMessage(message, "值类型应为字符串", SUGGESTION_STRING);
|
|
211
|
+
const parentFields = props.config?.parentFields || [];
|
|
212
|
+
const fieldPath = Array.isArray(props.model?.field) ? props.model.field : [];
|
|
213
|
+
const [id, ...fieldNames] = [...parentFields, ...fieldPath];
|
|
214
|
+
const ds = id ? findDataSource(removeDataSourceFieldPrefix(`${id}`)) : void 0;
|
|
215
|
+
const allowed = getCondOpsByFieldType(getFieldType(ds, fieldNames));
|
|
216
|
+
if (!allowed.has(value)) return defaultMessage(message, `${value} 不在可选项中`, listSuggestion([...allowed]));
|
|
217
|
+
};
|
|
218
|
+
var validateCodeSelectCol = (value, { message }) => {
|
|
219
|
+
if (typeof value !== "string") return defaultMessage(message, `${value}类型应为字符串`, SUGGESTION_STRING);
|
|
220
|
+
const codeDsl = codeBlock_default.getCodeDsl();
|
|
221
|
+
if (!codeDsl || !Object.keys(codeDsl).length) return;
|
|
222
|
+
if (!(value in codeDsl)) return defaultMessage(message, `代码块(${value})不存在`, listSuggestion(Object.keys(codeDsl)));
|
|
223
|
+
};
|
|
224
|
+
var validatePageFragmentSelect = (value, { message }) => {
|
|
225
|
+
if (!isId(value)) return defaultMessage(message, `${value}类型应为字符串或数字`, SUGGESTION_STRING_OR_NUMBER);
|
|
226
|
+
const items = editor_default.get("root")?.items;
|
|
227
|
+
if (!items?.length) return;
|
|
228
|
+
const fragments = items.filter((item) => item.type === NodeType.PAGE_FRAGMENT);
|
|
229
|
+
if (!fragments.some((item) => `${item.id}` === `${value}`)) return defaultMessage(message, `页面片段(${value})不存在`, listSuggestion(fragments.map((item) => `${item.id}`)));
|
|
230
|
+
};
|
|
231
|
+
var validateUiSelect = (value, { message }) => {
|
|
232
|
+
if (!isId(value)) return defaultMessage(message, `${value}类型应为字符串或数字`, SUGGESTION_STRING_OR_NUMBER);
|
|
233
|
+
if (!editor_default.get("root")) return;
|
|
234
|
+
if (!editor_default.getNodeById(value)) return defaultMessage(message, `组件(${value})不存在`, uiIdSuggestion());
|
|
235
|
+
};
|
|
236
|
+
var validateDataSourceInput = (value, { message }) => {
|
|
237
|
+
if (typeof value !== "string") return defaultMessage(message, `${value}类型应为字符串`, SUGGESTION_STRING);
|
|
238
|
+
return validateDataSourceTemplateBindings(value, message);
|
|
239
|
+
};
|
|
240
|
+
var validateDataSourceMethodSelect = (value, { message }) => validateDataSourceMethodTuple(value, message);
|
|
241
|
+
var isDataSourceFieldPathValue = (value, config) => {
|
|
242
|
+
if (!Array.isArray(value) || !value.length || value.some((item) => typeof item !== "string")) return false;
|
|
243
|
+
if (config.dataSourceId) return true;
|
|
244
|
+
if (config.value === "key") return true;
|
|
245
|
+
return `${value[0]}`.startsWith(DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX);
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* data-source-field-select 的 typeMatch 校验逻辑,可供自定义 rules.validator 复用。
|
|
249
|
+
*/
|
|
250
|
+
var validateDataSourceFieldSelect = (value, context, options) => {
|
|
251
|
+
const { mForm, message, props } = context;
|
|
252
|
+
const config = props.config || {};
|
|
253
|
+
if (!isDataSourceFieldPathValue(value, config)) {
|
|
254
|
+
if (options?.validatePlainValue) return options.validatePlainValue(value, context);
|
|
255
|
+
if (config.fieldConfig) return validateTypeMatch(value, mForm, {
|
|
256
|
+
...props,
|
|
257
|
+
config: {
|
|
258
|
+
name: config.name,
|
|
259
|
+
...config.fieldConfig
|
|
260
|
+
}
|
|
261
|
+
}, message);
|
|
262
|
+
}
|
|
263
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) return defaultMessage(message, `${value}类型应为字符串数组`, dataSourceFieldPathSuggestion());
|
|
264
|
+
let dataSourceId = config.dataSourceId ? `${config.dataSourceId}` : void 0;
|
|
265
|
+
let fieldNames = value;
|
|
266
|
+
if (!dataSourceId) {
|
|
267
|
+
dataSourceId = value.length ? removeDataSourceFieldPrefix(value[0]) : void 0;
|
|
268
|
+
fieldNames = value.slice(1);
|
|
269
|
+
}
|
|
270
|
+
return validateDataSourceFieldPath(fieldNames, {
|
|
271
|
+
dataSourceId,
|
|
272
|
+
dataSourceFieldType: config.dataSourceFieldType,
|
|
273
|
+
message
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
var validateDataSourceSelect = (value, { message, props }) => {
|
|
277
|
+
const config = props.config || {};
|
|
278
|
+
const dataSources = getDataSources();
|
|
279
|
+
const filtered = config.dataSourceType ? dataSources.filter((ds) => ds.type === config.dataSourceType) : dataSources;
|
|
280
|
+
if (config.value === "id") {
|
|
281
|
+
if (typeof value !== "string") return defaultMessage(message, `${value}类型应为字符串`, SUGGESTION_STRING);
|
|
282
|
+
if (!filtered.length) return;
|
|
283
|
+
if (!filtered.some((ds) => `${ds.id}` === `${value}`)) return defaultMessage(message, `${value}不在可选项中`, listSuggestion(filtered.map((ds) => `${ds.id}`)));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (!isPlainObject(value) || value.isBindDataSource !== true || typeof value.dataSourceId === "undefined") return defaultMessage(message, `${value}类型不合法`, dataSourceBindObjectSuggestion(filtered));
|
|
287
|
+
if (!filtered.length) return;
|
|
288
|
+
const ds = filtered.find((item) => `${item.id}` === `${value.dataSourceId}`);
|
|
289
|
+
if (!ds) return defaultMessage(message, `${value}不在可选项中`, listSuggestion(filtered.map((item) => `${item.id}`)));
|
|
290
|
+
if (typeof value.dataSourceType !== "undefined" && value.dataSourceType !== ds.type) return defaultMessage(message, `${value}不在可选项中`, listSuggestion(filtered.map((item) => `${item.id}`)));
|
|
291
|
+
};
|
|
292
|
+
var validateCodeSelect = (value, { message }) => {
|
|
293
|
+
if (!isPlainObject(value) || !Array.isArray(value.hookData)) return defaultMessage(message, `${value}类型不合法`, SUGGESTION_CODE_SELECT);
|
|
294
|
+
for (const item of value.hookData) {
|
|
295
|
+
if (!isPlainObject(item)) return defaultMessage(message, "钩子项结构不合法", SUGGESTION_HOOK_ITEM);
|
|
296
|
+
if (typeof item.params !== "undefined" && !isPlainObject(item.params)) return defaultMessage(message, "钩子项结构不合法", SUGGESTION_HOOK_ITEM);
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
var validateDataSourceFields = (value, { message }) => {
|
|
300
|
+
if (!Array.isArray(value)) return defaultMessage(message, `${value}类型应为数组`, SUGGESTION_ARRAY);
|
|
301
|
+
for (const item of value) {
|
|
302
|
+
const error = validateDataSourceFieldsItem(item, message);
|
|
303
|
+
if (error) return error;
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
var validateDataSourceMocks = (value, { message }) => {
|
|
307
|
+
if (!Array.isArray(value)) return defaultMessage(message, `${value}类型应为数组`, SUGGESTION_ARRAY);
|
|
308
|
+
for (const item of value) if (!isPlainObject(item) || typeof item.title !== "string" || typeof item.enable !== "boolean" || typeof item.useInEditor !== "boolean" || !isPlainObject(item.data)) return defaultMessage(message, "mock 项结构不合法", SUGGESTION_MOCK_ITEM);
|
|
309
|
+
};
|
|
310
|
+
var validateDataSourceMethods = (value, { message }) => {
|
|
311
|
+
if (!Array.isArray(value)) return defaultMessage(message, `${value}类型应为数组`, SUGGESTION_ARRAY);
|
|
312
|
+
for (const item of value) {
|
|
313
|
+
if (!isPlainObject(item) || typeof item.name !== "string") return defaultMessage(message, "方法项结构不合法", SUGGESTION_METHOD_ITEM);
|
|
314
|
+
if (typeof item.content !== "undefined" && typeof item.content !== "string" && typeof item.content !== "function") return defaultMessage(message, "方法项结构不合法", SUGGESTION_METHOD_ITEM);
|
|
315
|
+
if (typeof item.params !== "undefined" && !Array.isArray(item.params)) return defaultMessage(message, "方法项结构不合法", SUGGESTION_METHOD_ITEM);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
var validateEventSelect = (value, { message }) => {
|
|
319
|
+
if (!Array.isArray(value)) return defaultMessage(message, `${value}类型应为数组`, SUGGESTION_ARRAY);
|
|
320
|
+
for (const item of value) {
|
|
321
|
+
if (!isPlainObject(item) || typeof item.name !== "string") return defaultMessage(message, "事件项结构不合法", SUGGESTION_EVENT_ITEM);
|
|
322
|
+
if (Array.isArray(item.actions)) {
|
|
323
|
+
for (const action of item.actions) if (!isPlainObject(action) || typeof action.actionType === "undefined") return defaultMessage(message, "事件项结构不合法", SUGGESTION_EVENT_ITEM);
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
if (typeof item.to === "undefined" || typeof item.method !== "string") return defaultMessage(message, "事件项结构不合法", SUGGESTION_EVENT_ITEM);
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
var validateDisplayConds = (value, { message }) => {
|
|
330
|
+
if (!Array.isArray(value)) return defaultMessage(message, `${value}类型应为数组`, SUGGESTION_ARRAY);
|
|
331
|
+
for (const item of value) {
|
|
332
|
+
if (!isPlainObject(item) || !Array.isArray(item.cond)) return defaultMessage(message, "显示条件结构不合法", displayCondSuggestion());
|
|
333
|
+
for (const cond of item.cond) if (!isPlainObject(cond) || !Array.isArray(cond.field) || cond.field.some((part) => typeof part !== "string") || typeof cond.op !== "string") return defaultMessage(message, "显示条件结构不合法", displayCondSuggestion());
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
var editorTypeMatchRules = {
|
|
337
|
+
"key-value": validateKeyValue,
|
|
338
|
+
"style-setter": validateStyleSetter,
|
|
339
|
+
"cond-op-select": validateCondOpSelect,
|
|
340
|
+
"code-select-col": validateCodeSelectCol,
|
|
341
|
+
"page-fragment-select": validatePageFragmentSelect,
|
|
342
|
+
"ui-select": validateUiSelect,
|
|
343
|
+
"data-source-input": validateDataSourceInput,
|
|
344
|
+
"data-source-method-select": validateDataSourceMethodSelect,
|
|
345
|
+
/** 注册进 typeMatch 规则表的入口,收窄为 TypeMatchValidator,避免调用方误传第三个参数 */
|
|
346
|
+
"data-source-field-select": (value, context) => validateDataSourceFieldSelect(value, context),
|
|
347
|
+
"data-source-select": validateDataSourceSelect,
|
|
348
|
+
"code-select": validateCodeSelect,
|
|
349
|
+
"data-source-fields": validateDataSourceFields,
|
|
350
|
+
"data-source-mocks": validateDataSourceMocks,
|
|
351
|
+
"data-source-methods": validateDataSourceMethods,
|
|
352
|
+
"event-select": validateEventSelect,
|
|
353
|
+
"display-conds": validateDisplayConds
|
|
354
|
+
};
|
|
355
|
+
//#endregion
|
|
356
|
+
export { ALL_COND_OPS, editorTypeMatchRules, validateDataSourceFieldSelect };
|