base_ui/components/global/MyVueTreeListV2.vue
2025-02-01 13:04:55 +03:30

236 lines
5.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>