tfp
Version:
A Web UI framework for TaskBuilder
1,039 lines (963 loc) • 37.8 kB
JavaScript
import {VisibleComponent} from "../controller.js";
/**
* 树型组件
* @param {[type]} dataModel [description]
*/
export default class Tree extends VisibleComponent {
constructor(__tfp, dataModel, parent) {
super(__tfp, "Tree", dataModel, parent);
this.nodes = {};
this.leafNodes = {};
this.rootNodes = [];
this.rootLeafNodes = [];
this.iconPath = this._tfp.rootPath+"/src/components/tree/images/";
this.iconColor = this._tfp.curPage.contentColorMode;
}
//属性
get loadDataService() { return this.dataModel.loadDataService }
set loadDataService(value) {this.dataModel.loadDataService = value }
//属性
get deleteNodeService() { return this.dataModel.deleteNodeService }
set deleteNodeService(value) {this.dataModel.deleteNodeService = value }
//属性
get deleteLeafNodeService() { return this.dataModel.deleteLeafNodeService }
set deleteLeafNodeService(value) {this.dataModel.deleteLeafNodeService = value }
//属性
get nodeDataMember() { return this.dataModel.nodeDataMember }
set nodeDataMember(value) {this.dataModel.nodeDataMember = value }
//属性
get rootNodeParentId() { return this.dataModel.rootNodeParentId }
set rootNodeParentId(value) {this.dataModel.rootNodeParentId = value }
//属性
get nodeIdFieldName() { return this.dataModel.nodeIdFieldName }
set nodeIdFieldName(value) {this.dataModel.nodeIdFieldName = value }
//属性
get nodeNameFieldName() { return this.dataModel.nodeNameFieldName }
set nodeNameFieldName(value) {this.dataModel.nodeNameFieldName = value }
//属性
get nodeParentIdFieldName() { return this.dataModel.nodeParentIdFieldName }
set nodeParentIdFieldName(value) {this.dataModel.nodeParentIdFieldName = value }
//属性
get leafNodeDataMember() { return this.dataModel.leafNodeDataMember }
set leafNodeDataMember(value) {this.dataModel.leafNodeDataMember = value }
//属性
get leafNodeIdFieldName() { return this.dataModel.leafNodeIdFieldName }
set leafNodeIdFieldName(value) {this.dataModel.leafNodeIdFieldName = value }
//属性
get leafNodeNameFieldName() { return this.dataModel.leafNodeNameFieldName }
set leafNodeNameFieldName(value) {this.dataModel.leafNodeNameFieldName = value }
//属性
get leafNodeParentIdFieldName() { return this.dataModel.leafNodeParentIdFieldName }
set leafNodeParentIdFieldName(value) {this.dataModel.leafNodeParentIdFieldName = value }
get expandAll() { return this.dataModel.expandAll }
set expandAll(value) {
this.dataModel.expandAll = value ? true : false;
if(this._jqObj) {
//
}
}
get showNodeCheckbox() { return this.dataModel.showNodeCheckbox }
set showNodeCheckbox(value) {
this.dataModel.showNodeCheckbox = value ? true : false;
if(this._jqObj) {
//
}
}
get showNodeEditButton() { return this.dataModel.showNodeEditButton }
set showNodeEditButton(value) {
this.dataModel.showNodeEditButton = value ? true : false;
if(this._jqObj) {
//
}
}
get showNodeDeleteButton() { return this.dataModel.showNodeDeleteButton }
set showNodeDeleteButton(value) {
this.dataModel.showNodeDeleteButton = value ? true : false;
if(this._jqObj) {
//
}
}
get showLeafNodeCheckbox() { return this.dataModel.showLeafNodeCheckbox }
set showLeafNodeCheckbox(value) {
this.dataModel.showLeafNodeCheckbox = value ? true : false;
if(this._jqObj) {
//
}
}
get showLeafNodeEditButton() { return this.dataModel.showLeafNodeEditButton }
set showLeafNodeEditButton(value) {
this.dataModel.showLeafNodeEditButton = value ? true : false;
if(this._jqObj) {
//
}
}
get showLeafNodeDeleteButton() { return this.dataModel.showLeafNodeDeleteButton }
set showLeafNodeDeleteButton(value) {
this.dataModel.showLeafNodeDeleteButton = value ? true : false;
if(this._jqObj) {
//
}
}
get checkParentOnCheckChild() { return this.dataModel.checkParentOnCheckChild }
set checkParentOnCheckChild(value) {
this.dataModel.checkParentOnCheckChild = value ? true : false;
if(this._jqObj) {
//
}
}
get checkAllChildOnCheckParent() { return this.dataModel.checkAllChildOnCheckParent }
set checkAllChildOnCheckParent(value) {
this.dataModel.checkAllChildOnCheckParent = value ? true : false;
if(this._jqObj) {
//
}
}
get unCheckAllChildOnUnCheckParent() { return this.dataModel.unCheckAllChildOnUnCheckParent }
set unCheckAllChildOnUnCheckParent(value) {
this.dataModel.unCheckAllChildOnUnCheckParent = value ? true : false;
if(this._jqObj) {
//
}
}
get unCheckParentOnUnCheckAllChild() { return this.dataModel.unCheckParentOnUnCheckAllChild }
set unCheckParentOnUnCheckAllChild(value) {
this.dataModel.unCheckParentOnUnCheckAllChild = value ? true : false;
if(this._jqObj) {
//
}
}
get multiCheck() { return this.dataModel.multiCheck }
set multiCheck(value) {
this.dataModel.multiCheck = value ? true : false;
if(this._jqObj) {
//
}
}
get deepBackground() { return this.dataModel.deepBackground }
set deepBackground(value) {
this.dataModel.deepBackground = value ? true : false;
if(this._jqObj) {
//
}
}
clear() {
this.nodes = {};
this.leafNodes = {};
this.rootNodes = [];
this.rootLeafNodes = [];
if(this._jqObj) this._jqObj.empty();
}
bindData(data) {
if(!data) {
this._tfp.showMsg("请提供要绑定的数据!");
return;
}
if(!this.dataModel.nodeDataMember) {
this._tfp.showMsg("请为组件["+this.id+"]设置[nodeDataMember]参数!");
return;
}
let nodesData = data[this.dataModel.nodeDataMember];
if(!nodesData) {
this._tfp.showMsg("服务响应结果中没有名为["+this.dataModel.nodeDataMember+"]的参数!");
return;
}
this.clear();
var nodeIdArr = [];
//将服务器端返回数据转换为节点对象
if(nodesData instanceof Array) {
for(var i=0;i<nodesData.length;i++) {
var nodeData = nodesData[i];
var node = {};
node.id = nodeData[this.dataModel.nodeIdFieldName];
node.name = nodeData[this.dataModel.nodeNameFieldName];
node.parentId = nodeData[this.dataModel.nodeParentIdFieldName];
node.data = nodeData;
node.childNodes = [];
node.leafNodes = [];
this.nodes[node.id] = node;
nodeIdArr.push(node.id);
}
} else {
for(objId in nodesData) {
var nodeData = nodesData[objId];
var node = {};
node.id = nodeData[this.dataModel.nodeIdFieldName];
node.name = nodeData[this.dataModel.nodeNameFieldName];
node.parentId = nodeData[this.dataModel.nodeParentIdFieldName];
node.data = nodeData;
node.childNodes = [];
node.leafNodes = [];
this.nodes[node.id] = node;
nodeIdArr.push(node.id);
}
}
//如果有页节点数据,则生成页节点对象
if(this.dataModel.leafNodeDataMember && data[this.dataModel.leafNodeDataMember]) {
var leafNodesData = data[this.dataModel.leafNodeDataMember];
for(var i=0;i<leafNodesData.length;i++) {
var nodeData = leafNodesData[i];
var node = {};
node.id = nodeData[this.dataModel.leafNodeIdFieldName];
node.name = nodeData[this.dataModel.leafNodeNameFieldName];
node.parentId = nodeData[this.dataModel.leafNodeParentIdFieldName];
this.leafNodes[node.id] = node;
var parentNode = this.nodes[node.parentId];
if(parentNode) {
parentNode.leafNodes.push(node.id);
}
}
}
//生成节点之间的关系
for(var i=0;i<nodeIdArr.length;i++) {
var nodeId = nodeIdArr[i];
var node = this.nodes[nodeId];
if(node.parentId==this.dataModel.rootNodeParentId) {
this.rootNodes.push(nodeId);
} else {
var parentNode = this.nodes[node.parentId];
if(parentNode) {
parentNode.childNodes.push(nodeId);
}
}
}
for(var i=0;i<this.rootNodes.length;i++) {
var node = this.nodes[this.rootNodes[i]];
if(!node.parentId) node.parentId = this.dataModel.rootNodeParentId;
this.createNode(this._jqObj, node, 5);
}
/*if(this.dataModel.onLoaded) {
eval(this.dataModel.onLoaded+"(req, res)");
}*/
}
bindTreeNodes(rootNodes, nodes, leafNodes) {
if(!rootNodes) {
this._tfp.showMsg("请提供根节点数据!");
return;
}
if(!nodes) {
this._tfp.showMsg("请提供节点数据!");
return;
}
this.rootNodes = rootNodes;
this.nodes = nodes;
if(leafNodes) this.leafNodes = leafNodes;
for(var i=0;i<this.rootNodes.length;i++) {
var node = this.nodes[this.rootNodes[i]];
if(!node.parentId) node.parentId = this.dataModel.rootNodeParentId;
this.createNode(this._jqObj, node, 5);
}
}
loadData() {
if(!this.dataModel.loadDataService) {
this._tfp.showMsg("请为["+this.id+"]设置加载数据服务!");
return;
}
let serviceCpt = this._tfp.get(this.dataModel.loadDataService);
if(!serviceCpt) {
this._tfp.showMsg("ID为["+this.dataModel.loadDataService+"]的组件不存在!");
return;
}
let that = this;
serviceCpt.status = 0;
serviceCpt.request(null, function(req, res) {
that.bindData(res);
});
}
reloadData() {
this.loadData();
}
getNodeTextDivWidth(marginLeft) {
//动态计算每个节点内文本框的最大宽度,以便文字过长时能自动出现省略号
var divWidth = this._jqObj.get(0).offsetWidth;
var nodeTextWidth = divWidth-marginLeft-16-22;
if(this.dataModel.showNodeCheckbox) nodeTextWidth -= 25;
if(this.dataModel.showNodeDeleteButton) nodeTextWidth -= 21;
if(this.dataModel.showNodeEditButton) nodeTextWidth -= 21;
return nodeTextWidth;
}
/**
* 创建节点
* @param {[type]} parentDiv [description]
* @param {[type]} node [description]
* @param {[type]} marginLeft [description]
*/
createNode(parentDiv, node, marginLeft) {
var toggleIcon = "dot";
var haveChild = false;
if(node.childNodes.length>0 || (node.leafNodes && node.leafNodes.length>0)) haveChild = true;
if(haveChild) toggleIcon = this.dataModel.expandAll ? "toggle" : "expand";
var nodeHtml = "<div class=\"tfp-tree-node\" nodeId=\""+node.id+"\">"
+"<div class=\"tfp-tree-node-icon\"><img src=\""+(this.iconPath+toggleIcon
+"-"+this.iconColor)+".png\" style=\"margin-left: "+marginLeft+"px;\"></div>";
if(this.dataModel.showNodeCheckbox) {
let cbkType = this.dataModel.multiCheck ? "checkbox" : "radio";
nodeHtml += "<div class=\"tfp-tree-node-checkbox\">"
+"<input type=\""+cbkType+"\" value=\""+node.id+"\"";
if(cbkType=="radio") nodeHtml += " name=\""+this.id+"\"";
nodeHtml += "></div>";
}
nodeHtml += "<div class=\"tfp-tree-node-text\" style=\"";
//+"width:"+this.getNodeTextDivWidth(marginLeft)+"px;"
if(!this.dataModel.deepBackground) nodeHtml += "color:#333333";
nodeHtml += "\">"+node.name+"</div>";
if(this.dataModel.showNodeDeleteButton) {
nodeHtml += "<div class=\"tfp-tree-node-button\">"
+"<img src=\""+(this.iconPath+"del-"+this.iconColor)+".png\" title=\"删除\" style=\"cursor:pointer\"></div>";
}
if(this.dataModel.showNodeEditButton) {
nodeHtml += "<div class=\"tfp-tree-node-button\">"
+"<img src=\""+(this.iconPath+"edit-"+this.iconColor)+".png\" title=\"修改\" style=\"cursor:pointer\"></div>";
}
nodeHtml += "</div>";
parentDiv.append(nodeHtml);
let nodeDivNew = parentDiv.children(".tfp-tree-node").last();
let that = this;
nodeDivNew.mouseover(function() {
var bgColor = that.dataModel.deepBackground ? "#444444" : "#EEEEEE";
//$(this).css("background-color", bgColor);
$(this).find(".tfp-tree-node-button").show();
});
nodeDivNew.mouseout(function() {
//$(this).css("background-color", "");
$(this).find(".tfp-tree-node-button").hide();
});
nodeDivNew.find(".tfp-tree-node-text").click(function() {
if(that.dataModel.onClickNode) {
let eventFucName = that._tfp.getCptEventFuncName(that.dataModel.onClickNode);
eval(eventFucName+"('"+node.id+"')");
}
that._jqObj.find(".tfp-tree-node").removeClass("tfp-tree-node-selected");
$(this).closest(".tfp-tree-node").addClass("tfp-tree-node-selected");
that.toggleNode(node.id);
});
nodeDivNew.find(".tfp-tree-node-icon").find("img").click(function() {
that.toggleNode(node.id);
});
nodeDivNew.find(".tfp-tree-node-checkbox").find("input").click(function() {
that.checkNode(node.id);
if(that.dataModel.onClickNode) {
let eventFucName = that._tfp.getCptEventFuncName(that.dataModel.onClickNode);
eval(eventFucName+"('"+node.id+"')");
}
});
nodeDivNew.find(".tfp-tree-node-button").find("img").click(function() {
if($(this).attr("title")=="修改") {
if(that.dataModel.onClickNodeEditButton) {
let eventFucName = that._tfp.getCptEventFuncName(that.dataModel.onClickNodeEditButton);
eval(eventFucName+"('"+node.id+"')");
}
} else {
that.onClickDeleteNodeButton(node.id);
}
});
var childDisplay = this.dataModel.expandAll ? "" : "display:none";
var childNodesDiv = $("<div class=\"tfp-tree-node-childs\" "
+"nodeId=\""+node.id+"\" style=\""+childDisplay+"\"></div>");
parentDiv.append(childNodesDiv);
if(haveChild) {
for(var i=0;i<node.childNodes.length;i++) {
var childNode = this.nodes[node.childNodes[i]];
//如果子节点没有设置父节点编号属性,则在此设置一下
//目前在选择部门和人员时需要这么做
if(!childNode.parentId) childNode.parentId = node.id;
this.createNode(childNodesDiv, childNode, marginLeft+20);
}
if(node.leafNodes && node.leafNodes.length>0) {
for(var i=0;i<node.leafNodes.length;i++) {
var leafNode = this.leafNodes[node.leafNodes[i]];
if(!leafNode) continue;
if(!leafNode.parentId) leafNode.parentId = node.id;
this.createLeafNode(childNodesDiv, leafNode, marginLeft+20);
}
}
}
}
/**
* 处理节点删除按钮点击事件
* @param {[type]} nodeId [description]
*/
onClickDeleteNodeButton(nodeId) {
if(!confirm("确定删除?")) return;
if(this.dataModel.onClickNodeDeleteButton) {
let eventFucName = this._tfp.getCptEventFuncName(this.dataModel.onClickNodeDeleteButton);
eval(eventFucName+"('"+node.id+"')");
} else if(this.dataModel.deleteNodeService) {
var args = {};
args[this.dataModel.nodeIdFieldName] = nodeId;
args.childs = "";
var childNodesDiv = $("#"+this.id).find(".tfp-tree-node-childs[nodeId="+nodeId+"]");
childNodesDiv.find(".tfp-tree-node").each(function() {
if(args.childs!="") args.childs += ",";
args.childs += $(this).attr("nodeId");
});
let serviceCpt = this._tfp.components[this.dataModel.deleteNodeService];
if(!serviceCpt) return;
let that = this;
serviceCpt.request(args, function(req, res) {
if(res.code!=0) {
that._tfp.showMsg(res.message);
return;
}
that.deleteNode(nodeId);
});
}
}
/**
* 删除节点
* @param {[type]} nodeId [description]
* @return {[type]} [description]
*/
deleteNode(nodeId) {
if(!(nodeId in this.nodes)) return;
//删除节点对应的html元素
var nodeDiv = this._jqObj.find(".tfp-tree-node[nodeId="+nodeId+"]");
nodeDiv.remove();
var childNodesDiv = this._jqObj.find(".tfp-tree-node-childs[nodeId="+nodeId+"]");
childNodesDiv.remove();
var node = this.nodes[nodeId];
//删除子节点
this.deleteChildNode(node);
//解除与父节点的关联
if(node.parentId!=this.dataModel.rootNodeParentId) {
var parentNode = this.nodes[node.parentId];
parentNode.childNodes.remove(node.id);
//如果父节点没有其他子节点了,则应该修改父节点的图标为无法收起或展开
if(parentNode.childNodes.length==0 && (!parentNode.leafNodes || parentNode.leafNodes.length==0)) {
let iconColor = this.dataModel.deepBackground ? "" : "-dark";
var parentDiv = this._jqObj.find(".tfp-tree-node[nodeId="+node.parentId+"]");
parentDiv.find(".tfp-tree-node-icon").find("img").get(0).src =
this.iconPath+"dot-"+this.iconColor+".png";
}
}
//删除自己
delete this.nodes[nodeId];
node = null;
}
/**
* 删除子节点
* @param {[type]} node [description]
* @return {[type]} [description]
*/
deleteChildNode(node) {
for(var i=0;i<node.childNodes.length;i++) {
var childNodeId = node.childNodes[i];
var childNode = this.nodes[childNodeId];
if(!childNode) continue;
this.deleteChildNode(childNode);
delete this.nodes[childNode.id];
childNode = null;
}
if(!node.leafNodes) return;
for(var i=0;i<node.leafNodes.length;i++) {
var leafNodeId = node.leafNodes[i];
var leafNode = this.leafNodes[leafNodeId];
delete this.leafNodes[leafNode.id];
leafNode = null;
}
}
/**
* 处理节点选择框点击事件
* @param {[type]} nodeId [description]
*/
checkNode(nodeId) {
var node = this.nodes[nodeId];
if(!node) return;
var nodeDiv = this._jqObj.find(".tfp-tree-node[nodeId="+nodeId+"]");
var cbk = nodeDiv.find(".tfp-tree-node-checkbox").find("input").get(0);
var childNodesDiv = this._jqObj.find(".tfp-tree-node-childs[nodeId="+nodeId+"]");
if(cbk.checked) {
if(this.dataModel.multiCheck) {
if(this.dataModel.checkAllChildOnCheckParent) {
childNodesDiv.find(".tfp-tree-node-checkbox").find("input").each(function() {
$(this).get(0).checked = cbk.checked;
});
}
if(this.dataModel.checkParentOnCheckChild) {
var parentId = node.parentId;
while(parentId!=this.dataModel.rootNodeParentId) {
var parentNode = this.nodes[parentId];
var parentDiv = this._jqObj.find(".tfp-tree-node[nodeId="+parentId+"]");
var parentCbk = parentDiv.find(".tfp-tree-node-checkbox").find("input");
if(parentCbk.length==0) break;
parentCbk.get(0).checked = true;
parentId = parentNode.parentId;
}
}
} else {
$(":radio").each(function(){
if($(this).parent().parent().attr("nodeId")!=nodeId) $(this).get(0).checked = false;
});
}
} else {
if(this.dataModel.unCheckAllChildOnUnCheckParent) {
childNodesDiv.find(".tfp-tree-node-checkbox").find("input").each(function() {
$(this).get(0).checked = cbk.checked;
});
}
if(this.dataModel.unCheckParentOnUnCheckAllChild) {
this.unCheckParentNode(node);
}
}
}
/**
* 取消选中父节点
* @param {[type]} node [description]
*/
unCheckParentNode(node) {
var parentId = node.parentId;
if(parentId==this.dataModel.rootNodeParentId) return;
var parentNode = this.nodes[parentId];
if(!parentNode) return;
for(var i=0;i<parentNode.childNodes.length;i++) {
var childId = parentNode.childNodes[i];
var childDiv = this._jqObj.find(".tfp-tree-node[nodeId="+childId+"]");
var childCbk = childDiv.find(".tfp-tree-node-checkbox").find("input");
if(childCbk.length==0) continue;
//如果父节点有其他子节点已选中,则不能取消选中父节点
if(childCbk.get(0).checked) return;
}
if(this.dataModel.showLeafNodeCheckbox && parentNode.leafNodes) {
for(var i=0;i<parentNode.leafNodes.length;i++) {
var childId = parentNode.leafNodes[i];
var childDiv = this._jqObj.find(".tfp-tree-node[nodeId="+childId+"]");
var childCbk = childDiv.find(".tfp-tree-node-checkbox").find("input");
if(childCbk.length==0) continue;
//如果父节点有叶节点已选中,则不能取消选中父节点
if(childCbk.get(0).checked) return;
}
}
var parentDiv = this._jqObj.find(".tfp-tree-node[nodeId="+parentId+"]");
var parentCbk = parentDiv.find(".tfp-tree-node-checkbox").find("input");
if(parentCbk.length==0) return;
parentCbk.get(0).checked = false;
this.unCheckParentNode(parentNode);
}
haveChild(nodeId) {
return (this.nodes[nodeId].childNodes.length>0
|| (this.nodes[nodeId].leafNodes
&& this.nodes[nodeId].leafNodes.length>0));
}
/**
* 处理节点展开收起按钮点击事件
* @param {[type]} nodeId [description]
*/
toggleNode(nodeId) {
if(!this.haveChild(nodeId)) return;
var nodeDiv = this._jqObj.find(".tfp-tree-node[nodeId="+nodeId+"]");
var childNodesDiv = this._jqObj.find(".tfp-tree-node-childs[nodeId="+nodeId+"]");
let img = nodeDiv.find(".tfp-tree-node-icon").find("img").get(0);
var iconColor = this.dataModel.deepBackground ? "" : "-dark";
if(img.src.indexOf("images/toggle")>=0) {
img.src = this.iconPath+"expand-"+this.iconColor+".png";
childNodesDiv.hide();
} else {
img.src = this.iconPath+"toggle-"+this.iconColor+".png";
childNodesDiv.show();
}
}
getLeafNodeTextDivWidth(marginLeft) {
//动态计算每个节点内文本框的最大宽度,以便文字过长时能自动出现省略号
var divWidth = this._jqObj.get(0).offsetWidth;
var nodeTextWidth = divWidth-marginLeft-16-22;
if(this.dataModel.showLeafNodeCheckbox) nodeTextWidth -= 25;
if(this.dataModel.showLeafNodeDeleteButton) nodeTextWidth -= 21;
if(this.dataModel.showLeafNodeEditButton) nodeTextWidth -= 21;
return nodeTextWidth;
}
/**
* 创建页节点
* @param {[type]} parentDiv [description]
* @param {[type]} node [description]
* @param {[type]} marginLeft [description]
*/
createLeafNode(parentDiv, node, marginLeft) {
var nodeHtml = "<div class=\"tfp-tree-leaf-node\" nodeId=\""+node.id+"\">";
if (this.dataModel.showLeafNodeCheckbox) {
var cbkType = this.dataModel.multiCheck ? "checkbox" : "radio";
nodeHtml += "<div class=\"tfp-tree-node-checkbox\">" + "<input type=\""
+ cbkType + "\" value=\"" + node.id + "\" style=\"margin-left: " + marginLeft + "px;\"";
if (cbkType == "radio") nodeHtml += " name=\"" + this.id + "\"";
nodeHtml += "></div>";
} else {
nodeHtml += "<div class=\"tfp-tree-node-icon\"><img src=\"" + (this.iconPath + "dot"
+ "-" + this.iconColor) + ".png\" style=\"margin-left: " + marginLeft + "px;\"></div>";
}
nodeHtml += "<div class=\"tfp-tree-node-text\" style=\"cursor:pointer;width:"
+this.getLeafNodeTextDivWidth(marginLeft)+"px;"
if(!this.dataModel.deepBackground) nodeHtml += "color:#333333";
nodeHtml += "\">"+node.name+"</div>";
var iconColor = this.dataModel.deepBackground ? "" : "-dark";
if(this.dataModel.showLeafNodeDeleteButton) {
nodeHtml += "<div class=\"tfp-tree-node-button\">"
+"<img src=\""+this.iconPath+"del-"+this.iconColor+".png\" title=\"删除\"></div>";
}
if(this.dataModel.showLeafNodeEditButton) {
nodeHtml += "<div class=\"tfp-tree-node-button\">"
+"<img src=\""+this.iconPath+"edit-"+this.iconColor+".png\" title=\"修改\"></div>";
}
nodeHtml += "</div>";
parentDiv.append(nodeHtml);
let that = this;
let nodeDivNew = parentDiv.children(".tfp-tree-leaf-node").last();
nodeDivNew.mouseover(function() {
var bgColor = that.dataModel.deepBackground ? "#444444" : "#EEEEEE";
//$(this).css("background-color", bgColor);
$(this).find(".tfp-tree-node-button").css("display", "inline-flex");
});
nodeDivNew.mouseout(function() {
//$(this).css("background-color", "");
$(this).find(".tfp-tree-node-button").hide();
});
nodeDivNew.find(".tfp-tree-node-text").click(function() {
if(that.dataModel.onClickLeafNode) {
let eventFucName = that._tfp.getCptEventFuncName(that.dataModel.onClickLeafNode);
eval(eventFucName+"('"+node.id+"')");
}
});
nodeDivNew.find(".tfp-tree-node-checkbox").find("input").click(function() {
that.checkLeafNode(node.id);
if(that.dataModel.onClickLeafNode) {
let eventFucName = that._tfp.getCptEventFuncName(that.dataModel.onClickLeafNode);
eval(eventFucName+"('"+node.id+"')");
}
});
nodeDivNew.find(".tfp-tree-node-button").find("img").click(function() {
if($(this).attr("title")=="修改") {
if(that.dataModel.onClickLeafNodeEditButton) {
let eventFucName = that._tfp.getCptEventFuncName(that.dataModel.onClickLeafNodeEditButton);
eval(eventFucName+"('"+node.id+"')");
}
} else {
that.onClickDeleteLeafNodeButton(node.id);
}
});
}
checkLeafNode(nodeId) {
var node = this.leafNodes[nodeId];
var nodeDiv = this._jqObj.find(".tfp-tree-leaf-node[nodeId="+nodeId+"]");
var cbk = nodeDiv.find(".tfp-tree-node-checkbox").find("input").get(0);
if(cbk.checked) {
if(this.dataModel.multiCheck) {
if(this.dataModel.checkParentOnCheckChild) {
var parentId = node.parentId;
while(parentId!=this.dataModel.rootNodeParentId) {
var parentNode = this.nodes[parentId];
var parentDiv = this._jqObj.find(".tfp-tree-node[nodeId="+parentId+"]");
var parentCbk = parentDiv.find(".tfp-tree-node-checkbox").find("input");
if(parentCbk.length==0) break;
parentCbk.get(0).checked = true;
parentId = parentNode.parentId;
}
}
} else {
$(":radio").each(function(){
if($(this).parent().parent().attr("nodeId")!=nodeId) $(this).get(0).checked = false;
});
}
} else {
if(this.dataModel.unCheckParentOnUnCheckAllChild) {
this.unCheckParentNode(node);
}
}
}
onClickDeleteLeafNodeButton(nodeId) {
if(!confirm("确定删除?")) return;
if(this.dataModel.onClickLeafNodeDeleteButton) {
let eventFucName = this._tfp.getCptEventFuncName(this.dataModel.onClickLeafNodeDeleteButton);
eval(eventFucName+"('"+node.id+"')");
} else if(this.dataModel.deleteLeafNodeService) {
var args = {};
args[this.dataModel.leafNodeIdFieldName] = nodeId;
let serviceCpt = this._tfp.components[this.dataModel.deleteLeafNodeService];
if(!serviceCpt) return;
let that = this;
serviceCpt.request(args, function(req, res) {
if(res.code!=0) {
that._tfp.showMsg(res.message);
return;
}
that.deleteLeafNode(nodeId);
});
}
}
/**
* 删除叶节点
* @param {[type]} nodeId [description]
* @return {[type]} [description]
*/
deleteLeafNode(nodeId) {
if(!(nodeId in this.leafNodes)) return;
//删除节点对应的html元素
var nodeDiv = this._jqObj.find(".tfp-tree-node[nodeId="+nodeId+"]");
nodeDiv.remove();
var node = this.leafNodes[nodeId];
//解除与父节点的关联
var parentNode = this.nodes[node.parentId];
parentNode.leafNodes.remove(node.id);
//如果父节点没有其他子节点了,则应该修改父节点的图标为无法收起或展开
if(parentNode.childNodes.length==0 && parentNode.leafNodes.length==0) {
let iconColor = this.dataModel.deepBackground ? "" : "-dark";
var parentDiv = this._jqObj.find(".tfp-tree-leaf-node[nodeId="+node.parentId+"]");
parentDiv.find(".tfp-tree-node-icon").find("img").get(0).src =
this.iconPath+"dot-"+this.iconColor+".png";
}
//删除自己
delete this.leafNodes[nodeId];
node = null;
}
/**
* 获得图标颜色
* @return {[type]} [description]
*/
getIconColor() {
return this.dataModel.deepBackground ? "" : "-dark";
}
/**
* 获得节点HTML元素
* @param {[type]} nodeId [description]
* @return {[type]} [description]
*/
getNodeEl(nodeId) {
return this._jqObj.find(".tfp-tree-node[nodeId="+nodeId+"]");
}
/**
* 获得子节点容器HTML元素
* @param {[type]} nodeId [description]
* @return {[type]} [description]
*/
getNodeChildsEl(nodeId) {
return this._jqObj.find(".tfp-tree-node-childs[nodeId="+nodeId+"]");
}
/**
* 获得叶节点HTML元素
* @param {[type]} nodeId [description]
* @return {[type]} [description]
*/
getLeafNodeEl(nodeId) {
return this._jqObj.find(".tfp-tree-leaf-node[nodeId="+nodeId+"]");
}
/**
* 添加节点
* @param {[type]} id [description]
* @param {[type]} name [description]
* @param {[type]} parentId [description]
* @param {[type]} tag [description]
*/
addNode(id, name, parentId, tag) {
var node = {};
node.id = id;
node.name = name;
node.parentId = parentId;
node.childNodes = [];
if(this.dataModel.leafNodeDataMember) node.leafNodes = [];
if(tag) node.tag = tag;
this.nodes[node.id] = node;
var marginLeft = 5;
var parentDiv = $("#"+this.id);
if(node.parentId!=this.dataModel.rootNodeParentId) {
let parentEl = this.getNodeEl(node.parentId);
marginLeft = this._tfp.getPixel(parentEl.css("margin-left"))+20;
parentDiv = this.getNodeChildsEl(node.parentId);
if(parentDiv.length==0) return;
var parentNode = this.nodes[node.parentId];
if(!parentNode) return;
parentNode.childNodes.push(node.id);
var parentIcon = parentEl.find(".tfp-tree-node-icon").find("img");
if(parentIcon.get(0).src.indexOf("/dot")>0) {
parentIcon.get(0).src = this.iconPath+"expand-"+this.iconColor+".png";
}
}
this.createNode(parentDiv, node, marginLeft);
}
/**
* 添加叶节点
* @param {[type]} id [description]
* @param {[type]} name [description]
* @param {[type]} parentId [description]
* @param {[type]} tag [description]
*/
addLeafNode(id, name, parentId, tag) {
var node = {};
node.id = id;
node.name = name;
node.parentId = parentId;
if(tag) node.tag = tag;
this.leafNodes[node.id] = node;
var marginLeft = 5;
var parentDiv = $("#"+this.id);
if(node.parentId!=this.dataModel.rootNodeParentId) {
let parentEl = this.getNodeEl(node.parentId);
marginLeft = this._tfp.getPixel(parentEl.css("margin-left"))+20;
parentDiv = this.getNodeChildsEl(node.parentId);
if(parentDiv.length==0) return;
var parentNode = this.nodes[node.parentId];
if(!parentNode) return;
parentNode.leafNodes.push(node.id);
var parentIcon = parentEl.find(".tfp-tree-node-icon").find("img");
if(parentIcon.get(0).src.indexOf("/dot")>0) {
parentIcon.get(0).src = this.iconPath+"expand-"+this.iconColor+".png";
}
}
this.createLeafNode(parentDiv, node, marginLeft);
}
/**
* 更新节点
* @param {[type]} id [description]
* @param {[type]} name [description]
* @param {[type]} parentId [description]
* @return {[type]} [description]
*/
updateNode(id, name, parentId) {
var node = this.nodes[id];
if(!node) return;
var nodeDiv = this.getNodeEl(id);
var childNodesDiv = this.getNodeChildsEl(id);
var nodeIcon = nodeDiv.find(".tfp-tree-node-icon").find("img");
if(node.name!=name) {
node.name = name;
nodeDiv.find(".tfp-tree-node-text").html(name);
}
//如果父节点变了,则需要重新关联
if(node.parentId != parentId) {
if(node.parentId!=this.dataModel.rootNodeParentId) {
var parentOld = this.nodes[node.parentId];
parentOld.childNodes.remove(node.id);
//如果老的父节点没有其他子节点了,则应该修改老父节点的图标为无法收起或展开
if(parentOld.childNodes.length==0) {
var parentOldEl = this.getNodeEl(node.parentId);
var parentOldIcon = parentOldEl.find(".tfp-tree-node-icon").find("img");
parentOldIcon.get(0).src = this.iconPath+"dot-"+this.iconColor+".png";
}
}
var parentDiv = null;
var parentMargin = 5;
if(parentId==this.dataModel.rootNodeParentId) {
parentDiv = $("#"+this.id);
} else {
parentDiv = this.getNodeEl(parentId);;
var parentNewIconDiv = parentDiv.find(".tfp-tree-node-icon");
parentMargin = this._tfp.getPixel(parentNewIconDiv.css("margin-left"))+20;
this.setChildMargin(node, parentMargin);
var parentNew = this.nodes[parentId];
//如果新的父节点原来没有子节点,则应该修改新父节点的图标为展开
if(parentNew.childNodes.length==0) {
parentNewIconDiv.find("img").get(0).src = this.iconPath+"expand-"+this.iconColor+".png";
}
parentNew.childNodes.push(id);
}
nodeIcon.css("margin-left", parentMargin+"px");
//nodeDiv.css("background-color", "");
nodeDiv.find(".tfp-tree-node-button").hide();
parentDiv.append(nodeDiv.clone());
parentDiv.append(childNodesDiv.clone());
node.parentId = parentId;
nodeDiv.remove();
childNodesDiv.remove();
}
}
/**
* 设置子节点左边距
* @param {[type]} parent [description]
* @param {[type]} parentMargin [description]
*/
setChildMargin(parent, parentMargin) {
for(var i=0;i<parent.childNodes.length;i++) {
var node = this.nodes[parent.childNodes[i]];
var nodeDiv = this.getNodeEl(node.id);
var nodeIconDiv = nodeDiv.find(".tfp-tree-node-icon");
nodeIconDiv.css("margin-left", (parentMargin+20)+"px");
this.setChildMargin(node, parentMargin+20);
}
if(!parent.leafNodes) return;
for(var i=0;i<parent.leafNodes.length;i++) {
var leafNode = this.leafNodes[parent.leafNodes[i]];
var nodeDiv = this.getLeafNodeEl(leafNode.id);
var nodeIconDiv = nodeDiv.find(".tfp-tree-node-icon");
nodeIconDiv.css("margin-left", (parentMargin+20)+"px");
}
}
/**
* 获得选中的节点
* @param {[type]} getData [description]
* @return {[type]} [description]
*/
getCheckedNodes(getData) {
var nodes = [];
let that = this;
this._jqObj.find(".tfp-tree-node").each(function() {
var input = $(this).first(".tfp-tree-node-checkbox").find("input");
if(input.get(0).checked && input.val()!="") {
var node = that.nodes[input.val()];
if(getData) {
nodes.push(node);
} else {
nodes.push({
id: node.id,
name: node.name,
parentId: node.parentId
});
}
}
});
return nodes;
}
/**
* 获得选中的叶节点
* @param {[type]} getData [description]
* @return {[type]} [description]
*/
getCheckedLeafNodes(getData) {
var nodes = [];
let that = this;
this._jqObj.find(".tfp-tree-leaf-node").each(function() {
var input = $(this).first(".tfp-tree-node-checkbox").find("input");
if(input.get(0).checked && input.val()!="") {
var node = that.leafNodes[input.val()];
if(getData) {
nodes.push(node);
} else {
nodes.push({
id: node.id,
name: node.name,
parentId: node.parentId
});
}
}
});
return nodes;
}
/**
* 获得选中的节点值
* @return {[type]} [description]
*/
getCheckedNodesValue() {
var values = "";
this._jqObj.find(".tfp-tree-node").each(function() {
var input = $(this).find(".tfp-tree-node-checkbox").find("input");
if(input.get(0).checked && input.val()!="") {
if(values!="") values += ",";
values += input.val();
}
});
return values;
}
/**
* 获得选中的叶节点值
* @return {[type]} [description]
*/
getCheckedLeafNodesValue() {
var values = "";
this._jqObj.find(".tfp-tree-leaf-node").each(function() {
var input = $(this).find(".tfp-tree-node-checkbox").find("input");
if(input.get(0).checked && input.val()!="") {
if(values!="") values += ",";
values += input.val();
}
});
return values;
}
initRuntime() {
if(!this.dataModel.loadDataService) return;
this.loadData();
}
}