|
@ -1,261 +1,253 @@
|
|
|
<template>
|
|
|
<div class="custom-form">
|
|
|
<van-form @submit="onSubmit">
|
|
|
<van-cell-group v-for="(g, k) in groups" :key="k">
|
|
|
<div v-if="groups.length>1" class="ptb13 pl15 c-999 fs-14 bgc-f2f3f4">
|
|
|
{{g.groupTitle}}
|
|
|
</div>
|
|
|
<template v-for="(item, i) in g.children">
|
|
|
<template v-if="item.isHide!==true">
|
|
|
<slot v-if="$slots[item.id]" :name="item.id" :config="item" />
|
|
|
<van-field
|
|
|
:class="{'has-tips': $slots[item.id+'-tips']}"
|
|
|
v-else-if="item.type=='text'||item.type=='textarea'"
|
|
|
:type="item.type"
|
|
|
:key="i"
|
|
|
v-model="form[item.id]"
|
|
|
error-message-align="right"
|
|
|
input-align="right"
|
|
|
:rules="rules[item.id]"
|
|
|
v-bind="item.vanCfg||''"
|
|
|
v-on="item.vanEvts||''"
|
|
|
@click="item.onClick? item.onClick(item) : ''"
|
|
|
/>
|
|
|
<div class="custom-form">
|
|
|
<van-form @submit="onSubmit">
|
|
|
<van-cell-group v-for="(g, k) in groups" :key="k">
|
|
|
<div v-if="groups.length > 1" class="ptb13 pl15 c-999 fs-14 bgc-f2f3f4">
|
|
|
{{ g.groupTitle }}
|
|
|
</div>
|
|
|
<template v-for="(item, i) in g.children">
|
|
|
<template v-if="item.isHide !== true">
|
|
|
<slot v-if="$slots[item.id]" :name="item.id" :config="item" />
|
|
|
<van-field
|
|
|
:class="{ 'has-tips': $slots[item.id + '-tips'] }"
|
|
|
v-else-if="item.type == 'text' || item.type == 'textarea'"
|
|
|
:type="item.type"
|
|
|
:key="i"
|
|
|
v-model="form[item.id]"
|
|
|
error-message-align="right"
|
|
|
input-align="right"
|
|
|
:rules="rules[item.id]"
|
|
|
v-bind="item.vanCfg || ''"
|
|
|
v-on="item.vanEvts || ''"
|
|
|
@click="item.onClick ? item.onClick(item) : ''" />
|
|
|
|
|
|
<van-field
|
|
|
v-else-if="item.type=='select'||item.type=='date'||item.type=='datetime'"
|
|
|
:class="{'has-tips': $slots[item.id+'-tips']}"
|
|
|
:key="i"
|
|
|
v-model="form[item.id].name"
|
|
|
error-message-align="right"
|
|
|
input-align="right"
|
|
|
:rules="rules[item.id]"
|
|
|
v-bind="item.vanCfg||''"
|
|
|
v-on="item.vanEvts||''"
|
|
|
readonly
|
|
|
is-link
|
|
|
@click="item.onClick? item.onClick(item) : onSelectShow(item)"
|
|
|
/>
|
|
|
<van-field
|
|
|
v-else-if="item.type == 'select' || item.type == 'date' || item.type == 'datetime'"
|
|
|
:class="{ 'has-tips': $slots[item.id + '-tips'] }"
|
|
|
:key="i"
|
|
|
v-model="form[item.id].name"
|
|
|
error-message-align="right"
|
|
|
input-align="right"
|
|
|
:rules="rules[item.id]"
|
|
|
v-bind="item.vanCfg || ''"
|
|
|
v-on="item.vanEvts || ''"
|
|
|
readonly
|
|
|
is-link
|
|
|
@click="item.onClick ? item.onClick(item) : onSelectShow(item)" />
|
|
|
|
|
|
<van-field
|
|
|
v-else-if="item.type=='photo'"
|
|
|
:class="{'has-tips': $slots[item.id+'-tips']}"
|
|
|
:key="i"
|
|
|
v-model="form[item.id].name"
|
|
|
error-message-align="right"
|
|
|
input-align="right"
|
|
|
:rules="rules[item.id]"
|
|
|
v-bind="item.vanCfg||''"
|
|
|
v-on="item.vanEvts||''" >
|
|
|
<template slot="input">
|
|
|
<CustomUpload :data.sync="form[item.id]"></CustomUpload>
|
|
|
</template>
|
|
|
</van-field>
|
|
|
<van-field
|
|
|
v-else-if="item.type == 'photo'"
|
|
|
:class="{ 'has-tips': $slots[item.id + '-tips'] }"
|
|
|
:key="i"
|
|
|
v-model="form[item.id].name"
|
|
|
error-message-align="right"
|
|
|
input-align="right"
|
|
|
:rules="rules[item.id]"
|
|
|
v-bind="item.vanCfg || ''"
|
|
|
v-on="item.vanEvts || ''">
|
|
|
<template slot="input">
|
|
|
<CustomUpload :data.sync="form[item.id]"></CustomUpload>
|
|
|
</template>
|
|
|
</van-field>
|
|
|
|
|
|
<div :key="i" class="custom-form-tips" v-if="$slots[item.id+'-tips']">
|
|
|
<slot :name="item.id+ '-tips'" :config="item" />
|
|
|
</div>
|
|
|
</template>
|
|
|
</template>
|
|
|
</van-cell-group>
|
|
|
<slot name="tips"></slot>
|
|
|
<div class="plr30 ptb30">
|
|
|
<van-button native-type="submit" type="primary" round :color="comfirmBtnColor" block>{{comfirmBtnText}}</van-button>
|
|
|
<div :key="i" class="custom-form-tips" v-if="$slots[item.id + '-tips']">
|
|
|
<slot :name="item.id + '-tips'" :config="item" />
|
|
|
</div>
|
|
|
</van-form>
|
|
|
</template>
|
|
|
</template>
|
|
|
</van-cell-group>
|
|
|
<slot name="tips"></slot>
|
|
|
<div class="plr30 ptb30">
|
|
|
<van-button native-type="submit" type="primary" round :color="comfirmBtnColor" block>
|
|
|
{{ comfirmBtnText }}
|
|
|
</van-button>
|
|
|
</div>
|
|
|
</van-form>
|
|
|
|
|
|
<van-popup v-model="showPick" position="bottom">
|
|
|
<van-datetime-picker
|
|
|
:type="curPick.type"
|
|
|
v-if="curPick.type=='date'||curPick.type=='datetime'"
|
|
|
v-model="currentDate"
|
|
|
:min-date="curPick.minDate"
|
|
|
:max-date="curPick.maxDate"
|
|
|
@confirm="onConfirm"
|
|
|
@cancel="onCancel"
|
|
|
/>
|
|
|
<van-picker
|
|
|
v-else
|
|
|
title=""
|
|
|
show-toolbar
|
|
|
:columns="columns"
|
|
|
@confirm="onConfirm"
|
|
|
@cancel="onCancel"
|
|
|
/>
|
|
|
</van-popup>
|
|
|
</div>
|
|
|
<van-popup v-model="showPick" position="bottom">
|
|
|
<van-datetime-picker
|
|
|
:type="curPick.type"
|
|
|
v-if="curPick.type == 'date' || curPick.type == 'datetime'"
|
|
|
v-model="currentDate"
|
|
|
:min-date="curPick.minDate"
|
|
|
:max-date="curPick.maxDate"
|
|
|
@confirm="onConfirm"
|
|
|
@cancel="onCancel" />
|
|
|
<van-picker v-else title="" show-toolbar :columns="columns" @confirm="onConfirm" @cancel="onCancel" />
|
|
|
</van-popup>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import Tools from '../../utils/tool'
|
|
|
import validateForm from '../../utils/validateForm'
|
|
|
var messageObj = {
|
|
|
'mobile': '请输入正确的号码',
|
|
|
'idCard': '请输入正确的身份证号码',
|
|
|
'digit': '请输入整型数字',
|
|
|
'oneDecimal': '允许一位小数'
|
|
|
'mobile': '请输入正确的号码',
|
|
|
'idCard': '请输入正确的身份证号码',
|
|
|
'digit': '请输入整型数字',
|
|
|
'oneDecimal': '允许一位小数'
|
|
|
}
|
|
|
export default {
|
|
|
name: "CustomForm",
|
|
|
props: {
|
|
|
configs: Object,
|
|
|
comfirmBtnText: {
|
|
|
type: String,
|
|
|
default: "保存"
|
|
|
},
|
|
|
comfirmBtnColor: {
|
|
|
type: String,
|
|
|
default: "#17b3ec"
|
|
|
}
|
|
|
name: 'CustomForm',
|
|
|
props: {
|
|
|
configs: Object,
|
|
|
comfirmBtnText: {
|
|
|
type: String,
|
|
|
default: '保存'
|
|
|
},
|
|
|
components: {
|
|
|
|
|
|
comfirmBtnColor: {
|
|
|
type: String,
|
|
|
default: '#17b3ec'
|
|
|
}
|
|
|
},
|
|
|
components: {},
|
|
|
watch: {
|
|
|
'form': {
|
|
|
handler(n, o) {
|
|
|
this.$emit('input', this.form)
|
|
|
},
|
|
|
deep: true,
|
|
|
immediate: true
|
|
|
}
|
|
|
// 'configs': {
|
|
|
// handler(n, o){
|
|
|
// if(n.fields[0].groupTitle){
|
|
|
// this.groups = n.fields
|
|
|
// } else {
|
|
|
// this.groups = {
|
|
|
// groupTitle: "信息",
|
|
|
// children: n.fields
|
|
|
// }
|
|
|
// }
|
|
|
// console.log(this.groups)
|
|
|
// },
|
|
|
// deep: true,
|
|
|
// immediate: true
|
|
|
// }
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
form: '',
|
|
|
rules: '',
|
|
|
showPick: false,
|
|
|
columns: [],
|
|
|
curPick: '',
|
|
|
groups: [],
|
|
|
currentDate: new Date()
|
|
|
}
|
|
|
},
|
|
|
created() {
|
|
|
this.formatGroup()
|
|
|
var form = {}
|
|
|
var rules = {}
|
|
|
this.configs.fields.forEach((v, i) => {
|
|
|
if (v.children) {
|
|
|
v.children.forEach((m, n) => {
|
|
|
form[m.id] = this.formatValue(m)
|
|
|
rules[m.id] = this.setRule(m)
|
|
|
})
|
|
|
} else {
|
|
|
form[v.id] = this.formatValue(v)
|
|
|
rules[v.id] = this.setRule(v)
|
|
|
}
|
|
|
})
|
|
|
this.form = form
|
|
|
this.rules = rules
|
|
|
},
|
|
|
mounted() {},
|
|
|
computed: {},
|
|
|
methods: {
|
|
|
resetRule(item) {
|
|
|
this.rules[item.id] = this.setRule(item)
|
|
|
},
|
|
|
watch:{
|
|
|
'form': {
|
|
|
handler(n, o){
|
|
|
this.$emit('input', this.form)
|
|
|
},
|
|
|
deep: true,
|
|
|
immediate: true
|
|
|
}
|
|
|
// 'configs': {
|
|
|
// handler(n, o){
|
|
|
// if(n.fields[0].groupTitle){
|
|
|
// this.groups = n.fields
|
|
|
// } else {
|
|
|
// this.groups = {
|
|
|
// groupTitle: "信息",
|
|
|
// children: n.fields
|
|
|
// }
|
|
|
// }
|
|
|
// console.log(this.groups)
|
|
|
// },
|
|
|
// deep: true,
|
|
|
// immediate: true
|
|
|
// }
|
|
|
formatValue(v) {
|
|
|
return v.value || v.value === 0 || v.value === false
|
|
|
? v.value
|
|
|
: v.type == 'select' || v.type == 'date' || v.type == 'datetime'
|
|
|
? { name: '', id: '' }
|
|
|
: ''
|
|
|
},
|
|
|
data(){
|
|
|
return {
|
|
|
form: "",
|
|
|
rules: "",
|
|
|
showPick: false,
|
|
|
columns: [],
|
|
|
curPick: "",
|
|
|
groups: [],
|
|
|
currentDate:new Date(),
|
|
|
}
|
|
|
formatGroup() {
|
|
|
if (this.configs.fields.length && this.configs.fields[0].groupTitle) {
|
|
|
this.groups = this.configs.fields
|
|
|
} else {
|
|
|
this.groups = [
|
|
|
{
|
|
|
groupTitle: '信息',
|
|
|
children: this.configs.fields
|
|
|
}
|
|
|
]
|
|
|
}
|
|
|
this.groups.forEach(m => {
|
|
|
m.children.forEach(v => {
|
|
|
this.loadDict(v)
|
|
|
})
|
|
|
})
|
|
|
console.log('this.groups', this.groups)
|
|
|
},
|
|
|
created(){
|
|
|
this.formatGroup()
|
|
|
var form = {}
|
|
|
var rules = {}
|
|
|
this.configs.fields.forEach((v, i) => {
|
|
|
if(v.children){
|
|
|
v.children.forEach((m, n)=>{
|
|
|
form[m.id] = this.formatValue(m)
|
|
|
rules[m.id] = this.setRule(m)
|
|
|
})
|
|
|
} else {
|
|
|
form[v.id] = this.formatValue(v)
|
|
|
rules[v.id] = this.setRule(v)
|
|
|
}
|
|
|
});
|
|
|
this.form = form
|
|
|
this.rules = rules
|
|
|
loadDict(item) {
|
|
|
if (!item.optionListLoadConfig) {
|
|
|
return
|
|
|
}
|
|
|
if (!Tools.dictLoad) {
|
|
|
console.error('请先设置字典加载器')
|
|
|
return
|
|
|
}
|
|
|
Tools.dictLoad(item.optionListLoadConfig).then(res => {
|
|
|
item.optionList = res
|
|
|
})
|
|
|
},
|
|
|
mounted() {
|
|
|
|
|
|
setValue(key, value) {
|
|
|
this.form[key] = value
|
|
|
},
|
|
|
computed:{
|
|
|
|
|
|
setValues(model) {
|
|
|
for (var k in this.form) {
|
|
|
this.setValue(k, model[k])
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
resetRule(item){
|
|
|
this.rules[item.id] = this.setRule(item)
|
|
|
},
|
|
|
formatValue(v){
|
|
|
return v.value||v.value===0||v.value===false? v.value : v.type=='select'||v.type=='date'||v.type=='datetime'? {name: "", id: ""} : ""
|
|
|
},
|
|
|
formatGroup(){
|
|
|
if(this.configs.fields[0].groupTitle){
|
|
|
this.groups = this.configs.fields
|
|
|
} else {
|
|
|
this.groups = [{
|
|
|
groupTitle: "信息",
|
|
|
children: this.configs.fields
|
|
|
}]
|
|
|
}
|
|
|
this.groups.forEach(m=>{
|
|
|
m.children.forEach(v=>{
|
|
|
this.loadDict(v)
|
|
|
})
|
|
|
})
|
|
|
console.log('this.groups', this.groups)
|
|
|
},
|
|
|
loadDict(item){
|
|
|
if(!item.optionListLoadConfig){
|
|
|
return
|
|
|
}
|
|
|
if(!Tools.dictLoad){
|
|
|
console.error('请先设置字典加载器')
|
|
|
return
|
|
|
}
|
|
|
Tools.dictLoad(item.optionListLoadConfig).then(res=>{
|
|
|
item.optionList = res
|
|
|
})
|
|
|
},
|
|
|
setValue(key, value){
|
|
|
this.form[key] = value
|
|
|
},
|
|
|
setValues(model){
|
|
|
for(var k in this.form){
|
|
|
this.setValue(k, model[k])
|
|
|
}
|
|
|
},
|
|
|
onSubmit(){
|
|
|
this.$emit("onSubmit", this.form)
|
|
|
},
|
|
|
setRule(item){
|
|
|
var rules = item.rules || []
|
|
|
var vanCfg = item.vanCfg
|
|
|
if(vanCfg.required){
|
|
|
rules = [{ required: true, message: item.type=='photo'? (item.requiredErrMsg || '请上传') : '' }].concat(rules)
|
|
|
}
|
|
|
onSubmit() {
|
|
|
this.$emit('onSubmit', this.form)
|
|
|
},
|
|
|
setRule(item) {
|
|
|
var rules = item.rules || []
|
|
|
var vanCfg = item.vanCfg
|
|
|
if (vanCfg.required) {
|
|
|
rules = [{ required: true, message: item.type == 'photo' ? item.requiredErrMsg || '请上传' : '' }].concat(rules)
|
|
|
}
|
|
|
|
|
|
if(item.regularType && validateForm[item.regularType]){
|
|
|
rules.push({
|
|
|
validator: validateForm[item.regularType],
|
|
|
trigger: 'blur',
|
|
|
message: messageObj[item.regularType]
|
|
|
})
|
|
|
}
|
|
|
console.log(rules)
|
|
|
return rules
|
|
|
},
|
|
|
onSelectShow(item){
|
|
|
this.columns = item.optionList || []
|
|
|
this.curPick = item
|
|
|
this.showPick = true
|
|
|
},
|
|
|
onConfirm(value, index) {
|
|
|
if(this.curPick.type == 'datetime'){
|
|
|
this.form[this.curPick.id].name = this.$moment(value).format('YYYY-MM-DD HH:mm')
|
|
|
this.form[this.curPick.id].id = value
|
|
|
} else if(this.curPick.type == 'date'){
|
|
|
this.form[this.curPick.id].name = this.$moment(value).format('YYYY-MM-DD')
|
|
|
this.form[this.curPick.id].id = value
|
|
|
} else {
|
|
|
this.form[this.curPick.id].name = value.text
|
|
|
this.form[this.curPick.id].id = value.model.id
|
|
|
}
|
|
|
this.showPick = false
|
|
|
},
|
|
|
onCancel(){
|
|
|
this.showPick = false
|
|
|
},
|
|
|
if (item.regularType && validateForm[item.regularType]) {
|
|
|
rules.push({
|
|
|
validator: validateForm[item.regularType],
|
|
|
trigger: 'blur',
|
|
|
message: messageObj[item.regularType]
|
|
|
})
|
|
|
}
|
|
|
console.log(rules)
|
|
|
return rules
|
|
|
},
|
|
|
onSelectShow(item) {
|
|
|
this.columns = item.optionList || []
|
|
|
this.curPick = item
|
|
|
this.showPick = true
|
|
|
},
|
|
|
};
|
|
|
onConfirm(value, index) {
|
|
|
if (this.curPick.type == 'datetime') {
|
|
|
this.form[this.curPick.id].name = this.$moment(value).format('YYYY-MM-DD HH:mm')
|
|
|
this.form[this.curPick.id].id = value
|
|
|
} else if (this.curPick.type == 'date') {
|
|
|
this.form[this.curPick.id].name = this.$moment(value).format('YYYY-MM-DD')
|
|
|
this.form[this.curPick.id].id = value
|
|
|
} else {
|
|
|
this.form[this.curPick.id].name = value.text
|
|
|
this.form[this.curPick.id].id = value.model.id
|
|
|
}
|
|
|
this.showPick = false
|
|
|
},
|
|
|
onCancel() {
|
|
|
this.showPick = false
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
@import './css/index.scss';
|