236 lines
5.0 KiB
Vue
236 lines
5.0 KiB
Vue
<template>
|
||
<div>
|
||
<!-- <button @click="addNode">Add Node</button> -->
|
||
<vue-tree-list
|
||
class="vue-tree-list"
|
||
@click="onClick"
|
||
@change-name="onChangeName"
|
||
@delete-node="onDel"
|
||
@add-node="onAddNode"
|
||
:model="dataTree"
|
||
default-tree-node-name="new node"
|
||
default-leaf-node-name="new leaf"
|
||
v-bind:default-expanded="true"
|
||
ref="treee"
|
||
>
|
||
<!-- <div v-slot:leafNameDisplay="slotProps">
|
||
<span>
|
||
{{ slotProps.model[titleKey] }}
|
||
|
||
<span v-if="slotProps.model.count" class="muted"
|
||
>#{{ slotProps.model.count }}</span
|
||
>
|
||
</span>
|
||
</div> -->
|
||
<!-- <span class="icon" slot="addTreeNodeIcon">📂</span>
|
||
<span class="icon" slot="addLeafNodeIcon">+</span>
|
||
<span class="icon" slot="editNodeIcon">📃</span>
|
||
<span class="icon" slot="delNodeIcon">✂️</span>
|
||
<span class="icon" slot="leafNodeIcon">🍃</span>
|
||
<span class="icon" slot="treeNodeIcon">🌲</span> -->
|
||
<span class="icon1" slot="treeNodeIcon">
|
||
<div
|
||
style="
|
||
width: 6px;
|
||
height: 6px;
|
||
border-radius: 50%;
|
||
background-color: black;
|
||
"
|
||
></div>
|
||
</span>
|
||
</vue-tree-list>
|
||
<!-- <button @click="getNewTree">Get new tree</button>
|
||
<pre>
|
||
{{ newTree }}
|
||
</pre> -->
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { VueTreeList, Tree, TreeNode } from "vue-tree-list";
|
||
export default {
|
||
props: {
|
||
parentName: {
|
||
default: "Thing",
|
||
},
|
||
titleKey: {
|
||
default: "title",
|
||
},
|
||
treeItems: {
|
||
default() {
|
||
return [];
|
||
},
|
||
},
|
||
},
|
||
|
||
data() {
|
||
return {
|
||
// newTree: {},
|
||
dicTreePath: {},
|
||
dataTree: new Tree([
|
||
{
|
||
id: "Thing",
|
||
value: "Thing",
|
||
},
|
||
]),
|
||
};
|
||
},
|
||
// mounted() {
|
||
// data= new Tree(this.treeItems);
|
||
// },
|
||
watch: {
|
||
treeItems(newList) {
|
||
// this.dicTreePath = {};
|
||
// this.dataTree.children = newVal;
|
||
|
||
// this.dataTree.children.forEach((element,index) => {
|
||
// this.dicTreePath['parent'] = 'Thing';
|
||
// });
|
||
|
||
newList.forEach((element, index) => {
|
||
const nodeModel = {
|
||
children: null,
|
||
id: index,
|
||
isLeaf: false,
|
||
parent: this.parentName,
|
||
pid: this.parentName,
|
||
value: element.value,
|
||
name: element.value,
|
||
};
|
||
var node = new TreeNode(nodeModel);
|
||
|
||
// todo: find the parent and add new children into it.
|
||
// this.dataTree.children
|
||
|
||
if (!this.dataTree.children && !this.dataTree.children[0])
|
||
this.dataTree.children[0].children = [];
|
||
this.dataTree.children[0].addChildren(node);
|
||
});
|
||
},
|
||
},
|
||
methods: {
|
||
onDel(node) {
|
||
console.log(node);
|
||
node.remove();
|
||
this.$emit("on-delete-node", node);
|
||
},
|
||
|
||
onChangeName(params) {
|
||
console.log(params);
|
||
this.$emit("on-change-name", params);
|
||
},
|
||
|
||
onAddNode(params) {
|
||
console.log(params);
|
||
this.$emit("on-add-node", params);
|
||
},
|
||
|
||
onClick(params) {
|
||
console.log(params);
|
||
this.$emit("on-click", params);
|
||
},
|
||
|
||
addNode(item) {
|
||
var node = new TreeNode({ item: item, isLeaf: false });
|
||
if (!this.dataTree.children) this.dataTree.children = [];
|
||
this.dataTree.addChildren(node);
|
||
},
|
||
updateChildren(element, childs) {
|
||
var parent = this.dataTree;
|
||
if (element.parent != null) parent = element.parent;
|
||
|
||
const index = parent.children.findIndex(
|
||
(item) => item.keyId === element.keyId
|
||
);
|
||
if (index !== -1) {
|
||
parent.children[index].children = childs;
|
||
}
|
||
},
|
||
getNewTree() {
|
||
var vm = this;
|
||
function _dfs(oldNode) {
|
||
var newNode = {};
|
||
|
||
for (var k in oldNode) {
|
||
if (k !== "children" && k !== "parent") {
|
||
newNode[k] = oldNode[k];
|
||
}
|
||
}
|
||
|
||
if (oldNode.children && oldNode.children.length > 0) {
|
||
newNode.children = [];
|
||
for (var i = 0, len = oldNode.children.length; i < len; i++) {
|
||
newNode.children.push(_dfs(oldNode.children[i]));
|
||
}
|
||
}
|
||
return newNode;
|
||
}
|
||
|
||
vm.newTree = _dfs(vm.dataTree);
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.vtl-node-main {
|
||
padding: 5px 1rem 5px 0 !important;
|
||
|
||
.vtl-node-content {
|
||
margin-right: 7px;
|
||
}
|
||
|
||
&.vtl-drag-disabled {
|
||
// background-color: #d0cfcf;
|
||
background-color: inherit !important;
|
||
}
|
||
|
||
&:hover {
|
||
cursor: pointer;
|
||
background-color: #f0f0f0 !important;
|
||
}
|
||
|
||
.vtl-caret {
|
||
margin-left: 0;
|
||
margin-right: -1rem;
|
||
margin-top: 8px;
|
||
transform: rotateY(180deg);
|
||
}
|
||
}
|
||
|
||
.vtl-tree-margin {
|
||
margin-right: 2em;
|
||
margin-left: auto;
|
||
}
|
||
|
||
.vtl {
|
||
.vtl-drag-disabled {
|
||
background-color: #d0cfcf;
|
||
|
||
&:hover {
|
||
background-color: #d0cfcf;
|
||
}
|
||
}
|
||
|
||
.vtl-disabled {
|
||
background-color: #d0cfcf;
|
||
}
|
||
}
|
||
|
||
.vtl {
|
||
}
|
||
</style>
|
||
|
||
<style lang="scss" scoped>
|
||
.icon {
|
||
&:hover {
|
||
cursor: pointer;
|
||
}
|
||
}
|
||
|
||
.muted {
|
||
color: gray;
|
||
font-size: 80%;
|
||
}
|
||
</style>
|