Compare commits

..

5 Commits

Author SHA1 Message Date
youxingzhi
5500a36492 1.4.6 2020-07-02 09:59:35 +08:00
ayou
66bc19baaa Merge pull request #78 from zoispag/feat/74_slot_for_display_name
Feat: Add slot for display node/leaf name 
2020-07-02 09:57:17 +08:00
Zois Pagoulatos
97daf67f9a Add slot for display node/leaf name (#74) 2020-07-01 11:26:10 +02:00
youxingzhi
d1e12aad85 1.4.5 2020-05-30 22:13:14 +08:00
youxingzhi
d5dd9b88c9 fix: 🐛 #72 2020-05-30 22:12:00 +08:00
5 changed files with 104 additions and 61 deletions

View File

@@ -14,6 +14,11 @@
default-leaf-node-name="new leaf"
v-bind:default-expanded="false"
>
<template v-slot:leafNameDisplay="slotProps">
<span>
{{ slotProps.model.name }} <span class="muted">#{{ slotProps.model.id }}</span>
</span>
</template>
<template v-slot:addTreeNodeIcon="slotProps">
<span class="icon">📂</span>
</template>
@@ -31,18 +36,22 @@
</template>
<template v-slot:treeNodeIcon="slotProps">
<span class="icon">
{{ (slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded) ? '🌲' : '' }}</span>
{{
slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded
? '🌲'
: ''
}}</span
>
</template>
</vue-tree-list>
<button @click="getNewTree">Get new tree</button>
<pre>
{{ newTree }}
</pre
>
{{ newTree }}
</pre>
</div>
</template>
<script>
import {VueTreeList, Tree, TreeNode} from '../src'
import { VueTreeList, Tree, TreeNode } from '../src'
export default {
components: {
VueTreeList
@@ -105,23 +114,23 @@ export default {
console.log(params)
},
drop: function({node, src, target}) {
drop: function({ node, src, target }) {
// eslint-disable-next-line no-console
console.log('drop', node, src, target)
},
dropBefore: function({node, src, target}) {
dropBefore: function({ node, src, target }) {
// eslint-disable-next-line no-console
console.log('drop-before', node, src, target)
},
dropAfter: function({node, src, target}) {
dropAfter: function({ node, src, target }) {
// eslint-disable-next-line no-console
console.log('drop-after', node, src, target)
},
addNode() {
var node = new TreeNode({name: 'new node', isLeaf: false})
var node = new TreeNode({ name: 'new node', isLeaf: false })
if (!this.data.children) this.data.children = []
this.data.addChildren(node)
},
@@ -171,4 +180,9 @@ export default {
cursor: pointer;
}
}
.muted {
color: gray;
font-size: 80%;
}
</style>

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "vue-tree-list",
"version": "1.4.4",
"version": "1.4.6",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "vue-tree-list",
"version": "1.4.4",
"version": "1.4.6",
"description": "A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.",
"author": "ayou",
"scripts": {

118
readme.md
View File

@@ -1,6 +1,7 @@
[![Actions Status](https://github.com/ParadeTo/vue-tree-list/workflows/Test/badge.svg)](https://github.com/ParadeTo/vue-tree-list/actions)
# vue-tree-list
A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.
![vue-tree-demo.gif](https://raw.githubusercontent.com/ParadeTo/vue-tree-list/master/img/demo.gif)
@@ -21,7 +22,8 @@ Vue.use(VueTreeList)
Or just register locally like the example below.
# use
``npm install vue-tree-list``
`npm install vue-tree-list`
```html
<template>
@@ -35,7 +37,13 @@ Or just register locally like the example below.
:model="data"
default-tree-node-name="new node"
default-leaf-node-name="new leaf"
v-bind:default-expanded="false">
v-bind:default-expanded="false"
>
<template v-slot:leafNameDisplay="slotProps">
<span>
{{ slotProps.model.name }} <span class="muted">#{{ slotProps.model.id }}</span>
</span>
</template>
<span class="icon" slot="addTreeNodeIcon">📂</span>
<span class="icon" slot="addLeafNodeIcon"></span>
<span class="icon" slot="editNodeIcon">📃</span>
@@ -56,7 +64,7 @@ Or just register locally like the example below.
components: {
VueTreeList
},
data () {
data() {
return {
newTree: {},
data: new Tree([
@@ -93,32 +101,32 @@ Or just register locally like the example below.
}
},
methods: {
onDel (node) {
onDel(node) {
console.log(node)
node.remove()
},
onChangeName (params) {
onChangeName(params) {
console.log(params)
},
onAddNode (params) {
onAddNode(params) {
console.log(params)
},
onClick (params) {
onClick(params) {
console.log(params)
},
addNode () {
addNode() {
var node = new TreeNode({ name: 'new node', isLeaf: false })
if (!this.data.children) this.data.children = []
this.data.addChildren(node)
},
getNewTree () {
getNewTree() {
var vm = this
function _dfs (oldNode) {
function _dfs(oldNode) {
var newNode = {}
for (var k in oldNode) {
@@ -137,8 +145,7 @@ Or just register locally like the example below.
}
vm.newTree = _dfs(vm.data)
},
}
}
}
</script>
@@ -163,58 +170,71 @@ Or just register locally like the example below.
cursor: pointer;
}
}
</style>
.muted {
color: gray;
font-size: 80%;
}
</style>
```
# props
## props of vue-tree-list
| name | type | default | description |
|:-----:|:-------:|:------------:|:----:|
model | TreeNode | - | You can use `const head = new Tree([])` to generate a tree with the head of `TreeNode` type
default-tree-node-name | string | New node node | Default name for new treenode
default-leaf-node-name | string | New leaf node | Default name for new leafnode
default-expanded | boolean | true | Tree is expanded or not
## props of vue-tree-list
| name | type | default | description |
| :--------------------: | :------: | :-----------: | :-----------------------------------------------------------------------------------------: |
| model | TreeNode | - | You can use `const head = new Tree([])` to generate a tree with the head of `TreeNode` type |
| default-tree-node-name | string | New node node | Default name for new treenode |
| default-leaf-node-name | string | New leaf node | Default name for new leafnode |
| default-expanded | boolean | true | Tree is expanded or not |
## props of TreeNode
### attributes
| name | type | default | description |
|:-----:|:-------:|:------------:|:----:|
id | string, number | current timestamp | The node's id
isLeaf | boolean | false | The node is leaf or not
dragDisabled | boolean | false | Forbid dragging tree node
addTreeNodeDisabled | boolean | false | Show `addTreeNode` button or not
addLeafNodeDisabled | boolean | false | Show `addLeafNode` button or not
editNodeDisabled | boolean | false | Show `editNode` button or not
delNodeDisabled | boolean | false | Show `delNode` button or not
children | array | null | The children of node
| name | type | default | description |
| :-----------------: | :------------: | :---------------: | :------------------------------: |
| id | string, number | current timestamp | The node's id |
| isLeaf | boolean | false | The node is leaf or not |
| dragDisabled | boolean | false | Forbid dragging tree node |
| addTreeNodeDisabled | boolean | false | Show `addTreeNode` button or not |
| addLeafNodeDisabled | boolean | false | Show `addLeafNode` button or not |
| editNodeDisabled | boolean | false | Show `editNode` button or not |
| delNodeDisabled | boolean | false | Show `delNode` button or not |
| children | array | null | The children of node |
### methods
| name | params | description |
|:-----:|:-------:|:----:|
changeName | name | Change node's name
addChildren | children: object, array | Add children to node
remove | - | Remove node from the tree
moveInto | target: TreeNode | Move node into another node
insertBefore | target: TreeNode | Move node before another node
insertAfter | target: TreeNode | Move node after another node
| name | params | description |
| :----------: | :---------------------: | :---------------------------: |
| changeName | name | Change node's name |
| addChildren | children: object, array | Add children to node |
| remove | - | Remove node from the tree |
| moveInto | target: TreeNode | Move node into another node |
| insertBefore | target: TreeNode | Move node before another node |
| insertAfter | target: TreeNode | Move node after another node |
# events
| name | params | description |
|:-----:|:-------:|:----:|
click | TreeNode | Trigger when clicking a tree node
change-name | {'id', 'oldName', 'newName'} | Trigger after changing a node's name
delete-node | TreeNode | Trigger when clicking `delNode` button. You can call `remove` of `TreeNode` to remove the node.
add-node | TreeNode | Trigger after adding a new node
drop | {node, src, target} | Trigger after dropping a node into another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop into
drop-before | {node, src, target} | Trigger after dropping a node before another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop before
drop-after | {node, src, target} | Trigger after dropping a node after another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop after
| name | params | description |
| :---------: | :--------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| click | TreeNode | Trigger when clicking a tree node |
| change-name | {'id', 'oldName', 'newName'} | Trigger after changing a node's name |
| delete-node | TreeNode | Trigger when clicking `delNode` button. You can call `remove` of `TreeNode` to remove the node. |
| add-node | TreeNode | Trigger after adding a new node |
| drop | {node, src, target} | Trigger after dropping a node into another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop into |
| drop-before | {node, src, target} | Trigger after dropping a node before another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop before |
| drop-after | {node, src, target} | Trigger after dropping a node after another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop after |
# customize operation icons
The component has default icons for `addTreeNodeIcon`, `addLeafNodeIcon`, `editNodeIcon`, `delNodeIcon`, `leafNodeIcon`, `treeNodeIcon` button, but you can also customize them and can access `model`, `root`, `expanded` as below:
```html
<template v-slot:leafNameDisplay="slotProps">
<span>{{ slotProps.model.name }} #{{ slotProps.model.id }}</span>
</template>
<template v-slot:addTreeNodeIcon="slotProps">
<span class="icon">📂</span>
</template>
@@ -232,6 +252,8 @@ The component has default icons for `addTreeNodeIcon`, `addLeafNodeIcon`, `editN
</template>
<template v-slot:treeNodeIcon="slotProps">
<span class="icon">
{{ (slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded) ? '🌲' : '' }}</span>
{{ (slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded) ?
'🌲' : '' }}</span
>
</template>
```

View File

@@ -43,7 +43,9 @@
</span>
<div class="vtl-node-content" v-if="!editable">
{{ model.name }}
<slot name="leafNameDisplay" :expanded="expanded" :model="model" :root="rootNode">
{{ model.name }}
</slot>
</div>
<input
v-else
@@ -110,6 +112,9 @@
:model="model"
:key="model.id"
>
<template v-slot:leafNameDisplay="slotProps">
<slot name="leafNameDisplay" v-bind="slotProps" />
</template>
<template v-slot:addTreeNodeIcon="slotProps">
<slot name="addTreeNodeIcon" v-bind="slotProps" />
</template>
@@ -221,7 +226,8 @@ export default {
this.rootNode.$emit('change-name', {
id: this.model.id,
oldName: oldName,
newName: e.target.value
newName: e.target.value,
node: this.model
})
},
@@ -295,6 +301,7 @@ export default {
return true
},
dragEnter() {
if (!compInOperation) return
if (compInOperation.model.id === this.model.id || !compInOperation || this.model.isLeaf)
return
this.isDragEnterNode = true