<template>
|
<template v-for="field in fields" :key="field.prop">
|
<el-col v-bind="field.col">
|
<slot
|
:name="field.prop"
|
:model="model"
|
:field="field"
|
v-if="field.type === 'slot'"
|
/>
|
|
<el-form-item
|
v-if="field.type === 'el-input'"
|
v-bind="field.item"
|
>
|
<template #label="scope">
|
<app-text-ellipsis :value="scope.label"/>
|
</template>
|
<el-input
|
v-model="model[field.prop]"
|
v-bind="field.input"
|
@change="props.subModelChange(field.prop, $event)"
|
/>
|
</el-form-item>
|
|
<el-form-item
|
v-if="field.type === 'el-input-dialog'"
|
v-bind="field.item"
|
class="el-input-dialog"
|
>
|
<app-text-ellipsis
|
:value="model[field.prop] ? (model[field.prop][field?.inputDialog?.labelKey || 'label'] || field?.inputDialog?.placeholder) : ''"
|
style="position: absolute;bottom: 5px;left: 0;right: 50px;border-bottom: 1px solid var(--el-border-color);"/>
|
<el-button type="primary" class="button" @click="props.subInputDialog(field.prop, model)">...
|
</el-button>
|
</el-form-item>
|
|
<el-form-item
|
v-if="field.type === 'el-textarea'"
|
v-bind="field.item"
|
>
|
<template #label="scope">
|
<app-text-ellipsis :value="scope.label"/>
|
</template>
|
<el-input
|
v-model="model[field.prop]"
|
v-bind="field.textarea"
|
type="textarea"
|
@change="props.subModelChange(field.prop, $event)"
|
/>
|
</el-form-item>
|
|
<el-form-item
|
v-if="field.type === 'el-switch'"
|
v-bind="field.item"
|
>
|
<template #label="scope">
|
<app-text-ellipsis :value="scope.label"/>
|
</template>
|
<el-switch
|
v-model="model[field.prop]"
|
v-bind="field.switch"
|
@change="props.subModelChange(field.prop, $event)"
|
/>
|
</el-form-item>
|
|
<el-form-item
|
v-if="field.type === 'el-input-number'"
|
v-bind="field.item"
|
>
|
<template #label="scope">
|
<app-text-ellipsis :value="scope.label"/>
|
</template>
|
<el-input-number
|
v-model="model[field.prop]"
|
v-bind="field.inputNumber"
|
@handleChange="props.subModelChange(field.prop, $event)"
|
/>
|
</el-form-item>
|
|
|
<el-form-item
|
v-if="field.type === 'el-select'"
|
v-bind="field.item"
|
>
|
<template #label="scope">
|
<app-text-ellipsis :value="scope.label"/>
|
</template>
|
<el-select v-model="model[field.prop]" v-bind="field.select"
|
@change="props.subModelChange(field.prop, $event)">
|
<el-option
|
v-for="item in field.select.options"
|
v-bind="field.select"
|
:key="item[field.select.valueKey]"
|
:label="item[field.select.labelKey]"
|
:value="item[field.select.valueKey]"
|
:disabled="item.disabled"
|
>
|
</el-option>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item
|
v-if="field.type === 'el-date-picker'"
|
v-bind="field.item"
|
>
|
<template #label="scope">
|
<app-text-ellipsis :value="scope.label"/>
|
</template>
|
<el-date-picker
|
v-model="model[field.prop]"
|
@change="props.subModelChange(field.prop, $event)"
|
v-bind="field.datePicker"
|
/>
|
</el-form-item>
|
</el-col>
|
</template>
|
</template>
|
|
<script setup>
|
|
const props = defineProps({
|
fields: {
|
type: Array,
|
default: []
|
},
|
model: {
|
type: Object,
|
default: {}
|
},
|
subModelChange: {
|
type: Function,
|
default: () => {
|
}
|
},
|
subInputDialog: {
|
type: Function,
|
default: () => {
|
}
|
},
|
});
|
|
</script>
|
|
<style lang="scss" scoped>
|
.el-input-dialog {
|
.value {
|
display: block;
|
padding-bottom: 3px;
|
border-bottom: 1px solid var(--el-border-color);
|
width: 100%;
|
margin-right: 40px;
|
}
|
|
.button {
|
background-color: var(--el-color-primary) !important;
|
color: white !important;
|
position: absolute;
|
right: 0;
|
}
|
}
|
</style>
|