@tmagic/form 1.0.0-beta.1
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/style.css +161 -0
- package/dist/tmagic-form.es.js +3749 -0
- package/dist/tmagic-form.es.js.map +1 -0
- package/dist/tmagic-form.umd.js +3790 -0
- package/dist/tmagic-form.umd.js.map +1 -0
- package/dist/types/src/Form.vue.d.ts +304 -0
- package/dist/types/src/FormDialog.vue.d.ts +641 -0
- package/dist/types/src/containers/Container.vue.d.ts +69 -0
- package/dist/types/src/containers/Fieldset.vue.d.ts +56 -0
- package/dist/types/src/containers/GroupList.vue.d.ts +56 -0
- package/dist/types/src/containers/GroupListItem.vue.d.ts +72 -0
- package/dist/types/src/containers/Panel.vue.d.ts +41 -0
- package/dist/types/src/containers/Row.vue.d.ts +42 -0
- package/dist/types/src/containers/Step.vue.d.ts +45 -0
- package/dist/types/src/containers/Table.vue.d.ts +1401 -0
- package/dist/types/src/containers/Tabs.vue.d.ts +45 -0
- package/dist/types/src/fields/Cascader.vue.d.ts +1748 -0
- package/dist/types/src/fields/Checkbox.vue.d.ts +59 -0
- package/dist/types/src/fields/CheckboxGroup.vue.d.ts +56 -0
- package/dist/types/src/fields/Date.vue.d.ts +58 -0
- package/dist/types/src/fields/DateTime.vue.d.ts +57 -0
- package/dist/types/src/fields/Daterange.vue.d.ts +57 -0
- package/dist/types/src/fields/Display.vue.d.ts +3 -0
- package/dist/types/src/fields/DynamicField.vue.d.ts +76 -0
- package/dist/types/src/fields/Hidden.vue.d.ts +3 -0
- package/dist/types/src/fields/Link.vue.d.ts +1365 -0
- package/dist/types/src/fields/Number.vue.d.ts +59 -0
- package/dist/types/src/fields/RadioGroup.vue.d.ts +55 -0
- package/dist/types/src/fields/Select.vue.d.ts +975 -0
- package/dist/types/src/fields/Switch.vue.d.ts +59 -0
- package/dist/types/src/fields/Text.vue.d.ts +61 -0
- package/dist/types/src/fields/Textarea.vue.d.ts +56 -0
- package/dist/types/src/fields/Time.vue.d.ts +54 -0
- package/dist/types/src/index.d.ts +36 -0
- package/dist/types/src/schema.d.ts +495 -0
- package/dist/types/src/shims-vue.d.ts +6 -0
- package/dist/types/src/utils/config.d.ts +3 -0
- package/dist/types/src/utils/fieldProps.d.ts +21 -0
- package/dist/types/src/utils/form.d.ts +8 -0
- package/dist/types/src/utils/useAddField.d.ts +1 -0
- package/dist/types/src/vite-env.d.ts +1 -0
- package/package.json +51 -0
- package/src/Form.vue +188 -0
- package/src/FormDialog.vue +163 -0
- package/src/containers/Container.vue +263 -0
- package/src/containers/Fieldset.vue +138 -0
- package/src/containers/GroupList.vue +152 -0
- package/src/containers/GroupListItem.vue +159 -0
- package/src/containers/Panel.vue +106 -0
- package/src/containers/Row.vue +68 -0
- package/src/containers/Step.vue +82 -0
- package/src/containers/Table.vue +624 -0
- package/src/containers/Tabs.vue +176 -0
- package/src/fields/Cascader.vue +147 -0
- package/src/fields/Checkbox.vue +67 -0
- package/src/fields/CheckboxGroup.vue +44 -0
- package/src/fields/ColorPicker.vue +38 -0
- package/src/fields/Date.vue +51 -0
- package/src/fields/DateTime.vue +59 -0
- package/src/fields/Daterange.vue +75 -0
- package/src/fields/Display.vue +34 -0
- package/src/fields/DynamicField.vue +109 -0
- package/src/fields/Hidden.vue +29 -0
- package/src/fields/Link.vue +112 -0
- package/src/fields/Number.vue +53 -0
- package/src/fields/RadioGroup.vue +33 -0
- package/src/fields/Select.vue +393 -0
- package/src/fields/Switch.vue +65 -0
- package/src/fields/Text.vue +134 -0
- package/src/fields/Textarea.vue +62 -0
- package/src/fields/Time.vue +48 -0
- package/src/index.ts +127 -0
- package/src/schema.ts +638 -0
- package/src/shims-vue.d.ts +6 -0
- package/src/theme/date-time.scss +7 -0
- package/src/theme/fieldset.scss +24 -0
- package/src/theme/form-dialog.scss +13 -0
- package/src/theme/form.scss +30 -0
- package/src/theme/group-list.scss +23 -0
- package/src/theme/index.scss +9 -0
- package/src/theme/link.scss +3 -0
- package/src/theme/panel.scss +18 -0
- package/src/theme/select.scss +3 -0
- package/src/theme/table.scss +69 -0
- package/src/theme/tabs.scss +25 -0
- package/src/utils/config.ts +27 -0
- package/src/utils/containerProps.ts +50 -0
- package/src/utils/createForm.ts +25 -0
- package/src/utils/fieldProps.ts +39 -0
- package/src/utils/form.ts +266 -0
- package/src/utils/useAddField.ts +40 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +9 -0
- package/vite.config.ts +27 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="m-fields-dynamic-field">
|
|
3
|
+
<el-form size="small">
|
|
4
|
+
<el-form-item v-for="key in Object.keys(fieldMap.value)" :key="key" :label="fieldLabelMap.value[key]">
|
|
5
|
+
<el-input
|
|
6
|
+
v-model="fieldMap.value[key]"
|
|
7
|
+
:placeholder="fieldLabelMap.value[key]"
|
|
8
|
+
@change="inputChangeHandler(key)"
|
|
9
|
+
></el-input>
|
|
10
|
+
</el-form-item>
|
|
11
|
+
</el-form>
|
|
12
|
+
</div>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script lang="ts">
|
|
16
|
+
/**
|
|
17
|
+
* 动态表单,目前只支持input类型字段
|
|
18
|
+
* inputType: 'dynamic-field',
|
|
19
|
+
* text: '动态表单',
|
|
20
|
+
* dynamicKey: 'keyname', 如果model[dynamicKey]变化,表单字段变化
|
|
21
|
+
* returnFields(config,model,request): 函数,返回字段列表[{name:'',label:'',defaultValue:''}]
|
|
22
|
+
*
|
|
23
|
+
* 特别注意!!!field的上一级必须extensible: true,才能保存未声明的字段
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { defineComponent, onBeforeUnmount, PropType, reactive, watch } from 'vue';
|
|
27
|
+
|
|
28
|
+
import { DynamicFieldConfig } from '../schema';
|
|
29
|
+
import { getConfig } from '../utils/config';
|
|
30
|
+
import fieldProps from '../utils/fieldProps';
|
|
31
|
+
import { useAddField } from '../utils/useAddField';
|
|
32
|
+
|
|
33
|
+
export default defineComponent({
|
|
34
|
+
name: 'm-fields-dynamic-field',
|
|
35
|
+
|
|
36
|
+
props: {
|
|
37
|
+
...fieldProps,
|
|
38
|
+
config: {
|
|
39
|
+
type: Object as PropType<DynamicFieldConfig>,
|
|
40
|
+
required: true,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
emits: ['change'],
|
|
45
|
+
|
|
46
|
+
setup(props, { emit }) {
|
|
47
|
+
useAddField(props.prop);
|
|
48
|
+
|
|
49
|
+
const request = getConfig('request') as Function;
|
|
50
|
+
const fieldMap = reactive<{ [key: string]: any }>({
|
|
51
|
+
value: {},
|
|
52
|
+
});
|
|
53
|
+
const fieldLabelMap = reactive<{ [key: string]: any }>({
|
|
54
|
+
value: {},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const changeFieldMap = async () => {
|
|
58
|
+
if (typeof props.config.returnFields !== 'function' || !props.model) return;
|
|
59
|
+
const fields = await props.config.returnFields(props.config, props.model, request);
|
|
60
|
+
fieldMap.value = {};
|
|
61
|
+
fieldLabelMap.value = {};
|
|
62
|
+
fields.forEach((v) => {
|
|
63
|
+
if (typeof v !== 'object' || v.name === undefined) return;
|
|
64
|
+
let oldVal = props.model?.[v.name] || '';
|
|
65
|
+
if (!oldVal && v.defaultValue !== undefined) {
|
|
66
|
+
oldVal = v.defaultValue;
|
|
67
|
+
emit('change', oldVal, v.name);
|
|
68
|
+
}
|
|
69
|
+
fieldMap.value[v.name] = oldVal;
|
|
70
|
+
fieldLabelMap.value[v.name] = v.label || '';
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const unwatch = watch(
|
|
75
|
+
() => props.model?.[props.config.dynamicKey],
|
|
76
|
+
(val) => {
|
|
77
|
+
if (val !== '') {
|
|
78
|
+
changeFieldMap();
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
immediate: true,
|
|
83
|
+
},
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
onBeforeUnmount(() => {
|
|
87
|
+
if (typeof unwatch === 'function') {
|
|
88
|
+
unwatch();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
request,
|
|
94
|
+
fieldMap,
|
|
95
|
+
fieldLabelMap,
|
|
96
|
+
unwatch,
|
|
97
|
+
|
|
98
|
+
changeFieldMap,
|
|
99
|
+
inputChangeHandler: (key: string) => {
|
|
100
|
+
emit('change', fieldMap.value[key], key);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
methods: {
|
|
106
|
+
init() {},
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
</script>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<input v-if="model" v-model="model[n]" type="hidden" />
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { computed, defineComponent, PropType } from 'vue';
|
|
7
|
+
|
|
8
|
+
import { HiddenConfig } from '../schema';
|
|
9
|
+
import fieldProps from '../utils/fieldProps';
|
|
10
|
+
import { useAddField } from '../utils/useAddField';
|
|
11
|
+
|
|
12
|
+
export default defineComponent({
|
|
13
|
+
name: 'm-fields-hidden',
|
|
14
|
+
});
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<script setup lang="ts">
|
|
18
|
+
const props = defineProps({
|
|
19
|
+
...fieldProps,
|
|
20
|
+
config: {
|
|
21
|
+
type: Object as PropType<HiddenConfig>,
|
|
22
|
+
required: true,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const n = computed(() => props.name || props.config.name || '');
|
|
27
|
+
|
|
28
|
+
useAddField(props.prop);
|
|
29
|
+
</script>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<a v-if="config.href && !disabled" target="_blank" :href="href" :style="config.css || {}">{{ displayText }}</a>
|
|
3
|
+
<span v-else-if="config.href && disabled" :style="config.disabledCss || {}">{{ displayText }}</span>
|
|
4
|
+
<div v-else class="m-fields-link">
|
|
5
|
+
<el-button type="text" @click="editHandler">点击编辑</el-button>
|
|
6
|
+
<m-form-dialog
|
|
7
|
+
ref="editor"
|
|
8
|
+
:title="config.formTitle || '编辑扩展配置'"
|
|
9
|
+
:width="config.formWidth"
|
|
10
|
+
:values="formValue"
|
|
11
|
+
:config="formConfig"
|
|
12
|
+
:parentValues="values"
|
|
13
|
+
:fullscreen="config.fullscreen"
|
|
14
|
+
@submit="action"
|
|
15
|
+
></m-form-dialog>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<script lang="ts">
|
|
20
|
+
import { computed, defineComponent, inject, PropType, ref } from 'vue';
|
|
21
|
+
|
|
22
|
+
import FormDialog from '../FormDialog.vue';
|
|
23
|
+
import { FormState, LinkConfig } from '../schema';
|
|
24
|
+
import fieldProps from '../utils/fieldProps';
|
|
25
|
+
import { useAddField } from '../utils/useAddField';
|
|
26
|
+
|
|
27
|
+
export default defineComponent({
|
|
28
|
+
name: 'm-fields-link',
|
|
29
|
+
|
|
30
|
+
props: {
|
|
31
|
+
...fieldProps,
|
|
32
|
+
config: {
|
|
33
|
+
type: Object as PropType<LinkConfig>,
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
emits: ['change'],
|
|
39
|
+
|
|
40
|
+
setup(props, { emit }) {
|
|
41
|
+
useAddField(props.prop);
|
|
42
|
+
|
|
43
|
+
const formValue = ref({});
|
|
44
|
+
const editor = ref<InstanceType<typeof FormDialog>>();
|
|
45
|
+
const mForm = inject<FormState | undefined>('mForm');
|
|
46
|
+
|
|
47
|
+
const href = computed(() => {
|
|
48
|
+
if (typeof props.config.href === 'function' && props.model) {
|
|
49
|
+
return props.config.href(props.model);
|
|
50
|
+
}
|
|
51
|
+
return props.config.href || props.model?.[props.name];
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const init = () => {
|
|
55
|
+
formValue.value = props.model?.[props.name] || {};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
// ref
|
|
60
|
+
formValue,
|
|
61
|
+
editor,
|
|
62
|
+
|
|
63
|
+
// computed methods
|
|
64
|
+
href,
|
|
65
|
+
|
|
66
|
+
formConfig: computed(() => {
|
|
67
|
+
if (typeof props.config.form === 'function') {
|
|
68
|
+
return props.config.form(mForm, {
|
|
69
|
+
model: props.model || {},
|
|
70
|
+
values: props.values || {},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return props.config.form;
|
|
74
|
+
}),
|
|
75
|
+
|
|
76
|
+
disable: computed(() => {
|
|
77
|
+
if (typeof props.config.disabled !== 'undefined') {
|
|
78
|
+
return props.config.disabled;
|
|
79
|
+
}
|
|
80
|
+
return !href.value;
|
|
81
|
+
}),
|
|
82
|
+
|
|
83
|
+
displayText: computed(() => {
|
|
84
|
+
if (typeof props.config.displayText === 'function') {
|
|
85
|
+
return props.config.displayText(mForm, { model: props.model || {} });
|
|
86
|
+
}
|
|
87
|
+
if (props.config.displayText) {
|
|
88
|
+
return props.config.displayText;
|
|
89
|
+
}
|
|
90
|
+
return '跳转';
|
|
91
|
+
}),
|
|
92
|
+
|
|
93
|
+
// methods
|
|
94
|
+
init,
|
|
95
|
+
|
|
96
|
+
editHandler: () => {
|
|
97
|
+
init();
|
|
98
|
+
editor.value && (editor.value.dialogVisible = true);
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
action: (data: any) => {
|
|
102
|
+
if (props.model) {
|
|
103
|
+
props.model[props.name] = data;
|
|
104
|
+
formValue.value = data;
|
|
105
|
+
emit('change', props.model[props.name]);
|
|
106
|
+
}
|
|
107
|
+
editor.value && (editor.value.dialogVisible = false);
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
</script>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-input-number
|
|
3
|
+
v-if="model"
|
|
4
|
+
v-model="model[name]"
|
|
5
|
+
clearable
|
|
6
|
+
controls-position="right"
|
|
7
|
+
:size="size"
|
|
8
|
+
:max="config.max"
|
|
9
|
+
:min="config.min"
|
|
10
|
+
:step="config.step"
|
|
11
|
+
:placeholder="config.placeholder"
|
|
12
|
+
:disabled="disabled"
|
|
13
|
+
@change="changeHandler"
|
|
14
|
+
@input="inputHandler"
|
|
15
|
+
></el-input-number>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script lang="ts">
|
|
19
|
+
import { defineComponent, inject, PropType } from 'vue';
|
|
20
|
+
|
|
21
|
+
import { FormState, NumberConfig } from '../schema';
|
|
22
|
+
import fieldProps from '../utils/fieldProps';
|
|
23
|
+
import { useAddField } from '../utils/useAddField';
|
|
24
|
+
export default defineComponent({
|
|
25
|
+
name: 'm-fields-number',
|
|
26
|
+
|
|
27
|
+
props: {
|
|
28
|
+
...fieldProps,
|
|
29
|
+
config: {
|
|
30
|
+
type: Object as PropType<NumberConfig>,
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
emits: ['change', 'input'],
|
|
36
|
+
|
|
37
|
+
setup(props, { emit }) {
|
|
38
|
+
useAddField(props.prop);
|
|
39
|
+
|
|
40
|
+
const mForm = inject<FormState | null>('mForm');
|
|
41
|
+
return {
|
|
42
|
+
mForm,
|
|
43
|
+
changeHandler: (value: number) => {
|
|
44
|
+
emit('change', value);
|
|
45
|
+
},
|
|
46
|
+
inputHandler: (v: string) => {
|
|
47
|
+
emit('input', v);
|
|
48
|
+
mForm?.$emit('field-input', props.prop, v);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
</script>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-radio-group v-if="model" v-model="model[name]" :size="size" :disabled="disabled" @change="changeHandler">
|
|
3
|
+
<el-radio v-for="option in config.options" :label="option.value" :key="option.value">{{ option.text }}</el-radio>
|
|
4
|
+
</el-radio-group>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import { defineComponent } from 'vue';
|
|
9
|
+
|
|
10
|
+
import fieldProps from '../utils/fieldProps';
|
|
11
|
+
import { useAddField } from '../utils/useAddField';
|
|
12
|
+
|
|
13
|
+
export default defineComponent({
|
|
14
|
+
name: 'm-fields-radio-group',
|
|
15
|
+
|
|
16
|
+
props: {
|
|
17
|
+
...fieldProps,
|
|
18
|
+
config: {
|
|
19
|
+
type: Object,
|
|
20
|
+
required: true,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
emits: ['change'],
|
|
25
|
+
|
|
26
|
+
setup(props, { emit }) {
|
|
27
|
+
useAddField(props.prop);
|
|
28
|
+
return {
|
|
29
|
+
changeHandler: (v: string | number | boolean) => emit('change', v),
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
</script>
|