278 lines
6.4 KiB
Vue
278 lines
6.4 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="rootTreeItems"
|
||
default-tree-node-name="new node"
|
||
default-leaf-node-name="new leaf"
|
||
v-bind:default-expanded="false"
|
||
ref="treee"
|
||
>
|
||
<!-- <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>
|
||
<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";
|
||
|
||
/**
|
||
* @vue-prop {Array} [treeItems=[]] - آیتمهای درخت
|
||
*
|
||
* @vue-data {Object} [dicTreePath={}] - مسیر درخت
|
||
* @vue-data {Tree} [rootTreeItems=new Tree(this.treeItems)] - درخت داده
|
||
* @vue-data {String} [classId=""] - شناسه کلاس
|
||
*/
|
||
|
||
export default {
|
||
props: {
|
||
treeItems: {
|
||
default() {
|
||
return [];
|
||
},
|
||
},
|
||
openIds: {
|
||
default() {
|
||
return [];
|
||
},
|
||
},
|
||
},
|
||
components: {
|
||
VueTreeList,
|
||
},
|
||
data() {
|
||
return {
|
||
// newTree: {},
|
||
dicTreePath: {},
|
||
rootTreeItems: new Tree(this.treeItems),
|
||
classId: "",
|
||
};
|
||
},
|
||
mounted() {
|
||
// data= new Tree(this.treeItems);
|
||
},
|
||
watch: {
|
||
treeItems(newVal) {
|
||
this.dicTreePath = {};
|
||
this.rootTreeItems.children = newVal;
|
||
// this.rootTreeItems.children.forEach((element) => {
|
||
// this.dicTreePath[element.keyId] = "" + element.index;
|
||
// });
|
||
},
|
||
},
|
||
methods: {
|
||
/**
|
||
* حذف یک نود.
|
||
* این متد یک نود را حذف میکند.
|
||
*
|
||
* @param {HTMLElement} node - نودی که قرار است حذف شود
|
||
*/
|
||
onDel(node) {
|
||
node.remove();
|
||
},
|
||
|
||
/**
|
||
* تغییر نام.
|
||
* این متد نام یک مورد را تغییر میدهد.
|
||
*
|
||
* @param {object} params - پارامترهای مورد نیاز
|
||
*/
|
||
onChangeName(params) {
|
||
console.log(params);
|
||
},
|
||
|
||
/**
|
||
* افزودن یک نود جدید.
|
||
*
|
||
* @param {object} params - پارامترهای مورد نیاز
|
||
*/
|
||
onAddNode(params) {
|
||
console.log(params);
|
||
},
|
||
|
||
/**
|
||
* رویداد کلیک.
|
||
* این متد وظیفه اعمال تغییرات پس از کلیک را دارد.
|
||
*
|
||
* @param {object} params - پارامترهای مورد نیاز
|
||
*/
|
||
onClick(params) {
|
||
if (this.classId !== "") {
|
||
let id = document.getElementById(this.classId);
|
||
if (id) id.classList.remove("selected");
|
||
const element = document.getElementById(params.id);
|
||
if (element) element.classList.add("selected");
|
||
} else {
|
||
const element = document.getElementById(params.id);
|
||
if (element) element.classList.add("selected");
|
||
}
|
||
this.classId = structuredClone(params.id);
|
||
this.$emit("on-click", params);
|
||
},
|
||
|
||
/**
|
||
* اضافه کردن یک نود جدید.
|
||
*
|
||
* @param {object} item - مورد جدید برای افزودن
|
||
*/
|
||
addNode(item) {
|
||
var node = new TreeNode({ item: item, isLeaf: false });
|
||
if (!this.rootTreeItems.children) this.rootTreeItems.children = [];
|
||
this.rootTreeItems.addChildren(node);
|
||
},
|
||
|
||
/**
|
||
* بهروزرسانی فرزندان.
|
||
* این متد فرزندان یک المان را بهروزرسانی میکند.
|
||
*
|
||
* @param {object} element - المانی که فرزندانش باید بهروز شود
|
||
* @param {array} childs - فرزندان جدید
|
||
*/
|
||
updateChildren(element, childs) {
|
||
var parent = this.rootTreeItems;
|
||
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.rootTreeItems);
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<!-- <style lang="scss">
|
||
.selected {
|
||
background-color: var(--active-color);
|
||
}
|
||
.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: var(--hover-color) !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-leaf-node{
|
||
// background-color: red;
|
||
|
||
// }
|
||
.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%;
|
||
}
|
||
// .homeP{
|
||
// div{
|
||
// div:active{
|
||
// background-color: red;
|
||
|
||
// }
|
||
// }
|
||
// }
|
||
</style> -->
|