{"version":3,"file":"fuzzy-search.mjs","sources":["../../../../../../packages/components/tree/js/fuzzy-search.js"],"sourcesContent":["/*\r\n * email: bigablecat@hotmail.com\r\n * Date: 2018-04-14\r\n */\r\n\r\n/**\r\n * @param zTreeId the ztree id used to get the ztree object\r\n * @param searchField selector of your input for fuzzy search\r\n * @param isHighLight whether highlight the match words, default true\r\n * @param isExpand whether to expand the node, default false\r\n *\r\n * @returns\r\n */\r\nexport function fuzzySearch($, zTreeId, searchField, isHighLight, isExpand) {\r\n  var zTreeObj = $.fn.zTree.getZTreeObj(zTreeId);//get the ztree object by ztree id\r\n  if(!zTreeObj){\r\n    console.error(\"fail to get ztree object\");\r\n  }\r\n  var nameKey = zTreeObj.setting.data.key.name; //get the key of the node name\r\n  isHighLight = isHighLight===false?false:true;//default true, only use false to disable highlight\r\n  isExpand = isExpand?true:false; // not to expand in default\r\n  zTreeObj.setting.view.nameIsHTML = isHighLight; //allow use html in node name for highlight use\r\n\r\n  var metaChar = '[\\\\[\\\\]\\\\\\\\\\^\\\\$\\\\.\\\\|\\\\?\\\\*\\\\+\\\\(\\\\)]'; //js meta characters\r\n  var rexMeta = new RegExp(metaChar, 'gi');//regular expression to match meta characters\r\n\r\n  // keywords filter function\r\n  function ztreeFilter(zTreeObj,_keywords,callBackFunc) {\r\n    if(!_keywords){\r\n      _keywords =''; //default blank for _keywords\r\n    }\r\n\r\n    // function to find the matching node\r\n    function filterFunc(node) {\r\n      if(node && node.oldname && node.oldname.length>0){\r\n        node[nameKey] = node.oldname; //recover oldname of the node if exist\r\n      }\r\n      zTreeObj.updateNode(node); //update node to for modifications take effect\r\n      if (_keywords.length == 0) {\r\n        //return true to show all nodes if the keyword is blank\r\n        zTreeObj.showNode(node);\r\n        zTreeObj.expandNode(node,isExpand);\r\n        return true;\r\n      }\r\n      //transform node name and keywords to lowercase\r\n      if (node[nameKey] && node[nameKey].toLowerCase().indexOf(_keywords.toLowerCase())!=-1) {\r\n        if(isHighLight){ //highlight process\r\n          //a new variable 'newKeywords' created to store the keywords information\r\n          //keep the parameter '_keywords' as initial and it will be used in next node\r\n          //process the meta characters in _keywords thus the RegExp can be correctly used in str.replace\r\n          var newKeywords = _keywords.replace(rexMeta,function(matchStr){\r\n            //add escape character before meta characters\r\n            return '\\\\' + matchStr;\r\n          });\r\n          node.oldname = node[nameKey]; //store the old name\r\n          var rexGlobal = new RegExp(newKeywords, 'gi');//'g' for global,'i' for ignore case\r\n          //use replace(RegExp,replacement) since replace(/substr/g,replacement) cannot be used here\r\n          node[nameKey] = node.oldname.replace(rexGlobal, function(originalText){\r\n            //highlight the matching words in node name\r\n            var highLightText =\r\n              '<span style=\"color: whitesmoke;background-color: darkred;\">'\r\n              + originalText\r\n              +'</span>';\r\n            return \thighLightText;\r\n          });\r\n          zTreeObj.updateNode(node); //update node for modifications take effect\r\n        }\r\n        zTreeObj.showNode(node);//show node with matching keywords\r\n        return true; //return true and show this node\r\n      }\r\n\r\n      zTreeObj.hideNode(node); // hide node that not matched\r\n      return false; //return false for node not matched\r\n    }\r\n\r\n    var nodesShow = zTreeObj.getNodesByFilter(filterFunc); //get all nodes that would be shown\r\n    processShowNodes(nodesShow, _keywords);//nodes should be reprocessed to show correctly\r\n  }\r\n\r\n  /**\r\n   * reprocess of nodes before showing\r\n   */\r\n  function processShowNodes(nodesShow,_keywords){\r\n    if(nodesShow && nodesShow.length>0){\r\n      //process the ancient nodes if _keywords is not blank\r\n      if(_keywords.length>0){\r\n        $.each(nodesShow, function(n,obj){\r\n          var pathOfOne = obj.getPath();//get all the ancient nodes including current node\r\n          if(pathOfOne && pathOfOne.length>0){\r\n            //i < pathOfOne.length-1 process every node in path except self\r\n            for(var i=0;i<pathOfOne.length-1;i++){\r\n              zTreeObj.showNode(pathOfOne[i]); //show node\r\n              zTreeObj.expandNode(pathOfOne[i],true); //expand node\r\n            }\r\n          }\r\n        });\r\n      }else{ //show all nodes when _keywords is blank and expand the root nodes\r\n        var rootNodes = zTreeObj.getNodesByParam('level','0');//get all root nodes\r\n        $.each(rootNodes,function(n,obj){\r\n          zTreeObj.expandNode(obj,true); //expand all root nodes\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  //listen to change in input element\r\n  $(searchField).bind('input propertychange', function() {\r\n    var _keywords = $(this).val();\r\n    searchNodeLazy(_keywords); //call lazy load\r\n  });\r\n\r\n  var timeoutId = null;\r\n  var lastKeyword = '';\r\n  // excute lazy load once after input change, the last pending task will be cancled\r\n  function searchNodeLazy(_keywords) {\r\n    if (timeoutId) {\r\n      //clear pending task\r\n      clearTimeout(timeoutId);\r\n    }\r\n    timeoutId = setTimeout(function() {\r\n      if (lastKeyword === _keywords) {\r\n        return;\r\n      }\r\n      ztreeFilter(zTreeObj,_keywords); //lazy load ztreeFilter function\r\n      // $(searchField).focus();//focus input field again after filtering\r\n      lastKeyword = _keywords;\r\n    }, 500);\r\n  }\r\n}\r\n"],"names":[],"mappings":"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"}