功能变化: 添加一对多组件
parent
227e1393a4
commit
2dfb4c80a9
Binary file not shown.
After Width: | Height: | Size: 127 KiB |
|
@ -0,0 +1,200 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="elProps.index.span" v-if="elProps.index">
|
||||||
|
<div style="text-align: center">{{ elProps.index.name }}</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="elProps.fields[key].span" v-for="(_, key) in elProps.fields" :key="key">
|
||||||
|
<div style="text-align: center">{{ elProps.fields[key].name }}</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="2">
|
||||||
|
<div style="text-align: center">操作</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form :model="currentForm" ref="currentFormRef" label-width="0px" size="mini" type="flex">
|
||||||
|
<el-row style="margin-bottom: 0px" :gutter="5" v-for="(field, index) in currentForm.data" :key="index">
|
||||||
|
<el-col :span="elProps.index.span" v-if="elProps.index">
|
||||||
|
<div style="text-align: center">
|
||||||
|
{{index+1}}
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="elProps.fields[key].span" v-for="(_,key) in elProps.fields" :key="key">
|
||||||
|
<el-form-item
|
||||||
|
:prop="'data.' + index + '.' + key"
|
||||||
|
:rules="[
|
||||||
|
{ required: elProps.fields[key].required, message: '不能为空', trigger: 'blur' },
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<el-select v-model="field[key]" v-if="elProps.fields[key].type === 'select'" placeholder="请选择">
|
||||||
|
<el-option
|
||||||
|
v-for="item in elProps.fields[key].option"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-input-number style="width: 100%" v-else-if="elProps.fields[key].type === 'number'" controls-position="right" v-model="field[key]"></el-input-number>
|
||||||
|
<el-input v-model="field[key]" v-else placeholder="请输入"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="4">
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click.prevent="topDomain(index)" :disabled="index === 0" type="primary" circle icon="el-icon-top"></el-button>
|
||||||
|
<el-button @click.prevent="bottomDomain(index)" :disabled="index === currentForm.data.length - 1" type="primary" circle icon="el-icon-bottom"></el-button>
|
||||||
|
<el-button @click.prevent="removeDomain(index)" type="danger" circle icon="el-icon-delete"></el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-button type="primary" @click="addDomain">新增</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'foreignKeyCrudForm',
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: ['change', 'input']
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
elProps: {
|
||||||
|
type: Object,
|
||||||
|
default () {
|
||||||
|
return {
|
||||||
|
index: {
|
||||||
|
name: '序号',
|
||||||
|
span: 2
|
||||||
|
},
|
||||||
|
fields: {
|
||||||
|
description: {
|
||||||
|
name: '内容描述',
|
||||||
|
type: 'input',
|
||||||
|
span: 10,
|
||||||
|
default: null,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
name: '类型',
|
||||||
|
type: 'select',
|
||||||
|
span: 4,
|
||||||
|
default: 0,
|
||||||
|
required: true,
|
||||||
|
options: [{
|
||||||
|
value: '0',
|
||||||
|
label: '单选项'
|
||||||
|
}, {
|
||||||
|
value: '1',
|
||||||
|
label: '多选项'
|
||||||
|
}, {
|
||||||
|
value: '2',
|
||||||
|
label: '单行填空'
|
||||||
|
}, {
|
||||||
|
value: '3',
|
||||||
|
label: '多行填空'
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
score: {
|
||||||
|
name: '分数',
|
||||||
|
type: 'number',
|
||||||
|
span: 4,
|
||||||
|
default: 0,
|
||||||
|
required: true,
|
||||||
|
min: 0,
|
||||||
|
max: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
type: Array,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
// eslint-disable-next-line vue/return-in-computed-property
|
||||||
|
submitForm () {
|
||||||
|
let res = ''
|
||||||
|
this.$refs.currentFormRef.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
const { data } = this.currentForm
|
||||||
|
res = data
|
||||||
|
} else {
|
||||||
|
console.log('error submit!!')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
},
|
||||||
|
currentForm () {
|
||||||
|
console.log(1212, this.value)
|
||||||
|
if (!this.value || !this.value[0]) {
|
||||||
|
const fields = {
|
||||||
|
_id: this.value?.length || 0
|
||||||
|
}
|
||||||
|
for (const key in this.elProps.fields) {
|
||||||
|
fields[key] = this.elProps.fields[key].default || null
|
||||||
|
}
|
||||||
|
this.$emit('change', [fields])
|
||||||
|
this.$emit('input', [fields])
|
||||||
|
return {
|
||||||
|
data: [fields]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
data: this.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 数组元素互换位置,并且替换顺序
|
||||||
|
swapArray (arr, index1, index2) {
|
||||||
|
arr[index1] = arr.splice(index2, 1, arr[index1])[0]
|
||||||
|
arr[index2].sort = index2 + 1
|
||||||
|
arr[index1].sort = index1 + 1
|
||||||
|
return arr
|
||||||
|
},
|
||||||
|
// 删除
|
||||||
|
removeDomain (index) {
|
||||||
|
this.currentForm.data.splice(index, 1)
|
||||||
|
this.$emit('change', this.currentForm.data)
|
||||||
|
this.$emit('input', this.currentForm.data)
|
||||||
|
},
|
||||||
|
// 上移
|
||||||
|
topDomain (index) {
|
||||||
|
this.swapArray(this.currentForm.data, index - 1, index)
|
||||||
|
this.$emit('change', this.currentForm.data)
|
||||||
|
this.$emit('input', this.currentForm.data)
|
||||||
|
},
|
||||||
|
// 下移
|
||||||
|
bottomDomain (index) {
|
||||||
|
this.swapArray(this.currentForm.data, index, index + 1)
|
||||||
|
this.$emit('change', this.currentForm.data)
|
||||||
|
this.$emit('input', this.currentForm.data)
|
||||||
|
},
|
||||||
|
// 新增
|
||||||
|
addDomain () {
|
||||||
|
const fields = {
|
||||||
|
_id: this.value.length
|
||||||
|
}
|
||||||
|
for (const key in this.elProps.fields) {
|
||||||
|
fields[key] = this.elProps.fields[key].default || null
|
||||||
|
}
|
||||||
|
console.log(12121212, this.currentForm.data, fields)
|
||||||
|
this.currentForm.data.push(fields)
|
||||||
|
this.$emit('change', this.currentForm.data)
|
||||||
|
this.$emit('input', this.currentForm.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -0,0 +1,19 @@
|
||||||
|
export default {
|
||||||
|
// 字段类型配置,注册之后即可在crud.js中使用了
|
||||||
|
'foreign-key-crud-form': {
|
||||||
|
// 行组件配置
|
||||||
|
form: { component: { name: 'foreign-key-crud-form', props: { color: 'danger' } } },
|
||||||
|
component: {
|
||||||
|
name: 'values-popover',
|
||||||
|
props: {
|
||||||
|
elProps: {
|
||||||
|
type: 'list',
|
||||||
|
rowKey: 'name'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 行展示时居中
|
||||||
|
align: 'center'
|
||||||
|
// 您还可以写更多默认配置
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { d2CrudPlus } from 'd2-crud-plus'
|
||||||
|
import group from './group'
|
||||||
|
|
||||||
|
function install (Vue, options) {
|
||||||
|
Vue.component('foreign-key-crud-form', () => import('./foreign-key-crud-form'))
|
||||||
|
if (d2CrudPlus != null) {
|
||||||
|
// 注册字段类型`demo-extend`
|
||||||
|
d2CrudPlus.util.columnResolve.addTypes(group)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出install, 通过`vue.use(D2pDemoExtend)`安装后 ,`demo-extend` 就可以在`crud.js`中使用了
|
||||||
|
export default {
|
||||||
|
install
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import tableProgress from './table-progress/lib/table-progress.vue'
|
||||||
import cardSelect from '@/components/card-select/index'
|
import cardSelect from '@/components/card-select/index'
|
||||||
import selectorTable from '@/components/selector-table/index'
|
import selectorTable from '@/components/selector-table/index'
|
||||||
import valuesPopover from '@/components/values-popover/index'
|
import valuesPopover from '@/components/values-popover/index'
|
||||||
|
import foreignKeyCrudForm from '@/components/foreign-key-crud-form/index'
|
||||||
// 注意 有些组件使用异步加载会有影响
|
// 注意 有些组件使用异步加载会有影响
|
||||||
Vue.component('d2-container', d2Container)
|
Vue.component('d2-container', d2Container)
|
||||||
Vue.component('d2-icon', () => import('./d2-icon'))
|
Vue.component('d2-icon', () => import('./d2-icon'))
|
||||||
|
@ -19,3 +20,4 @@ Vue.component('table-progress', tableProgress)
|
||||||
Vue.use(selectorTable)
|
Vue.use(selectorTable)
|
||||||
Vue.use(cardSelect)
|
Vue.use(cardSelect)
|
||||||
Vue.use(valuesPopover)
|
Vue.use(valuesPopover)
|
||||||
|
Vue.use(foreignKeyCrudForm)
|
||||||
|
|
|
@ -112,8 +112,17 @@ export default {
|
||||||
},
|
},
|
||||||
getListData () {
|
getListData () {
|
||||||
const params = {}
|
const params = {}
|
||||||
params[this.dict.value] = this.value
|
if (this.value.constructor === Array) {
|
||||||
|
const ids = []
|
||||||
|
this.value.map(res => {
|
||||||
|
ids.push(res[this.dict.value])
|
||||||
|
})
|
||||||
|
params[this.dict.value] = ids
|
||||||
|
} else {
|
||||||
|
params[this.dict.value] = this.value
|
||||||
|
}
|
||||||
params.query = `{${this.dict.value},${this.dict.label}}`
|
params.query = `{${this.dict.value},${this.dict.label}}`
|
||||||
|
console.log(12, params)
|
||||||
request({ url: this.dict.url, params: params }).then(ret => {
|
request({ url: this.dict.url, params: params }).then(ret => {
|
||||||
this.data = ret.data.data || ret.data
|
this.data = ret.data.data || ret.data
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue