-
Notifications
You must be signed in to change notification settings - Fork 697
/
CodeSelect.vue
118 lines (110 loc) · 2.96 KB
/
CodeSelect.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<template>
<div class="m-fields-code-select">
<m-form-table
:config="tableConfig"
:model="model[name]"
name="hookData"
:enableToggleMode="false"
:prop="prop"
:size="size"
@change="changeHandler"
>
</m-form-table>
</div>
</template>
<script lang="ts" setup name="MEditorCodeSelect">
import { computed, defineEmits, defineProps, inject, watch } from 'vue';
import { isEmpty, map } from 'lodash-es';
import { createValues, FormItem, FormState, TableConfig } from '@tmagic/form';
import { HookType, Id } from '@tmagic/schema';
import { CodeParamStatement, HookData, Services } from '../type';
const services = inject<Services>('services');
const mForm = inject<FormState>('mForm');
const emit = defineEmits(['change']);
const props = defineProps<{
config: {
tableConfig?: TableConfig;
};
model: any;
prop: string;
name: string;
size: 'mini' | 'small' | 'medium';
}>();
const codeDsl = computed(() => services?.codeBlockService.getCodeDslSync());
const tableConfig = computed<FormItem>(() => {
const defaultConfig = {
dropSort: true,
enableFullscreen: false,
border: true,
items: [
{
type: 'select',
label: '代码块',
name: 'codeId',
width: '200px',
options: () => {
if (codeDsl.value) {
return map(codeDsl.value, (value, key) => ({
text: `${value.name}(${key})`,
label: `${value.name}(${key})`,
value: key,
}));
}
return [];
},
onChange: (formState: any, codeId: Id, { model }: any) => {
// 参数的items是根据函数生成的,当codeId变化后修正model的值,避免写入其他codeId的params
model.params = {};
},
},
{
name: 'params',
label: '参数',
defaultValue: {},
itemsFunction: (row: HookData) => {
const paramsConfig = getParamsConfig(row.codeId);
if (!row.params) row.params = {};
if (isEmpty(row.params)) {
createValues(mForm, paramsConfig, {}, row.params);
}
return paramsConfig;
},
},
],
};
return {
...defaultConfig,
...props.config.tableConfig,
};
});
watch(
() => props.model[props.name],
(value) => {
// 兼容旧的数据结构
if (isEmpty(value)) {
// 空值或者空数组
props.model[props.name] = {
hookType: HookType.CODE,
hookData: [],
};
}
},
{
immediate: true,
},
);
const changeHandler = async () => {
emit('change', props.model[props.name]);
};
const getParamsConfig = (codeId: Id) => {
if (!codeDsl.value) return [];
const paramStatements = codeDsl.value[codeId]?.params;
if (isEmpty(paramStatements)) return [];
return paramStatements.map((paramState: CodeParamStatement) => ({
name: paramState.name,
text: paramState.name,
labelWidth: '100px',
type: 'text',
}));
};
</script>