Skip to content

Commit a4560c5

Browse files
authored
Merge pull request #63 from sendya/feature/tree-list
feature/tree-list
2 parents 5161624 + 256a18d commit a4560c5

File tree

4 files changed

+641
-341
lines changed

4 files changed

+641
-341
lines changed

src/api/manage.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const api = {
66
service: '/service',
77
permission: '/permission',
88
permissionNoPager: '/permission/no-pager',
9+
orgTree: '/org/tree'
910
}
1011

1112
export default api
@@ -42,6 +43,14 @@ export function getPermissions(parameter) {
4243
})
4344
}
4445

46+
export function getOrgTree(parameter) {
47+
return axios({
48+
url: api.orgTree,
49+
method: 'get',
50+
params: parameter
51+
})
52+
}
53+
4554
// id == 0 add post
4655
// id != 0 update put
4756
export function saveService(parameter) {

src/components/Tree/Tree.jsx

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { Menu, Icon, Input } from 'ant-design-vue'
2+
3+
const { Item, ItemGroup, SubMenu } = Menu
4+
const { Search } = Input
5+
6+
export default {
7+
name: 'Tree',
8+
props: {
9+
dataSource: {
10+
type: Array,
11+
required: true
12+
},
13+
search: {
14+
type: Boolean,
15+
default: false
16+
}
17+
},
18+
data () {
19+
return {
20+
openKeys: []
21+
}
22+
},
23+
methods: {
24+
handlePlus (...args) {
25+
this.$emit('onAdd', { args })
26+
},
27+
handleTitleClick (...args) {
28+
this.$emit('titleClick', { args })
29+
},
30+
31+
renderSearch () {
32+
return (
33+
<Search
34+
placeholder="input search text"
35+
style="width: 100%; margin-bottom: 1rem"
36+
/>
37+
)
38+
},
39+
renderIcon (icon) {
40+
return icon && (<Icon type={icon} />) || null
41+
},
42+
renderMenuItem (item) {
43+
return (
44+
<Item key={item.key}>
45+
{ this.renderIcon(item.icon) }
46+
{ item.title }
47+
<a class="btn"><a-icon type="plus" onClick={() => this.handlePlus(item)} /></a>
48+
</Item>
49+
)
50+
},
51+
renderItem (item) {
52+
return item.children ? this.renderSubItem(item, item.key) : this.renderMenuItem(item, item.key)
53+
},
54+
renderItemGroup (item) {
55+
const childrenItems = item.children.map(o => {
56+
return this.renderItem(o, o.key)
57+
})
58+
59+
return (
60+
<ItemGroup key={item.key}>
61+
<template slot="title">
62+
<span>{ item.title }</span>
63+
<a-dropdown>
64+
<a class="btn"><a-icon type="ellipsis" /></a>
65+
<a-menu slot="overlay">
66+
<a-menu-item key="1">新增</a-menu-item>
67+
<a-menu-item key="2">合并</a-menu-item>
68+
<a-menu-item key="3">移除</a-menu-item>
69+
</a-menu>
70+
</a-dropdown>
71+
</template>
72+
{ childrenItems }
73+
</ItemGroup>
74+
)
75+
},
76+
renderSubItem (item, key) {
77+
const childrenItems = item.children && item.children.map(o => {
78+
return this.renderItem(o, o.key)
79+
})
80+
81+
const title = (
82+
<span slot="title">
83+
{ this.renderIcon(item.icon) }
84+
<span>{ item.title }</span>
85+
</span>
86+
)
87+
88+
if (item.group) {
89+
return this.renderItemGroup(item)
90+
}
91+
// titleClick={this.handleTitleClick(item)}
92+
return (
93+
<SubMenu key={key}>
94+
{ title }
95+
{ childrenItems }
96+
</SubMenu>
97+
)
98+
}
99+
},
100+
render () {
101+
const { dataSource, search } = this.$props
102+
103+
const list = dataSource.map(item => {
104+
return this.renderItem(item)
105+
})
106+
107+
return (
108+
<div class="tree-wrapper">
109+
{ search ? this.renderSearch() : null }
110+
<Menu mode="inline" class="custom-tree" {...{ on: { click: item => this.$emit('click', item) } }}>
111+
{ list }
112+
</Menu>
113+
</div>
114+
)
115+
}
116+
}

0 commit comments

Comments
 (0)