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