You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
4.7 KiB

<template>
<view class="jnpf-table-select">
<u-input input-align='right' type="select" v-model="innerValue" disabled @click="openSelect"
:placeholder="placeholder">
</u-input>
</view>
</template>
<script>
import {
getDataInterfaceDataInfoByIds
} from '@/api/common.js'
export default {
name: 'jnpf-table-select',
model: {
prop: 'value',
event: 'input'
},
props: {
value: {
type: [String, Array],
default: ''
},
placeholder: {
type: String,
default: '请选择'
},
disabled: {
type: Boolean,
default: false
},
filterable: {
type: Boolean,
default: false
},
columnOptions: {
type: Array,
default: []
},
relationField: {
type: String,
default: ''
},
propsValue: {
type: String,
default: ''
},
popupTitle: {
type: String,
default: ''
},
interfaceId: {
type: String,
default: ''
},
hasPage: {
type: Boolean,
default: false
},
multiple: {
type: Boolean,
default: false
},
pageSize: {
type: Number,
default: 10000
},
vModel: {
type: String,
default: ''
},
rowIndex: {
default: null
},
formData: {
type: Object
},
templateJson: {
type: Array,
default: () => []
},
},
data() {
return {
selectShow: false,
innerValue: '',
defaultValue: '',
current: null,
defaultOptions: [],
firstVal: '',
firstId: 0,
list: [],
selectData: []
}
},
watch: {
value(val) {
this.$nextTick(() => {
if (val != '' || val.length > 0) {
this.setDefault()
} else {
this.innerValue = ''
}
})
},
},
created() {
this.setDefault()
uni.$on('tabConfirm', (subVal, txt, vModel, list) => {
this.tabConfirm(subVal, txt, vModel, list)
})
},
methods: {
setDefault() {
if (!this.value || !this.value.length) return this.innerValue = ''
let query = {
ids: !this.multiple ? [this.value] : this.value,
interfaceId: this.interfaceId,
propsValue: this.propsValue,
relationField: this.relationField,
paramList: this.getParamList()
}
if (!this.interfaceId) return
let value = !this.multiple ? [this.value] : this.value
getDataInterfaceDataInfoByIds(this.interfaceId, query).then(res => {
this.list = res.data || []
this.selectData = this.list
let label = []
this.list.forEach((o, i) => {
for (let j = 0; j < value.length; j++) {
if (value[j] == o[this.propsValue]) {
if (!!o[this.relationField]) {
label.push(o[this.relationField])
}
}
}
})
this.innerValue = label.length == 1 ? label[0] : label.join(',')
let relationData = this.$store.getters.relationData
this.$set(relationData, this.vModel, this.list)
this.$store.commit('base/UPDATE_RELATION_DATA', relationData)
})
},
getParamList() {
let templateJson = this.templateJson
if (!this.formData) return templateJson
for (let i = 0; i < templateJson.length; i++) {
if (templateJson[i].relationField) {
if (templateJson[i].relationField.includes('-')) {
let tableVModel = templateJson[i].relationField.split('-')[0]
let childVModel = templateJson[i].relationField.split('-')[1]
templateJson[i].defaultValue = this.formData[tableVModel] && this.formData[tableVModel][this
.rowIndex
] && this.formData[tableVModel][this.rowIndex][childVModel] || ''
} else {
templateJson[i].defaultValue = this.formData[templateJson[i].relationField] || ''
}
}
}
return templateJson
},
openSelect() {
if (this.disabled) return
const pageSize = this.hasPage ? this.pageSize : 100000
let data = {
columnOptions: this.columnOptions,
relationField: this.relationField,
propsValue: this.propsValue,
modelId: this.interfaceId,
hasPage: this.hasPage,
pageSize,
id: !this.multiple ? [this.value] : this.value,
vModel: this.vModel,
popupTitle: this.popupTitle || '选择数据',
innerValue: this.innerValue,
multiple: this.multiple,
filterable: this.filterable,
paramList: this.getParamList(),
selectData: this.selectData
}
uni.navigateTo({
url: '/pages/apply/tableSelect/index?data=' + encodeURIComponent(JSON.stringify(data))
})
},
tabConfirm(subVal, txt, vModel, list) {
if (vModel === this.vModel) {
this.innerValue = ''
this.innerValue = txt
if (!this.multiple) {
this.$emit('input', subVal[0])
this.$emit('change', subVal[0], list[0])
} else {
this.$emit('input', subVal)
this.$emit('change', subVal, list)
}
}
},
}
}
</script>
<style>
.jnpf-table-select {
width: 100%;
height: 100%;
}
</style>