191 lines
4.4 KiB
Vue
191 lines
4.4 KiB
Vue
<template>
|
|
<el-col :span="span">
|
|
<el-form-item
|
|
:label="config.attrName"
|
|
:prop="config.attrField"
|
|
label-width="150px"
|
|
class="add-form-item"
|
|
:class="{'form-item-disabled': disabled}"
|
|
>
|
|
<el-input
|
|
:value="value"
|
|
:placeholder="'请选择' + config.attrName"
|
|
readonly
|
|
:disabled="disabled"
|
|
:id="config.attrField"
|
|
@click.native="visible = true"
|
|
/>
|
|
</el-form-item>
|
|
|
|
<el-drawer
|
|
:title="config.attrName"
|
|
:visible.sync="visible"
|
|
:wrapper-closable="false"
|
|
size="350px"
|
|
append-to-body
|
|
class="org-tree"
|
|
@opened="drawerOpen"
|
|
>
|
|
<dept-tree
|
|
:ref="config.attrField"
|
|
:all-dept="allDept"
|
|
:show-user="config.selVal === 'USERLIST'"
|
|
:check-enable="true"
|
|
:deptSelect="true"
|
|
:treeDivId="config.attrField + 'Tree'"
|
|
:editable="false"
|
|
:onlyChecked="config.attrType === 'SEL_OPTS'"
|
|
@treeOnCheck="handleTreeOnCheck"
|
|
@treeDblClick="handleTreeDblClick">
|
|
</dept-tree>
|
|
|
|
<div class="demo-drawer-footer">
|
|
<el-button
|
|
round
|
|
class="common-button-primary"
|
|
icon="el-icon-check"
|
|
type="primary"
|
|
@click="handleTreeDrawerConfirm">确定
|
|
</el-button>
|
|
<el-button
|
|
round
|
|
class="common-button-default"
|
|
icon="el-icon-close"
|
|
@click="handleTreeDrawerCancel">取消</el-button>
|
|
</div>
|
|
</el-drawer>
|
|
</el-col>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'OrgTree',
|
|
props: {
|
|
config: {
|
|
type: Object,
|
|
required: true
|
|
},
|
|
value: {
|
|
required: true
|
|
},
|
|
disabled: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
// 栅格比例
|
|
span: {
|
|
type: Number,
|
|
default: 24
|
|
},
|
|
// 是否显示全部部门
|
|
allDept: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
zNodes: {
|
|
type: Array,
|
|
default: () => {
|
|
return []
|
|
}
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
visible: false,
|
|
treeCheckNode: [],
|
|
checkedName: ''
|
|
}
|
|
},
|
|
computed: {
|
|
placeholder () {
|
|
return `请选择${this.config.attrName}`
|
|
},
|
|
showMessage () {
|
|
return `${this.config.attrName}不能为空`
|
|
},
|
|
isRequired () {
|
|
return !!this.config.isMust
|
|
},
|
|
isString (str) {
|
|
return (typeof str === 'string') && str.constructor === String
|
|
}
|
|
},
|
|
methods: {
|
|
handleTreeDblClick (treeId, treeNode) {
|
|
this.checkedName = treeNode.name
|
|
this.$emit('input', treeNode.id)
|
|
this.visible = false
|
|
},
|
|
handleTreeOnCheck (treeCheckNode) {
|
|
this.treeCheckNode = treeCheckNode
|
|
},
|
|
getShowName (id) {
|
|
let name = ''
|
|
this.zNodes.map(item => {
|
|
if (item.id === id) {
|
|
name = item.oldname || item.name
|
|
}
|
|
})
|
|
return name
|
|
},
|
|
handleTreeDrawerConfirm () {
|
|
if (this.config.selVal === 'USERLIST') {
|
|
const checkedList = []
|
|
const checkedNameList = []
|
|
this.treeCheckNode.map(item => {
|
|
if (!item.isParent) {
|
|
checkedList.push(item.id)
|
|
checkedNameList.push(item.name)
|
|
}
|
|
})
|
|
this.checkedName = checkedNameList.join(',')
|
|
this.$emit('input', checkedList.join(','))
|
|
} else {
|
|
const checkedList = []
|
|
const checkedNameList = []
|
|
this.treeCheckNode.map(item => {
|
|
checkedList.push(item.id)
|
|
if (item.oldname) {
|
|
checkedNameList.push(item.oldname)
|
|
} else {
|
|
checkedNameList.push(item.name)
|
|
}
|
|
})
|
|
this.checkedName = checkedNameList.join(',')
|
|
this.$emit('input', checkedList.join(','))
|
|
}
|
|
this.visible = false
|
|
},
|
|
handleTreeDrawerCancel () {
|
|
this.visible = false
|
|
},
|
|
// 赋值回显人员和部门
|
|
drawerOpen () {
|
|
let checkedArr = this.config.value ? this.config.value.split(',') : []
|
|
if (checkedArr.length > 0) {
|
|
setTimeout(() => {
|
|
this.$nextTick(() => {
|
|
this.$refs[this.config.attrField].checkedNode(checkedArr)
|
|
})
|
|
}, 1500)
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
value (newVal) {
|
|
this.checkedName = newVal || ''
|
|
},
|
|
checkedName (val) {
|
|
this.$emit('update:value', val)
|
|
}
|
|
},
|
|
mounted () {
|
|
this.checkedName = this.config.valueName || ''
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
|
|
</style>
|