Commit 12e1aa86 authored by WangXu's avatar WangXu

用户选择组件 缺数据绑定

parent 3aa0f9c9
...@@ -20,7 +20,8 @@ const api = { ...@@ -20,7 +20,8 @@ const api = {
getTempletById: '/task/work-template/queryTemplateByTemplateId', getTempletById: '/task/work-template/queryTemplateByTemplateId',
copyTemplate: '/task/work-template/templateCopy', copyTemplate: '/task/work-template/templateCopy',
moveTemplate: '/task/work-template/templateMove', moveTemplate: '/task/work-template/templateMove',
roleTree: 'http://localhost:8080/roleTree' roleTree: 'http://localhost:8080/roleTree',
userTree: 'http://localhost:8080/userTree',
} }
export default api export default api
...@@ -187,3 +188,11 @@ export function roleTree(params) { ...@@ -187,3 +188,11 @@ export function roleTree(params) {
params: params params: params
}) })
} }
export function userTree(params) {
const url = api.userTree
return axios({
url,
method: 'get',
params: params
})
}
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
<div><strong>选择</strong></div> <div><strong>选择</strong></div>
<a-input-search style="margin-bottom: 8px" placeholder="搜索" @change="onChange"/> <a-input-search style="margin-bottom: 8px" placeholder="搜索" @change="onChange"/>
<a-tree <a-tree
ref="roleTree"
@expand="onExpand" @expand="onExpand"
:expandedKeys="expandedKeys" :expandedKeys="expandedKeys"
:autoExpandParent="autoExpandParent" :autoExpandParent="autoExpandParent"
...@@ -15,6 +16,7 @@ ...@@ -15,6 +16,7 @@
:checkable="true" :checkable="true"
:checkStrictly="true" :checkStrictly="true"
v-model="selectedList" v-model="selectedList"
@check="handleCheck"
> >
<template slot="title" slot-scope="{title}"> <template slot="title" slot-scope="{title}">
<span v-if="title.indexOf(searchValue) > -1"> <span v-if="title.indexOf(searchValue) > -1">
...@@ -31,14 +33,14 @@ ...@@ -31,14 +33,14 @@
<a-col class="content right" :span="12"> <a-col class="content right" :span="12">
<div class="ant-card-bordered"> <div class="ant-card-bordered">
<div><strong>已选</strong></div> <div><strong>已选</strong></div>
<template v-for="(role, index) in selectedList.checked"> <template v-for="(role, index) in selectedListForTags">
<a-tooltip v-if="role.name.length > 20" :key="role.id" :title="role.name"> <a-tooltip v-if="role.title.length > 20" :key="role.id" :title="role.title">
<a-tag class="role" :key="role.id" :closable="true" :afterClose="() => handleClose(role)"> <a-tag class="role" :key="role.id" :closable="true" :afterClose="() => handleClose(role)">
{{`${role.name.slice(0, 20)}...`}} {{`${role.title.slice(0, 20)}...`}}
</a-tag> </a-tag>
</a-tooltip> </a-tooltip>
<a-tag class="role" v-else :key="role.id" :closable="true" :afterClose="() => handleClose(role)"> <a-tag class="role" v-else :key="role.id" :closable="true" :afterClose="() => handleClose(role)">
{{role.name}} {{role.title}}
</a-tag> </a-tag>
</template> </template>
<div v-if="!hasSelectedData"> <div v-if="!hasSelectedData">
...@@ -57,6 +59,7 @@ ...@@ -57,6 +59,7 @@
<script> <script>
import { Ellipsis } from '@/components' import { Ellipsis } from '@/components'
import ACol from 'ant-design-vue/es/grid/Col'; import ACol from 'ant-design-vue/es/grid/Col';
import roleSelectTree from "@/views/taskTemplate/taskDesign/taskFlow/component/role-select-tree";
const getParentKey = (key, tree) => { const getParentKey = (key, tree) => {
let parentKey let parentKey
...@@ -72,6 +75,19 @@ ...@@ -72,6 +75,19 @@
} }
return parentKey return parentKey
} }
const dataList = []
const generateList = (data) => {
for (let i = 0; i < data.length; i++) {
const node = data[i]
const key = node.key
dataList.push({ key, title: key })
if (node.children) {
generateList(node.children, node.key)
}
}
}
export default { export default {
name: 'RoleSelectTree', name: 'RoleSelectTree',
components: { components: {
...@@ -84,19 +100,20 @@ ...@@ -84,19 +100,20 @@
expandedKeys: [], expandedKeys: [],
searchValue: '', searchValue: '',
autoExpandParent: true, autoExpandParent: true,
selectedList: {} selectedList: {},
selectedListForTags: []
} }
}, },
computed: { computed: {
hasSelectedData() { hasSelectedData() {
const flag = this.selectedList.checked && this.selectedList.checked.length > 0 const flag = this.selectedListForTags && this.selectedListForTags.length > 0
return flag return flag
} }
}, },
methods: { methods: {
handleClose(removedTag) { handleClose(removedTag) {
const selectedList = this.selectedList && this.selectedList.checked const selectedList = this.selectedList && this.selectedList.checked
const tags = selectedList.filter(tag => tag !== removedTag) const tags = selectedList.filter(tag => tag !== removedTag.key)
console.log(tags) console.log(tags)
this.selectedList = Object.assign({}, this.selectedList, { this.selectedList = Object.assign({}, this.selectedList, {
checked: tags checked: tags
...@@ -123,7 +140,28 @@ ...@@ -123,7 +140,28 @@
autoExpandParent: true, autoExpandParent: true,
}) })
}, },
handleCheck(checkedKeys, e) {
console.log('handleCheck', this.$refs.roleTree)
// const checked
const hasKey = this.selectedListForTags.some(item => {
return item.key === e.node.eventKey
})
// 取消选中
if (!e.checked && hasKey) {
this.selectedListForTags = this.selectedListForTags.filter(item => {
return item.key !== e.node.eventKey
})
}
// 选中
if (e.checked && !hasKey) {
this.selectedListForTags.push(e.node.dataRef)
}
}
}, },
mounted(){
console.log('roleTree', this.$refs.roleTree)
generateList(this.gData)
}
} }
</script> </script>
......
...@@ -3,17 +3,20 @@ ...@@ -3,17 +3,20 @@
<div class="role"> <div class="role">
<div class="tree"> <div class="tree">
<a-row class="wrap" type="flex" :gutter="16"> <a-row class="wrap" type="flex" :gutter="16">
<a-col class="content left" :span="12"> <a-col class="content left" :span="16">
<div class="ant-card-bordered"> <div class="ant-card-bordered">
<div><strong>选择</strong></div> <div><strong>选择</strong></div>
<a-row> <a-row type="flex">
<a-col :span="18"> <a-col :span="18">
<a-input-search style="margin-bottom: 8px" placeholder="搜索" @change="onChange"/> <a-input-search style="margin-bottom: 8px" placeholder="搜索" @change="onChange"/>
<a-tree <a-tree
class="usertree"
@expand="onExpand" @expand="onExpand"
:defaultExpandAll="true" :defaultExpandAll="false"
:autoExpandParent="autoExpandParent"
:treeData="gData" :treeData="gData"
:showIcon="true" :showIcon="true"
:expandedKeys="expandedKeys"
@select="handleSelect" @select="handleSelect"
> >
<template slot="title" slot-scope="{title}"> <template slot="title" slot-scope="{title}">
...@@ -24,32 +27,38 @@ ...@@ -24,32 +27,38 @@
</span> </span>
<span v-else>{{title}}</span> <span v-else>{{title}}</span>
</template> </template>
<template slot="icon" slot-scope="{title}"> <a-icon slot="folder" type="folder"/>
1111
</template>
</a-tree> </a-tree>
</a-col> </a-col>
<a-col :span="18"> <a-col class="userlist" :span="6">
<div style="background-color: black"></div> <div class="list">
<template v-for="(user, index) of userList">
<div class="user" @click="userSelect(user)" :key="index">
<span class="username">{{user.name}}</span>
</div>
</template>
</div>
</a-col> </a-col>
</a-row> </a-row>
</div> </div>
</a-col> </a-col>
<a-col class="content right" :span="12"> <a-col class="content right" :span="8">
<div class="ant-card-bordered"> <div class="ant-card-bordered">
<div><strong>已选</strong></div> <div><strong>已选</strong></div>
<template v-for="(role, index) in selectedList.checked"> <div class="userlist">
<a-tooltip v-if="role.length > 20" :key="role" :title="role"> <template v-for="(user, index) in selectedList">
<a-tag class="role" :key="role" :closable="true" :afterClose="() => handleClose(role)"> <a-tooltip v-if="user.name.length > 20" :key="user.id" :title="user.name">
{{`${role.slice(0, 20)}...`}} <a-tag class="user" :key="index" :closable="true" :afterClose="() => handleClose(user)">
{{`${user.name.slice(0, 20)}...`}}
</a-tag>
</a-tooltip>
<a-tag class="user" v-else :key="index" :closable="true" :afterClose="() => handleClose(user)">
{{user.name}}
</a-tag> </a-tag>
</a-tooltip> </template>
<a-tag class="role" v-else :key="role" :closable="true" :afterClose="() => handleClose(role)"> </div>
{{role}}
</a-tag>
</template>
<div v-if="!hasSelectedData"> <div v-if="!hasSelectedData">
暂无 暂无
</div> </div>
...@@ -67,62 +76,84 @@ ...@@ -67,62 +76,84 @@
import { Ellipsis } from '@/components' import { Ellipsis } from '@/components'
import ACol from 'ant-design-vue/es/grid/Col'; import ACol from 'ant-design-vue/es/grid/Col';
import ARow from 'ant-design-vue/es/grid/Row'; import ARow from 'ant-design-vue/es/grid/Row';
import { userTree } from '@/api/task';
const x = 3 /**
const y = 2 * 搜索时查找父级 id
const z = 1 * @param key
const gData = [] * @param tree
*/
const generateData = (_level, _preKey, _tns) => { const getParentKey = (key, tree) => {
const preKey = _preKey || '0' let parentKey
const tns = _tns || gData for (let i = 0; i < tree.length; i++) {
const node = tree[i]
const children = [] if (node.children) {
for (let i = 0; i < x; i++) { if (node.children.some(item => item.key === key)) {
const key = `${preKey}-${i}` parentKey = node.key
tns.push({ title: key, key, scopedSlots: { title: 'title' } }) } else if (getParentKey(key, node.children)) {
if (i < y) { parentKey = getParentKey(key, node.children)
children.push(key) }
} }
} }
if (_level < 0) { return parentKey
return tns
}
const level = _level - 1
children.forEach((key, index) => {
tns[index].children = []
return generateData(level, key, tns[index].children)
})
} }
generateData(z)
/**
* 将树状数据转换为list
* @param data
*/
const dataList = [] const dataList = []
const generateList = (data) => { const generateList = (data) => {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
const node = data[i] const node = data[i]
const key = node.key const key = node.key
dataList.push({ key, title: key }) dataList.push({ key, title: node.title })
if (node.children) { if (node.children) {
generateList(node.children, node.key) generateList(node.children, node.key)
} }
} }
} }
generateList(gData)
const getParentKey = (key, tree) => { /**
let parentKey * 将用户数据转换为list
for (let i = 0; i < tree.length; i++) { * @param data
const node = tree[i] */
let userDataList = []
const generateUserList = (data) => {
for (let i = 0; i < data.length; i++) {
const node = data[i]
const userList = node.userList
userDataList = [...userDataList, ...userList]
if (node.children) { if (node.children) {
if (node.children.some(item => item.key === key)) { generateUserList(node.children, node.key)
parentKey = node.key }
} else if (getParentKey(key, node.children)) { }
parentKey = getParentKey(key, node.children) }
/**
* 格式化数据为 a-tree 可用的数据
* @param list
* @returns {*}
*/
function t(list) {
let arr = list
for (var i = 0; i < arr.length; i++) {
const obj = {
slots: {
icon: 'folder'
} }
} }
if (arr[i].childDeptTreeResDTOS) {
obj.children = t(arr[i].childDeptTreeResDTOS);
}
arr[i].deptName && (obj.userList = arr[i].userInfoList)
arr[i].deptName && (obj.title = arr[i].deptName);
arr[i].deptId && (obj.key = arr[i].deptId);
arr[i] = obj;
} }
return parentKey return arr;
} }
export default { export default {
name: 'UserSelectTree', name: 'UserSelectTree',
components: { components: {
...@@ -130,30 +161,42 @@ ...@@ -130,30 +161,42 @@
ACol, ACol,
Ellipsis Ellipsis
}, },
props: {}, model: {
prop: 'selectedKeys',
event: 'change'
},
props: {
selectedKeys: {
type: Array,
default: function() {
return []
}
}
},
data() { data() {
return { return {
gData: [],
expandedKeys: [], expandedKeys: [],
searchValue: '', searchValue: '',
autoExpandParent: true, autoExpandParent: true,
gData, selectedList: [],
selectedList: {} currentTreeNode: {},
userList: []
} }
}, },
computed: { computed: {
hasSelectedData() { hasSelectedData() {
const flag = this.selectedList.checked && this.selectedList.checked.length > 0 const flag = this.selectedList && this.selectedList.length > 0
return flag return flag
} }
}, },
methods: { methods: {
handleClose(removedTag) { handleClose(removedTag) {
const selectedList = this.selectedList && this.selectedList.checked const selectedList = this.selectedList
const tags = selectedList.filter(tag => tag !== removedTag) const tags = selectedList.filter(tag => tag !== removedTag)
console.log(tags) console.log(tags)
this.selectedList = Object.assign({}, this.selectedList, { this.selectedList = tags
checked: tags this.$emit('change', this.selectedList)
})
// this.$set(this.selectedList, 'checked', tags) // this.$set(this.selectedList, 'checked', tags)
// this.selectedList.checked = tags // this.selectedList.checked = tags
// this.$forceUpdate(); // this.$forceUpdate();
...@@ -162,14 +205,16 @@ ...@@ -162,14 +205,16 @@
this.expandedKeys = expandedKeys this.expandedKeys = expandedKeys
this.autoExpandParent = false this.autoExpandParent = false
}, },
handleSelect(selectedKeys, e){ handleSelect(selectedKeys, e) {
console.log('handleSelect', selectedKeys, e) console.log('handleSelect', selectedKeys, e)
this.currentTreeNode = e.node.dataRef
this.userList = this.currentTreeNode.userList
}, },
onChange(e) { onChange(e) {
const value = e.target.value const value = e.target.value
const expandedKeys = dataList.map((item) => { const expandedKeys = dataList.map((item) => {
if (item.key.indexOf(value) > -1) { if (item.title.indexOf(value) > -1) {
return getParentKey(item.key, gData) return getParentKey(item.key, this.gData)
} }
return null return null
}).filter((item, i, self) => item && self.indexOf(item) === i) }).filter((item, i, self) => item && self.indexOf(item) === i)
...@@ -179,14 +224,56 @@ ...@@ -179,14 +224,56 @@
autoExpandParent: true, autoExpandParent: true,
}) })
}, },
userSelect(user) {
const hasUser = this.selectedList.some(item => {
return item === user
})
if (!hasUser) {
this.selectedList.push(user)
this.$emit('change', this.selectedList)
}
},
getUserTreeData() {
return userTree().then(res => {
const list = [res.data]
const treeData = list
this.gData = t(treeData)
console.log('getUserTreeData', this.gData)
})
},
}, },
async mounted() {
await this.getUserTreeData()
this.gData[0] && (this.userList = this.gData[0].userList, this.currentTreeNode = this.gData[0])
generateList(this.gData)
generateUserList(this.gData)
this.selectedList = userDataList.filter(item => {
console.log(item)
return this.selectedKeys.some(id => {
return item.id === id
})
})
}
} }
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.wrap{
height: 453px;
}
.tree { .tree {
overflow: hidden; overflow: hidden;
} }
.left .usertree{
max-height: 350px;
overflow-y: auto;
overflow-x: hidden;
}
.left .userlist, .right .userlist{
max-height: 390px;
overflow-y: auto;
overflow-x: hidden;
}
.wrap > .content { .wrap > .content {
/*flex: 1;*/ /*flex: 1;*/
...@@ -200,15 +287,28 @@ ...@@ -200,15 +287,28 @@
width: 100%; width: 100%;
} }
.wrap .right .role { .wrap .right .user {
display: block; display: block;
position: relative; position: relative;
margin-bottom: 5px; margin-bottom: 5px;
} }
.wrap .right .role /deep/ .anticon-close { .wrap .right .user /deep/ .anticon-close {
position: absolute; position: absolute;
right: 3px; right: 3px;
line-height: 22px; line-height: 22px;
} }
.userlist .list .user{
padding: 4px 15px;
cursor: pointer;
}
.userlist .list .user .username{
cursor: pointer;
transition: color .3s linear 0s;
}
.userlist .list .username:hover{
cursor: pointer;
font-weight: bold;
color: #2eabff;
}
</style> </style>
<template> <template>
<div> <div>
<mt-show-input v-model="mtShowInputText"></mt-show-input> <mt-show-input v-model="mtShowInputText"></mt-show-input>
<role-select-tree :gData="roleTree"></role-select-tree> <!--<role-select-tree :gData="roleTree"></role-select-tree>-->
<!--<user-select-tree></user-select-tree>--> <!--<user-select-tree :gData="userTree" v-if="userTree.length>0"></user-select-tree>-->
<div id="user-select-tree">
<a-button type="primary" @click="showModal">Open Modal</a-button>
<a-modal
v-model="visible"
:width="700"
style="top: 20px;"
@ok="handleOk"
>
<div class="title" slot="title">
<span>选择人员<span style="color: #00000073">(可多选)</span></span>
</div>
<user-select-tree :selectedKeys="[1042237480110104577, 1042237480391122946]"></user-select-tree>
</a-modal>
</div>
</div> </div>
</template> </template>
<script> <script>
import mtShowInput from "@comp/mt-show-input"; import mtShowInput from '@comp/mt-show-input';
import roleSelectTree from "@/views/taskTemplate/taskDesign/taskFlow/component/role-select-tree"; import roleSelectTree from "@/views/taskTemplate/taskDesign/taskFlow/component/role-select-tree";
import userSelectTree from "@/views/taskTemplate/taskDesign/taskFlow/component/user-select-tree"; import userSelectTree from "@/views/taskTemplate/taskDesign/taskFlow/component/user-select-tree";
import { roleTree } from '@/api/task'; import { roleTree, userTree } from '@/api/task';
const generateData = (_obj, _keys) => {
const children = []
for (let i = 0; i < _obj; i++) {
tns.push({ title: key, key, scopedSlots: { title: 'title' }})
if (i < y) {
children.push(key)
}
}
if (_level < 0) {
return tns
}
const level = _level - 1
children.forEach((key, index) => {
tns[index].children = []
return generateData(level, key, tns[index].children)
})
}
export default { export default {
name: 'test', name: 'test',
data() { data() {
return { return {
visible: false,
mtShowInputText: '王旭', mtShowInputText: '王旭',
roleTree: [] roleTree: [],
} }
}, },
components: { components: {
...@@ -47,16 +43,23 @@ ...@@ -47,16 +43,23 @@
userSelectTree userSelectTree
}, },
methods: { methods: {
showModal() {
this.visible = true
},
handleOk(e) {
console.log(e);
this.visible = false
},
getRoleTreeData() { getRoleTreeData() {
roleTree().then(res => { roleTree().then(res => {
const list = res.data || [] const list = res.data || []
const treeData = list.map(role => { const treeData = list.map(role => {
const obj = Object.assign({}, { const obj = Object.assign({}, {
key: role, key: role.id,
title: role.name, title: role.name,
children: role.roles.map(cRole => { children: role.roles.map(cRole => {
const cObj = Object.assign({}, { const cObj = Object.assign({}, {
key: cRole, key: cRole.id,
title: cRole.name title: cRole.name
}) })
return cObj return cObj
...@@ -67,11 +70,9 @@ ...@@ -67,11 +70,9 @@
this.roleTree = treeData this.roleTree = treeData
console.log('getRoleTreeData', this.roleTree) console.log('getRoleTreeData', this.roleTree)
}) })
}, }
}, },
mounted() { mounted() {
this.getRoleTreeData()
} }
} }
</script> </script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment