@tmagic/editor 1.8.0-beta.24 → 1.8.0-beta.26
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 +10 -16
- package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +5 -8
- package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +3 -5
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +3 -11
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +29 -124
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -6
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +7 -6
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +6 -10
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +5 -7
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +1 -4
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -6
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +9 -137
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +51 -326
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +2 -4
- package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +3 -34
- package/dist/es/fields/StyleSetter/configs.js +663 -0
- package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +5 -108
- package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +3 -9
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -103
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +5 -265
- package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +5 -85
- package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +3 -22
- 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 +20 -0
- package/dist/es/fields/headless-validation.js +139 -0
- package/dist/es/headless.js +2 -0
- package/dist/es/hooks/use-compare-form.js +6 -23
- package/dist/es/hooks/use-form-context.js +19 -0
- package/dist/es/index.js +3 -2
- package/dist/es/initService.js +17 -1
- package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +1 -7
- package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +1 -11
- package/dist/es/layouts/history-list/useHistoryRevert.js +3 -11
- package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +10 -23
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +3 -13
- package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/code-block/useContentMenu.js +1 -1
- package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/layouts/sidebar/data-source/useContentMenu.js +1 -1
- package/dist/es/plugin.js +33 -32
- package/dist/es/style.css +120 -60
- package/dist/es/utils/data-source/index.js +2 -1
- package/dist/es/utils/props.js +1 -4
- package/dist/es/utils/type-match-rules.js +23 -22
- package/dist/style.css +120 -60
- package/dist/themes/magic-admin.css +132 -67
- package/dist/tmagic-editor-headless.umd.cjs +10867 -0
- package/dist/tmagic-editor.umd.cjs +2151 -2034
- package/package.json +12 -7
- package/src/Editor.vue +12 -16
- package/src/components/CodeParams.vue +10 -4
- package/src/components/CompareForm.vue +4 -5
- package/src/components/ViewForm.vue +2 -3
- package/src/editorProps.ts +1 -2
- package/src/fields/Code.vue +2 -10
- package/src/fields/CodeSelect.vue +20 -116
- package/src/fields/CodeSelectCol.vue +3 -5
- package/src/fields/CondOpSelect.vue +3 -2
- package/src/fields/DataSourceFieldSelect/FieldSelect.vue +1 -1
- package/src/fields/DataSourceFieldSelect/Index.vue +7 -6
- package/src/fields/DataSourceFields.vue +0 -7
- package/src/fields/DataSourceMethodSelect.vue +2 -5
- package/src/fields/DataSourceMethods.vue +1 -6
- package/src/fields/DataSourceMocks.vue +1 -10
- package/src/fields/DataSourceSelect.vue +1 -1
- package/src/fields/DisplayConds.vue +17 -153
- package/src/fields/EventSelect.vue +28 -375
- package/src/fields/KeyValue.vue +3 -4
- package/src/fields/StyleSetter/components/Border.vue +4 -38
- package/src/fields/StyleSetter/configs.ts +690 -0
- package/src/fields/StyleSetter/pro/Background.vue +4 -104
- package/src/fields/StyleSetter/pro/Border.vue +3 -12
- package/src/fields/StyleSetter/pro/Font.vue +5 -124
- package/src/fields/StyleSetter/pro/Layout.vue +4 -219
- package/src/fields/StyleSetter/pro/Position.vue +6 -110
- package/src/fields/StyleSetter/pro/Transform.vue +4 -30
- 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 +31 -0
- package/src/fields/headless-validation.ts +177 -0
- package/src/headless.ts +33 -0
- package/src/hooks/use-compare-form.ts +7 -25
- package/src/hooks/use-form-context.ts +40 -0
- package/src/index.ts +2 -0
- package/src/initService.ts +23 -1
- package/src/layouts/history-list/HistoryDiffDialog.vue +0 -10
- package/src/layouts/history-list/HistoryListPanel.vue +1 -13
- package/src/layouts/history-list/useHistoryRevert.ts +7 -13
- package/src/layouts/props-panel/FormPanel.vue +17 -28
- package/src/layouts/props-panel/PropsPanel.vue +1 -4
- package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
- package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
- package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +1 -1
- package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
- package/src/plugin.ts +32 -33
- package/src/theme/code-block.scss +0 -37
- package/src/theme/display-conds.scss +4 -0
- package/src/theme/event.scss +22 -45
- package/src/theme/props-panel.scss +17 -3
- package/src/theme/themes/magic-admin/index.scss +12 -1
- package/src/type.ts +10 -29
- package/src/utils/data-source/index.ts +1 -0
- package/src/utils/props.ts +1 -4
- package/src/utils/type-match-rules.ts +37 -31
- package/types/headless.d.ts +18 -0
- package/types/index.d.ts +155 -180
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import CodeBlockEditor_default from "../components/CodeBlockEditor.js";
|
|
2
|
-
import { FORM_SILENT_MODE_KEY } from "@tmagic/form";
|
|
3
2
|
import { MagicTable } from "@tmagic/table";
|
|
4
3
|
import { TMagicButton, tMagicMessageBox } from "@tmagic/design";
|
|
5
4
|
import { computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, inject, nextTick, onMounted, openBlock, ref, unref, useTemplateRef, withCtx } from "vue";
|
|
@@ -36,7 +35,6 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
36
35
|
const props = __props;
|
|
37
36
|
const emit = __emit;
|
|
38
37
|
const mForm = inject("mForm");
|
|
39
|
-
const silentMode = inject(FORM_SILENT_MODE_KEY, false);
|
|
40
38
|
/** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
|
|
41
39
|
const isCompare = computed(() => Boolean(mForm?.isCompare));
|
|
42
40
|
const codeConfig = ref();
|
|
@@ -130,7 +128,6 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
130
128
|
/** 由 DataSourceConfigPanel 注入:打开数据源详情后需要直接打开的方法名 */
|
|
131
129
|
const editingMethodName = inject("editingDataSourceMethodName", computed(() => ""));
|
|
132
130
|
onMounted(() => {
|
|
133
|
-
if (silentMode) return;
|
|
134
131
|
const methodName = editingMethodName.value;
|
|
135
132
|
if (!methodName) return;
|
|
136
133
|
const methods = props.model[props.name] || [];
|
|
@@ -155,7 +152,7 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
155
152
|
default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("添加", -1)])]),
|
|
156
153
|
_: 1
|
|
157
154
|
}, 8, ["disabled"])])) : createCommentVNode("v-if", true),
|
|
158
|
-
codeConfig.value
|
|
155
|
+
codeConfig.value ? (openBlock(), createBlock(CodeBlockEditor_default, {
|
|
159
156
|
key: 1,
|
|
160
157
|
ref: "codeBlockEditor",
|
|
161
158
|
disabled: __props.disabled,
|
|
@@ -3,11 +3,11 @@ import { useEditorContentHeight } from "../hooks/use-editor-content-height.js";
|
|
|
3
3
|
import { useNextFloatBoxPosition } from "../hooks/use-next-float-box-position.js";
|
|
4
4
|
import CodeEditor_default from "../layouts/CodeEditor.js";
|
|
5
5
|
import FloatingBox_default from "../components/FloatingBox.js";
|
|
6
|
-
import {
|
|
6
|
+
import { MFormBox } from "@tmagic/form";
|
|
7
7
|
import { MagicTable } from "@tmagic/table";
|
|
8
8
|
import { TMagicButton, TMagicSwitch, tMagicMessageBox } from "@tmagic/design";
|
|
9
9
|
import { getDefaultValueFromFields } from "@tmagic/utils";
|
|
10
|
-
import { computed,
|
|
10
|
+
import { computed, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, inject, isRef, mergeModels, openBlock, ref, unref, useModel, withCtx } from "vue";
|
|
11
11
|
//#region packages/editor/src/fields/DataSourceMocks.vue?vue&type=script&setup=true&lang.ts
|
|
12
12
|
var _hoisted_1 = { class: "m-editor-data-source-fields" };
|
|
13
13
|
var _hoisted_2 = {
|
|
@@ -49,7 +49,6 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
49
49
|
const emit = __emit;
|
|
50
50
|
const { uiService } = useServices();
|
|
51
51
|
const mForm = inject("mForm");
|
|
52
|
-
const silentMode = inject(FORM_SILENT_MODE_KEY, false);
|
|
53
52
|
/** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
|
|
54
53
|
const isCompare = computed(() => Boolean(mForm?.isCompare));
|
|
55
54
|
const width = useModel(__props, "width");
|
|
@@ -235,8 +234,7 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
235
234
|
default: withCtx(() => [..._cache[4] || (_cache[4] = [createTextVNode("添加", -1)])]),
|
|
236
235
|
_: 1
|
|
237
236
|
}, 8, ["disabled"])])) : createCommentVNode("v-if", true),
|
|
238
|
-
|
|
239
|
-
key: 1,
|
|
237
|
+
createVNode(FloatingBox_default, {
|
|
240
238
|
"body-style": { padding: "0 16px" },
|
|
241
239
|
visible: addDialogVisible.value,
|
|
242
240
|
"onUpdate:visible": _cache[1] || (_cache[1] = ($event) => addDialogVisible.value = $event),
|
|
@@ -268,7 +266,7 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
268
266
|
"title",
|
|
269
267
|
"framework-width",
|
|
270
268
|
"position"
|
|
271
|
-
])
|
|
269
|
+
])
|
|
272
270
|
]);
|
|
273
271
|
};
|
|
274
272
|
}
|
|
@@ -34,7 +34,7 @@ var DataSourceSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
34
34
|
const props = __props;
|
|
35
35
|
const mForm = inject("mForm");
|
|
36
36
|
const { dataSourceService, uiService } = useServices();
|
|
37
|
-
const eventBus = inject("eventBus");
|
|
37
|
+
const eventBus = inject("eventBus", null);
|
|
38
38
|
const dataSources = computed(() => dataSourceService.get("dataSources"));
|
|
39
39
|
const notEditable = computed(() => filterFunction(mForm, props.config.notEditable, props));
|
|
40
40
|
/** 对比模式下隐藏查看/编辑操作按钮,仅保留只读展示。 */
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getCascaderOptionsFromFields, getFieldType } from "../utils/data-source/index.js";
|
|
1
|
+
import { createDisplayCondsConfig } from "./configs/displayConds.js";
|
|
3
2
|
import { MGroupList, filterFunction } from "@tmagic/form";
|
|
4
|
-
import { computed,
|
|
3
|
+
import { computed, createElementBlock, createVNode, defineComponent, inject, openBlock, unref } from "vue";
|
|
5
4
|
//#region packages/editor/src/fields/DisplayConds.vue?vue&type=script&setup=true&lang.ts
|
|
5
|
+
var _hoisted_1 = { class: "m-fields-display-conds" };
|
|
6
6
|
var DisplayConds_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
7
7
|
name: "m-fields-display-conds",
|
|
8
8
|
__name: "DisplayConds",
|
|
@@ -28,150 +28,21 @@ var DisplayConds_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
|
|
|
28
28
|
setup(__props, { emit: __emit }) {
|
|
29
29
|
const emit = __emit;
|
|
30
30
|
const props = __props;
|
|
31
|
-
const { dataSourceService } = useServices();
|
|
32
31
|
const mForm = inject("mForm");
|
|
33
32
|
const parentFields = computed(() => filterFunction(mForm, props.config.parentFields, props) || []);
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const ds = dataSourceService.getDataSourceById(id);
|
|
37
|
-
const type = getFieldType(ds, fieldNames);
|
|
38
|
-
if (type === "number") model.value = Number(model.value);
|
|
39
|
-
else if (type === "boolean") model.value = Boolean(model.value);
|
|
40
|
-
else if (type === "null") model.value = null;
|
|
41
|
-
else model.value = `${model.value}`;
|
|
42
|
-
return v;
|
|
43
|
-
};
|
|
44
|
-
const config = computed(() => ({
|
|
45
|
-
type: "groupList",
|
|
46
|
-
name: props.name,
|
|
47
|
-
titlePrefix: props.config.titlePrefix,
|
|
48
|
-
expandAll: true,
|
|
49
|
-
enableToggleMode: false,
|
|
50
|
-
flat: props.config.flat,
|
|
51
|
-
items: [{
|
|
52
|
-
type: "table",
|
|
53
|
-
name: "cond",
|
|
54
|
-
operateColWidth: props.config.operateColWidth,
|
|
55
|
-
enableToggleMode: false,
|
|
56
|
-
fixed: props.config.fixed,
|
|
57
|
-
flat: props.config.flat,
|
|
58
|
-
items: [
|
|
59
|
-
parentFields.value.length ? {
|
|
60
|
-
type: "cascader",
|
|
61
|
-
options: () => {
|
|
62
|
-
const [dsId, ...keys] = parentFields.value;
|
|
63
|
-
const ds = dataSourceService.getDataSourceById(dsId);
|
|
64
|
-
if (!ds) return [];
|
|
65
|
-
let fields = ds.fields || [];
|
|
66
|
-
keys.forEach((key) => {
|
|
67
|
-
fields = fields.find((f) => f.name === key)?.fields || [];
|
|
68
|
-
});
|
|
69
|
-
return getCascaderOptionsFromFields(fields, [
|
|
70
|
-
"string",
|
|
71
|
-
"number",
|
|
72
|
-
"boolean",
|
|
73
|
-
"any"
|
|
74
|
-
]);
|
|
75
|
-
},
|
|
76
|
-
name: "field",
|
|
77
|
-
value: "key",
|
|
78
|
-
label: "字段",
|
|
79
|
-
checkStrictly: false,
|
|
80
|
-
onChange: fieldOnChange,
|
|
81
|
-
defaultValue: () => [],
|
|
82
|
-
rules: [{
|
|
83
|
-
required: true,
|
|
84
|
-
trigger: "blur",
|
|
85
|
-
message: "请选择字段"
|
|
86
|
-
}, {
|
|
87
|
-
typeMatch: true,
|
|
88
|
-
trigger: "change"
|
|
89
|
-
}]
|
|
90
|
-
} : {
|
|
91
|
-
type: "data-source-field-select",
|
|
92
|
-
name: "field",
|
|
93
|
-
value: "key",
|
|
94
|
-
label: "字段",
|
|
95
|
-
checkStrictly: false,
|
|
96
|
-
dataSourceFieldType: [
|
|
97
|
-
"string",
|
|
98
|
-
"number",
|
|
99
|
-
"boolean",
|
|
100
|
-
"any"
|
|
101
|
-
],
|
|
102
|
-
onChange: fieldOnChange,
|
|
103
|
-
defaultValue: () => [],
|
|
104
|
-
rules: [{
|
|
105
|
-
required: true,
|
|
106
|
-
trigger: "blur",
|
|
107
|
-
message: "请选择字段"
|
|
108
|
-
}, {
|
|
109
|
-
typeMatch: true,
|
|
110
|
-
trigger: "change"
|
|
111
|
-
}]
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
type: "cond-op-select",
|
|
115
|
-
parentFields: parentFields.value,
|
|
116
|
-
label: "条件",
|
|
117
|
-
width: 140,
|
|
118
|
-
name: "op",
|
|
119
|
-
rules: [{
|
|
120
|
-
required: true,
|
|
121
|
-
trigger: "blur",
|
|
122
|
-
message: "请选择条件"
|
|
123
|
-
}, {
|
|
124
|
-
typeMatch: true,
|
|
125
|
-
trigger: "change"
|
|
126
|
-
}]
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
label: "值",
|
|
130
|
-
width: 160,
|
|
131
|
-
items: [{
|
|
132
|
-
name: "value",
|
|
133
|
-
type: (_mForm, { model }) => {
|
|
134
|
-
const [id, ...fieldNames] = [...parentFields.value, ...model.field];
|
|
135
|
-
const ds = dataSourceService.getDataSourceById(id);
|
|
136
|
-
const type = getFieldType(ds, fieldNames);
|
|
137
|
-
if (type === "number") return "number";
|
|
138
|
-
if (type === "boolean") return "select";
|
|
139
|
-
if (type === "null") return "display";
|
|
140
|
-
return "text";
|
|
141
|
-
},
|
|
142
|
-
options: [{
|
|
143
|
-
text: "true",
|
|
144
|
-
value: true
|
|
145
|
-
}, {
|
|
146
|
-
text: "false",
|
|
147
|
-
value: false
|
|
148
|
-
}],
|
|
149
|
-
display: (_mForm, { model }) => !["between", "not_between"].includes(model.op),
|
|
150
|
-
displayText: (_mForm, { model }) => {
|
|
151
|
-
if (model.value === null) return "null";
|
|
152
|
-
return model.value;
|
|
153
|
-
}
|
|
154
|
-
}, {
|
|
155
|
-
name: "range",
|
|
156
|
-
type: "number-range",
|
|
157
|
-
display: (vm, { model }) => ["between", "not_between"].includes(model.op)
|
|
158
|
-
}]
|
|
159
|
-
}
|
|
160
|
-
]
|
|
161
|
-
}]
|
|
162
|
-
}));
|
|
33
|
+
const config = computed(() => createDisplayCondsConfig(props.config, props.name, parentFields.value));
|
|
34
|
+
const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
|
|
163
35
|
const changeHandler = (v, eventData) => {
|
|
164
|
-
if (!Array.isArray(props.model[props.name])) props.model[props.name] = [];
|
|
165
36
|
emit("change", v, eventData);
|
|
166
37
|
};
|
|
167
38
|
return (_ctx, _cache) => {
|
|
168
|
-
return openBlock(),
|
|
169
|
-
style: { "width": "100%" },
|
|
39
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(MGroupList), {
|
|
170
40
|
config: config.value,
|
|
171
41
|
name: __props.name,
|
|
172
42
|
disabled: __props.disabled,
|
|
173
43
|
model: __props.model,
|
|
174
44
|
"last-values": __props.lastValues,
|
|
45
|
+
"is-compare": isCompareMode.value,
|
|
175
46
|
prop: __props.prop,
|
|
176
47
|
size: __props.size,
|
|
177
48
|
onChange: changeHandler
|
|
@@ -181,9 +52,10 @@ var DisplayConds_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
|
|
|
181
52
|
"disabled",
|
|
182
53
|
"model",
|
|
183
54
|
"last-values",
|
|
55
|
+
"is-compare",
|
|
184
56
|
"prop",
|
|
185
57
|
"size"
|
|
186
|
-
]);
|
|
58
|
+
])]);
|
|
187
59
|
};
|
|
188
60
|
}
|
|
189
61
|
});
|
|
@@ -1,19 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { TMagicButton } from "@tmagic/design";
|
|
5
|
-
import { ActionType } from "@tmagic/core";
|
|
6
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
|
|
7
|
-
import { has } from "lodash-es";
|
|
8
|
-
import { Delete, Plus } from "@element-plus/icons-vue";
|
|
1
|
+
import { createEventNameConfig, createEventSelectConfig, createLegacyTableConfig, isLegacyEventValue } from "./configs/eventSelect.js";
|
|
2
|
+
import { MContainer, MGroupList, MTable } from "@tmagic/form";
|
|
3
|
+
import { computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
|
|
9
4
|
//#region packages/editor/src/fields/EventSelect.vue?vue&type=script&setup=true&lang.ts
|
|
10
5
|
var _hoisted_1 = { class: "m-fields-event-select" };
|
|
11
6
|
var _hoisted_2 = {
|
|
12
7
|
key: 1,
|
|
13
8
|
class: "fullWidth event-select-container"
|
|
14
9
|
};
|
|
15
|
-
var _hoisted_3 = { class: "event-
|
|
16
|
-
var _hoisted_4 = { class: "event-item-header" };
|
|
10
|
+
var _hoisted_3 = { class: "event-item-header" };
|
|
17
11
|
var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
18
12
|
name: "MFieldsEventSelect",
|
|
19
13
|
__name: "EventSelect",
|
|
@@ -36,244 +30,21 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
36
30
|
setup(__props, { emit: __emit }) {
|
|
37
31
|
const props = __props;
|
|
38
32
|
const emit = __emit;
|
|
39
|
-
const
|
|
40
|
-
const eventNameConfig = computed(() =>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
text: "事件类型",
|
|
44
|
-
type: (mForm, { formValue }) => {
|
|
45
|
-
if (props.config.src !== "component" || formValue.type === "page-fragment-container" && formValue.pageFragmentId) return "cascader";
|
|
46
|
-
return "select";
|
|
47
|
-
},
|
|
48
|
-
labelWidth: "70px",
|
|
49
|
-
checkStrictly: () => props.config.src !== "component",
|
|
50
|
-
valueSeparator: ".",
|
|
51
|
-
options: (_mForm, { formValue }) => getEventNameOptions(props.config.src, formValue),
|
|
52
|
-
rules: [{
|
|
53
|
-
validator: ({ value, callback }, { formValue }) => {
|
|
54
|
-
const allowedNames = getEventNameAllowedValues(props.config, formValue);
|
|
55
|
-
if (allowedNames && allowedNames.size > 0 && value && !allowedNames.has(value)) return callback(`事件名(${value})不存在`);
|
|
56
|
-
callback();
|
|
57
|
-
},
|
|
58
|
-
trigger: "blur"
|
|
59
|
-
}],
|
|
60
|
-
...props.config.eventNameConfig
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
const actionTypeOptions = computed(() => {
|
|
64
|
-
const o = [{
|
|
65
|
-
text: "组件",
|
|
66
|
-
label: "组件",
|
|
67
|
-
value: ActionType.COMP
|
|
68
|
-
}];
|
|
69
|
-
if (!propsService.getDisabledCodeBlock()) o.push({
|
|
70
|
-
text: "代码",
|
|
71
|
-
label: "代码",
|
|
72
|
-
disabled: !Object.keys(codeBlockService.getCodeDsl() || {}).length,
|
|
73
|
-
value: ActionType.CODE
|
|
74
|
-
});
|
|
75
|
-
if (!propsService.getDisabledDataSource()) o.push({
|
|
76
|
-
text: "数据源",
|
|
77
|
-
label: "数据源",
|
|
78
|
-
value: ActionType.DATA_SOURCE
|
|
79
|
-
});
|
|
80
|
-
return o;
|
|
81
|
-
});
|
|
82
|
-
const actionTypeConfig = computed(() => {
|
|
83
|
-
return {
|
|
84
|
-
name: "actionType",
|
|
85
|
-
text: "联动类型",
|
|
86
|
-
type: "select",
|
|
87
|
-
labelPosition: "left",
|
|
88
|
-
defaultValue: ActionType.COMP,
|
|
89
|
-
options: actionTypeOptions.value,
|
|
90
|
-
rules: [{
|
|
91
|
-
required: true,
|
|
92
|
-
message: "联动类型不能为空"
|
|
93
|
-
}, {
|
|
94
|
-
typeMatch: true,
|
|
95
|
-
trigger: "blur"
|
|
96
|
-
}],
|
|
97
|
-
onChange: (_mForm, _v, { setModel }) => {
|
|
98
|
-
setModel("to", "");
|
|
99
|
-
setModel("method", "");
|
|
100
|
-
setModel("codeId", "");
|
|
101
|
-
setModel("dataSourceMethod", []);
|
|
102
|
-
},
|
|
103
|
-
...props.config.actionTypeConfig
|
|
104
|
-
};
|
|
105
|
-
});
|
|
106
|
-
const targetCompConfig = computed(() => {
|
|
107
|
-
return {
|
|
108
|
-
name: "to",
|
|
109
|
-
text: "联动组件",
|
|
110
|
-
type: "ui-select",
|
|
111
|
-
labelPosition: "left",
|
|
112
|
-
display: (_mForm, { model }) => model.actionType === ActionType.COMP,
|
|
113
|
-
onChange: (_mForm, _v, { setModel }) => {
|
|
114
|
-
setModel("method", "");
|
|
115
|
-
},
|
|
116
|
-
rules: [{
|
|
117
|
-
typeMatch: true,
|
|
118
|
-
trigger: "blur"
|
|
119
|
-
}],
|
|
120
|
-
...props.config.targetCompConfig
|
|
121
|
-
};
|
|
122
|
-
});
|
|
123
|
-
const compActionConfig = computed(() => {
|
|
124
|
-
return {
|
|
125
|
-
name: "method",
|
|
126
|
-
text: "动作",
|
|
127
|
-
labelPosition: "left",
|
|
128
|
-
type: (mForm, { model }) => {
|
|
129
|
-
const to = editorService.getNodeById(model.to);
|
|
130
|
-
if (to && to.type === "page-fragment-container" && to.pageFragmentId) return "cascader";
|
|
131
|
-
return "select";
|
|
132
|
-
},
|
|
133
|
-
checkStrictly: () => props.config.src !== "component",
|
|
134
|
-
display: (mForm, { model }) => model.actionType === ActionType.COMP,
|
|
135
|
-
options: (_mForm, { model }) => getCompActionOptions(model.to),
|
|
136
|
-
rules: [{
|
|
137
|
-
trigger: "blur",
|
|
138
|
-
validator: ({ value, callback }, { model }) => {
|
|
139
|
-
const allowedMethods = getCompActionAllowedValues(props.config, model);
|
|
140
|
-
const normalized = normalizeCompActionValue(value);
|
|
141
|
-
if (allowedMethods && allowedMethods.size > 0 && normalized && !allowedMethods.has(normalized)) return callback(`动作名(${normalized})不存在`);
|
|
142
|
-
callback();
|
|
143
|
-
}
|
|
144
|
-
}],
|
|
145
|
-
...props.config.compActionConfig
|
|
146
|
-
};
|
|
147
|
-
});
|
|
148
|
-
const codeActionConfig = computed(() => {
|
|
149
|
-
return {
|
|
150
|
-
type: "code-select-col",
|
|
151
|
-
text: "代码块",
|
|
152
|
-
name: "codeId",
|
|
153
|
-
notEditable: () => !codeBlockService.getEditStatus(),
|
|
154
|
-
display: (mForm, { model }) => model.actionType === ActionType.CODE,
|
|
155
|
-
...props.config.codeActionConfig
|
|
156
|
-
};
|
|
157
|
-
});
|
|
158
|
-
const dataSourceActionConfig = computed(() => {
|
|
159
|
-
return {
|
|
160
|
-
type: "data-source-method-select",
|
|
161
|
-
text: "数据源方法",
|
|
162
|
-
name: "dataSourceMethod",
|
|
163
|
-
notEditable: () => !dataSourceService.get("editable"),
|
|
164
|
-
display: (mForm, { model }) => model.actionType === ActionType.DATA_SOURCE,
|
|
165
|
-
...props.config.dataSourceActionConfig
|
|
166
|
-
};
|
|
167
|
-
});
|
|
168
|
-
const tableConfig = computed(() => defineFormItem({
|
|
169
|
-
type: "table",
|
|
170
|
-
name: "events",
|
|
171
|
-
items: [
|
|
172
|
-
{
|
|
173
|
-
name: "name",
|
|
174
|
-
label: "事件名",
|
|
175
|
-
type: eventNameConfig.value.type,
|
|
176
|
-
options: (mForm, { formValue }) => eventsService.getEvent(formValue.type, { node: editorService.getNodeById(formValue.id) }).map((option) => ({
|
|
177
|
-
text: option.label,
|
|
178
|
-
value: option.value
|
|
179
|
-
}))
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
name: "to",
|
|
183
|
-
label: "联动组件",
|
|
184
|
-
type: "ui-select"
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
name: "method",
|
|
188
|
-
label: "动作",
|
|
189
|
-
type: compActionConfig.value.type,
|
|
190
|
-
options: (mForm, { model, formValue }) => {
|
|
191
|
-
const node = editorService.getNodeById(model.to) || formValue;
|
|
192
|
-
if (!node?.type) return [];
|
|
193
|
-
return eventsService.getMethod(node.type, {
|
|
194
|
-
targetId: model.to,
|
|
195
|
-
node
|
|
196
|
-
}).map((option) => ({
|
|
197
|
-
text: option.label,
|
|
198
|
-
value: option.value
|
|
199
|
-
}));
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
]
|
|
203
|
-
}));
|
|
204
|
-
const actionsConfig = computed(() => defineFormItem({
|
|
205
|
-
type: "panel",
|
|
206
|
-
labelPosition: "left",
|
|
207
|
-
items: [{
|
|
208
|
-
type: "group-list",
|
|
209
|
-
name: "actions",
|
|
210
|
-
expandAll: true,
|
|
211
|
-
enableToggleMode: false,
|
|
212
|
-
titlePrefix: "动作",
|
|
213
|
-
labelPosition: "left",
|
|
214
|
-
items: [
|
|
215
|
-
actionTypeConfig.value,
|
|
216
|
-
targetCompConfig.value,
|
|
217
|
-
compActionConfig.value,
|
|
218
|
-
codeActionConfig.value,
|
|
219
|
-
dataSourceActionConfig.value
|
|
220
|
-
]
|
|
221
|
-
}]
|
|
222
|
-
}));
|
|
223
|
-
const isOldVersion = computed(() => {
|
|
224
|
-
if (props.model[props.name].length === 0) return false;
|
|
225
|
-
return !has(props.model[props.name][0], "actions");
|
|
226
|
-
});
|
|
33
|
+
const tableConfig = computed(() => createLegacyTableConfig(props.config));
|
|
34
|
+
const eventNameConfig = computed(() => createEventNameConfig(props.config));
|
|
35
|
+
const eventConfig = computed(() => createEventSelectConfig(props.config, props.name));
|
|
36
|
+
const isOldVersion = computed(() => isLegacyEventValue(props.model[props.name]));
|
|
227
37
|
/**
|
|
228
38
|
* 对比模式判定:
|
|
229
39
|
*
|
|
230
|
-
* event-select
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
* 内部的 MPanel / MFormContainer,逐项(事件名、动作)展示前后差异。
|
|
40
|
+
* event-select 内部是事件列表 group-list。父级 `MFormContainer` 已将其归入「自接管对比字段」
|
|
41
|
+
* (见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),对比时只渲染一次本组件,并把 `is-compare` /
|
|
42
|
+
* `lastValues` 透传给内部 MGroupList 与 title slot 里的事件名表单。
|
|
234
43
|
*
|
|
235
44
|
* 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
|
|
236
45
|
*/
|
|
237
46
|
const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
|
|
238
|
-
|
|
239
|
-
* 待渲染的事件卡片列表。
|
|
240
|
-
*
|
|
241
|
-
* - 非对比模式:直接映射当前事件列表,`lastCardItem` 为空;
|
|
242
|
-
* - 对比模式:按索引对齐当前值与历史值,取两者长度的最大值,使得「新增」(仅当前有)与
|
|
243
|
-
* 「删除」(仅历史有)的事件都能被渲染出来;缺失的一侧用空对象兜底,从而让子级正确高亮差异。
|
|
244
|
-
*/
|
|
245
|
-
const displayList = computed(() => {
|
|
246
|
-
const current = props.model[props.name] || [];
|
|
247
|
-
if (!isCompareMode.value) return current.map((cardItem, index) => ({
|
|
248
|
-
cardItem,
|
|
249
|
-
lastCardItem: void 0,
|
|
250
|
-
index
|
|
251
|
-
}));
|
|
252
|
-
const last = props.lastValues?.[props.name] || [];
|
|
253
|
-
const length = Math.max(current.length, last.length);
|
|
254
|
-
return Array.from({ length }, (_, index) => ({
|
|
255
|
-
cardItem: current[index] ?? {},
|
|
256
|
-
lastCardItem: last[index] ?? {},
|
|
257
|
-
index
|
|
258
|
-
}));
|
|
259
|
-
});
|
|
260
|
-
const addEvent = () => {
|
|
261
|
-
const defaultEvent = {
|
|
262
|
-
name: "",
|
|
263
|
-
actions: []
|
|
264
|
-
};
|
|
265
|
-
if (!props.model[props.name]) props.model[props.name] = [];
|
|
266
|
-
emit("change", defaultEvent, { modifyKey: props.model[props.name].length });
|
|
267
|
-
};
|
|
268
|
-
const removeEvent = (index) => {
|
|
269
|
-
if (!props.name) return;
|
|
270
|
-
props.model[props.name].splice(index, 1);
|
|
271
|
-
emit("change", props.model[props.name]);
|
|
272
|
-
};
|
|
273
|
-
const eventNameChangeHandler = (v, eventData) => {
|
|
274
|
-
emit("change", props.model[props.name], eventData);
|
|
275
|
-
};
|
|
276
|
-
const onChangeHandler = (v, eventData) => emit("change", props.model[props.name], eventData);
|
|
47
|
+
const onChangeHandler = (_v, eventData) => emit("change", props.model[props.name], eventData);
|
|
277
48
|
return (_ctx, _cache) => {
|
|
278
49
|
return openBlock(), createElementBlock("div", _hoisted_1, [isOldVersion.value ? (openBlock(), createBlock(unref(MTable), {
|
|
279
50
|
key: 0,
|
|
@@ -292,93 +63,47 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
292
63
|
"last-values",
|
|
293
64
|
"is-compare",
|
|
294
65
|
"config"
|
|
295
|
-
])) : (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
66
|
+
])) : (openBlock(), createElementBlock("div", _hoisted_2, [_cache[0] || (_cache[0] = createElementVNode("div", { class: "event-select-header" }, [createElementVNode("div", { class: "event-select-title" }, "事件配置")], -1)), createVNode(unref(MGroupList), {
|
|
67
|
+
config: eventConfig.value,
|
|
68
|
+
name: __props.name,
|
|
69
|
+
disabled: __props.disabled,
|
|
70
|
+
model: __props.model,
|
|
71
|
+
"last-values": __props.lastValues,
|
|
72
|
+
"is-compare": isCompareMode.value,
|
|
73
|
+
prop: __props.prop,
|
|
74
|
+
size: __props.size,
|
|
75
|
+
onChange: onChangeHandler
|
|
76
|
+
}, {
|
|
77
|
+
title: withCtx(({ model: itemModel, lastValues: itemLastValues, prop: itemProp }) => [createElementVNode("div", _hoisted_3, [createVNode(unref(MContainer), {
|
|
78
|
+
class: "fullWidth",
|
|
79
|
+
config: eventNameConfig.value,
|
|
80
|
+
model: itemModel,
|
|
81
|
+
"last-values": itemLastValues,
|
|
82
|
+
"is-compare": isCompareMode.value,
|
|
303
83
|
disabled: __props.disabled,
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
"
|
|
84
|
+
size: __props.size,
|
|
85
|
+
prop: itemProp,
|
|
86
|
+
onChange: onChangeHandler
|
|
87
|
+
}, null, 8, [
|
|
88
|
+
"config",
|
|
89
|
+
"model",
|
|
90
|
+
"last-values",
|
|
91
|
+
"is-compare",
|
|
92
|
+
"disabled",
|
|
310
93
|
"size",
|
|
311
|
-
"
|
|
312
|
-
]))
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
"label-width": __props.config.labelWidth || "100px",
|
|
325
|
-
onChange: onChangeHandler
|
|
326
|
-
}, {
|
|
327
|
-
header: withCtx(() => [createElementVNode("div", _hoisted_4, [createVNode(unref(MContainer), {
|
|
328
|
-
class: "fullWidth",
|
|
329
|
-
config: eventNameConfig.value,
|
|
330
|
-
model: entry.cardItem,
|
|
331
|
-
"last-values": entry.lastCardItem,
|
|
332
|
-
"is-compare": isCompareMode.value,
|
|
333
|
-
disabled: __props.disabled,
|
|
334
|
-
size: __props.size,
|
|
335
|
-
prop: `${__props.prop}.${entry.index}`,
|
|
336
|
-
onChange: eventNameChangeHandler
|
|
337
|
-
}, null, 8, [
|
|
338
|
-
"config",
|
|
339
|
-
"model",
|
|
340
|
-
"last-values",
|
|
341
|
-
"is-compare",
|
|
342
|
-
"disabled",
|
|
343
|
-
"size",
|
|
344
|
-
"prop"
|
|
345
|
-
]), !isCompareMode.value ? (openBlock(), createBlock(unref(TMagicButton), {
|
|
346
|
-
key: 0,
|
|
347
|
-
class: "event-item-delete-button",
|
|
348
|
-
link: "",
|
|
349
|
-
icon: unref(Delete),
|
|
350
|
-
disabled: __props.disabled,
|
|
351
|
-
size: __props.size,
|
|
352
|
-
onClick: ($event) => removeEvent(Number(entry.index))
|
|
353
|
-
}, null, 8, [
|
|
354
|
-
"icon",
|
|
355
|
-
"disabled",
|
|
356
|
-
"size",
|
|
357
|
-
"onClick"
|
|
358
|
-
])) : createCommentVNode("v-if", true)])]),
|
|
359
|
-
_: 2
|
|
360
|
-
}, 1032, [
|
|
361
|
-
"disabled",
|
|
362
|
-
"size",
|
|
363
|
-
"prop",
|
|
364
|
-
"config",
|
|
365
|
-
"model",
|
|
366
|
-
"last-values",
|
|
367
|
-
"is-compare",
|
|
368
|
-
"label-width"
|
|
369
|
-
]);
|
|
370
|
-
}), 128)),
|
|
371
|
-
!isCompareMode.value ? (openBlock(), createBlock(unref(TMagicButton), {
|
|
372
|
-
key: 0,
|
|
373
|
-
class: "create-button fullWidth",
|
|
374
|
-
icon: unref(Plus),
|
|
375
|
-
disabled: __props.disabled,
|
|
376
|
-
onClick: _cache[1] || (_cache[1] = ($event) => addEvent())
|
|
377
|
-
}, {
|
|
378
|
-
default: withCtx(() => [..._cache[4] || (_cache[4] = [createTextVNode("添加事件", -1)])]),
|
|
379
|
-
_: 1
|
|
380
|
-
}, 8, ["icon", "disabled"])) : createCommentVNode("v-if", true)
|
|
381
|
-
]))]);
|
|
94
|
+
"prop"
|
|
95
|
+
])])]),
|
|
96
|
+
_: 1
|
|
97
|
+
}, 8, [
|
|
98
|
+
"config",
|
|
99
|
+
"name",
|
|
100
|
+
"disabled",
|
|
101
|
+
"model",
|
|
102
|
+
"last-values",
|
|
103
|
+
"is-compare",
|
|
104
|
+
"prop",
|
|
105
|
+
"size"
|
|
106
|
+
])]))]);
|
|
382
107
|
};
|
|
383
108
|
}
|
|
384
109
|
});
|