推送功能添加
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1 +0,0 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="UTF-8"><link rel="icon" type="image/svg+xml" href="../../favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1"><title>铃铛学习中心</title><link rel="stylesheet" href="./libs/ztree/zTreeStyle.css"><script src="./libs/jquery.min.js"></script><script src="./libs/lodash.min.js"></script><script src="./libs/ztree/jquery.ztree.all.min.js"></script><script src="https://base.bestsch.com/BschHome/base/js/bschload.min.js?v=2025011001"></script><script src="./js/userType.js?type=teacher"></script><script type="module" crossorigin src="./static/js/main-CNRNr9ff.js"></script><link rel="stylesheet" crossorigin href="./static/css/main-BEI6wsu_.css"></head><body><div id="app"></div></body></html>
|
||||
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 933 B |
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,628 +0,0 @@
|
||||
/*
|
||||
* JQuery zTree excheck v3.5.28
|
||||
* http://treejs.cn/
|
||||
*
|
||||
* Copyright (c) 2010 Hunter.z
|
||||
*
|
||||
* Licensed same as jquery - MIT License
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* email: hunter.z@263.net
|
||||
* Date: 2017-01-20
|
||||
*/
|
||||
(function($){
|
||||
//default consts of excheck
|
||||
var _consts = {
|
||||
event: {
|
||||
CHECK: "ztree_check"
|
||||
},
|
||||
id: {
|
||||
CHECK: "_check"
|
||||
},
|
||||
checkbox: {
|
||||
STYLE: "checkbox",
|
||||
DEFAULT: "chk",
|
||||
DISABLED: "disable",
|
||||
FALSE: "false",
|
||||
TRUE: "true",
|
||||
FULL: "full",
|
||||
PART: "part",
|
||||
FOCUS: "focus"
|
||||
},
|
||||
radio: {
|
||||
STYLE: "radio",
|
||||
TYPE_ALL: "all",
|
||||
TYPE_LEVEL: "level"
|
||||
}
|
||||
},
|
||||
//default setting of excheck
|
||||
_setting = {
|
||||
check: {
|
||||
enable: false,
|
||||
autoCheckTrigger: false,
|
||||
chkStyle: _consts.checkbox.STYLE,
|
||||
nocheckInherit: false,
|
||||
chkDisabledInherit: false,
|
||||
radioType: _consts.radio.TYPE_LEVEL,
|
||||
chkboxType: {
|
||||
"Y": "ps",
|
||||
"N": "ps"
|
||||
}
|
||||
},
|
||||
data: {
|
||||
key: {
|
||||
checked: "checked"
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
beforeCheck:null,
|
||||
onCheck:null
|
||||
}
|
||||
},
|
||||
//default root of excheck
|
||||
_initRoot = function (setting) {
|
||||
var r = data.getRoot(setting);
|
||||
r.radioCheckedList = [];
|
||||
},
|
||||
//default cache of excheck
|
||||
_initCache = function(treeId) {},
|
||||
//default bind event of excheck
|
||||
_bindEvent = function(setting) {
|
||||
var o = setting.treeObj,
|
||||
c = consts.event;
|
||||
o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
|
||||
event.srcEvent = srcEvent;
|
||||
tools.apply(setting.callback.onCheck, [event, treeId, node]);
|
||||
});
|
||||
},
|
||||
_unbindEvent = function(setting) {
|
||||
var o = setting.treeObj,
|
||||
c = consts.event;
|
||||
o.unbind(c.CHECK);
|
||||
},
|
||||
//default event proxy of excheck
|
||||
_eventProxy = function(e) {
|
||||
var target = e.target,
|
||||
setting = data.getSetting(e.data.treeId),
|
||||
tId = "", node = null,
|
||||
nodeEventType = "", treeEventType = "",
|
||||
nodeEventCallback = null, treeEventCallback = null;
|
||||
|
||||
if (tools.eqs(e.type, "mouseover")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "mouseoverCheck";
|
||||
}
|
||||
} else if (tools.eqs(e.type, "mouseout")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "mouseoutCheck";
|
||||
}
|
||||
} else if (tools.eqs(e.type, "click")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "checkNode";
|
||||
}
|
||||
}
|
||||
if (tId.length>0) {
|
||||
node = data.getNodeCache(setting, tId);
|
||||
switch (nodeEventType) {
|
||||
case "checkNode" :
|
||||
nodeEventCallback = _handler.onCheckNode;
|
||||
break;
|
||||
case "mouseoverCheck" :
|
||||
nodeEventCallback = _handler.onMouseoverCheck;
|
||||
break;
|
||||
case "mouseoutCheck" :
|
||||
nodeEventCallback = _handler.onMouseoutCheck;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var proxyResult = {
|
||||
stop: nodeEventType === "checkNode",
|
||||
node: node,
|
||||
nodeEventType: nodeEventType,
|
||||
nodeEventCallback: nodeEventCallback,
|
||||
treeEventType: treeEventType,
|
||||
treeEventCallback: treeEventCallback
|
||||
};
|
||||
return proxyResult
|
||||
},
|
||||
//default init node of excheck
|
||||
_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
|
||||
if (!n) return;
|
||||
var checkedKey = setting.data.key.checked;
|
||||
if (typeof n[checkedKey] == "string") n[checkedKey] = tools.eqs(n[checkedKey], "true");
|
||||
n[checkedKey] = !!n[checkedKey];
|
||||
n.checkedOld = n[checkedKey];
|
||||
if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
|
||||
n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
|
||||
if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
|
||||
n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
|
||||
if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
|
||||
n.halfCheck = !!n.halfCheck;
|
||||
n.check_Child_State = -1;
|
||||
n.check_Focus = false;
|
||||
n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
|
||||
|
||||
if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && n[checkedKey] ) {
|
||||
var r = data.getRoot(setting);
|
||||
r.radioCheckedList.push(n);
|
||||
}
|
||||
},
|
||||
//add dom for check
|
||||
_beforeA = function(setting, node, html) {
|
||||
var checkedKey = setting.data.key.checked;
|
||||
if (setting.check.enable) {
|
||||
data.makeChkFlag(setting, node);
|
||||
html.push("<span ID='", node.tId, consts.id.CHECK, "' class='", view.makeChkClass(setting, node), "' treeNode", consts.id.CHECK, (node.nocheck === true?" style='display:none;'":""),"></span>");
|
||||
}
|
||||
},
|
||||
//update zTreeObj, add method of check
|
||||
_zTreeTools = function(setting, zTreeTools) {
|
||||
zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
|
||||
var checkedKey = this.setting.data.key.checked;
|
||||
if (node.chkDisabled === true) return;
|
||||
if (checked !== true && checked !== false) {
|
||||
checked = !node[checkedKey];
|
||||
}
|
||||
callbackFlag = !!callbackFlag;
|
||||
|
||||
if (node[checkedKey] === checked && !checkTypeFlag) {
|
||||
return;
|
||||
} else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
|
||||
return;
|
||||
}
|
||||
if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
|
||||
node[checkedKey] = checked;
|
||||
var checkObj = $$(node, consts.id.CHECK, this.setting);
|
||||
if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
|
||||
view.setChkClass(this.setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(this.setting, node);
|
||||
if (callbackFlag) {
|
||||
this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
zTreeTools.checkAllNodes = function(checked) {
|
||||
view.repairAllChk(this.setting, !!checked);
|
||||
}
|
||||
|
||||
zTreeTools.getCheckedNodes = function(checked) {
|
||||
var childKey = this.setting.data.key.children;
|
||||
checked = (checked !== false);
|
||||
return data.getTreeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey], checked);
|
||||
}
|
||||
|
||||
zTreeTools.getChangeCheckedNodes = function() {
|
||||
var childKey = this.setting.data.key.children;
|
||||
return data.getTreeChangeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey]);
|
||||
}
|
||||
|
||||
zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
|
||||
disabled = !!disabled;
|
||||
inheritParent = !!inheritParent;
|
||||
inheritChildren = !!inheritChildren;
|
||||
view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
|
||||
view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
|
||||
}
|
||||
|
||||
var _updateNode = zTreeTools.updateNode;
|
||||
zTreeTools.updateNode = function(node, checkTypeFlag) {
|
||||
if (_updateNode) _updateNode.apply(zTreeTools, arguments);
|
||||
if (!node || !this.setting.check.enable) return;
|
||||
var nObj = $$(node, this.setting);
|
||||
if (nObj.get(0) && tools.uCanDo(this.setting)) {
|
||||
var checkObj = $$(node, consts.id.CHECK, this.setting);
|
||||
if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
|
||||
view.setChkClass(this.setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(this.setting, node);
|
||||
}
|
||||
}
|
||||
},
|
||||
//method of operate data
|
||||
_data = {
|
||||
getRadioCheckedList: function(setting) {
|
||||
var checkedList = data.getRoot(setting).radioCheckedList;
|
||||
for (var i=0, j=checkedList.length; i<j; i++) {
|
||||
if(!data.getNodeCache(setting, checkedList[i].tId)) {
|
||||
checkedList.splice(i, 1);
|
||||
i--; j--;
|
||||
}
|
||||
}
|
||||
return checkedList;
|
||||
},
|
||||
getCheckStatus: function(setting, node) {
|
||||
if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
|
||||
var checkedKey = setting.data.key.checked,
|
||||
r = {
|
||||
checked: node[checkedKey],
|
||||
half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (node[checkedKey] ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
|
||||
};
|
||||
return r;
|
||||
},
|
||||
getTreeCheckedNodes: function(setting, nodes, checked, results) {
|
||||
if (!nodes) return [];
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
|
||||
results = !results ? [] : results;
|
||||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||||
if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] == checked) {
|
||||
results.push(nodes[i]);
|
||||
if(onlyOne) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
data.getTreeCheckedNodes(setting, nodes[i][childKey], checked, results);
|
||||
if(onlyOne && results.length > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return results;
|
||||
},
|
||||
getTreeChangeCheckedNodes: function(setting, nodes, results) {
|
||||
if (!nodes) return [];
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked;
|
||||
results = !results ? [] : results;
|
||||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||||
if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] != nodes[i].checkedOld) {
|
||||
results.push(nodes[i]);
|
||||
}
|
||||
data.getTreeChangeCheckedNodes(setting, nodes[i][childKey], results);
|
||||
}
|
||||
return results;
|
||||
},
|
||||
makeChkFlag: function(setting, node) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
chkFlag = -1;
|
||||
if (node[childKey]) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var cNode = node[childKey][i];
|
||||
var tmp = -1;
|
||||
if (setting.check.chkStyle == consts.radio.STYLE) {
|
||||
if (cNode.nocheck === true || cNode.chkDisabled === true) {
|
||||
tmp = cNode.check_Child_State;
|
||||
} else if (cNode.halfCheck === true) {
|
||||
tmp = 2;
|
||||
} else if (cNode[checkedKey]) {
|
||||
tmp = 2;
|
||||
} else {
|
||||
tmp = cNode.check_Child_State > 0 ? 2:0;
|
||||
}
|
||||
if (tmp == 2) {
|
||||
chkFlag = 2; break;
|
||||
} else if (tmp == 0){
|
||||
chkFlag = 0;
|
||||
}
|
||||
} else if (setting.check.chkStyle == consts.checkbox.STYLE) {
|
||||
if (cNode.nocheck === true || cNode.chkDisabled === true) {
|
||||
tmp = cNode.check_Child_State;
|
||||
} else if (cNode.halfCheck === true) {
|
||||
tmp = 1;
|
||||
} else if (cNode[checkedKey] ) {
|
||||
tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
|
||||
} else {
|
||||
tmp = (cNode.check_Child_State > 0) ? 1 : 0;
|
||||
}
|
||||
if (tmp === 1) {
|
||||
chkFlag = 1; break;
|
||||
} else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
|
||||
chkFlag = 1; break;
|
||||
} else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
|
||||
chkFlag = 1; break;
|
||||
} else if (tmp > -1) {
|
||||
chkFlag = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
node.check_Child_State = chkFlag;
|
||||
}
|
||||
},
|
||||
//method of event proxy
|
||||
_event = {
|
||||
|
||||
},
|
||||
//method of event handler
|
||||
_handler = {
|
||||
onCheckNode: function (event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkedKey = setting.data.key.checked;
|
||||
if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
|
||||
node[checkedKey] = !node[checkedKey];
|
||||
view.checkNodeRelation(setting, node);
|
||||
var checkObj = $$(node, consts.id.CHECK, setting);
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(setting, node);
|
||||
setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
|
||||
return true;
|
||||
},
|
||||
onMouseoverCheck: function(event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
node.check_Focus = true;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
return true;
|
||||
},
|
||||
onMouseoutCheck: function(event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
node.check_Focus = false;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
return true;
|
||||
}
|
||||
},
|
||||
//method of tools for zTree
|
||||
_tools = {
|
||||
|
||||
},
|
||||
//method of operate ztree dom
|
||||
_view = {
|
||||
checkNodeRelation: function(setting, node) {
|
||||
var pNode, i, l,
|
||||
childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
r = consts.radio;
|
||||
if (setting.check.chkStyle == r.STYLE) {
|
||||
var checkedList = data.getRadioCheckedList(setting);
|
||||
if (node[checkedKey]) {
|
||||
if (setting.check.radioType == r.TYPE_ALL) {
|
||||
for (i = checkedList.length-1; i >= 0; i--) {
|
||||
pNode = checkedList[i];
|
||||
if (pNode[checkedKey] && pNode != node) {
|
||||
pNode[checkedKey] = false;
|
||||
checkedList.splice(i, 1);
|
||||
|
||||
view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
|
||||
if (pNode.parentTId != node.parentTId) {
|
||||
view.repairParentChkClassWithSelf(setting, pNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
checkedList.push(node);
|
||||
} else {
|
||||
var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
|
||||
for (i = 0, l = parentNode[childKey].length; i < l; i++) {
|
||||
pNode = parentNode[childKey][i];
|
||||
if (pNode[checkedKey] && pNode != node) {
|
||||
pNode[checkedKey] = false;
|
||||
view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (setting.check.radioType == r.TYPE_ALL) {
|
||||
for (i = 0, l = checkedList.length; i < l; i++) {
|
||||
if (node == checkedList[i]) {
|
||||
checkedList.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
|
||||
view.setSonNodeCheckBox(setting, node, true);
|
||||
}
|
||||
if (!node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
|
||||
view.setSonNodeCheckBox(setting, node, false);
|
||||
}
|
||||
if (node[checkedKey] && setting.check.chkboxType.Y.indexOf("p") > -1) {
|
||||
view.setParentNodeCheckBox(setting, node, true);
|
||||
}
|
||||
if (!node[checkedKey] && setting.check.chkboxType.N.indexOf("p") > -1) {
|
||||
view.setParentNodeCheckBox(setting, node, false);
|
||||
}
|
||||
}
|
||||
},
|
||||
makeChkClass: function(setting, node) {
|
||||
var checkedKey = setting.data.key.checked,
|
||||
c = consts.checkbox, r = consts.radio,
|
||||
fullStyle = "";
|
||||
if (node.chkDisabled === true) {
|
||||
fullStyle = c.DISABLED;
|
||||
} else if (node.halfCheck) {
|
||||
fullStyle = c.PART;
|
||||
} else if (setting.check.chkStyle == r.STYLE) {
|
||||
fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
|
||||
} else {
|
||||
fullStyle = node[checkedKey] ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL:c.PART) : ((node.check_Child_State < 1)? c.FULL:c.PART);
|
||||
}
|
||||
var chkName = setting.check.chkStyle + "_" + (node[checkedKey] ? c.TRUE : c.FALSE) + "_" + fullStyle;
|
||||
chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
|
||||
return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
|
||||
},
|
||||
repairAllChk: function(setting, checked) {
|
||||
if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
|
||||
var checkedKey = setting.data.key.checked,
|
||||
childKey = setting.data.key.children,
|
||||
root = data.getRoot(setting);
|
||||
for (var i = 0, l = root[childKey].length; i<l ; i++) {
|
||||
var node = root[childKey][i];
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = checked;
|
||||
}
|
||||
view.setSonNodeCheckBox(setting, node, checked);
|
||||
}
|
||||
}
|
||||
},
|
||||
repairChkClass: function(setting, node) {
|
||||
if (!node) return;
|
||||
data.makeChkFlag(setting, node);
|
||||
if (node.nocheck !== true) {
|
||||
var checkObj = $$(node, consts.id.CHECK, setting);
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
}
|
||||
},
|
||||
repairParentChkClass: function(setting, node) {
|
||||
if (!node || !node.parentTId) return;
|
||||
var pNode = node.getParentNode();
|
||||
view.repairChkClass(setting, pNode);
|
||||
view.repairParentChkClass(setting, pNode);
|
||||
},
|
||||
repairParentChkClassWithSelf: function(setting, node) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children;
|
||||
if (node[childKey] && node[childKey].length > 0) {
|
||||
view.repairParentChkClass(setting, node[childKey][0]);
|
||||
} else {
|
||||
view.repairParentChkClass(setting, node);
|
||||
}
|
||||
},
|
||||
repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children;
|
||||
if (node.chkDisabled != chkDisabled) {
|
||||
node.chkDisabled = chkDisabled;
|
||||
}
|
||||
view.repairChkClass(setting, node);
|
||||
if (node[childKey] && inherit) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var sNode = node[childKey][i];
|
||||
view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
|
||||
}
|
||||
}
|
||||
},
|
||||
repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
|
||||
if (!node) return;
|
||||
if (node.chkDisabled != chkDisabled && inherit) {
|
||||
node.chkDisabled = chkDisabled;
|
||||
}
|
||||
view.repairChkClass(setting, node);
|
||||
view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
|
||||
},
|
||||
setChkClass: function(setting, obj, node) {
|
||||
if (!obj) return;
|
||||
if (node.nocheck === true) {
|
||||
obj.hide();
|
||||
} else {
|
||||
obj.show();
|
||||
}
|
||||
obj.attr('class', view.makeChkClass(setting, node));
|
||||
},
|
||||
setParentNodeCheckBox: function(setting, node, value, srcNode) {
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
if (!srcNode) srcNode = node;
|
||||
data.makeChkFlag(setting, node);
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = value;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
if (setting.check.autoCheckTrigger && node != srcNode) {
|
||||
setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
if (node.parentTId) {
|
||||
var pSign = true;
|
||||
if (!value) {
|
||||
var pNodes = node.getParentNode()[childKey];
|
||||
for (var i = 0, l = pNodes.length; i < l; i++) {
|
||||
if ((pNodes[i].nocheck !== true && pNodes[i].chkDisabled !== true && pNodes[i][checkedKey])
|
||||
|| ((pNodes[i].nocheck === true || pNodes[i].chkDisabled === true) && pNodes[i].check_Child_State > 0)) {
|
||||
pSign = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pSign) {
|
||||
view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
|
||||
}
|
||||
}
|
||||
},
|
||||
setSonNodeCheckBox: function(setting, node, value, srcNode) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
if (!srcNode) srcNode = node;
|
||||
|
||||
var hasDisable = false;
|
||||
if (node[childKey]) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var sNode = node[childKey][i];
|
||||
view.setSonNodeCheckBox(setting, sNode, value, srcNode);
|
||||
if (sNode.chkDisabled === true) hasDisable = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (node != data.getRoot(setting) && node.chkDisabled !== true) {
|
||||
if (hasDisable && node.nocheck !== true) {
|
||||
data.makeChkFlag(setting, node);
|
||||
}
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = value;
|
||||
if (!hasDisable) node.check_Child_State = (node[childKey] && node[childKey].length > 0) ? (value ? 2 : 0) : -1;
|
||||
} else {
|
||||
node.check_Child_State = -1;
|
||||
}
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
|
||||
setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
_z = {
|
||||
tools: _tools,
|
||||
view: _view,
|
||||
event: _event,
|
||||
data: _data
|
||||
};
|
||||
$.extend(true, $.fn.zTree.consts, _consts);
|
||||
$.extend(true, $.fn.zTree._z, _z);
|
||||
|
||||
var zt = $.fn.zTree,
|
||||
tools = zt._z.tools,
|
||||
consts = zt.consts,
|
||||
view = zt._z.view,
|
||||
data = zt._z.data,
|
||||
event = zt._z.event,
|
||||
$$ = tools.$;
|
||||
|
||||
data.exSetting(_setting);
|
||||
data.addInitBind(_bindEvent);
|
||||
data.addInitUnBind(_unbindEvent);
|
||||
data.addInitCache(_initCache);
|
||||
data.addInitNode(_initNode);
|
||||
data.addInitProxy(_eventProxy, true);
|
||||
data.addInitRoot(_initRoot);
|
||||
data.addBeforeA(_beforeA);
|
||||
data.addZTreeTools(_zTreeTools);
|
||||
|
||||
var _createNodes = view.createNodes;
|
||||
view.createNodes = function(setting, level, nodes, parentNode, index) {
|
||||
if (_createNodes) _createNodes.apply(view, arguments);
|
||||
if (!nodes) return;
|
||||
view.repairParentChkClassWithSelf(setting, parentNode);
|
||||
}
|
||||
var _removeNode = view.removeNode;
|
||||
view.removeNode = function(setting, node) {
|
||||
var parentNode = node.getParentNode();
|
||||
if (_removeNode) _removeNode.apply(view, arguments);
|
||||
if (!node || !parentNode) return;
|
||||
view.repairChkClass(setting, parentNode);
|
||||
view.repairParentChkClass(setting, parentNode);
|
||||
}
|
||||
|
||||
var _appendNodes = view.appendNodes;
|
||||
view.appendNodes = function(setting, level, nodes, parentNode, index, initFlag, openFlag) {
|
||||
var html = "";
|
||||
if (_appendNodes) {
|
||||
html = _appendNodes.apply(view, arguments);
|
||||
}
|
||||
if (parentNode) {
|
||||
data.makeChkFlag(setting, parentNode);
|
||||
}
|
||||
return html;
|
||||
}
|
||||
})(jQuery);
|
||||
@@ -1,378 +0,0 @@
|
||||
/*-------------------------------------
|
||||
zTree Style
|
||||
|
||||
version: 3.4
|
||||
author: Hunter.z
|
||||
email: hunter.z@263.net
|
||||
website: http://code.google.com/p/jquerytree/
|
||||
|
||||
-------------------------------------*/
|
||||
.ztree * {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif
|
||||
}
|
||||
|
||||
.ztree {
|
||||
margin: 0;
|
||||
padding: 5px;
|
||||
color: #333
|
||||
}
|
||||
|
||||
.ztree li {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
line-height: 17px;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
outline: 0
|
||||
}
|
||||
|
||||
.ztree li ul {
|
||||
margin: 0;
|
||||
padding: 0 0 0 18px
|
||||
}
|
||||
|
||||
.ztree li ul.line {
|
||||
background: url(./img/line_conn.png) 0 0 repeat-y;
|
||||
}
|
||||
|
||||
.ztree li a {
|
||||
padding-right: 3px;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
height: 21px;
|
||||
color: #333;
|
||||
background-color: transparent;
|
||||
text-decoration: none;
|
||||
vertical-align: top;
|
||||
display: inline-block
|
||||
}
|
||||
|
||||
.ztree li a:hover {
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
.ztree li a.curSelectedNode {
|
||||
padding-top: 0px;
|
||||
background-color: #e5e5e5;
|
||||
color: black;
|
||||
height: 21px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.ztree li a.curSelectedNode_Edit {
|
||||
padding-top: 0px;
|
||||
background-color: #e5e5e5;
|
||||
color: black;
|
||||
height: 21px;
|
||||
border: 1px #666 solid;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.ztree li a.tmpTargetNode_inner {
|
||||
padding-top: 0px;
|
||||
background-color: #aaa;
|
||||
color: white;
|
||||
height: 21px;
|
||||
border: 1px #666 solid;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.ztree li a.tmpTargetNode_prev {}
|
||||
|
||||
.ztree li a.tmpTargetNode_next {}
|
||||
|
||||
.ztree li a input.rename {
|
||||
height: 14px;
|
||||
width: 80px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 12px;
|
||||
border: 1px #585956 solid;
|
||||
*border: 0px
|
||||
}
|
||||
|
||||
.ztree li span {
|
||||
line-height: 21px;
|
||||
margin-right: 2px
|
||||
}
|
||||
|
||||
.ztree li span.button {
|
||||
line-height: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 21px;
|
||||
height: 21px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
border: 0 none;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
background-color: transparent;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
background-image: url("./img/bootstrap.png");
|
||||
}
|
||||
|
||||
.ztree li span.button.chk {
|
||||
width: 13px;
|
||||
height: 13px;
|
||||
margin: 0 2px;
|
||||
cursor: auto
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_full {
|
||||
background-position: -5px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_full_focus {
|
||||
background-position: -5px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_part {
|
||||
background-position: -5px -48px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_part_focus {
|
||||
background-position: -5px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_disable {
|
||||
background-position: -5px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_full {
|
||||
background-position: -26px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_full_focus {
|
||||
background-position: -26px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_part {
|
||||
background-position: -26px -48px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_part_focus {
|
||||
background-position: -26px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_disable {
|
||||
background-position: -26px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_full {
|
||||
background-position: -47px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_full_focus {
|
||||
background-position: -47px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_part {
|
||||
background-position: -47px -47px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_part_focus {
|
||||
background-position: -47px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_disable {
|
||||
background-position: -47px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_full {
|
||||
background-position: -68px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_full_focus {
|
||||
background-position: -68px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_part {
|
||||
background-position: -68px -47px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_part_focus {
|
||||
background-position: -68px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_disable {
|
||||
background-position: -68px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.switch {
|
||||
width: 21px;
|
||||
height: 21px
|
||||
}
|
||||
|
||||
.ztree li span.button.root_open {
|
||||
background-position: -105px -63px
|
||||
}
|
||||
|
||||
.ztree li span.button.root_close {
|
||||
background-position: -126px -63px
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_open {
|
||||
background-position: -105px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_close {
|
||||
background-position: -126px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_open {
|
||||
background-position: -105px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_close {
|
||||
background-position: -126px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_open {
|
||||
background-position: -105px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_close {
|
||||
background-position: -126px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_open {
|
||||
background-position: -105px -84px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_close {
|
||||
background-position: -126px -84px;
|
||||
}
|
||||
|
||||
.ztree li span.button.root_docu {
|
||||
background-position: -105px -63px;
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_docu {
|
||||
background-position: -84px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_docu {
|
||||
background-position: -84px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_docu {
|
||||
background-position: -84px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_docu {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_open {
|
||||
margin-right: 2px;
|
||||
background-position: -147px -21px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_close {
|
||||
margin-right: 2px;
|
||||
margin-right: 2px;
|
||||
background-position: -147px 0;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_docu {
|
||||
margin-right: 2px;
|
||||
background-position: -147px -43px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.edit {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px -21px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.edit:hover {
|
||||
background-position: -168px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.remove {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px -42px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.remove:hover {
|
||||
background-position: -168px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.add {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px 0;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.add:hover {
|
||||
background-position: -168px 0;
|
||||
}
|
||||
|
||||
ul.tmpTargetzTree {
|
||||
background-color: #FFE6B0;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
span.tmpzTreeMove_arrow {
|
||||
width: 16px;
|
||||
height: 21px;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 2px 0 0 1px;
|
||||
border: 0 none;
|
||||
position: absolute;
|
||||
background-color: transparent;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
background-position: -168px -84px;
|
||||
background-image: url("./img/bootstrap.png");
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
span.tmpzTreeMove_prev {
|
||||
background: red;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ul.ztree.zTreeDragUL {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: hidden;
|
||||
background-color: #cfcfcf;
|
||||
border: 1px #00B83F dotted;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.ztreeMask {
|
||||
z-index: 10000;
|
||||
background-color: #cfcfcf;
|
||||
opacity: 0.0;
|
||||
filter: alpha(opacity=0);
|
||||
position: absolute
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
.ztree li span.button {background-image:url("./img/bootstrap3.png");}
|
||||
span.tmpzTreeMove_arrow {background-image:url("./img/bootstrap3.png");}
|
||||
|
||||
|
Before Width: | Height: | Size: 542 KiB |
|
Before Width: | Height: | Size: 186 KiB |
@@ -1 +0,0 @@
|
||||
import"./main-CNRNr9ff.js";
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1 +0,0 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="UTF-8"><link rel="icon" type="image/svg+xml" href="../../favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1"><title>用户中心</title><link rel="stylesheet" href="./libs/ztree/zTreeStyle.css"><script src="./libs/jquery.min.js"></script><script src="./libs/lodash.min.js"></script><script src="./libs/ztree/jquery.ztree.all.min.js"></script><script src="https://base.bestsch.com/BschHome/base/js/bschload.min.js?v=2025011001"></script><script src="./js/userType.js?type=teacher"></script><script type="module" crossorigin src="./static/js/main-DQzyo1z-.js"></script><link rel="stylesheet" crossorigin href="./static/css/main-CDdhe5_3.css"></head><body><div id="app"></div></body></html>
|
||||
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 933 B |
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,628 +0,0 @@
|
||||
/*
|
||||
* JQuery zTree excheck v3.5.28
|
||||
* http://treejs.cn/
|
||||
*
|
||||
* Copyright (c) 2010 Hunter.z
|
||||
*
|
||||
* Licensed same as jquery - MIT License
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* email: hunter.z@263.net
|
||||
* Date: 2017-01-20
|
||||
*/
|
||||
(function($){
|
||||
//default consts of excheck
|
||||
var _consts = {
|
||||
event: {
|
||||
CHECK: "ztree_check"
|
||||
},
|
||||
id: {
|
||||
CHECK: "_check"
|
||||
},
|
||||
checkbox: {
|
||||
STYLE: "checkbox",
|
||||
DEFAULT: "chk",
|
||||
DISABLED: "disable",
|
||||
FALSE: "false",
|
||||
TRUE: "true",
|
||||
FULL: "full",
|
||||
PART: "part",
|
||||
FOCUS: "focus"
|
||||
},
|
||||
radio: {
|
||||
STYLE: "radio",
|
||||
TYPE_ALL: "all",
|
||||
TYPE_LEVEL: "level"
|
||||
}
|
||||
},
|
||||
//default setting of excheck
|
||||
_setting = {
|
||||
check: {
|
||||
enable: false,
|
||||
autoCheckTrigger: false,
|
||||
chkStyle: _consts.checkbox.STYLE,
|
||||
nocheckInherit: false,
|
||||
chkDisabledInherit: false,
|
||||
radioType: _consts.radio.TYPE_LEVEL,
|
||||
chkboxType: {
|
||||
"Y": "ps",
|
||||
"N": "ps"
|
||||
}
|
||||
},
|
||||
data: {
|
||||
key: {
|
||||
checked: "checked"
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
beforeCheck:null,
|
||||
onCheck:null
|
||||
}
|
||||
},
|
||||
//default root of excheck
|
||||
_initRoot = function (setting) {
|
||||
var r = data.getRoot(setting);
|
||||
r.radioCheckedList = [];
|
||||
},
|
||||
//default cache of excheck
|
||||
_initCache = function(treeId) {},
|
||||
//default bind event of excheck
|
||||
_bindEvent = function(setting) {
|
||||
var o = setting.treeObj,
|
||||
c = consts.event;
|
||||
o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
|
||||
event.srcEvent = srcEvent;
|
||||
tools.apply(setting.callback.onCheck, [event, treeId, node]);
|
||||
});
|
||||
},
|
||||
_unbindEvent = function(setting) {
|
||||
var o = setting.treeObj,
|
||||
c = consts.event;
|
||||
o.unbind(c.CHECK);
|
||||
},
|
||||
//default event proxy of excheck
|
||||
_eventProxy = function(e) {
|
||||
var target = e.target,
|
||||
setting = data.getSetting(e.data.treeId),
|
||||
tId = "", node = null,
|
||||
nodeEventType = "", treeEventType = "",
|
||||
nodeEventCallback = null, treeEventCallback = null;
|
||||
|
||||
if (tools.eqs(e.type, "mouseover")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "mouseoverCheck";
|
||||
}
|
||||
} else if (tools.eqs(e.type, "mouseout")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "mouseoutCheck";
|
||||
}
|
||||
} else if (tools.eqs(e.type, "click")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "checkNode";
|
||||
}
|
||||
}
|
||||
if (tId.length>0) {
|
||||
node = data.getNodeCache(setting, tId);
|
||||
switch (nodeEventType) {
|
||||
case "checkNode" :
|
||||
nodeEventCallback = _handler.onCheckNode;
|
||||
break;
|
||||
case "mouseoverCheck" :
|
||||
nodeEventCallback = _handler.onMouseoverCheck;
|
||||
break;
|
||||
case "mouseoutCheck" :
|
||||
nodeEventCallback = _handler.onMouseoutCheck;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var proxyResult = {
|
||||
stop: nodeEventType === "checkNode",
|
||||
node: node,
|
||||
nodeEventType: nodeEventType,
|
||||
nodeEventCallback: nodeEventCallback,
|
||||
treeEventType: treeEventType,
|
||||
treeEventCallback: treeEventCallback
|
||||
};
|
||||
return proxyResult
|
||||
},
|
||||
//default init node of excheck
|
||||
_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
|
||||
if (!n) return;
|
||||
var checkedKey = setting.data.key.checked;
|
||||
if (typeof n[checkedKey] == "string") n[checkedKey] = tools.eqs(n[checkedKey], "true");
|
||||
n[checkedKey] = !!n[checkedKey];
|
||||
n.checkedOld = n[checkedKey];
|
||||
if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
|
||||
n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
|
||||
if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
|
||||
n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
|
||||
if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
|
||||
n.halfCheck = !!n.halfCheck;
|
||||
n.check_Child_State = -1;
|
||||
n.check_Focus = false;
|
||||
n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
|
||||
|
||||
if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && n[checkedKey] ) {
|
||||
var r = data.getRoot(setting);
|
||||
r.radioCheckedList.push(n);
|
||||
}
|
||||
},
|
||||
//add dom for check
|
||||
_beforeA = function(setting, node, html) {
|
||||
var checkedKey = setting.data.key.checked;
|
||||
if (setting.check.enable) {
|
||||
data.makeChkFlag(setting, node);
|
||||
html.push("<span ID='", node.tId, consts.id.CHECK, "' class='", view.makeChkClass(setting, node), "' treeNode", consts.id.CHECK, (node.nocheck === true?" style='display:none;'":""),"></span>");
|
||||
}
|
||||
},
|
||||
//update zTreeObj, add method of check
|
||||
_zTreeTools = function(setting, zTreeTools) {
|
||||
zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
|
||||
var checkedKey = this.setting.data.key.checked;
|
||||
if (node.chkDisabled === true) return;
|
||||
if (checked !== true && checked !== false) {
|
||||
checked = !node[checkedKey];
|
||||
}
|
||||
callbackFlag = !!callbackFlag;
|
||||
|
||||
if (node[checkedKey] === checked && !checkTypeFlag) {
|
||||
return;
|
||||
} else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
|
||||
return;
|
||||
}
|
||||
if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
|
||||
node[checkedKey] = checked;
|
||||
var checkObj = $$(node, consts.id.CHECK, this.setting);
|
||||
if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
|
||||
view.setChkClass(this.setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(this.setting, node);
|
||||
if (callbackFlag) {
|
||||
this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
zTreeTools.checkAllNodes = function(checked) {
|
||||
view.repairAllChk(this.setting, !!checked);
|
||||
}
|
||||
|
||||
zTreeTools.getCheckedNodes = function(checked) {
|
||||
var childKey = this.setting.data.key.children;
|
||||
checked = (checked !== false);
|
||||
return data.getTreeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey], checked);
|
||||
}
|
||||
|
||||
zTreeTools.getChangeCheckedNodes = function() {
|
||||
var childKey = this.setting.data.key.children;
|
||||
return data.getTreeChangeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey]);
|
||||
}
|
||||
|
||||
zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
|
||||
disabled = !!disabled;
|
||||
inheritParent = !!inheritParent;
|
||||
inheritChildren = !!inheritChildren;
|
||||
view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
|
||||
view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
|
||||
}
|
||||
|
||||
var _updateNode = zTreeTools.updateNode;
|
||||
zTreeTools.updateNode = function(node, checkTypeFlag) {
|
||||
if (_updateNode) _updateNode.apply(zTreeTools, arguments);
|
||||
if (!node || !this.setting.check.enable) return;
|
||||
var nObj = $$(node, this.setting);
|
||||
if (nObj.get(0) && tools.uCanDo(this.setting)) {
|
||||
var checkObj = $$(node, consts.id.CHECK, this.setting);
|
||||
if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
|
||||
view.setChkClass(this.setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(this.setting, node);
|
||||
}
|
||||
}
|
||||
},
|
||||
//method of operate data
|
||||
_data = {
|
||||
getRadioCheckedList: function(setting) {
|
||||
var checkedList = data.getRoot(setting).radioCheckedList;
|
||||
for (var i=0, j=checkedList.length; i<j; i++) {
|
||||
if(!data.getNodeCache(setting, checkedList[i].tId)) {
|
||||
checkedList.splice(i, 1);
|
||||
i--; j--;
|
||||
}
|
||||
}
|
||||
return checkedList;
|
||||
},
|
||||
getCheckStatus: function(setting, node) {
|
||||
if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
|
||||
var checkedKey = setting.data.key.checked,
|
||||
r = {
|
||||
checked: node[checkedKey],
|
||||
half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (node[checkedKey] ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
|
||||
};
|
||||
return r;
|
||||
},
|
||||
getTreeCheckedNodes: function(setting, nodes, checked, results) {
|
||||
if (!nodes) return [];
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
|
||||
results = !results ? [] : results;
|
||||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||||
if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] == checked) {
|
||||
results.push(nodes[i]);
|
||||
if(onlyOne) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
data.getTreeCheckedNodes(setting, nodes[i][childKey], checked, results);
|
||||
if(onlyOne && results.length > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return results;
|
||||
},
|
||||
getTreeChangeCheckedNodes: function(setting, nodes, results) {
|
||||
if (!nodes) return [];
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked;
|
||||
results = !results ? [] : results;
|
||||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||||
if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] != nodes[i].checkedOld) {
|
||||
results.push(nodes[i]);
|
||||
}
|
||||
data.getTreeChangeCheckedNodes(setting, nodes[i][childKey], results);
|
||||
}
|
||||
return results;
|
||||
},
|
||||
makeChkFlag: function(setting, node) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
chkFlag = -1;
|
||||
if (node[childKey]) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var cNode = node[childKey][i];
|
||||
var tmp = -1;
|
||||
if (setting.check.chkStyle == consts.radio.STYLE) {
|
||||
if (cNode.nocheck === true || cNode.chkDisabled === true) {
|
||||
tmp = cNode.check_Child_State;
|
||||
} else if (cNode.halfCheck === true) {
|
||||
tmp = 2;
|
||||
} else if (cNode[checkedKey]) {
|
||||
tmp = 2;
|
||||
} else {
|
||||
tmp = cNode.check_Child_State > 0 ? 2:0;
|
||||
}
|
||||
if (tmp == 2) {
|
||||
chkFlag = 2; break;
|
||||
} else if (tmp == 0){
|
||||
chkFlag = 0;
|
||||
}
|
||||
} else if (setting.check.chkStyle == consts.checkbox.STYLE) {
|
||||
if (cNode.nocheck === true || cNode.chkDisabled === true) {
|
||||
tmp = cNode.check_Child_State;
|
||||
} else if (cNode.halfCheck === true) {
|
||||
tmp = 1;
|
||||
} else if (cNode[checkedKey] ) {
|
||||
tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
|
||||
} else {
|
||||
tmp = (cNode.check_Child_State > 0) ? 1 : 0;
|
||||
}
|
||||
if (tmp === 1) {
|
||||
chkFlag = 1; break;
|
||||
} else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
|
||||
chkFlag = 1; break;
|
||||
} else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
|
||||
chkFlag = 1; break;
|
||||
} else if (tmp > -1) {
|
||||
chkFlag = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
node.check_Child_State = chkFlag;
|
||||
}
|
||||
},
|
||||
//method of event proxy
|
||||
_event = {
|
||||
|
||||
},
|
||||
//method of event handler
|
||||
_handler = {
|
||||
onCheckNode: function (event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkedKey = setting.data.key.checked;
|
||||
if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
|
||||
node[checkedKey] = !node[checkedKey];
|
||||
view.checkNodeRelation(setting, node);
|
||||
var checkObj = $$(node, consts.id.CHECK, setting);
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(setting, node);
|
||||
setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
|
||||
return true;
|
||||
},
|
||||
onMouseoverCheck: function(event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
node.check_Focus = true;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
return true;
|
||||
},
|
||||
onMouseoutCheck: function(event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
node.check_Focus = false;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
return true;
|
||||
}
|
||||
},
|
||||
//method of tools for zTree
|
||||
_tools = {
|
||||
|
||||
},
|
||||
//method of operate ztree dom
|
||||
_view = {
|
||||
checkNodeRelation: function(setting, node) {
|
||||
var pNode, i, l,
|
||||
childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
r = consts.radio;
|
||||
if (setting.check.chkStyle == r.STYLE) {
|
||||
var checkedList = data.getRadioCheckedList(setting);
|
||||
if (node[checkedKey]) {
|
||||
if (setting.check.radioType == r.TYPE_ALL) {
|
||||
for (i = checkedList.length-1; i >= 0; i--) {
|
||||
pNode = checkedList[i];
|
||||
if (pNode[checkedKey] && pNode != node) {
|
||||
pNode[checkedKey] = false;
|
||||
checkedList.splice(i, 1);
|
||||
|
||||
view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
|
||||
if (pNode.parentTId != node.parentTId) {
|
||||
view.repairParentChkClassWithSelf(setting, pNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
checkedList.push(node);
|
||||
} else {
|
||||
var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
|
||||
for (i = 0, l = parentNode[childKey].length; i < l; i++) {
|
||||
pNode = parentNode[childKey][i];
|
||||
if (pNode[checkedKey] && pNode != node) {
|
||||
pNode[checkedKey] = false;
|
||||
view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (setting.check.radioType == r.TYPE_ALL) {
|
||||
for (i = 0, l = checkedList.length; i < l; i++) {
|
||||
if (node == checkedList[i]) {
|
||||
checkedList.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
|
||||
view.setSonNodeCheckBox(setting, node, true);
|
||||
}
|
||||
if (!node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
|
||||
view.setSonNodeCheckBox(setting, node, false);
|
||||
}
|
||||
if (node[checkedKey] && setting.check.chkboxType.Y.indexOf("p") > -1) {
|
||||
view.setParentNodeCheckBox(setting, node, true);
|
||||
}
|
||||
if (!node[checkedKey] && setting.check.chkboxType.N.indexOf("p") > -1) {
|
||||
view.setParentNodeCheckBox(setting, node, false);
|
||||
}
|
||||
}
|
||||
},
|
||||
makeChkClass: function(setting, node) {
|
||||
var checkedKey = setting.data.key.checked,
|
||||
c = consts.checkbox, r = consts.radio,
|
||||
fullStyle = "";
|
||||
if (node.chkDisabled === true) {
|
||||
fullStyle = c.DISABLED;
|
||||
} else if (node.halfCheck) {
|
||||
fullStyle = c.PART;
|
||||
} else if (setting.check.chkStyle == r.STYLE) {
|
||||
fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
|
||||
} else {
|
||||
fullStyle = node[checkedKey] ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL:c.PART) : ((node.check_Child_State < 1)? c.FULL:c.PART);
|
||||
}
|
||||
var chkName = setting.check.chkStyle + "_" + (node[checkedKey] ? c.TRUE : c.FALSE) + "_" + fullStyle;
|
||||
chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
|
||||
return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
|
||||
},
|
||||
repairAllChk: function(setting, checked) {
|
||||
if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
|
||||
var checkedKey = setting.data.key.checked,
|
||||
childKey = setting.data.key.children,
|
||||
root = data.getRoot(setting);
|
||||
for (var i = 0, l = root[childKey].length; i<l ; i++) {
|
||||
var node = root[childKey][i];
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = checked;
|
||||
}
|
||||
view.setSonNodeCheckBox(setting, node, checked);
|
||||
}
|
||||
}
|
||||
},
|
||||
repairChkClass: function(setting, node) {
|
||||
if (!node) return;
|
||||
data.makeChkFlag(setting, node);
|
||||
if (node.nocheck !== true) {
|
||||
var checkObj = $$(node, consts.id.CHECK, setting);
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
}
|
||||
},
|
||||
repairParentChkClass: function(setting, node) {
|
||||
if (!node || !node.parentTId) return;
|
||||
var pNode = node.getParentNode();
|
||||
view.repairChkClass(setting, pNode);
|
||||
view.repairParentChkClass(setting, pNode);
|
||||
},
|
||||
repairParentChkClassWithSelf: function(setting, node) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children;
|
||||
if (node[childKey] && node[childKey].length > 0) {
|
||||
view.repairParentChkClass(setting, node[childKey][0]);
|
||||
} else {
|
||||
view.repairParentChkClass(setting, node);
|
||||
}
|
||||
},
|
||||
repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children;
|
||||
if (node.chkDisabled != chkDisabled) {
|
||||
node.chkDisabled = chkDisabled;
|
||||
}
|
||||
view.repairChkClass(setting, node);
|
||||
if (node[childKey] && inherit) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var sNode = node[childKey][i];
|
||||
view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
|
||||
}
|
||||
}
|
||||
},
|
||||
repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
|
||||
if (!node) return;
|
||||
if (node.chkDisabled != chkDisabled && inherit) {
|
||||
node.chkDisabled = chkDisabled;
|
||||
}
|
||||
view.repairChkClass(setting, node);
|
||||
view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
|
||||
},
|
||||
setChkClass: function(setting, obj, node) {
|
||||
if (!obj) return;
|
||||
if (node.nocheck === true) {
|
||||
obj.hide();
|
||||
} else {
|
||||
obj.show();
|
||||
}
|
||||
obj.attr('class', view.makeChkClass(setting, node));
|
||||
},
|
||||
setParentNodeCheckBox: function(setting, node, value, srcNode) {
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
if (!srcNode) srcNode = node;
|
||||
data.makeChkFlag(setting, node);
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = value;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
if (setting.check.autoCheckTrigger && node != srcNode) {
|
||||
setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
if (node.parentTId) {
|
||||
var pSign = true;
|
||||
if (!value) {
|
||||
var pNodes = node.getParentNode()[childKey];
|
||||
for (var i = 0, l = pNodes.length; i < l; i++) {
|
||||
if ((pNodes[i].nocheck !== true && pNodes[i].chkDisabled !== true && pNodes[i][checkedKey])
|
||||
|| ((pNodes[i].nocheck === true || pNodes[i].chkDisabled === true) && pNodes[i].check_Child_State > 0)) {
|
||||
pSign = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pSign) {
|
||||
view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
|
||||
}
|
||||
}
|
||||
},
|
||||
setSonNodeCheckBox: function(setting, node, value, srcNode) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
if (!srcNode) srcNode = node;
|
||||
|
||||
var hasDisable = false;
|
||||
if (node[childKey]) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var sNode = node[childKey][i];
|
||||
view.setSonNodeCheckBox(setting, sNode, value, srcNode);
|
||||
if (sNode.chkDisabled === true) hasDisable = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (node != data.getRoot(setting) && node.chkDisabled !== true) {
|
||||
if (hasDisable && node.nocheck !== true) {
|
||||
data.makeChkFlag(setting, node);
|
||||
}
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = value;
|
||||
if (!hasDisable) node.check_Child_State = (node[childKey] && node[childKey].length > 0) ? (value ? 2 : 0) : -1;
|
||||
} else {
|
||||
node.check_Child_State = -1;
|
||||
}
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
|
||||
setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
_z = {
|
||||
tools: _tools,
|
||||
view: _view,
|
||||
event: _event,
|
||||
data: _data
|
||||
};
|
||||
$.extend(true, $.fn.zTree.consts, _consts);
|
||||
$.extend(true, $.fn.zTree._z, _z);
|
||||
|
||||
var zt = $.fn.zTree,
|
||||
tools = zt._z.tools,
|
||||
consts = zt.consts,
|
||||
view = zt._z.view,
|
||||
data = zt._z.data,
|
||||
event = zt._z.event,
|
||||
$$ = tools.$;
|
||||
|
||||
data.exSetting(_setting);
|
||||
data.addInitBind(_bindEvent);
|
||||
data.addInitUnBind(_unbindEvent);
|
||||
data.addInitCache(_initCache);
|
||||
data.addInitNode(_initNode);
|
||||
data.addInitProxy(_eventProxy, true);
|
||||
data.addInitRoot(_initRoot);
|
||||
data.addBeforeA(_beforeA);
|
||||
data.addZTreeTools(_zTreeTools);
|
||||
|
||||
var _createNodes = view.createNodes;
|
||||
view.createNodes = function(setting, level, nodes, parentNode, index) {
|
||||
if (_createNodes) _createNodes.apply(view, arguments);
|
||||
if (!nodes) return;
|
||||
view.repairParentChkClassWithSelf(setting, parentNode);
|
||||
}
|
||||
var _removeNode = view.removeNode;
|
||||
view.removeNode = function(setting, node) {
|
||||
var parentNode = node.getParentNode();
|
||||
if (_removeNode) _removeNode.apply(view, arguments);
|
||||
if (!node || !parentNode) return;
|
||||
view.repairChkClass(setting, parentNode);
|
||||
view.repairParentChkClass(setting, parentNode);
|
||||
}
|
||||
|
||||
var _appendNodes = view.appendNodes;
|
||||
view.appendNodes = function(setting, level, nodes, parentNode, index, initFlag, openFlag) {
|
||||
var html = "";
|
||||
if (_appendNodes) {
|
||||
html = _appendNodes.apply(view, arguments);
|
||||
}
|
||||
if (parentNode) {
|
||||
data.makeChkFlag(setting, parentNode);
|
||||
}
|
||||
return html;
|
||||
}
|
||||
})(jQuery);
|
||||
@@ -1,378 +0,0 @@
|
||||
/*-------------------------------------
|
||||
zTree Style
|
||||
|
||||
version: 3.4
|
||||
author: Hunter.z
|
||||
email: hunter.z@263.net
|
||||
website: http://code.google.com/p/jquerytree/
|
||||
|
||||
-------------------------------------*/
|
||||
.ztree * {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif
|
||||
}
|
||||
|
||||
.ztree {
|
||||
margin: 0;
|
||||
padding: 5px;
|
||||
color: #333
|
||||
}
|
||||
|
||||
.ztree li {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
line-height: 17px;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
outline: 0
|
||||
}
|
||||
|
||||
.ztree li ul {
|
||||
margin: 0;
|
||||
padding: 0 0 0 18px
|
||||
}
|
||||
|
||||
.ztree li ul.line {
|
||||
background: url(./img/line_conn.png) 0 0 repeat-y;
|
||||
}
|
||||
|
||||
.ztree li a {
|
||||
padding-right: 3px;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
height: 21px;
|
||||
color: #333;
|
||||
background-color: transparent;
|
||||
text-decoration: none;
|
||||
vertical-align: top;
|
||||
display: inline-block
|
||||
}
|
||||
|
||||
.ztree li a:hover {
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
.ztree li a.curSelectedNode {
|
||||
padding-top: 0px;
|
||||
background-color: #e5e5e5;
|
||||
color: black;
|
||||
height: 21px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.ztree li a.curSelectedNode_Edit {
|
||||
padding-top: 0px;
|
||||
background-color: #e5e5e5;
|
||||
color: black;
|
||||
height: 21px;
|
||||
border: 1px #666 solid;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.ztree li a.tmpTargetNode_inner {
|
||||
padding-top: 0px;
|
||||
background-color: #aaa;
|
||||
color: white;
|
||||
height: 21px;
|
||||
border: 1px #666 solid;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.ztree li a.tmpTargetNode_prev {}
|
||||
|
||||
.ztree li a.tmpTargetNode_next {}
|
||||
|
||||
.ztree li a input.rename {
|
||||
height: 14px;
|
||||
width: 80px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 12px;
|
||||
border: 1px #585956 solid;
|
||||
*border: 0px
|
||||
}
|
||||
|
||||
.ztree li span {
|
||||
line-height: 21px;
|
||||
margin-right: 2px
|
||||
}
|
||||
|
||||
.ztree li span.button {
|
||||
line-height: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 21px;
|
||||
height: 21px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
border: 0 none;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
background-color: transparent;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
background-image: url("./img/bootstrap.png");
|
||||
}
|
||||
|
||||
.ztree li span.button.chk {
|
||||
width: 13px;
|
||||
height: 13px;
|
||||
margin: 0 2px;
|
||||
cursor: auto
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_full {
|
||||
background-position: -5px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_full_focus {
|
||||
background-position: -5px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_part {
|
||||
background-position: -5px -48px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_part_focus {
|
||||
background-position: -5px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_disable {
|
||||
background-position: -5px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_full {
|
||||
background-position: -26px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_full_focus {
|
||||
background-position: -26px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_part {
|
||||
background-position: -26px -48px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_part_focus {
|
||||
background-position: -26px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_disable {
|
||||
background-position: -26px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_full {
|
||||
background-position: -47px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_full_focus {
|
||||
background-position: -47px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_part {
|
||||
background-position: -47px -47px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_part_focus {
|
||||
background-position: -47px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_disable {
|
||||
background-position: -47px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_full {
|
||||
background-position: -68px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_full_focus {
|
||||
background-position: -68px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_part {
|
||||
background-position: -68px -47px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_part_focus {
|
||||
background-position: -68px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_disable {
|
||||
background-position: -68px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.switch {
|
||||
width: 21px;
|
||||
height: 21px
|
||||
}
|
||||
|
||||
.ztree li span.button.root_open {
|
||||
background-position: -105px -63px
|
||||
}
|
||||
|
||||
.ztree li span.button.root_close {
|
||||
background-position: -126px -63px
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_open {
|
||||
background-position: -105px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_close {
|
||||
background-position: -126px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_open {
|
||||
background-position: -105px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_close {
|
||||
background-position: -126px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_open {
|
||||
background-position: -105px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_close {
|
||||
background-position: -126px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_open {
|
||||
background-position: -105px -84px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_close {
|
||||
background-position: -126px -84px;
|
||||
}
|
||||
|
||||
.ztree li span.button.root_docu {
|
||||
background-position: -105px -63px;
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_docu {
|
||||
background-position: -84px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_docu {
|
||||
background-position: -84px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_docu {
|
||||
background-position: -84px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_docu {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_open {
|
||||
margin-right: 2px;
|
||||
background-position: -147px -21px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_close {
|
||||
margin-right: 2px;
|
||||
margin-right: 2px;
|
||||
background-position: -147px 0;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_docu {
|
||||
margin-right: 2px;
|
||||
background-position: -147px -43px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.edit {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px -21px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.edit:hover {
|
||||
background-position: -168px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.remove {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px -42px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.remove:hover {
|
||||
background-position: -168px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.add {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px 0;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.add:hover {
|
||||
background-position: -168px 0;
|
||||
}
|
||||
|
||||
ul.tmpTargetzTree {
|
||||
background-color: #FFE6B0;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
span.tmpzTreeMove_arrow {
|
||||
width: 16px;
|
||||
height: 21px;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 2px 0 0 1px;
|
||||
border: 0 none;
|
||||
position: absolute;
|
||||
background-color: transparent;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
background-position: -168px -84px;
|
||||
background-image: url("./img/bootstrap.png");
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
span.tmpzTreeMove_prev {
|
||||
background: red;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ul.ztree.zTreeDragUL {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: hidden;
|
||||
background-color: #cfcfcf;
|
||||
border: 1px #00B83F dotted;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.ztreeMask {
|
||||
z-index: 10000;
|
||||
background-color: #cfcfcf;
|
||||
opacity: 0.0;
|
||||
filter: alpha(opacity=0);
|
||||
position: absolute
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
.ztree li span.button {background-image:url("./img/bootstrap3.png");}
|
||||
span.tmpzTreeMove_arrow {background-image:url("./img/bootstrap3.png");}
|
||||
|
||||
|
Before Width: | Height: | Size: 542 KiB |
|
Before Width: | Height: | Size: 186 KiB |
@@ -1 +0,0 @@
|
||||
import"./main-DQzyo1z-.js";
|
||||
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1 +0,0 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="UTF-8"><link rel="icon" type="image/svg+xml" href="../../favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1"><title>铃铛学习中心</title><link rel="stylesheet" href="./libs/ztree/zTreeStyle.css"><script src="./libs/jquery.min.js"></script><script src="./libs/lodash.min.js"></script><script src="./libs/ztree/jquery.ztree.all.min.js"></script><script src="https://base.bestsch.com/BschHome/base/js/bschload.min.js?v=2025011001"></script><script src="./js/userType.js?type=teacher"></script><script type="module" crossorigin src="./static/js/main-BQpkDb67.js"></script><link rel="stylesheet" crossorigin href="./static/css/main-QEPDMFdB.css"></head><body><div id="app"></div></body></html>
|
||||
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 933 B |
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,628 +0,0 @@
|
||||
/*
|
||||
* JQuery zTree excheck v3.5.28
|
||||
* http://treejs.cn/
|
||||
*
|
||||
* Copyright (c) 2010 Hunter.z
|
||||
*
|
||||
* Licensed same as jquery - MIT License
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* email: hunter.z@263.net
|
||||
* Date: 2017-01-20
|
||||
*/
|
||||
(function($){
|
||||
//default consts of excheck
|
||||
var _consts = {
|
||||
event: {
|
||||
CHECK: "ztree_check"
|
||||
},
|
||||
id: {
|
||||
CHECK: "_check"
|
||||
},
|
||||
checkbox: {
|
||||
STYLE: "checkbox",
|
||||
DEFAULT: "chk",
|
||||
DISABLED: "disable",
|
||||
FALSE: "false",
|
||||
TRUE: "true",
|
||||
FULL: "full",
|
||||
PART: "part",
|
||||
FOCUS: "focus"
|
||||
},
|
||||
radio: {
|
||||
STYLE: "radio",
|
||||
TYPE_ALL: "all",
|
||||
TYPE_LEVEL: "level"
|
||||
}
|
||||
},
|
||||
//default setting of excheck
|
||||
_setting = {
|
||||
check: {
|
||||
enable: false,
|
||||
autoCheckTrigger: false,
|
||||
chkStyle: _consts.checkbox.STYLE,
|
||||
nocheckInherit: false,
|
||||
chkDisabledInherit: false,
|
||||
radioType: _consts.radio.TYPE_LEVEL,
|
||||
chkboxType: {
|
||||
"Y": "ps",
|
||||
"N": "ps"
|
||||
}
|
||||
},
|
||||
data: {
|
||||
key: {
|
||||
checked: "checked"
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
beforeCheck:null,
|
||||
onCheck:null
|
||||
}
|
||||
},
|
||||
//default root of excheck
|
||||
_initRoot = function (setting) {
|
||||
var r = data.getRoot(setting);
|
||||
r.radioCheckedList = [];
|
||||
},
|
||||
//default cache of excheck
|
||||
_initCache = function(treeId) {},
|
||||
//default bind event of excheck
|
||||
_bindEvent = function(setting) {
|
||||
var o = setting.treeObj,
|
||||
c = consts.event;
|
||||
o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
|
||||
event.srcEvent = srcEvent;
|
||||
tools.apply(setting.callback.onCheck, [event, treeId, node]);
|
||||
});
|
||||
},
|
||||
_unbindEvent = function(setting) {
|
||||
var o = setting.treeObj,
|
||||
c = consts.event;
|
||||
o.unbind(c.CHECK);
|
||||
},
|
||||
//default event proxy of excheck
|
||||
_eventProxy = function(e) {
|
||||
var target = e.target,
|
||||
setting = data.getSetting(e.data.treeId),
|
||||
tId = "", node = null,
|
||||
nodeEventType = "", treeEventType = "",
|
||||
nodeEventCallback = null, treeEventCallback = null;
|
||||
|
||||
if (tools.eqs(e.type, "mouseover")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "mouseoverCheck";
|
||||
}
|
||||
} else if (tools.eqs(e.type, "mouseout")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "mouseoutCheck";
|
||||
}
|
||||
} else if (tools.eqs(e.type, "click")) {
|
||||
if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
|
||||
tId = tools.getNodeMainDom(target).id;
|
||||
nodeEventType = "checkNode";
|
||||
}
|
||||
}
|
||||
if (tId.length>0) {
|
||||
node = data.getNodeCache(setting, tId);
|
||||
switch (nodeEventType) {
|
||||
case "checkNode" :
|
||||
nodeEventCallback = _handler.onCheckNode;
|
||||
break;
|
||||
case "mouseoverCheck" :
|
||||
nodeEventCallback = _handler.onMouseoverCheck;
|
||||
break;
|
||||
case "mouseoutCheck" :
|
||||
nodeEventCallback = _handler.onMouseoutCheck;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var proxyResult = {
|
||||
stop: nodeEventType === "checkNode",
|
||||
node: node,
|
||||
nodeEventType: nodeEventType,
|
||||
nodeEventCallback: nodeEventCallback,
|
||||
treeEventType: treeEventType,
|
||||
treeEventCallback: treeEventCallback
|
||||
};
|
||||
return proxyResult
|
||||
},
|
||||
//default init node of excheck
|
||||
_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
|
||||
if (!n) return;
|
||||
var checkedKey = setting.data.key.checked;
|
||||
if (typeof n[checkedKey] == "string") n[checkedKey] = tools.eqs(n[checkedKey], "true");
|
||||
n[checkedKey] = !!n[checkedKey];
|
||||
n.checkedOld = n[checkedKey];
|
||||
if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
|
||||
n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
|
||||
if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
|
||||
n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
|
||||
if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
|
||||
n.halfCheck = !!n.halfCheck;
|
||||
n.check_Child_State = -1;
|
||||
n.check_Focus = false;
|
||||
n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
|
||||
|
||||
if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && n[checkedKey] ) {
|
||||
var r = data.getRoot(setting);
|
||||
r.radioCheckedList.push(n);
|
||||
}
|
||||
},
|
||||
//add dom for check
|
||||
_beforeA = function(setting, node, html) {
|
||||
var checkedKey = setting.data.key.checked;
|
||||
if (setting.check.enable) {
|
||||
data.makeChkFlag(setting, node);
|
||||
html.push("<span ID='", node.tId, consts.id.CHECK, "' class='", view.makeChkClass(setting, node), "' treeNode", consts.id.CHECK, (node.nocheck === true?" style='display:none;'":""),"></span>");
|
||||
}
|
||||
},
|
||||
//update zTreeObj, add method of check
|
||||
_zTreeTools = function(setting, zTreeTools) {
|
||||
zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
|
||||
var checkedKey = this.setting.data.key.checked;
|
||||
if (node.chkDisabled === true) return;
|
||||
if (checked !== true && checked !== false) {
|
||||
checked = !node[checkedKey];
|
||||
}
|
||||
callbackFlag = !!callbackFlag;
|
||||
|
||||
if (node[checkedKey] === checked && !checkTypeFlag) {
|
||||
return;
|
||||
} else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
|
||||
return;
|
||||
}
|
||||
if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
|
||||
node[checkedKey] = checked;
|
||||
var checkObj = $$(node, consts.id.CHECK, this.setting);
|
||||
if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
|
||||
view.setChkClass(this.setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(this.setting, node);
|
||||
if (callbackFlag) {
|
||||
this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
zTreeTools.checkAllNodes = function(checked) {
|
||||
view.repairAllChk(this.setting, !!checked);
|
||||
}
|
||||
|
||||
zTreeTools.getCheckedNodes = function(checked) {
|
||||
var childKey = this.setting.data.key.children;
|
||||
checked = (checked !== false);
|
||||
return data.getTreeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey], checked);
|
||||
}
|
||||
|
||||
zTreeTools.getChangeCheckedNodes = function() {
|
||||
var childKey = this.setting.data.key.children;
|
||||
return data.getTreeChangeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey]);
|
||||
}
|
||||
|
||||
zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
|
||||
disabled = !!disabled;
|
||||
inheritParent = !!inheritParent;
|
||||
inheritChildren = !!inheritChildren;
|
||||
view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
|
||||
view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
|
||||
}
|
||||
|
||||
var _updateNode = zTreeTools.updateNode;
|
||||
zTreeTools.updateNode = function(node, checkTypeFlag) {
|
||||
if (_updateNode) _updateNode.apply(zTreeTools, arguments);
|
||||
if (!node || !this.setting.check.enable) return;
|
||||
var nObj = $$(node, this.setting);
|
||||
if (nObj.get(0) && tools.uCanDo(this.setting)) {
|
||||
var checkObj = $$(node, consts.id.CHECK, this.setting);
|
||||
if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
|
||||
view.setChkClass(this.setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(this.setting, node);
|
||||
}
|
||||
}
|
||||
},
|
||||
//method of operate data
|
||||
_data = {
|
||||
getRadioCheckedList: function(setting) {
|
||||
var checkedList = data.getRoot(setting).radioCheckedList;
|
||||
for (var i=0, j=checkedList.length; i<j; i++) {
|
||||
if(!data.getNodeCache(setting, checkedList[i].tId)) {
|
||||
checkedList.splice(i, 1);
|
||||
i--; j--;
|
||||
}
|
||||
}
|
||||
return checkedList;
|
||||
},
|
||||
getCheckStatus: function(setting, node) {
|
||||
if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
|
||||
var checkedKey = setting.data.key.checked,
|
||||
r = {
|
||||
checked: node[checkedKey],
|
||||
half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (node[checkedKey] ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
|
||||
};
|
||||
return r;
|
||||
},
|
||||
getTreeCheckedNodes: function(setting, nodes, checked, results) {
|
||||
if (!nodes) return [];
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
|
||||
results = !results ? [] : results;
|
||||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||||
if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] == checked) {
|
||||
results.push(nodes[i]);
|
||||
if(onlyOne) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
data.getTreeCheckedNodes(setting, nodes[i][childKey], checked, results);
|
||||
if(onlyOne && results.length > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return results;
|
||||
},
|
||||
getTreeChangeCheckedNodes: function(setting, nodes, results) {
|
||||
if (!nodes) return [];
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked;
|
||||
results = !results ? [] : results;
|
||||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||||
if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] != nodes[i].checkedOld) {
|
||||
results.push(nodes[i]);
|
||||
}
|
||||
data.getTreeChangeCheckedNodes(setting, nodes[i][childKey], results);
|
||||
}
|
||||
return results;
|
||||
},
|
||||
makeChkFlag: function(setting, node) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
chkFlag = -1;
|
||||
if (node[childKey]) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var cNode = node[childKey][i];
|
||||
var tmp = -1;
|
||||
if (setting.check.chkStyle == consts.radio.STYLE) {
|
||||
if (cNode.nocheck === true || cNode.chkDisabled === true) {
|
||||
tmp = cNode.check_Child_State;
|
||||
} else if (cNode.halfCheck === true) {
|
||||
tmp = 2;
|
||||
} else if (cNode[checkedKey]) {
|
||||
tmp = 2;
|
||||
} else {
|
||||
tmp = cNode.check_Child_State > 0 ? 2:0;
|
||||
}
|
||||
if (tmp == 2) {
|
||||
chkFlag = 2; break;
|
||||
} else if (tmp == 0){
|
||||
chkFlag = 0;
|
||||
}
|
||||
} else if (setting.check.chkStyle == consts.checkbox.STYLE) {
|
||||
if (cNode.nocheck === true || cNode.chkDisabled === true) {
|
||||
tmp = cNode.check_Child_State;
|
||||
} else if (cNode.halfCheck === true) {
|
||||
tmp = 1;
|
||||
} else if (cNode[checkedKey] ) {
|
||||
tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
|
||||
} else {
|
||||
tmp = (cNode.check_Child_State > 0) ? 1 : 0;
|
||||
}
|
||||
if (tmp === 1) {
|
||||
chkFlag = 1; break;
|
||||
} else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
|
||||
chkFlag = 1; break;
|
||||
} else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
|
||||
chkFlag = 1; break;
|
||||
} else if (tmp > -1) {
|
||||
chkFlag = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
node.check_Child_State = chkFlag;
|
||||
}
|
||||
},
|
||||
//method of event proxy
|
||||
_event = {
|
||||
|
||||
},
|
||||
//method of event handler
|
||||
_handler = {
|
||||
onCheckNode: function (event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkedKey = setting.data.key.checked;
|
||||
if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
|
||||
node[checkedKey] = !node[checkedKey];
|
||||
view.checkNodeRelation(setting, node);
|
||||
var checkObj = $$(node, consts.id.CHECK, setting);
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
view.repairParentChkClassWithSelf(setting, node);
|
||||
setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
|
||||
return true;
|
||||
},
|
||||
onMouseoverCheck: function(event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
node.check_Focus = true;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
return true;
|
||||
},
|
||||
onMouseoutCheck: function(event, node) {
|
||||
if (node.chkDisabled === true) return false;
|
||||
var setting = data.getSetting(event.data.treeId),
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
node.check_Focus = false;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
return true;
|
||||
}
|
||||
},
|
||||
//method of tools for zTree
|
||||
_tools = {
|
||||
|
||||
},
|
||||
//method of operate ztree dom
|
||||
_view = {
|
||||
checkNodeRelation: function(setting, node) {
|
||||
var pNode, i, l,
|
||||
childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
r = consts.radio;
|
||||
if (setting.check.chkStyle == r.STYLE) {
|
||||
var checkedList = data.getRadioCheckedList(setting);
|
||||
if (node[checkedKey]) {
|
||||
if (setting.check.radioType == r.TYPE_ALL) {
|
||||
for (i = checkedList.length-1; i >= 0; i--) {
|
||||
pNode = checkedList[i];
|
||||
if (pNode[checkedKey] && pNode != node) {
|
||||
pNode[checkedKey] = false;
|
||||
checkedList.splice(i, 1);
|
||||
|
||||
view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
|
||||
if (pNode.parentTId != node.parentTId) {
|
||||
view.repairParentChkClassWithSelf(setting, pNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
checkedList.push(node);
|
||||
} else {
|
||||
var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
|
||||
for (i = 0, l = parentNode[childKey].length; i < l; i++) {
|
||||
pNode = parentNode[childKey][i];
|
||||
if (pNode[checkedKey] && pNode != node) {
|
||||
pNode[checkedKey] = false;
|
||||
view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (setting.check.radioType == r.TYPE_ALL) {
|
||||
for (i = 0, l = checkedList.length; i < l; i++) {
|
||||
if (node == checkedList[i]) {
|
||||
checkedList.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
|
||||
view.setSonNodeCheckBox(setting, node, true);
|
||||
}
|
||||
if (!node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
|
||||
view.setSonNodeCheckBox(setting, node, false);
|
||||
}
|
||||
if (node[checkedKey] && setting.check.chkboxType.Y.indexOf("p") > -1) {
|
||||
view.setParentNodeCheckBox(setting, node, true);
|
||||
}
|
||||
if (!node[checkedKey] && setting.check.chkboxType.N.indexOf("p") > -1) {
|
||||
view.setParentNodeCheckBox(setting, node, false);
|
||||
}
|
||||
}
|
||||
},
|
||||
makeChkClass: function(setting, node) {
|
||||
var checkedKey = setting.data.key.checked,
|
||||
c = consts.checkbox, r = consts.radio,
|
||||
fullStyle = "";
|
||||
if (node.chkDisabled === true) {
|
||||
fullStyle = c.DISABLED;
|
||||
} else if (node.halfCheck) {
|
||||
fullStyle = c.PART;
|
||||
} else if (setting.check.chkStyle == r.STYLE) {
|
||||
fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
|
||||
} else {
|
||||
fullStyle = node[checkedKey] ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL:c.PART) : ((node.check_Child_State < 1)? c.FULL:c.PART);
|
||||
}
|
||||
var chkName = setting.check.chkStyle + "_" + (node[checkedKey] ? c.TRUE : c.FALSE) + "_" + fullStyle;
|
||||
chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
|
||||
return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
|
||||
},
|
||||
repairAllChk: function(setting, checked) {
|
||||
if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
|
||||
var checkedKey = setting.data.key.checked,
|
||||
childKey = setting.data.key.children,
|
||||
root = data.getRoot(setting);
|
||||
for (var i = 0, l = root[childKey].length; i<l ; i++) {
|
||||
var node = root[childKey][i];
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = checked;
|
||||
}
|
||||
view.setSonNodeCheckBox(setting, node, checked);
|
||||
}
|
||||
}
|
||||
},
|
||||
repairChkClass: function(setting, node) {
|
||||
if (!node) return;
|
||||
data.makeChkFlag(setting, node);
|
||||
if (node.nocheck !== true) {
|
||||
var checkObj = $$(node, consts.id.CHECK, setting);
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
}
|
||||
},
|
||||
repairParentChkClass: function(setting, node) {
|
||||
if (!node || !node.parentTId) return;
|
||||
var pNode = node.getParentNode();
|
||||
view.repairChkClass(setting, pNode);
|
||||
view.repairParentChkClass(setting, pNode);
|
||||
},
|
||||
repairParentChkClassWithSelf: function(setting, node) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children;
|
||||
if (node[childKey] && node[childKey].length > 0) {
|
||||
view.repairParentChkClass(setting, node[childKey][0]);
|
||||
} else {
|
||||
view.repairParentChkClass(setting, node);
|
||||
}
|
||||
},
|
||||
repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children;
|
||||
if (node.chkDisabled != chkDisabled) {
|
||||
node.chkDisabled = chkDisabled;
|
||||
}
|
||||
view.repairChkClass(setting, node);
|
||||
if (node[childKey] && inherit) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var sNode = node[childKey][i];
|
||||
view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
|
||||
}
|
||||
}
|
||||
},
|
||||
repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
|
||||
if (!node) return;
|
||||
if (node.chkDisabled != chkDisabled && inherit) {
|
||||
node.chkDisabled = chkDisabled;
|
||||
}
|
||||
view.repairChkClass(setting, node);
|
||||
view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
|
||||
},
|
||||
setChkClass: function(setting, obj, node) {
|
||||
if (!obj) return;
|
||||
if (node.nocheck === true) {
|
||||
obj.hide();
|
||||
} else {
|
||||
obj.show();
|
||||
}
|
||||
obj.attr('class', view.makeChkClass(setting, node));
|
||||
},
|
||||
setParentNodeCheckBox: function(setting, node, value, srcNode) {
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
if (!srcNode) srcNode = node;
|
||||
data.makeChkFlag(setting, node);
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = value;
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
if (setting.check.autoCheckTrigger && node != srcNode) {
|
||||
setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
if (node.parentTId) {
|
||||
var pSign = true;
|
||||
if (!value) {
|
||||
var pNodes = node.getParentNode()[childKey];
|
||||
for (var i = 0, l = pNodes.length; i < l; i++) {
|
||||
if ((pNodes[i].nocheck !== true && pNodes[i].chkDisabled !== true && pNodes[i][checkedKey])
|
||||
|| ((pNodes[i].nocheck === true || pNodes[i].chkDisabled === true) && pNodes[i].check_Child_State > 0)) {
|
||||
pSign = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pSign) {
|
||||
view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
|
||||
}
|
||||
}
|
||||
},
|
||||
setSonNodeCheckBox: function(setting, node, value, srcNode) {
|
||||
if (!node) return;
|
||||
var childKey = setting.data.key.children,
|
||||
checkedKey = setting.data.key.checked,
|
||||
checkObj = $$(node, consts.id.CHECK, setting);
|
||||
if (!srcNode) srcNode = node;
|
||||
|
||||
var hasDisable = false;
|
||||
if (node[childKey]) {
|
||||
for (var i = 0, l = node[childKey].length; i < l; i++) {
|
||||
var sNode = node[childKey][i];
|
||||
view.setSonNodeCheckBox(setting, sNode, value, srcNode);
|
||||
if (sNode.chkDisabled === true) hasDisable = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (node != data.getRoot(setting) && node.chkDisabled !== true) {
|
||||
if (hasDisable && node.nocheck !== true) {
|
||||
data.makeChkFlag(setting, node);
|
||||
}
|
||||
if (node.nocheck !== true && node.chkDisabled !== true) {
|
||||
node[checkedKey] = value;
|
||||
if (!hasDisable) node.check_Child_State = (node[childKey] && node[childKey].length > 0) ? (value ? 2 : 0) : -1;
|
||||
} else {
|
||||
node.check_Child_State = -1;
|
||||
}
|
||||
view.setChkClass(setting, checkObj, node);
|
||||
if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
|
||||
setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
_z = {
|
||||
tools: _tools,
|
||||
view: _view,
|
||||
event: _event,
|
||||
data: _data
|
||||
};
|
||||
$.extend(true, $.fn.zTree.consts, _consts);
|
||||
$.extend(true, $.fn.zTree._z, _z);
|
||||
|
||||
var zt = $.fn.zTree,
|
||||
tools = zt._z.tools,
|
||||
consts = zt.consts,
|
||||
view = zt._z.view,
|
||||
data = zt._z.data,
|
||||
event = zt._z.event,
|
||||
$$ = tools.$;
|
||||
|
||||
data.exSetting(_setting);
|
||||
data.addInitBind(_bindEvent);
|
||||
data.addInitUnBind(_unbindEvent);
|
||||
data.addInitCache(_initCache);
|
||||
data.addInitNode(_initNode);
|
||||
data.addInitProxy(_eventProxy, true);
|
||||
data.addInitRoot(_initRoot);
|
||||
data.addBeforeA(_beforeA);
|
||||
data.addZTreeTools(_zTreeTools);
|
||||
|
||||
var _createNodes = view.createNodes;
|
||||
view.createNodes = function(setting, level, nodes, parentNode, index) {
|
||||
if (_createNodes) _createNodes.apply(view, arguments);
|
||||
if (!nodes) return;
|
||||
view.repairParentChkClassWithSelf(setting, parentNode);
|
||||
}
|
||||
var _removeNode = view.removeNode;
|
||||
view.removeNode = function(setting, node) {
|
||||
var parentNode = node.getParentNode();
|
||||
if (_removeNode) _removeNode.apply(view, arguments);
|
||||
if (!node || !parentNode) return;
|
||||
view.repairChkClass(setting, parentNode);
|
||||
view.repairParentChkClass(setting, parentNode);
|
||||
}
|
||||
|
||||
var _appendNodes = view.appendNodes;
|
||||
view.appendNodes = function(setting, level, nodes, parentNode, index, initFlag, openFlag) {
|
||||
var html = "";
|
||||
if (_appendNodes) {
|
||||
html = _appendNodes.apply(view, arguments);
|
||||
}
|
||||
if (parentNode) {
|
||||
data.makeChkFlag(setting, parentNode);
|
||||
}
|
||||
return html;
|
||||
}
|
||||
})(jQuery);
|
||||
@@ -1,378 +0,0 @@
|
||||
/*-------------------------------------
|
||||
zTree Style
|
||||
|
||||
version: 3.4
|
||||
author: Hunter.z
|
||||
email: hunter.z@263.net
|
||||
website: http://code.google.com/p/jquerytree/
|
||||
|
||||
-------------------------------------*/
|
||||
.ztree * {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif
|
||||
}
|
||||
|
||||
.ztree {
|
||||
margin: 0;
|
||||
padding: 5px;
|
||||
color: #333
|
||||
}
|
||||
|
||||
.ztree li {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
line-height: 17px;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
outline: 0
|
||||
}
|
||||
|
||||
.ztree li ul {
|
||||
margin: 0;
|
||||
padding: 0 0 0 18px
|
||||
}
|
||||
|
||||
.ztree li ul.line {
|
||||
background: url(./img/line_conn.png) 0 0 repeat-y;
|
||||
}
|
||||
|
||||
.ztree li a {
|
||||
padding-right: 3px;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
height: 21px;
|
||||
color: #333;
|
||||
background-color: transparent;
|
||||
text-decoration: none;
|
||||
vertical-align: top;
|
||||
display: inline-block
|
||||
}
|
||||
|
||||
.ztree li a:hover {
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
.ztree li a.curSelectedNode {
|
||||
padding-top: 0px;
|
||||
background-color: #e5e5e5;
|
||||
color: black;
|
||||
height: 21px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.ztree li a.curSelectedNode_Edit {
|
||||
padding-top: 0px;
|
||||
background-color: #e5e5e5;
|
||||
color: black;
|
||||
height: 21px;
|
||||
border: 1px #666 solid;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.ztree li a.tmpTargetNode_inner {
|
||||
padding-top: 0px;
|
||||
background-color: #aaa;
|
||||
color: white;
|
||||
height: 21px;
|
||||
border: 1px #666 solid;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.ztree li a.tmpTargetNode_prev {}
|
||||
|
||||
.ztree li a.tmpTargetNode_next {}
|
||||
|
||||
.ztree li a input.rename {
|
||||
height: 14px;
|
||||
width: 80px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 12px;
|
||||
border: 1px #585956 solid;
|
||||
*border: 0px
|
||||
}
|
||||
|
||||
.ztree li span {
|
||||
line-height: 21px;
|
||||
margin-right: 2px
|
||||
}
|
||||
|
||||
.ztree li span.button {
|
||||
line-height: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 21px;
|
||||
height: 21px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
border: 0 none;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
background-color: transparent;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
background-image: url("./img/bootstrap.png");
|
||||
}
|
||||
|
||||
.ztree li span.button.chk {
|
||||
width: 13px;
|
||||
height: 13px;
|
||||
margin: 0 2px;
|
||||
cursor: auto
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_full {
|
||||
background-position: -5px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_full_focus {
|
||||
background-position: -5px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_part {
|
||||
background-position: -5px -48px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_part_focus {
|
||||
background-position: -5px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_false_disable {
|
||||
background-position: -5px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_full {
|
||||
background-position: -26px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_full_focus {
|
||||
background-position: -26px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_part {
|
||||
background-position: -26px -48px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_part_focus {
|
||||
background-position: -26px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.checkbox_true_disable {
|
||||
background-position: -26px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_full {
|
||||
background-position: -47px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_full_focus {
|
||||
background-position: -47px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_part {
|
||||
background-position: -47px -47px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_part_focus {
|
||||
background-position: -47px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_false_disable {
|
||||
background-position: -47px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_full {
|
||||
background-position: -68px -5px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_full_focus {
|
||||
background-position: -68px -26px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_part {
|
||||
background-position: -68px -47px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_part_focus {
|
||||
background-position: -68px -68px;
|
||||
}
|
||||
|
||||
.ztree li span.button.chk.radio_true_disable {
|
||||
background-position: -68px -89px;
|
||||
}
|
||||
|
||||
.ztree li span.button.switch {
|
||||
width: 21px;
|
||||
height: 21px
|
||||
}
|
||||
|
||||
.ztree li span.button.root_open {
|
||||
background-position: -105px -63px
|
||||
}
|
||||
|
||||
.ztree li span.button.root_close {
|
||||
background-position: -126px -63px
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_open {
|
||||
background-position: -105px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_close {
|
||||
background-position: -126px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_open {
|
||||
background-position: -105px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_close {
|
||||
background-position: -126px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_open {
|
||||
background-position: -105px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_close {
|
||||
background-position: -126px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_open {
|
||||
background-position: -105px -84px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_close {
|
||||
background-position: -126px -84px;
|
||||
}
|
||||
|
||||
.ztree li span.button.root_docu {
|
||||
background-position: -105px -63px;
|
||||
}
|
||||
|
||||
.ztree li span.button.roots_docu {
|
||||
background-position: -84px 0;
|
||||
}
|
||||
|
||||
.ztree li span.button.center_docu {
|
||||
background-position: -84px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.bottom_docu {
|
||||
background-position: -84px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.noline_docu {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_open {
|
||||
margin-right: 2px;
|
||||
background-position: -147px -21px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_close {
|
||||
margin-right: 2px;
|
||||
margin-right: 2px;
|
||||
background-position: -147px 0;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.ico_docu {
|
||||
margin-right: 2px;
|
||||
background-position: -147px -43px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.edit {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px -21px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.edit:hover {
|
||||
background-position: -168px -21px;
|
||||
}
|
||||
|
||||
.ztree li span.button.remove {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px -42px;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.remove:hover {
|
||||
background-position: -168px -42px;
|
||||
}
|
||||
|
||||
.ztree li span.button.add {
|
||||
margin-left: 2px;
|
||||
margin-right: -1px;
|
||||
background-position: -189px 0;
|
||||
vertical-align: top;
|
||||
*vertical-align: middle
|
||||
}
|
||||
|
||||
.ztree li span.button.add:hover {
|
||||
background-position: -168px 0;
|
||||
}
|
||||
|
||||
ul.tmpTargetzTree {
|
||||
background-color: #FFE6B0;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
span.tmpzTreeMove_arrow {
|
||||
width: 16px;
|
||||
height: 21px;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 2px 0 0 1px;
|
||||
border: 0 none;
|
||||
position: absolute;
|
||||
background-color: transparent;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
background-position: -168px -84px;
|
||||
background-image: url("./img/bootstrap.png");
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
span.tmpzTreeMove_prev {
|
||||
background: red;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ul.ztree.zTreeDragUL {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: hidden;
|
||||
background-color: #cfcfcf;
|
||||
border: 1px #00B83F dotted;
|
||||
opacity: 0.8;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.ztreeMask {
|
||||
z-index: 10000;
|
||||
background-color: #cfcfcf;
|
||||
opacity: 0.0;
|
||||
filter: alpha(opacity=0);
|
||||
position: absolute
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
.ztree li span.button {background-image:url("./img/bootstrap3.png");}
|
||||
span.tmpzTreeMove_arrow {background-image:url("./img/bootstrap3.png");}
|
||||
|
||||
|
Before Width: | Height: | Size: 542 KiB |
|
Before Width: | Height: | Size: 186 KiB |
@@ -1 +0,0 @@
|
||||
import"./main-BQpkDb67.js";
|
||||
@@ -85,5 +85,10 @@ export default {
|
||||
'SysUser.getGroups': ['GET', '/api/sysuser/Groups/{userId}'],
|
||||
'SysUser.changeGroups': ['POST', '/api/sysuser/ChangeGroups'],
|
||||
'SysUser.changeSortNo': ['POST', '/api/sysuser/ChangeSortNo/{userId}'],
|
||||
'SysUser.batchChangeStatus': ['POST', '/api/sysuser/BatchChangeStatus']
|
||||
'SysUser.batchChangeStatus': ['POST', '/api/sysuser/BatchChangeStatus'],
|
||||
'AppSettings.savePushSetting': ['POST', '/api/app/SavePushSetting/{id}'],
|
||||
'AppSettings.getPushSetting': ['GET', '/api/app/GetPushSetting/{id}'],
|
||||
'Push.test': ['POST', '/api/push/Test'],
|
||||
'Push.recordList': ['GET', '/api/push/RecordList'],
|
||||
'Push.retry': ['POST', '/api/push/Retry/{id}']
|
||||
};
|
||||
|
||||
@@ -58,9 +58,9 @@ export function getMenuList(): Promise<IModule[]> {
|
||||
page: "",
|
||||
childState: true,
|
||||
children: [
|
||||
{ id: 51, modId: 1106, name: "接口日志", page: "/api-log" },
|
||||
{ id: 52, modId: 1107, name: "系统日志", page: "/sys-log" },
|
||||
{ id: 53, modId: 1111, name: "操作日志", page: "/oplog" },
|
||||
{ id: 54, modId: 1112, name: "推送日志", page: "/push-log" },
|
||||
{ id: 55, modId: 1113, name: "测试推送", page: "/push-test" },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
@@ -8,9 +8,9 @@ import RoleAuthzList from "@/views/role-authz/RoleAuthzList.vue";
|
||||
import RoleManage from "@/views/role-authz/RoleManage.vue";
|
||||
import GroupAuth from "@/views/GroupAuth.vue";
|
||||
import PermissionView from "@/views/PermissionView.vue";
|
||||
import ApiLog from "@/views/ApiLog.vue";
|
||||
import SysLog from "@/views/SysLog.vue";
|
||||
import OperationLogList from "@/views/oplog/OperationLogList.vue";
|
||||
import PushLog from "@/views/push/PushLog.vue";
|
||||
import PushTest from "@/views/push/PushTest.vue";
|
||||
|
||||
const routes: RouteRecordRaw[] = [
|
||||
{
|
||||
@@ -92,16 +92,16 @@ const routes: RouteRecordRaw[] = [
|
||||
meta: { title: "权限一览", icon: "icon-list", modId: 1105 },
|
||||
},
|
||||
{
|
||||
path: "/api-log",
|
||||
name: "ApiLog",
|
||||
component: ApiLog,
|
||||
meta: { title: "接口日志", icon: "icon-list", modId: 1106 },
|
||||
path: "/push-log",
|
||||
name: "PushLog",
|
||||
component: PushLog,
|
||||
meta: { title: "推送日志", icon: "icon-list", modId: 1112, keepAlive: true },
|
||||
},
|
||||
{
|
||||
path: "/sys-log",
|
||||
name: "SysLog",
|
||||
component: SysLog,
|
||||
meta: { title: "系统日志", icon: "icon-list", modId: 1107 },
|
||||
path: "/push-test",
|
||||
name: "PushTest",
|
||||
component: PushTest,
|
||||
meta: { title: "测试推送", icon: "icon-list", modId: 1113 },
|
||||
},
|
||||
// ===== 操作日志 =====
|
||||
{
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
<!-- 排序管理 -->
|
||||
<AppSort v-model="sortModalVisible" :categoryId="dataParams.categoryId" :categoryName="currentCategoryName"
|
||||
@saved="onSortSaved" />
|
||||
|
||||
<!-- 推送设置 -->
|
||||
<PushSettingModal v-model="pushSettingVisible" :appId="currentApp.id" :appName="currentApp.name" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -46,6 +49,7 @@ import useCurrentInstance from "@/utils/hook/useCurrentInstance";
|
||||
import MyConfirm from "@/components/MyConfirm";
|
||||
import AddAppContainer from "./AddAppContainer.vue";
|
||||
import EditAppContainer from "./EditAppContainer.vue";
|
||||
import PushSettingModal from "./PushSettingModal.vue";
|
||||
import TablePageAlovaNew from '@/components/TablePageAlovaNew.vue';
|
||||
import { OperatorEnum } from '@/types';
|
||||
import AppSort from './AppSort.vue';
|
||||
@@ -56,6 +60,8 @@ const { $utils } = useCurrentInstance();
|
||||
const tableRef = ref<InstanceType<typeof TablePageAlovaNew> | null>(null);
|
||||
|
||||
const sortModalVisible = ref(false);
|
||||
const pushSettingVisible = ref(false);
|
||||
const currentApp = ref<{ id: number; name: string }>({ id: 0, name: "" });
|
||||
const keyword = ref("");
|
||||
|
||||
const dataParams = ref<{
|
||||
@@ -150,6 +156,7 @@ const columns = [
|
||||
return [
|
||||
$utils.operatingTextHandle(h, '编辑', '', () => handleEdit(row)),
|
||||
$utils.operatingTextHandle(h, '模块管理', '', () => goModuleManage(row)),
|
||||
$utils.operatingTextHandle(h, '推送设置', '', () => openPushSetting(row)),
|
||||
$utils.operatingTextHandle(h, '删除', 'text-error', () => handleDelete(row)),
|
||||
];
|
||||
}
|
||||
@@ -210,6 +217,12 @@ async function handleDelete(row: any) {
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------------- 推送设置 ---------------- */
|
||||
function openPushSetting(row: any) {
|
||||
currentApp.value = { id: row.id, name: row.name };
|
||||
pushSettingVisible.value = true;
|
||||
}
|
||||
|
||||
/* ---------------- 导航 ---------------- */
|
||||
const goAppType = () => {
|
||||
router.push("/app-manage/category");
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
<template>
|
||||
<Modal v-model="show" :mask-closable="false" width="680" title="推送设置" @on-visible-change="onVisibleChange">
|
||||
<div v-if="loading" class="loading-tip">加载中...</div>
|
||||
<Form v-else :label-width="110" class="push-setting-form">
|
||||
<FormItem label="应用">
|
||||
<span>{{ appName || '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="推送总开关">
|
||||
<i-switch v-model="form.pushEnabled" />
|
||||
<span class="switch-tip">{{ form.pushEnabled ? '开启' : '关闭' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="推送地址" required>
|
||||
<Input v-model="form.pushBaseUrl" placeholder="如 http://host/notice/api/base/(不含接口后缀)" />
|
||||
</FormItem>
|
||||
<FormItem label="订阅接口" required>
|
||||
<Select v-model="form.pushEventTypes" multiple filterable placeholder="请选择要订阅的接口(必选)">
|
||||
<Option v-for="opt in interfaceOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem label="关联学校">
|
||||
<Select v-model="form.pushSchoolIds" multiple filterable placeholder="留空=全局(监听所有学校变化)">
|
||||
<Option v-for="opt in schoolOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem label="推送角色">
|
||||
<Select v-model="form.pushRoleIds" multiple filterable placeholder="留空=全部角色">
|
||||
<Option v-for="opt in roleOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem label="签名密钥">
|
||||
<Input v-model="form.pushSecret" type="password" password placeholder="留空=复用应用密钥 appSecret;清空则改为复用" />
|
||||
<p class="field-tip">不修改请保持原值;清空输入框表示改用应用密钥。</p>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<template #footer>
|
||||
<Button @click="show = false">取消</Button>
|
||||
<Button type="primary" :loading="saving" @click="handleSave">保存</Button>
|
||||
</template>
|
||||
</Modal>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { Message } from 'view-ui-plus';
|
||||
import useCurrentInstance from '@/utils/hook/useCurrentInstance';
|
||||
|
||||
const props = defineProps<{
|
||||
modelValue: boolean;
|
||||
appId: number;
|
||||
appName?: string;
|
||||
}>();
|
||||
const emit = defineEmits(['update:modelValue', 'saved']);
|
||||
|
||||
const { $utils } = useCurrentInstance();
|
||||
|
||||
const show = computed({
|
||||
get: () => props.modelValue,
|
||||
set: val => emit('update:modelValue', val),
|
||||
});
|
||||
|
||||
const interfaceOptions = [
|
||||
{ value: 'group/SyncGroup', label: '组全量同步' },
|
||||
{ value: 'user/SyncUser', label: '用户全量同步' },
|
||||
{ value: 'group/AddGroup', label: '添加组' },
|
||||
{ value: 'group/UpdateGroup', label: '更新组' },
|
||||
{ value: 'group/DeleteGroup', label: '删除组' },
|
||||
{ value: 'user/AddUser', label: '添加用户' },
|
||||
{ value: 'user/UpdateUser', label: '更新用户' },
|
||||
{ value: 'user/DeleteUser', label: '删除用户' },
|
||||
];
|
||||
|
||||
const roleOptions = [
|
||||
{ value: 1, label: '老师' },
|
||||
{ value: 2, label: '校领导' },
|
||||
{ value: 3, label: '学生' },
|
||||
{ value: 4, label: '家长' },
|
||||
{ value: 5, label: '局领导' },
|
||||
{ value: 6, label: '工作号' },
|
||||
{ value: 7, label: '管理员' },
|
||||
];
|
||||
|
||||
const schoolOptions = ref<{ value: number; label: string }[]>([]);
|
||||
const loading = ref(false);
|
||||
const saving = ref(false);
|
||||
|
||||
const form = ref({
|
||||
pushEnabled: false,
|
||||
pushBaseUrl: '',
|
||||
pushEventTypes: [] as string[],
|
||||
pushSchoolIds: [] as number[],
|
||||
pushRoleIds: [] as number[],
|
||||
pushSecret: '',
|
||||
});
|
||||
const originalSecret = ref<string>('');
|
||||
|
||||
function flattenSchools(nodes: any[], prefix = ''): { value: number; label: string }[] {
|
||||
const out: { value: number; label: string }[] = [];
|
||||
(nodes || []).forEach((n) => {
|
||||
const label = prefix ? `${prefix} / ${n.name}` : n.name;
|
||||
out.push({ value: Number(n.id), label });
|
||||
if (Array.isArray(n.children) && n.children.length) {
|
||||
out.push(...flattenSchools(n.children, label));
|
||||
}
|
||||
});
|
||||
return out;
|
||||
}
|
||||
|
||||
async function loadSchools() {
|
||||
try {
|
||||
const data = await (Apis as any).SysGroup.getSchoolTree({ cacheFor: null });
|
||||
schoolOptions.value = flattenSchools(Array.isArray(data) ? data : []);
|
||||
} catch (e: any) {
|
||||
schoolOptions.value = [];
|
||||
}
|
||||
}
|
||||
|
||||
async function loadSettings() {
|
||||
loading.value = true;
|
||||
try {
|
||||
const data = await (Apis as any).AppSettings.getPushSetting({
|
||||
pathParams: { id: props.appId },
|
||||
cacheFor: null,
|
||||
});
|
||||
const d = data || {};
|
||||
form.value.pushEnabled = d.pushEnabled === 1;
|
||||
form.value.pushBaseUrl = d.pushBaseUrl || '';
|
||||
form.value.pushEventTypes = d.pushEventTypes ? String(d.pushEventTypes).split(',').filter(Boolean) : [];
|
||||
form.value.pushSchoolIds = d.pushSchoolIds
|
||||
? String(d.pushSchoolIds).split(',').filter(Boolean).map(Number)
|
||||
: [];
|
||||
form.value.pushRoleIds = d.pushRoleIds
|
||||
? String(d.pushRoleIds).split(',').filter(Boolean).map(Number)
|
||||
: [];
|
||||
form.value.pushSecret = d.pushSecret || '';
|
||||
originalSecret.value = d.pushSecret || '';
|
||||
} catch (e: any) {
|
||||
Message.error(e?.message || '加载推送设置失败');
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
watch(
|
||||
() => props.modelValue,
|
||||
(val) => {
|
||||
if (val && props.appId) {
|
||||
loadSchools();
|
||||
loadSettings();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
function onVisibleChange(val: boolean) {
|
||||
if (!val) emit('update:modelValue', false);
|
||||
}
|
||||
|
||||
function handleSave() {
|
||||
if (!form.value.pushBaseUrl.trim()) {
|
||||
Message.error('请填写推送地址');
|
||||
return;
|
||||
}
|
||||
if (!form.value.pushEventTypes.length) {
|
||||
Message.error('请至少选择一个订阅接口');
|
||||
return;
|
||||
}
|
||||
saving.value = true;
|
||||
const data: any = {
|
||||
pushBaseUrl: form.value.pushBaseUrl.trim(),
|
||||
pushEnabled: form.value.pushEnabled ? 1 : 0,
|
||||
pushEventTypes: form.value.pushEventTypes.join(','),
|
||||
pushSchoolIds: form.value.pushSchoolIds.length ? form.value.pushSchoolIds.join(',') : null,
|
||||
pushRoleIds: form.value.pushRoleIds.length ? form.value.pushRoleIds.join(',') : null,
|
||||
// 与原值相同=不修改(传 null 保留);清空=复用应用密钥(传 "")
|
||||
pushSecret: form.value.pushSecret === originalSecret.value ? null : form.value.pushSecret,
|
||||
};
|
||||
(Apis as any)
|
||||
.AppSettings.savePushSetting({
|
||||
pathParams: { id: props.appId },
|
||||
data,
|
||||
cacheFor: null,
|
||||
})
|
||||
.then(() => {
|
||||
Message.success('保存成功');
|
||||
show.value = false;
|
||||
emit('saved');
|
||||
})
|
||||
.catch((e: any) => Message.error(e?.message || '保存失败'))
|
||||
.finally(() => (saving.value = false));
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.push-setting-form {
|
||||
:deep(.ivu-form-item) {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.switch-tip {
|
||||
margin-left: 8px;
|
||||
color: #808695;
|
||||
}
|
||||
|
||||
.field-tip {
|
||||
margin: 4px 0 0;
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.loading-tip {
|
||||
padding: 24px 0;
|
||||
text-align: center;
|
||||
color: #999;
|
||||
}
|
||||
</style>
|
||||
@@ -16,9 +16,9 @@
|
||||
|
||||
<TablePageAlovaNew ref="tableRef" :dataApi="tableApi" :columns="columns" :tableHeight="tableHeight">
|
||||
<template #default="{ checkList }">
|
||||
<Button type="primary" ghost @click="openAdjust(checkList)">调整组</Button>
|
||||
<Button type="warning" class="ml-15" :disabled="!checkList?.length" @click="openBatchStatus(checkList)">设置状态</Button>
|
||||
<Button type="error" class="ml-15" :disabled="!checkList?.length" @click="openBatchDelete(checkList)">批量删除</Button>
|
||||
<Button type="primary" ghost :disabled="!checkList?.length" @click="openAdjust(checkList)">调整组</Button>
|
||||
<Button type="warning" ghost class="ml-15" :disabled="!checkList?.length" @click="openBatchStatus(checkList)">设置状态</Button>
|
||||
<Button type="error" ghost class="ml-15" :disabled="!checkList?.length" @click="openBatchDelete(checkList)">批量删除</Button>
|
||||
</template>
|
||||
</TablePageAlovaNew>
|
||||
|
||||
|
||||
@@ -0,0 +1,227 @@
|
||||
<template>
|
||||
<div class="main-wrapper">
|
||||
<div class="main-container">
|
||||
<div class="search-wrap fix">
|
||||
<Select v-model="dataParams.appKey" class="ml-12" clearable filterable placeholder="应用" style="width: 180px"
|
||||
@on-change="handleSearch">
|
||||
<Option v-for="opt in appOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
|
||||
<Select v-model="dataParams.interfacePath" class="ml-12" clearable placeholder="接口" style="width: 160px"
|
||||
@on-change="handleSearch">
|
||||
<Option v-for="opt in interfaceOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
|
||||
<Select v-model="dataParams.success" class="ml-12" clearable placeholder="调用结果" style="width: 120px"
|
||||
@on-change="handleSearch">
|
||||
<Option :value="1">成功</Option>
|
||||
<Option :value="0">失败</Option>
|
||||
</Select>
|
||||
|
||||
<DatePicker v-model="startDate" type="date" placeholder="开始时间" format="yyyy-MM-dd" :editable="false"
|
||||
:clearable="true" class="ml-12" style="width: 140px" @on-change="v => onStartChange(v)" />
|
||||
|
||||
<DatePicker v-model="endDate" type="date" placeholder="结束时间" format="yyyy-MM-dd" :editable="false"
|
||||
:clearable="true" class="ml-12" style="width: 140px" @on-change="v => onEndChange(v)" />
|
||||
|
||||
<Button type="primary" class="ml-12" @click="handleSearch">查询</Button>
|
||||
</div>
|
||||
|
||||
<TablePageAlovaNew ref="tableRef" :dataApi="tableApi" :columns="columns" :tableHeight="tableHeight" />
|
||||
</div>
|
||||
|
||||
<PushLogDetailModal v-model="detailVisible" :row="currentRow" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue';
|
||||
import { Message } from 'view-ui-plus';
|
||||
import useCurrentInstance from '@/utils/hook/useCurrentInstance';
|
||||
import TablePageAlovaNew from '@/components/TablePageAlovaNew.vue';
|
||||
import Utils from '@/utils';
|
||||
import PushLogDetailModal from './PushLogDetailModal.vue';
|
||||
|
||||
defineOptions({ name: 'PushLog' });
|
||||
|
||||
const { $utils } = useCurrentInstance();
|
||||
|
||||
const tableRef = ref<InstanceType<typeof TablePageAlovaNew> | null>(null);
|
||||
|
||||
const interfaceOptions = [
|
||||
{ value: 'group/SyncGroup', label: '组全量同步' },
|
||||
{ value: 'user/SyncUser', label: '用户全量同步' },
|
||||
{ value: 'group/AddGroup', label: '添加组' },
|
||||
{ value: 'group/UpdateGroup', label: '更新组' },
|
||||
{ value: 'group/DeleteGroup', label: '删除组' },
|
||||
{ value: 'user/AddUser', label: '添加用户' },
|
||||
{ value: 'user/UpdateUser', label: '更新用户' },
|
||||
{ value: 'user/DeleteUser', label: '删除用户' },
|
||||
];
|
||||
|
||||
const appOptions = ref<{ value: number; label: string }[]>([]);
|
||||
|
||||
interface DataParams {
|
||||
appKey?: number;
|
||||
interfacePath?: string;
|
||||
success?: number;
|
||||
startTime?: string;
|
||||
endTime?: string;
|
||||
}
|
||||
|
||||
const dataParams = ref<DataParams>({
|
||||
appKey: undefined,
|
||||
interfacePath: undefined,
|
||||
success: undefined,
|
||||
startTime: undefined,
|
||||
endTime: undefined,
|
||||
});
|
||||
|
||||
const startDate = ref<Date | null>(null);
|
||||
const endDate = ref<Date | null>(null);
|
||||
|
||||
function onStartChange(val: string) {
|
||||
dataParams.value.startTime = val ? `${val} 00:00:00` : undefined;
|
||||
handleSearch();
|
||||
}
|
||||
|
||||
function onEndChange(val: string) {
|
||||
dataParams.value.endTime = val ? `${val} 23:59:59` : undefined;
|
||||
handleSearch();
|
||||
}
|
||||
|
||||
function handleSearch() {
|
||||
tableRef.value?.refreshData();
|
||||
}
|
||||
|
||||
function clean(obj: Record<string, any>) {
|
||||
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined && v !== null && v !== ''));
|
||||
}
|
||||
|
||||
const tableApi = (params: { pageIndex: number; pageSize: number }) => {
|
||||
return (Apis as any).Push.recordList({
|
||||
params: clean({
|
||||
appKey: dataParams.value.appKey,
|
||||
interfacePath: dataParams.value.interfacePath,
|
||||
success: dataParams.value.success,
|
||||
startTime: dataParams.value.startTime,
|
||||
endTime: dataParams.value.endTime,
|
||||
pageIndex: params.pageIndex,
|
||||
pageSize: params.pageSize,
|
||||
}),
|
||||
cacheFor: null,
|
||||
});
|
||||
};
|
||||
|
||||
const tableHeight = ref($utils.useTableHeight({ isOperat: false, isPage: true, isSearch: true }));
|
||||
|
||||
const columns = [
|
||||
{ type: 'index', title: '序号', width: 70, align: 'center' },
|
||||
{
|
||||
title: '日志时间',
|
||||
key: 'createdAt',
|
||||
width: 170,
|
||||
render: (h: any, { row }: any) =>
|
||||
h('span', row.createdAt ? Utils.dateFormat(row.createdAt, 'yyyy-MM-dd HH:mm:ss') : '-'),
|
||||
},
|
||||
{ title: '应用', key: 'appName', width: 160, ellipsis: true, tooltip: true },
|
||||
{
|
||||
title: '接口',
|
||||
key: 'interfaceLabel',
|
||||
minWidth: 180,
|
||||
render: (h: any, { row }: any) =>
|
||||
h('span', { attrs: { title: row.interfacePath } }, row.interfaceLabel || row.interfacePath || '-'),
|
||||
},
|
||||
{
|
||||
title: '调用结果',
|
||||
key: 'success',
|
||||
width: 90,
|
||||
align: 'center',
|
||||
render: (h: any, { row }: any) =>
|
||||
h('span', { class: row.success === 1 ? 'text-success' : 'text-error' }, row.success === 1 ? '成功' : '失败'),
|
||||
},
|
||||
{
|
||||
title: '重试',
|
||||
key: 'attemptNo',
|
||||
width: 80,
|
||||
align: 'center',
|
||||
render: (h: any, { row }: any) => h('span', `第${row.attemptNo || 1}次`),
|
||||
},
|
||||
{
|
||||
title: '耗时(ms)',
|
||||
key: 'costMs',
|
||||
width: 100,
|
||||
align: 'right',
|
||||
render: (h: any, { row }: any) => h('span', row.costMs != null ? `${row.costMs}` : '-'),
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
width: 130,
|
||||
align: 'center',
|
||||
fixed: 'right' as const,
|
||||
render: (h: any, { row }: any) => {
|
||||
const actions = [
|
||||
h('a', { style: { color: '#577afb', marginRight: '12px' }, on: { click: () => openDetail(row) } }, '详情'),
|
||||
];
|
||||
if (row.success !== 1) {
|
||||
actions.push(
|
||||
h('a', { style: { color: '#ed4014' }, on: { click: () => handleRetry(row) } }, '重试')
|
||||
);
|
||||
}
|
||||
return h('span', actions);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const detailVisible = ref(false);
|
||||
const currentRow = ref<Record<string, any> | null>(null);
|
||||
|
||||
function openDetail(row: any) {
|
||||
currentRow.value = row;
|
||||
detailVisible.value = true;
|
||||
}
|
||||
|
||||
async function handleRetry(row: any) {
|
||||
try {
|
||||
await (Apis as any).Push.retry({ pathParams: { id: row.id }, cacheFor: null });
|
||||
Message.success('已重新投递,稍后在列表中查看结果');
|
||||
tableRef.value?.refreshData();
|
||||
} catch (e: any) {
|
||||
Message.error(e?.message || '重试失败');
|
||||
}
|
||||
}
|
||||
|
||||
async function loadApps() {
|
||||
try {
|
||||
const res = await (Apis as any).AppSettings.appList({
|
||||
params: { pageIndex: 1, pageSize: 9999 },
|
||||
cacheFor: null,
|
||||
});
|
||||
const list = (res && res.content) || [];
|
||||
appOptions.value = list.map((a: any) => ({ value: a.appKey, label: `${a.name}(${a.appKey})` }));
|
||||
} catch (e: any) {
|
||||
appOptions.value = [];
|
||||
}
|
||||
}
|
||||
|
||||
loadApps();
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.search-wrap {
|
||||
.ivu-select,
|
||||
.ivu-input-wrapper,
|
||||
.ivu-date-picker {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
.text-success {
|
||||
color: #19be6b;
|
||||
}
|
||||
|
||||
.text-error {
|
||||
color: #ed4014;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,144 @@
|
||||
<template>
|
||||
<Modal v-model="show" :mask-closable="false" width="720" title="推送日志详情" @on-visible-change="onVisibleChange">
|
||||
<Form :label-width="110" class="push-log-detail-form">
|
||||
<FormItem label="日志ID:">
|
||||
<span>{{ row?.id ?? '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="应用:">
|
||||
<span>{{ row?.appName ?? '-' }}</span>
|
||||
<span class="sub-text">(appKey {{ row?.subscriberAppKey ?? '-' }})</span>
|
||||
</FormItem>
|
||||
<FormItem label="接口:">
|
||||
<span>{{ row?.interfaceLabel ?? '-' }}</span>
|
||||
<span class="sub-text">{{ row?.interfacePath ?? '' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="请求地址:">
|
||||
<span class="break-all">{{ row?.requestUrl || '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="调用结果:">
|
||||
<span :class="resultClass">{{ resultText }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="触发类型:">
|
||||
<span>{{ triggerText }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="HTTP状态:">
|
||||
<span :class="row?.httpStatus === 200 ? 'text-success' : 'text-error'">{{ row?.httpStatus ?? '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="业务码:">
|
||||
<span>{{ row?.respCode ?? '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="业务消息:">
|
||||
<span class="break-all">{{ row?.respMsg || '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="重试次数:">
|
||||
<span>第 {{ row?.attemptNo ?? 1 }} 次</span>
|
||||
</FormItem>
|
||||
<FormItem label="耗时:">
|
||||
<span>{{ row?.costMs != null ? row.costMs + ' ms' : '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="签名时间 t:">
|
||||
<span>{{ row?.signT || '-' }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="创建时间:">
|
||||
<span>{{ formatTime(row?.createdAt) }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="请求体:">
|
||||
<pre class="json-pre">{{ formatJson(row?.payload) }}</pre>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<template #footer>
|
||||
<Button type="primary" @click="show = false">确定</Button>
|
||||
</template>
|
||||
</Modal>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed } from 'vue';
|
||||
import Utils from '@/utils';
|
||||
|
||||
interface Props {
|
||||
modelValue: boolean;
|
||||
row?: Record<string, any> | null;
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), { row: null });
|
||||
const emit = defineEmits(['update:modelValue']);
|
||||
|
||||
const show = computed({
|
||||
get: () => props.modelValue,
|
||||
set: val => emit('update:modelValue', val),
|
||||
});
|
||||
|
||||
const resultText = computed(() => (props.row?.success === 1 ? '成功' : '失败'));
|
||||
const resultClass = computed(() => (props.row?.success === 1 ? 'text-success' : 'text-error'));
|
||||
|
||||
const triggerMap: Record<string, string> = {
|
||||
manual: '手动测试',
|
||||
auto: '自动触发',
|
||||
retry: '失败重试',
|
||||
};
|
||||
const triggerText = computed(() => (props.row?.triggerType ? (triggerMap[props.row.triggerType] || props.row.triggerType) : '-'));
|
||||
|
||||
function onVisibleChange(val: boolean) {
|
||||
if (!val) emit('update:modelValue', false);
|
||||
}
|
||||
|
||||
function formatJson(val: any): string {
|
||||
if (!val) return '-';
|
||||
try {
|
||||
return JSON.stringify(JSON.parse(val), null, 2);
|
||||
} catch {
|
||||
return String(val);
|
||||
}
|
||||
}
|
||||
|
||||
function formatTime(val: any): string {
|
||||
if (!val) return '-';
|
||||
return Utils.dateFormat(val, 'yyyy-MM-dd HH:mm:ss');
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.push-log-detail-form {
|
||||
:deep(.ivu-form-item) {
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
:deep(.ivu-form-item-label) {
|
||||
color: #515a6e;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.text-success {
|
||||
color: #19be6b;
|
||||
}
|
||||
|
||||
.text-error {
|
||||
color: #ed4014;
|
||||
}
|
||||
|
||||
.sub-text {
|
||||
margin-left: 8px;
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.break-all {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.json-pre {
|
||||
margin: 0;
|
||||
padding: 10px 12px;
|
||||
background: #f7f8fa;
|
||||
border: 1px solid #e8eaec;
|
||||
border-radius: 4px;
|
||||
max-height: 240px;
|
||||
overflow: auto;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,242 @@
|
||||
<template>
|
||||
<div class="main-wrapper">
|
||||
<div class="main-container">
|
||||
<div class="test-card">
|
||||
<h3 class="card-title">测试推送</h3>
|
||||
<p class="card-desc">
|
||||
手动触发一次推送(投递消息队列,由订阅方异步接收)。下方将展示本次请求预览(URL / 头 / 体),
|
||||
实际响应结果与耗时请在「推送日志」中查看。
|
||||
</p>
|
||||
|
||||
<Form :label-width="100" class="test-form">
|
||||
<FormItem label="订阅方应用" required>
|
||||
<Select v-model="form.appId" filterable placeholder="选择要推送的订阅方应用" style="width: 360px">
|
||||
<Option v-for="opt in appOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem label="订阅接口" required>
|
||||
<Select v-model="form.interfacePath" filterable placeholder="选择接口" style="width: 360px"
|
||||
@on-change="onInterfaceChange">
|
||||
<Option v-for="opt in interfaceOptions" :key="opt.value" :value="opt.value">{{ opt.label }}</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem label="目标ID" :required="!isSync">
|
||||
<Input v-model="targetIdsText" :disabled="isSync" :placeholder="isSync ? '全量同步无需指定' : '可选,逗号分隔,如 10,11,12'"
|
||||
style="width: 360px" />
|
||||
</FormItem>
|
||||
<FormItem>
|
||||
<Button type="primary" :loading="sending" @click="handleSend">发送测试推送</Button>
|
||||
</FormItem>
|
||||
</Form>
|
||||
</div>
|
||||
|
||||
<div v-if="preview" class="result-card">
|
||||
<div class="result-head">
|
||||
<h3 class="card-title">请求预览</h3>
|
||||
<Button type="text" @click="goLog">查看推送日志</Button>
|
||||
</div>
|
||||
<Alert v-if="preview.batch && preview.batch > 1" type="info" show-icon>
|
||||
本次将拆分为 {{ preview.batch }} 条消息依次发送
|
||||
</Alert>
|
||||
<Form :label-width="100" class="result-form">
|
||||
<FormItem label="请求URL:">
|
||||
<span class="break-all">{{ preview.url }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="请求方法:">
|
||||
<span>{{ preview.method }}</span>
|
||||
</FormItem>
|
||||
<FormItem label="请求头:">
|
||||
<pre class="kv-pre">{{ formatHeaders(preview.headers) }}</pre>
|
||||
</FormItem>
|
||||
<FormItem label="请求体:">
|
||||
<pre class="json-pre">{{ formatJson(preview.body) }}</pre>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<Alert type="success" show-icon>{{ sendMessage }}</Alert>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { Message } from 'view-ui-plus';
|
||||
import useCurrentInstance from '@/utils/hook/useCurrentInstance';
|
||||
|
||||
defineOptions({ name: 'PushTest' });
|
||||
|
||||
const router = useRouter();
|
||||
const { $utils } = useCurrentInstance();
|
||||
|
||||
const interfaceOptions = [
|
||||
{ value: 'group/SyncGroup', label: '组全量同步', sync: true },
|
||||
{ value: 'user/SyncUser', label: '用户全量同步', sync: true },
|
||||
{ value: 'group/AddGroup', label: '添加组', sync: false },
|
||||
{ value: 'group/UpdateGroup', label: '更新组', sync: false },
|
||||
{ value: 'group/DeleteGroup', label: '删除组', sync: false },
|
||||
{ value: 'user/AddUser', label: '添加用户', sync: false },
|
||||
{ value: 'user/UpdateUser', label: '更新用户', sync: false },
|
||||
{ value: 'user/DeleteUser', label: '删除用户', sync: false },
|
||||
];
|
||||
|
||||
const appOptions = ref<{ value: number; label: string }[]>([]);
|
||||
const form = ref({ appId: undefined as number | undefined, interfacePath: '' });
|
||||
const targetIdsText = ref('');
|
||||
const sending = ref(false);
|
||||
const preview = ref<Record<string, any> | null>(null);
|
||||
const sendMessage = ref('');
|
||||
|
||||
const isSync = computed(() => {
|
||||
const opt = interfaceOptions.find((o) => o.value === form.value.interfacePath);
|
||||
return !!opt?.sync;
|
||||
});
|
||||
|
||||
function onInterfaceChange() {
|
||||
if (isSync.value) targetIdsText.value = '';
|
||||
}
|
||||
|
||||
function goLog() {
|
||||
router.push('/push-log');
|
||||
}
|
||||
|
||||
function formatHeaders(headers: Record<string, string> | undefined): string {
|
||||
if (!headers) return '-';
|
||||
return Object.entries(headers)
|
||||
.map(([k, v]) => `${k}: ${v}`)
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
function formatJson(val: any): string {
|
||||
if (val == null) return '-';
|
||||
if (typeof val === 'string') {
|
||||
try {
|
||||
return JSON.stringify(JSON.parse(val), null, 2);
|
||||
} catch {
|
||||
return val;
|
||||
}
|
||||
}
|
||||
return JSON.stringify(val, null, 2);
|
||||
}
|
||||
|
||||
function parseTargetIds(): number[] | null {
|
||||
if (isSync.value) return null;
|
||||
const txt = targetIdsText.value.trim();
|
||||
if (!txt) return null;
|
||||
const ids = txt
|
||||
.split(/[,,\s]+/)
|
||||
.map((s) => Number(s.trim()))
|
||||
.filter((n) => Number.isFinite(n));
|
||||
return ids.length ? ids : null;
|
||||
}
|
||||
|
||||
function handleSend() {
|
||||
if (form.value.appId == null) {
|
||||
Message.error('请选择订阅方应用');
|
||||
return;
|
||||
}
|
||||
if (!form.value.interfacePath) {
|
||||
Message.error('请选择订阅接口');
|
||||
return;
|
||||
}
|
||||
sending.value = true;
|
||||
preview.value = null;
|
||||
sendMessage.value = '';
|
||||
(Apis as any)
|
||||
.Push.test({
|
||||
data: {
|
||||
appId: form.value.appId,
|
||||
interfacePath: form.value.interfacePath,
|
||||
targetIds: parseTargetIds(),
|
||||
},
|
||||
cacheFor: null,
|
||||
})
|
||||
.then((res: any) => {
|
||||
preview.value = res?.preview || null;
|
||||
sendMessage.value = res?.message || '已发送';
|
||||
})
|
||||
.catch((e: any) => Message.error(e?.message || '发送失败'))
|
||||
.finally(() => (sending.value = false));
|
||||
}
|
||||
|
||||
async function loadApps() {
|
||||
try {
|
||||
const res = await (Apis as any).AppSettings.appList({
|
||||
params: { pageIndex: 1, pageSize: 9999 },
|
||||
cacheFor: null,
|
||||
});
|
||||
const list = (res && res.content) || [];
|
||||
appOptions.value = list.map((a: any) => ({ value: a.id, label: `${a.name}(${a.appKey})` }));
|
||||
} catch (e: any) {
|
||||
appOptions.value = [];
|
||||
}
|
||||
}
|
||||
|
||||
loadApps();
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.main-wrapper {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.main-container {
|
||||
padding: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.test-card,
|
||||
.result-card {
|
||||
background: #fff;
|
||||
border-radius: 4px;
|
||||
padding: 16px 20px;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
margin: 0 0 6px;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.card-desc {
|
||||
margin: 0 0 12px;
|
||||
color: #808695;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.test-form {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.result-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.break-all {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.kv-pre,
|
||||
.json-pre {
|
||||
margin: 0;
|
||||
padding: 10px 12px;
|
||||
background: #f7f8fa;
|
||||
border: 1px solid #e8eaec;
|
||||
border-radius: 4px;
|
||||
max-height: 280px;
|
||||
overflow: auto;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.kv-pre {
|
||||
max-height: 140px;
|
||||
}
|
||||
</style>
|
||||