Compare commits

..

8 Commits

Author SHA1 Message Date
youxingzhi
7b677a6589 1.5.0 2020-11-28 22:11:56 +08:00
youxingzhi
a21f4b8adf chore: 🤖 rm npx 2020-11-28 22:11:42 +08:00
youxingzhi
5b2fea32ad feat: 🎸 #84, add default title props 2020-11-28 22:11:42 +08:00
ayou
347a927e90 Merge pull request #93 from TheFoot/feature/node-expand-collapse
Feature: Added toggle() method to the node passed to TreeNode.click()…
2020-10-28 09:56:11 +08:00
Barry Jones
0f04f7edba Feature: Added toggle() method to the node passed to TreeNode.click() handler. 2020-09-08 15:35:17 +01:00
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
8 changed files with 120 additions and 66 deletions

View File

@@ -14,6 +14,11 @@
default-leaf-node-name="new leaf" 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>
<template v-slot:addTreeNodeIcon="slotProps"> <template v-slot:addTreeNodeIcon="slotProps">
<span class="icon">📂</span> <span class="icon">📂</span>
</template> </template>
@@ -42,8 +47,7 @@
<button @click="getNewTree">Get new tree</button> <button @click="getNewTree">Get new tree</button>
<pre> <pre>
{{ newTree }} {{ newTree }}
</pre </pre>
>
</div> </div>
</template> </template>
<script> <script>
@@ -176,4 +180,9 @@ export default {
cursor: pointer; cursor: pointer;
} }
} }
.muted {
color: gray;
font-size: 80%;
}
</style> </style>

