<template>
|
<div>
|
<el-form ref="generateForm" :model="models" :rules="rules" :label-position="data.editorOptions.config.labelPosition" :label-width="data.editorOptions.config.labelWidth">
|
<template v-for="item in data.editorOptions.fields">
|
<template v-if="item.type == 'grid'">
|
<el-row :key="item.key" :gutter="item.options.gutter ? item.options.gutter : 0" :justify="item.options.justify" :align="item.options.align" type="flex">
|
<el-col v-for="(col, colIndex) in item.columns" :key="colIndex" :span="col.span">
|
<template v-for="citem in col.fields">
|
<el-form-item v-if="citem.type=='blank'" :label="citem.label" :prop="citem.model" :key="citem.key">
|
<slot :name="citem.model" :model="models"></slot>
|
</el-form-item>
|
<genetate-form-item v-else :key="citem.key" :models.sync="models" :remote="remote" :rules="rules" :widget="citem"></genetate-form-item>
|
</template>
|
</el-col>
|
</el-row>
|
</template>
|
|
<template v-else-if="item.type == 'blank'">
|
<el-form-item :label="item.name" :prop="item.model" :key="item.key">
|
<slot :name="item.model" :model="models"></slot>
|
</el-form-item>
|
</template>
|
|
<template v-else>
|
<genetate-form-item :key="item.key" :models.sync="models" :rules="rules" :widget="item" :remote="remote"></genetate-form-item>
|
</template>
|
|
</template>
|
</el-form>
|
</div>
|
</template>
|
|
<script>
|
import GenetateFormItem from "./GenerateFormItem";
|
|
export default {
|
name: "fm-generate-form",
|
components: {
|
GenetateFormItem
|
},
|
props: {
|
data: {
|
type: Object,
|
default: () => {
|
return {};
|
}
|
},
|
remote: {
|
type: Boolean,
|
default: false
|
},
|
value: {
|
type: Object,
|
default: () => {
|
return {};
|
}
|
}
|
},
|
data() {
|
return {
|
models: {},
|
rules: {}
|
};
|
},
|
watch: {
|
value: {
|
deep: true,
|
handler(val) {
|
// console.log(JSON.stringify(val))
|
this.models = { ...this.models, ...val };
|
}
|
}
|
},
|
created() {
|
this.generateModle(this.data.editorOptions.fields);
|
},
|
methods: {
|
generateModle(genList) {
|
for (let i = 0; i < genList.length; i++) {
|
if (genList[i].type === "grid") {
|
genList[i].columns.forEach(item => {
|
this.generateModle(item.fields);
|
});
|
} else {
|
if (Object.keys(this.value).indexOf(genList[i].model) >= 0) {
|
this.models[genList[i].model] = this.value[genList[i].model];
|
} else {
|
if (genList[i].type === "blank") {
|
if (genList[i].options.defaultType === "String") {
|
this.models[genList[i].model] = "";
|
} else {
|
this.models[genList[i].model] =
|
genList[i].options.defaultType === "Object" ? {} : [];
|
}
|
} else {
|
this.models[genList[i].model] = genList[i].options.defaultValue;
|
}
|
}
|
|
if (this.rules[genList[i].model]) {
|
this.rules[genList[i].model] = [
|
...this.rules[genList[i].model],
|
...genList[i].rules
|
];
|
} else {
|
this.rules[genList[i].model] = [...genList[i].rules];
|
}
|
}
|
}
|
},
|
getData() {
|
return new Promise((resolve, reject) => {
|
this.$refs.generateForm.validate(valid => {
|
if (valid) {
|
resolve(this.models);
|
} else {
|
reject(new Error("表单数据校验失败").message);
|
}
|
});
|
});
|
},
|
refresh() {}
|
}
|
};
|
</script>
|