From 401524fb5661d57ffb2229d683fe4de85b65fd1c Mon Sep 17 00:00:00 2001 From: haoxuan <haoxuan> Date: 星期四, 31 八月 2023 17:54:24 +0800 Subject: [PATCH] 生产管理看板+删不需要的文件 --- src/components/giantTree/zTree/ztree.vue | 439 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 289 insertions(+), 150 deletions(-) diff --git a/src/components/giantTree/zTree/ztree.vue b/src/components/giantTree/zTree/ztree.vue index f17ee9c..69175d2 100644 --- a/src/components/giantTree/zTree/ztree.vue +++ b/src/components/giantTree/zTree/ztree.vue @@ -1,155 +1,173 @@ <template> - <div class="ztree" :id="ztreeId"></div> + <div> + <div class="search"> + <el-input placeholder="鎼滅储" v-model="keyWord" size="mini" v-show="search"> + <i slot="suffix" class="el-input__icon el-icon-search" :id="searchBtnId"></i> + </el-input> + </div> + <div class="ztree" :id="ztreeId"></div> + </div> </template> <script> -import * as $ from "jquery"; +import * as $ from "jquery" +import { Loading } from "element-ui" + if (!window.jQuery) { - window.jQuery = $; + window.jQuery = $ } // require("@ztree/ztree_v3/js/jquery.ztree.all"); -require("./ztree_v3/jquery.ztree.all"); +require("./ztree_v3/jquery.ztree.all") +require("./ztree_v3/jquery.ztree.exhide") export default { props: { showCheckbox: { type: Boolean, default: false }, readonly: { type: Boolean, default: true }, gb28181: { type: Boolean, default: false }, + search: { type: Boolean, default: false }, setting: { type: Object, require: false, - default: function () { - return {}; - }, + default: function() { + return {} + } }, nodes: { type: Array, require: true, - default: function () { - return []; - }, - }, + default: function() { + return [] + } + } }, data() { return { ztreeId: "ztree_" + parseInt(Math.random() * 1e10), + searchBtnId: "search_" + parseInt(Math.random() * 1e10), ztreeObj: null, list: [], + loading: false, ztreeSetting: { view: { showLine: true, showIcon: true, // default to hide icon addHoverDom: this.addHoverDom, - removeHoverDom: this.removeHoverDom, + removeHoverDom: this.removeHoverDom }, check: { chkboxType: { Y: "", N: "" }, - enable: this.showCheckbox, + enable: this.showCheckbox }, callback: { onAsyncError: (...arg) => { - this.$emit("onAsyncError", ...arg); + this.$emit("onAsyncError", ...arg) }, onAsyncSuccess: (...arg) => { - this.$emit("onAsyncSuccess", ...arg); + this.$emit("onAsyncSuccess", ...arg) }, onCheck: (...arg) => { - this.$emit("onCheck", ...arg); + this.$emit("onCheck", ...arg) }, onClick: (...arg) => { - this.$emit("onClick", ...arg); - this.removeHoverIcon(...arg); + this.$emit("onClick", ...arg) + this.removeHoverIcon(...arg) }, onCollapse: (...arg) => { - this.$emit("onCollapse", ...arg); + this.$emit("onCollapse", ...arg) }, onDblClick: (...arg) => { - this.$emit("onDblClick", ...arg); + this.$emit("onDblClick", ...arg) }, onDrag: (...arg) => { - this.$emit("onDrag", ...arg); + this.$emit("onDrag", ...arg) }, onDragMove: (...arg) => { - this.$emit("onDragMove", ...arg); + this.$emit("onDragMove", ...arg) }, onDrop: (...arg) => { - this.$emit("onDrop", ...arg); + this.$emit("onDrop", ...arg) }, onExpand: (...arg) => { - this.$emit("onExpand", ...arg); + this.$emit("onExpand", ...arg) }, onMouseDown: (...arg) => { - this.$emit("onMouseDown", ...arg); + this.$emit("onMouseDown", ...arg) }, onMouseUp: (...arg) => { - this.$emit("onMouseUp", ...arg); + this.$emit("onMouseUp", ...arg) }, onRemove: (...arg) => { - this.$emit("onRemove", ...arg); + this.$emit("onRemove", ...arg) }, onRename: (...arg) => { - this.$emit("onRename", ...arg); + this.$emit("onRename", ...arg) }, onRightClick: (...arg) => { - this.$emit("onRightClick", ...arg); - }, - }, + this.$emit("onRightClick", ...arg) + } + } }, - }; + keyWord: "", + options: { + target: "" + } + } }, watch: { nodes: { - handler: function (nodes) { - this.list = nodes; + handler: function(nodes) { + this.list = nodes // update tree if (this.ztreeObj) { - this.ztreeObj.destroy(); + this.ztreeObj.destroy() } this.$nextTick(() => { this.ztreeObj = $.fn.zTree.init( $("#" + this.ztreeId), Object.assign({}, this.ztreeSetting, this.setting), this.list - ); - this.$emit("onCreated", this.ztreeObj); - }); + ) + this.fuzzySearch(this.ztreeObj, this.searchBtnId, false, true) //鍒濆鍖栨ā绯婃悳绱㈡柟娉� + this.$emit("onCreated", this.ztreeObj) + }) }, deep: true, - immediate: true, + immediate: true }, showCheckbox: { - handler: function () { + handler: function() { let top = $("#" + this.ztreeId) .parent() - .scrollTop(); + .scrollTop() - this.ztreeSetting.check.enable = this.showCheckbox; + this.ztreeSetting.check.enable = this.showCheckbox if (this.ztreeObj) { - this.list = this.ztreeObj.getNodes(); - this.ztreeObj.destroy(); + this.list = this.ztreeObj.getNodes() + this.ztreeObj.destroy() } this.$nextTick(() => { this.ztreeObj = $.fn.zTree.init( $("#" + this.ztreeId), Object.assign({}, this.ztreeSetting, this.setting), this.list - ); + ) $("#" + this.ztreeId) .parent() - .scrollTop(top); - this.$emit("onCreated", this.ztreeObj); - }); + .scrollTop(top) + this.$emit("onCreated", this.ztreeObj) + }) }, - immediate: true, - }, + immediate: true + } }, methods: { addHoverDom(treeid, treeNode) { - let _vue = this; - const item = document.getElementById(`${treeNode.tId}_a`); + let _vue = this + const item = document.getElementById(`${treeNode.tId}_a`) // 鏂囦欢澶规柊澧炴寜閽� if ( @@ -159,18 +177,18 @@ !this.readonly && !this.gb28181 ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("el-icon-circle-plus-outline"); - btn.classList.add("primary"); + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("el-icon-circle-plus-outline") + btn.classList.add("primary") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onAddNode", treeNode); - }); + _vue.$emit("onAddNode", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } // 鏂囦欢澶瑰垹闄ゆ寜閽� @@ -182,153 +200,259 @@ !treeNode.children && !this.gb28181 ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("el-icon-remove-outline"); - btn.classList.add("danger"); + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("el-icon-remove-outline") + btn.classList.add("danger") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onRemoveNode", treeNode); - }); + _vue.$emit("onRemoveNode", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } // 鏂囦欢澶圭紪杈戞寜閽� - if ( - item && - !item.querySelector(".el-icon-edit") && - treeNode.isParent && - !this.readonly - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("el-icon-edit"); - btn.classList.add("primary"); + if (item && !item.querySelector(".el-icon-edit") && treeNode.isParent && !this.readonly) { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("el-icon-edit") + btn.classList.add("primary") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onRenameNode", treeNode); - }); + _vue.$emit("onRenameNode", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } // 娣诲姞鎽勫儚鏈烘寜閽� - if ( - item && - !item.querySelector(".iconshishishipin") && - treeNode.isParent && - !this.readonly && - !this.gb28181 - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("iconfont"); - btn.classList.add("iconshishishipin"); - btn.classList.add("primary"); - btn.classList.add("icon-fix"); + if (item && !item.querySelector(".iconshishishipin") && treeNode.isParent && !this.readonly && !this.gb28181) { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("iconfont") + btn.classList.add("iconshishishipin") + btn.classList.add("primary") + btn.classList.add("icon-fix") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onAddDevice", treeNode.id); - }); + _vue.$emit("onAddDevice", treeNode.id) + }) - item.appendChild(btn); + item.appendChild(btn) } // 瀵煎叆鎽勫儚鏈烘寜閽� - if ( - item && - !item.querySelector(".icondaoru") && - treeNode.isParent && - !this.readonly && - !this.gb28181 - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("iconfont"); - btn.classList.add("icondaoru"); - btn.classList.add("primary"); - btn.classList.add("icon-fix"); + if (item && !item.querySelector(".icondaoru") && treeNode.isParent && !this.readonly && !this.gb28181) { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("iconfont") + btn.classList.add("icondaoru") + btn.classList.add("primary") + btn.classList.add("icon-fix") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onImport", treeNode.id); - }); + _vue.$emit("onImport", treeNode.id) + }) - item.appendChild(btn); + item.appendChild(btn) } // 鏌ョ湅搴曞浘鎸夐挳 - if ( - item && - !item.querySelector(".icontupian1") && - treeNode.type == "camera" - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("iconfont"); - btn.classList.add("icontupian1"); - btn.classList.add("primary"); - btn.classList.add("icon-fix"); + if (item && !item.querySelector(".icontupian1") && treeNode.type == "camera") { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("iconfont") + btn.classList.add("icontupian1") + btn.classList.add("primary") + btn.classList.add("icon-fix") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onShowPic", treeNode); - }); + _vue.$emit("onShowPic", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } }, removeHoverIcon(evt, treeId, item) { - this.removeHoverDom(treeId, item); + this.removeHoverDom(treeId, item) }, removeHoverDom(treeid, treeNode) { - const item = document.getElementById(`${treeNode.tId}_a`); + const item = document.getElementById(`${treeNode.tId}_a`) if (item) { - let btn = item.querySelector(".el-icon-circle-plus-outline"); + let btn = item.querySelector(".el-icon-circle-plus-outline") if (btn) { - item.removeChild(item.querySelector(".el-icon-circle-plus-outline")); + item.removeChild(item.querySelector(".el-icon-circle-plus-outline")) } - btn = item.querySelector(".el-icon-remove-outline"); + btn = item.querySelector(".el-icon-remove-outline") if (btn) { - item.removeChild(item.querySelector(".el-icon-remove-outline")); + item.removeChild(item.querySelector(".el-icon-remove-outline")) } - btn = item.querySelector(".el-icon-edit"); + btn = item.querySelector(".el-icon-edit") if (btn) { - item.removeChild(item.querySelector(".el-icon-edit")); + item.removeChild(item.querySelector(".el-icon-edit")) } - btn = item.querySelector(".iconshishishipin"); + btn = item.querySelector(".iconshishishipin") if (btn) { - item.removeChild(item.querySelector(".iconshishishipin")); + item.removeChild(item.querySelector(".iconshishishipin")) } - btn = item.querySelector(".icondaoru"); + btn = item.querySelector(".icondaoru") if (btn) { - item.removeChild(item.querySelector(".icondaoru")); + item.removeChild(item.querySelector(".icondaoru")) } - btn = item.querySelector(".icontupian1"); + btn = item.querySelector(".icontupian1") if (btn) { - item.removeChild(item.querySelector(".icontupian1")); + item.removeChild(item.querySelector(".icontupian1")) } } }, - }, -}; + fuzzySearch(zTreeObj, searchField, isHighLight, isExpand) { + const _this = this + + if (!zTreeObj) { + alert("fail to get ztree object") + } + var nameKey = zTreeObj.setting.data.key.name //get the key of the node name + isHighLight = isHighLight === false ? false : true //default true, only use false to disable highlight + isExpand = isExpand ? true : false // not to expand in default + zTreeObj.setting.view.nameIsHTML = isHighLight //allow use html in node name for highlight use + + var metaChar = "[\\[\\]\\\\^\\$\\.\\|\\?\\*\\+\\(\\)]" //js meta characters + var rexMeta = new RegExp(metaChar, "gi") //regular expression to match meta characters + + // keywords filter function + function ztreeFilter(zTreeObj, _keywords, callBackFunc) { + if (!_keywords) { + _keywords = "" //default blank for _keywords + } + + // function to find the matching node + function filterFunc(node) { + if (node && node.oldname && node.oldname.length > 0) { + node[nameKey] = node.oldname //recover oldname of the node if exist + } + zTreeObj.updateNode(node) //update node to for modifications take effect + if (_keywords.length == 0) { + //return true to show all nodes if the keyword is blank + zTreeObj.showNode(node) + zTreeObj.expandNode(node, isExpand) + return true + } + //transform node name and keywords to lowercase + if (node[nameKey] && node[nameKey].toLowerCase().indexOf(_keywords.toLowerCase()) != -1) { + if (isHighLight) { + //highlight process + //a new variable 'newKeywords' created to store the keywords information + //keep the parameter '_keywords' as initial and it will be used in next node + //process the meta characters in _keywords thus the RegExp can be correctly used in str.replace + var newKeywords = _keywords.replace(rexMeta, function(matchStr) { + //add escape character before meta characters + return "\\" + matchStr + }) + node.oldname = node[nameKey] //store the old name + var rexGlobal = new RegExp(newKeywords, "gi") //'g' for global,'i' for ignore case + //use replace(RegExp,replacement) since replace(/substr/g,replacement) cannot be used here + node[nameKey] = node.oldname.replace(rexGlobal, function(originalText) { + //highlight the matching words in node name + var highLightText = + '<span style="color: whitesmoke;background-color: darkred;">' + originalText + "</span>" + return highLightText + }) + zTreeObj.updateNode(node) //update node for modifications take effect + } + zTreeObj.showNode(node) //show node with matching keywords + return true //return true and show this node + } + + zTreeObj.hideNode(node) // hide node that not matched + return false //return false for node not matched + } + + var nodesShow = zTreeObj.getNodesByFilter(filterFunc) //get all nodes that would be shown + processShowNodes(nodesShow, _keywords) //nodes should be reprocessed to show correctly + _this.$emit("onAfterSearch", null) + } + + /** + * reprocess of nodes before showing + */ + function processShowNodes(nodesShow, _keywords) { + if (nodesShow && nodesShow.length > 0) { + //process the ancient nodes if _keywords is not blank + if (_keywords.length > 0) { + $.each(nodesShow, function(n, obj) { + var pathOfOne = obj.getPath() //get all the ancient nodes including current node + if (pathOfOne && pathOfOne.length > 0) { + //i < pathOfOne.length-1 process every node in path except self + for (var i = 0; i < pathOfOne.length - 1; i++) { + zTreeObj.showNode(pathOfOne[i]) //show node + zTreeObj.expandNode(pathOfOne[i], true) //expand node + } + } + }) + } else { + //show all nodes when _keywords is blank and expand the root nodes + var rootNodes = zTreeObj.getNodesByParam("level", "0") //get all root nodes + $.each(rootNodes, function(n, obj) { + zTreeObj.expandNode(obj, true) //expand all root nodes + }) + } + } + } + + //listen to change in input element + $("#" + searchField).bind("click", function() { + // _this.options.target = document.querySelector("#" + _this.ztreeId).parentNode.parentNode + // console.log(_this.options.target); + // let loadingInstance = Loading.service(_this.options) + // console.log(_this.keyWord); + // var _keywords = $(this).val(); + $("#" + searchField).removeClass("el-icon-search") + $("#" + searchField).addClass("el-icon-loading") + searchNodeLazy(_this.keyWord) //call lazy load + // loadingInstance.close() + setTimeout(() => { + $("#" + searchField).removeClass("el-icon-loading") + $("#" + searchField).addClass("el-icon-search") + }, 300) + }) + + var lastKeyword = "" + // excute lazy load once after input change, the last pending task will be cancled + function searchNodeLazy(_keywords) { + if (lastKeyword === _keywords) { + return + } + ztreeFilter(zTreeObj, _keywords) //lazy load ztreeFilter function + // $(searchField).focus();//focus input field again after filtering + lastKeyword = _keywords + } + }, + handleSearch() { + this.loading = true + searchNodeLazy(this.keyWord) //call lazy load + this.loading = false + } + } +} </script> -<style > +<style> /* beauty ztree! */ .ztree * { @@ -360,8 +484,7 @@ } .ztree li ul.line { /* background: url(./img/line_conn.gif) 0 0 repeat-y; */ - background: url(data:image/gif;base64,R0lGODlhCQACAIAAAMzMzP///yH5BAEAAAEALAAAAAAJAAIAAAIEjI9pUAA7) - 0 0 repeat-y; + background: url(data:image/gif;base64,R0lGODlhCQACAIAAAMzMzP///yH5BAEAAAEALAAAAAAJAAIAAAIEjI9pUAA7) 0 0 repeat-y; } .ztree li a { @@ -659,3 +782,19 @@ position: absolute; } </style> + +<style scoped lang="scss"> +.search { + width: 280px; + margin: 5px 5px; + + ::v-deep .el-input__suffix { + right: 0; + width: 50px; + background: skyblue; + color: #fff; + cursor: pointer; + background-color: rgb(61, 104, 255); + } +} +</style> -- Gitblit v1.8.0