8
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{ {
"name": "vue-tree-list", "name": "vue-tree-list",
"version": "1.4.5", "version": "1.5.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@@ -6783,6 +6783,12 @@
"assert-plus": "^1.0.0" "assert-plus": "^1.0.0"
} }
}, },
"git-cz": {
"version": "4.7.4",
"resolved": "https://registry.npmjs.org/git-cz/-/git-cz-4.7.4.tgz",
"integrity": "sha512-s8r6JPuuFJXCiwB6uBlWYjDE6GlvIReSgVqYCfpRB+JbiBVNQLcBb93mH6bIJzz1lQU4R8+qlChhQIK8xp58Tg==",
"dev": true
},
"glob": { "glob": {
"version": "7.1.6", "version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "vue-tree-list", "name": "vue-tree-list",
"version": "1.4.5", "version": "1.5.0",
"description": "A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.", "description": "A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.",
"author": "ayou", "author": "ayou",
"scripts": { "scripts": {
@@ -10,7 +10,7 @@
"test:coverage": "vue-cli-service test:unit --coverage", "test:coverage": "vue-cli-service test:unit --coverage",
"lint": "vue-cli-service lint", "lint": "vue-cli-service lint",
"lint-staged": "lint-staged", "lint-staged": "lint-staged",
"commit": "npx git-cz", "commit": "git-cz",
"prepublish": "npm run build" "prepublish": "npm run build"
}, },
"main": "dist/vue-tree-list.umd.min.js", "main": "dist/vue-tree-list.umd.min.js",
@@ -27,6 +27,7 @@
"eslint-config-prettier": "^6.10.0", "eslint-config-prettier": "^6.10.0",
"eslint-plugin-prettier": "^3.1.2", "eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-vue": "^5.0.0", "eslint-plugin-vue": "^5.0.0",
"git-cz": "^4.7.4",
"husky": "^4.2.1", "husky": "^4.2.1",
"jest-serializer-vue": "^2.0.2", "jest-serializer-vue": "^2.0.2",
"less": "^3.10.3", "less": "^3.10.3",

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) [![Actions Status](https://github.com/ParadeTo/vue-tree-list/workflows/Test/badge.svg)](https://github.com/ParadeTo/vue-tree-list/actions)
# vue-tree-list # vue-tree-list
A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging. 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) ![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. Or just register locally like the example below.
# use # use
``npm install vue-tree-list``
`npm install vue-tree-list`
```html ```html
<template> <template>
@@ -35,7 +37,13 @@ Or just register locally like the example below.
:model="data" :model="data"
default-tree-node-name="new node" default-tree-node-name="new node"
default-leaf-node-name="new leaf" 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="addTreeNodeIcon">📂</span>
<span class="icon" slot="addLeafNodeIcon"></span> <span class="icon" slot="addLeafNodeIcon"></span>
<span class="icon" slot="editNodeIcon">📃</span> <span class="icon" slot="editNodeIcon">📃</span>
@@ -137,8 +145,7 @@ Or just register locally like the example below.
} }
vm.newTree = _dfs(vm.data) vm.newTree = _dfs(vm.data)
}, }
} }
} }
</script> </script>
@@ -163,58 +170,71 @@ Or just register locally like the example below.
cursor: pointer; cursor: pointer;
} }
} }
</style>
.muted {
color: gray;
font-size: 80%;
}
</style>
``` ```
# props # 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 ## props of TreeNode
### attributes ### attributes
| name | type | default | description | | name | type | default | description |
|:-----:|:-------:|:------------:|:----:| | :-----------------: | :------------: | :---------------: | :------------------------------: |
id | string, number | current timestamp | The node's id | id | string, number | current timestamp | The node's id |
isLeaf | boolean | false | The node is leaf or not | isLeaf | boolean | false | The node is leaf or not |
dragDisabled | boolean | false | Forbid dragging tree node | dragDisabled | boolean | false | Forbid dragging tree node |
addTreeNodeDisabled | boolean | false | Show `addTreeNode` button or not | addTreeNodeDisabled | boolean | false | Show `addTreeNode` button or not |
addLeafNodeDisabled | boolean | false | Show `addLeafNode` button or not | addLeafNodeDisabled | boolean | false | Show `addLeafNode` button or not |
editNodeDisabled | boolean | false | Show `editNode` button or not | editNodeDisabled | boolean | false | Show `editNode` button or not |
delNodeDisabled | boolean | false | Show `delNode` button or not | delNodeDisabled | boolean | false | Show `delNode` button or not |
children | array | null | The children of node | children | array | null | The children of node |
### methods ### methods
| name | params | description | | name | params | description |
|:-----:|:-------:|:----:| | :----------: | :---------------------: | :---------------------------: |
changeName | name | Change node's name | changeName | name | Change node's name |
addChildren | children: object, array | Add children to node | addChildren | children: object, array | Add children to node |
remove | - | Remove node from the tree | remove | - | Remove node from the tree |
moveInto | target: TreeNode | Move node into another node | moveInto | target: TreeNode | Move node into another node |
insertBefore | target: TreeNode | Move node before another node | insertBefore | target: TreeNode | Move node before another node |
insertAfter | target: TreeNode | Move node after another node | insertAfter | target: TreeNode | Move node after another node |
# events # events
| name | params | description | | name | params | description |
|:-----:|:-------:|:----:| | :---------: | :--------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------: |
click | TreeNode | Trigger when clicking a tree node | click | TreeNode | Trigger when clicking a tree node. You can call `toggle` of `TreeNode` to toggle the folder node. |
change-name | {'id', 'oldName', 'newName'} | Trigger after changing a node's name | 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. | 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 | 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 | {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-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 | 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 # 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: 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 ```html
<template v-slot:leafNameDisplay="slotProps">
<span>{{ slotProps.model.name }} #{{ slotProps.model.id }}</span>
</template>
<template v-slot:addTreeNodeIcon="slotProps"> <template v-slot:addTreeNodeIcon="slotProps">
<span class="icon">📂</span> <span class="icon">📂</span>
</template> </template>
@@ -232,6 +252,8 @@ The component has default icons for `addTreeNodeIcon`, `addLeafNodeIcon`, `editN
</template> </template>
<template v-slot:treeNodeIcon="slotProps"> <template v-slot:treeNodeIcon="slotProps">
<span class="icon"> <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> </template>
``` ```

View File

@@ -43,7 +43,9 @@
</span> </span>
<div class="vtl-node-content" v-if="!editable"> <div class="vtl-node-content" v-if="!editable">
<slot name="leafNameDisplay" :expanded="expanded" :model="model" :root="rootNode">
{{ model.name }} {{ model.name }}
</slot>
</div> </div>
<input <input
v-else v-else
@@ -56,7 +58,7 @@
/> />
<div class="vtl-operation" v-show="isHover"> <div class="vtl-operation" v-show="isHover">
<span <span
title="add tree node" :title="defaultAddTreeNodeTitle"
@click.stop.prevent="addChild(false)" @click.stop.prevent="addChild(false)"
v-if="!model.isLeaf && !model.addTreeNodeDisabled" v-if="!model.isLeaf && !model.addTreeNodeDisabled"
> >
@@ -65,7 +67,7 @@
</slot> </slot>
</span> </span>
<span <span
title="add leaf node" :title="defaultAddLeafNodeTitle"
@click.stop.prevent="addChild(true)" @click.stop.prevent="addChild(true)"
v-if="!model.isLeaf && !model.addLeafNodeDisabled" v-if="!model.isLeaf && !model.addLeafNodeDisabled"
> >
@@ -110,6 +112,9 @@
:model="model" :model="model"
:key="model.id" :key="model.id"
> >
<template v-slot:leafNameDisplay="slotProps">
<slot name="leafNameDisplay" v-bind="slotProps" />
</template>
<template v-slot:addTreeNodeIcon="slotProps"> <template v-slot:addTreeNodeIcon="slotProps">
<slot name="addTreeNodeIcon" v-bind="slotProps" /> <slot name="addTreeNodeIcon" v-bind="slotProps" />
</template> </template>
@@ -157,11 +162,19 @@ export default {
}, },
defaultLeafNodeName: { defaultLeafNodeName: {
type: String, type: String,
default: 'New leaf node' default: 'Leaf Node'
}, },
defaultTreeNodeName: { defaultTreeNodeName: {
type: String, type: String,
default: 'New tree node' default: 'Tree Node'
},
defaultAddTreeNodeTitle: {
type: String,
default: 'Add Tree Node'
},
defaultAddLeafNodeTitle: {
type: String,
default: 'Add Leaf Node'
}, },
defaultExpanded: { defaultExpanded: {
type: Boolean, type: Boolean,
@@ -267,7 +280,10 @@ export default {
}, },
click() { click() {
this.rootNode.$emit('click', this.model) this.rootNode.$emit('click', {
toggle: this.toggle,
...this.model
})
}, },
addChild(isLeaf) { addChild(isLeaf) {

View File

@@ -47,7 +47,7 @@ exports[`Render render correctly 1`] = `
<div class="vtl-node-content"> <div class="vtl-node-content">
Node 2 Node 2
</div> </div>
<div class="vtl-operation" style="display: none;"><span title="add tree node"><i class="vtl-icon vtl-icon-folder-plus-e"></i></span> <span title="add leaf node"><i class="vtl-icon vtl-icon-plus"></i></span> <span title="edit"><i class="vtl-icon vtl-icon-edit"></i></span> <span title="delete"><i class="vtl-icon vtl-icon-trash"></i></span></div> <div class="vtl-operation" style="display: none;"><span title="Add Tree Node"><i class="vtl-icon vtl-icon-folder-plus-e"></i></span> <span title="Add Leaf Node"><i class="vtl-icon vtl-icon-plus"></i></span> <span title="edit"><i class="vtl-icon vtl-icon-edit"></i></span> <span title="delete"><i class="vtl-icon vtl-icon-trash"></i></span></div>
</div> </div>
<!----> <!---->
</div> </div>
@@ -61,7 +61,7 @@ exports[`Render render correctly 1`] = `
<div class="vtl-node-content"> <div class="vtl-node-content">
Node 3 Node 3
</div> </div>
<div class="vtl-operation" style="display: none;"><span title="add tree node"><i class="vtl-icon vtl-icon-folder-plus-e"></i></span> <span title="add leaf node"><i class="vtl-icon vtl-icon-plus"></i></span> <span title="edit"><i class="vtl-icon vtl-icon-edit"></i></span> <span title="delete"><i class="vtl-icon vtl-icon-trash"></i></span></div> <div class="vtl-operation" style="display: none;"><span title="Add Tree Node"><i class="vtl-icon vtl-icon-folder-plus-e"></i></span> <span title="Add Leaf Node"><i class="vtl-icon vtl-icon-plus"></i></span> <span title="edit"><i class="vtl-icon vtl-icon-edit"></i></span> <span title="delete"><i class="vtl-icon vtl-icon-trash"></i></span></div>
</div> </div>
<!----> <!---->
</div> </div>

View File

@@ -11,7 +11,7 @@ exports[`Slot render slot correctly 1`] = `
<div class="vtl-node-content"> <div class="vtl-node-content">
Node 1 Node 1
</div> </div>
<div class="vtl-operation" style="display: none;"><span title="add tree node"><span class="add-tree-node-icon">📂</span></span> <span title="add leaf node"><span class="icon"></span></span> <span title="edit"><span class="icon">📃</span></span> <span title="delete"><span></span></span></div> <div class="vtl-operation" style="display: none;"><span title="Add Tree Node"><span class="add-tree-node-icon">📂</span></span> <span title="Add Leaf Node"><span class="icon"></span></span> <span title="edit"><span class="icon">📃</span></span> <span title="delete"><span></span></span></div>
</div> </div>
<div class="vtl-border vtl-bottom"></div> <div class="vtl-border vtl-bottom"></div>
</div> </div>
@@ -42,7 +42,7 @@ exports[`Slot render slot correctly 1`] = `
<div class="vtl-node-content"> <div class="vtl-node-content">
Node 2 Node 2
</div> </div>
<div class="vtl-operation" style="display: none;"><span title="add tree node"><span class="add-tree-node-icon">📂</span></span> <span title="add leaf node"><span class="icon"></span></span> <span title="edit"><span class="icon">📃</span></span> <span title="delete"><span class="del-node-icon">✂️</span></span></div> <div class="vtl-operation" style="display: none;"><span title="Add Tree Node"><span class="add-tree-node-icon">📂</span></span> <span title="Add Leaf Node"><span class="icon"></span></span> <span title="edit"><span class="icon">📃</span></span> <span title="delete"><span class="del-node-icon">✂️</span></span></div>
</div> </div>
<!----> <!---->
</div> </div>

View File

@@ -51,7 +51,7 @@ describe('Operation', () => {
}) })
it('add leaf node', done => { it('add leaf node', done => {
const $node1AddLeafNode = wrapper.find('#t1 [title="add leaf node"]') const $node1AddLeafNode = wrapper.find('#t1 [title="Add Leaf Node"]')
$node1AddLeafNode.trigger('click') $node1AddLeafNode.trigger('click')
Vue.nextTick(() => { Vue.nextTick(() => {
expect(wrapper.findAll('.vtl-leaf-node').length).toBe(2) expect(wrapper.findAll('.vtl-leaf-node').length).toBe(2)
@@ -60,7 +60,7 @@ describe('Operation', () => {
}) })
it('add tree node', done => { it('add tree node', done => {
const $node1AddTreeNode = wrapper.find('#t1 [title="add tree node"]') const $node1AddTreeNode = wrapper.find('#t1 [title="Add Tree Node"]')
$node1AddTreeNode.trigger('click') $node1AddTreeNode.trigger('click')
Vue.nextTick(() => { Vue.nextTick(() => {
expect(wrapper.findAll('.vtl-tree-node').length).toBe(3) expect(wrapper.findAll('.vtl-tree-node').length).toBe(3)