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.
 
 
 
 
 
 

240 lines
5.9 KiB

<template>
<div>
<el-input
v-model="searchInput"
placeholder="搜索成员"
size="small"
suffix-icon="el-icon-search"
@input="inputchange"/>
<div
v-loading="loading"
class="search-list">
<el-checkbox-group
v-model="selectItems"
@change="changeCheckout">
<el-checkbox
v-for="(item, i) in list"
v-if="item.show"
:key="i"
:label="item"
:disabled="item.disabled"
class="colleagues-list">
<div
v-photo="item"
v-lazy:background-image="$options.filters.filterUserLazyImg(item.img)"
class="div-photo search-img"/>
<span>{{ item.realname }}</span>
</el-checkbox>
</el-checkbox-group>
</div>
</div>
</template>
<script type="text/javascript">
// import { usersList } from '@/api/common'
export default {
name: 'XhUser', // 新建 user
components: {},
props: {
value: {
type: String,
default: ''
},
/** 多选框 只能选一个 */
radio: {
type: Boolean,
default: false
},
/** 已选信息 */
selectedData: {
type: Array,
default: () => {
return []
}
},
/** 获取不同的员工展示列表 */
infoType: {
type: String,
default: 'default' // 返回全部 crm_contract crm_receivables oa_examine 合同审核人自选列表
},
infoRequest: Function,
/** 请求辅助参数 */
infoParams: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
list: [],
selectItems: [], // 选择项
loading: false, // 加载动画
searchInput: ''
}
},
computed: {},
watch: {
selectedData: function(value) {
this.checkItems(value)
}
},
mounted() {
this.getUserList()
},
methods: {
// 获取员工列表
getUserList() {
this.loading = true
this.getRequest()(this.getParams())
.then(res => {
var self = this
this.list = res.data.map(function(item, index, array) {
item.disabled = false // 要求单选
item.show = true
if (self.selectedData.length > 0) {
let disabled = true
for (let index = 0; index < self.selectedData.length; index++) {
const element = self.selectedData[index]
if (element.userId == item.userId) {
disabled = false
self.selectItems.push(item)
}
}
if (self.radio) {
item.disabled = disabled
}
}
return item
})
this.loading = false
})
.catch(() => {
this.loading = false
})
},
getRequest() {
if (this.infoRequest) {
return this.infoRequest
} else if (this.infoType === 'default') {
return usersList
} else if (
this.infoType === 'crm_contract' ||
this.infoType === 'crm_receivables' ||
this.infoType === 'oa_examine'
) {
return usersList
}
},
getParams() {
const params =
this.infoParams && Object.keys(this.infoParams.length !== 0)
? this.infoParams
: {}
if (this.infoType === 'default') {
params.pageType = 0
return params
} else if (
this.infoType === 'crm_contract' ||
this.infoType === 'crm_receivables' ||
this.infoType === 'oa_examine'
) {
params.pageType = 0
return params
}
},
changeCheckout(items) {
if (this.radio) {
if (items.length) {
var element = items[0]
this.list = this.list.map(function(item, index, array) {
if (element.userId == item.userId) {
item.disabled = false
} else {
item.disabled = true
}
return item
})
} else {
this.list = this.list.map(function(item, index, array) {
item.disabled = false
return item
})
}
}
this.$emit('changeCheckout', { data: this.selectItems })
},
/** 取消勾选 */
cancelCheckItem(item) {
var removeIndex = -1
for (let index = 0; index < this.selectItems.length; index++) {
const element = this.selectItems[index]
if (element.userId == item.userId) {
removeIndex = index
}
}
this.selectItems.splice(removeIndex, 1)
if (this.radio && this.selectItems.length == 0) {
this.list = this.list.map(function(item, index, array) {
item.disabled = false
return item
})
}
},
/** 标记勾选 */
checkItems(items) {
this.selectItems = []
if (items.length > 0) {
for (let bigIndex = 0; bigIndex < this.list.length; bigIndex++) {
const item = this.list[bigIndex]
let disabled = true
for (let index = 0; index < items.length; index++) {
const element = items[index]
if (element.userId == item.userId) {
disabled = false
this.selectItems.push(item)
}
}
if (this.radio) {
item.disabled = disabled
}
}
}
},
// 搜索
inputchange(val) {
this.list = this.list.map(function(item, index, array) {
if (item.realname.indexOf(val) != -1) {
item.show = true
} else {
item.show = false
}
return item
})
}
}
}
</script>
<style lang="scss" scoped>
/* 选择员工 */
.search-img {
width: 24px;
height: 24px;
border-radius: 12px;
vertical-align: middle;
margin-right: 8px;
}
.search-list {
padding: 5px;
height: 248px;
overflow: auto;
}
.colleagues-list {
padding: 5px;
display: block;
margin-left: 0;
}
</style>