Lliuzhengjun初始化仓库
828e1411创建于 2024年6月28日历史提交
import {
    ElInput,
    ElInputNumber,
    ElOption,
    ElRadioButton,
    ElRadioGroup,
    ElSelect,
} from 'element-plus'
import { defineComponent } from 'vue'


const Input = (form: Record<string, any>, data: Record<string, any>, context: any) => (
    <ElInput
        v-model={form.data[data.name]}
        clearable
        onChange={(val) => { context.emit('handleChange', val, data) }}
    >
    </ElInput>
)

const InputNumber = (form: Record<string, any>, data: Record<string, any>, context: any) => (
    <ElInputNumber
        v-model={form.data[data.name]}
        controls-position="right"
        onChange={(val) => { context.emit('handleChange', val, data) }}
    />

)

const setLabelValue = (data: any, _item: any,) => {
    return {
        label: data.valueLabel || _item,
        value: _item,
    }
}
const Select = (form: Record<string, any>, name: string, data: any, context: any) => (
    <ElSelect
        v-model={form.data[name]}
        filterable
        clearable
        onChange={(val) => { context.emit('handleChange', val, data, name) }}
        >

        {Object.keys(data).map((item: any) => {
            return <ElOption {...setLabelValue(data[item], item)} />
        })}

    </ElSelect>
)

const Radio = (form: Record<string, any>, name: string, data: any, context: any) => (
    <ElRadioGroup
        v-model={form.data[name]}
        text-color='#fff'
        fill='#4971FF'
        onChange={(val) => { context.emit('handleChange', val, data, name) }}
        >

        {Object.keys(data).map((item: any) => {
            return <ElRadioButton {...setLabelValue(data[item], item)} />
        })}

    </ElRadioGroup>
)

const setFormItem = (
    form: Record<string, any> | undefined,
    data: Record<string, any> | undefined,
    context: any
) => {
    if (!form) return null
    if (!data) return null

    let valueType = data.valueType || 'radio';
    let enumValue = "";
    const ENUM_REGEX = /enum\((.*)\)/g
    const enumMatch = ENUM_REGEX.exec(valueType);
    if (enumMatch) {
        valueType = "select";
        enumValue = enumMatch[1]
    }
    if(data.valueToNextConfig && Object.keys(data.valueToNextConfig).length > 8) {
        valueType = 'select'
    }
    switch (valueType) {
        case 'string':
            return Input(form, data, context)
        case 'number':
            return InputNumber(form, data, context)
        case 'select':
            return Select(form, data.name, data.valueToNextConfig, context)
        case 'radio':
            return Radio(form, data.name, data.valueToNextConfig, context)
        default:
            return null
    }
}

export default defineComponent({
    name: 'FormItem',
    props: {
        data: Object,
        formData: Object,
    },
    setup(props, context) {
        return () => {
            return props.data
                ? setFormItem(props.formData, props.data, context)
                : null
        }
    },
})