jquery.ztree.excheck.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. /*
  2. * JQuery zTree excheck v3.5.37
  3. * http://treejs.cn/
  4. *
  5. * Copyright (c) 2010 Hunter.z
  6. *
  7. * Licensed same as jquery - MIT License
  8. * http://www.opensource.org/licenses/mit-license.php
  9. *
  10. * email: hunter.z@263.net
  11. * Date: 2018-08-21
  12. */
  13. (function ($) {
  14. //default consts of excheck
  15. var _consts = {
  16. event: {
  17. CHECK: "ztree_check"
  18. },
  19. id: {
  20. CHECK: "_check"
  21. },
  22. checkbox: {
  23. STYLE: "checkbox",
  24. DEFAULT: "chk",
  25. DISABLED: "disable",
  26. FALSE: "false",
  27. TRUE: "true",
  28. FULL: "full",
  29. PART: "part",
  30. FOCUS: "focus"
  31. },
  32. radio: {
  33. STYLE: "radio",
  34. TYPE_ALL: "all",
  35. TYPE_LEVEL: "level"
  36. }
  37. },
  38. //default setting of excheck
  39. _setting = {
  40. check: {
  41. enable: false,
  42. autoCheckTrigger: false,
  43. chkStyle: _consts.checkbox.STYLE,
  44. nocheckInherit: false,
  45. chkDisabledInherit: false,
  46. radioType: _consts.radio.TYPE_LEVEL,
  47. chkboxType: {
  48. "Y": "ps",
  49. "N": "ps"
  50. }
  51. },
  52. data: {
  53. key: {
  54. checked: "checked"
  55. }
  56. },
  57. callback: {
  58. beforeCheck: null,
  59. onCheck: null
  60. }
  61. },
  62. //default root of excheck
  63. _initRoot = function (setting) {
  64. var r = data.getRoot(setting);
  65. r.radioCheckedList = [];
  66. },
  67. //default cache of excheck
  68. _initCache = function (treeId) {
  69. },
  70. //default bind event of excheck
  71. _bindEvent = function (setting) {
  72. var o = setting.treeObj,
  73. c = consts.event;
  74. o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
  75. event.srcEvent = srcEvent;
  76. tools.apply(setting.callback.onCheck, [event, treeId, node]);
  77. });
  78. },
  79. _unbindEvent = function (setting) {
  80. var o = setting.treeObj,
  81. c = consts.event;
  82. o.unbind(c.CHECK);
  83. },
  84. //default event proxy of excheck
  85. _eventProxy = function (e) {
  86. var target = e.target,
  87. setting = data.getSetting(e.data.treeId),
  88. tId = "", node = null,
  89. nodeEventType = "", treeEventType = "",
  90. nodeEventCallback = null, treeEventCallback = null;
  91. if (tools.eqs(e.type, "mouseover")) {
  92. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) {
  93. tId = tools.getNodeMainDom(target).id;
  94. nodeEventType = "mouseoverCheck";
  95. }
  96. } else if (tools.eqs(e.type, "mouseout")) {
  97. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) {
  98. tId = tools.getNodeMainDom(target).id;
  99. nodeEventType = "mouseoutCheck";
  100. }
  101. } else if (tools.eqs(e.type, "click")) {
  102. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) {
  103. tId = tools.getNodeMainDom(target).id;
  104. nodeEventType = "checkNode";
  105. }
  106. }
  107. if (tId.length > 0) {
  108. node = data.getNodeCache(setting, tId);
  109. switch (nodeEventType) {
  110. case "checkNode" :
  111. nodeEventCallback = _handler.onCheckNode;
  112. break;
  113. case "mouseoverCheck" :
  114. nodeEventCallback = _handler.onMouseoverCheck;
  115. break;
  116. case "mouseoutCheck" :
  117. nodeEventCallback = _handler.onMouseoutCheck;
  118. break;
  119. }
  120. }
  121. var proxyResult = {
  122. stop: nodeEventType === "checkNode",
  123. node: node,
  124. nodeEventType: nodeEventType,
  125. nodeEventCallback: nodeEventCallback,
  126. treeEventType: treeEventType,
  127. treeEventCallback: treeEventCallback
  128. };
  129. return proxyResult
  130. },
  131. //default init node of excheck
  132. _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
  133. if (!n) return;
  134. var checked = data.nodeChecked(setting, n);
  135. checked = data.nodeChecked(setting, n, checked);
  136. n.checkedOld = checked;
  137. if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
  138. n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
  139. if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
  140. n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
  141. if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
  142. n.halfCheck = !!n.halfCheck;
  143. n.check_Child_State = -1;
  144. n.check_Focus = false;
  145. n.getCheckStatus = function () {
  146. return data.getCheckStatus(setting, n);
  147. };
  148. if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) {
  149. var r = data.getRoot(setting);
  150. r.radioCheckedList.push(n);
  151. }
  152. },
  153. //add dom for check
  154. _beforeA = function (setting, node, html) {
  155. if (setting.check.enable) {
  156. data.makeChkFlag(setting, node);
  157. 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>");
  158. }
  159. },
  160. //update zTreeObj, add method of check
  161. _zTreeTools = function (setting, zTreeTools) {
  162. zTreeTools.checkNode = function (node, checked, checkTypeFlag, callbackFlag) {
  163. var nodeChecked = data.nodeChecked(setting, node);
  164. if (node.chkDisabled === true) return;
  165. if (checked !== true && checked !== false) {
  166. checked = !nodeChecked;
  167. }
  168. callbackFlag = !!callbackFlag;
  169. if (nodeChecked === checked && !checkTypeFlag) {
  170. return;
  171. } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
  172. return;
  173. }
  174. if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
  175. data.nodeChecked(setting, node, checked);
  176. var checkObj = $$(node, consts.id.CHECK, this.setting);
  177. if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
  178. view.setChkClass(this.setting, checkObj, node);
  179. view.repairParentChkClassWithSelf(this.setting, node);
  180. if (callbackFlag) {
  181. this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
  182. }
  183. }
  184. }
  185. zTreeTools.checkAllNodes = function (checked) {
  186. view.repairAllChk(this.setting, !!checked);
  187. }
  188. zTreeTools.getCheckedNodes = function (checked) {
  189. var checked = (checked !== false);
  190. var children = data.nodeChildren(setting, data.getRoot(this.setting));
  191. return data.getTreeCheckedNodes(this.setting, children, checked);
  192. }
  193. zTreeTools.getChangeCheckedNodes = function () {
  194. var children = data.nodeChildren(setting, data.getRoot(this.setting));
  195. return data.getTreeChangeCheckedNodes(this.setting, children);
  196. }
  197. zTreeTools.setChkDisabled = function (node, disabled, inheritParent, inheritChildren) {
  198. disabled = !!disabled;
  199. inheritParent = !!inheritParent;
  200. inheritChildren = !!inheritChildren;
  201. view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
  202. view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
  203. }
  204. var _updateNode = zTreeTools.updateNode;
  205. zTreeTools.updateNode = function (node, checkTypeFlag) {
  206. if (_updateNode) _updateNode.apply(zTreeTools, arguments);
  207. if (!node || !this.setting.check.enable) return;
  208. var nObj = $$(node, this.setting);
  209. if (nObj.get(0) && tools.uCanDo(this.setting)) {
  210. var checkObj = $$(node, consts.id.CHECK, this.setting);
  211. if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
  212. view.setChkClass(this.setting, checkObj, node);
  213. view.repairParentChkClassWithSelf(this.setting, node);
  214. }
  215. }
  216. },
  217. //method of operate data
  218. _data = {
  219. getRadioCheckedList: function (setting) {
  220. var checkedList = data.getRoot(setting).radioCheckedList;
  221. for (var i = 0, j = checkedList.length; i < j; i++) {
  222. if (!data.getNodeCache(setting, checkedList[i].tId)) {
  223. checkedList.splice(i, 1);
  224. i--;
  225. j--;
  226. }
  227. }
  228. return checkedList;
  229. },
  230. getCheckStatus: function (setting, node) {
  231. if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
  232. var checked = data.nodeChecked(setting, node),
  233. r = {
  234. checked: checked,
  235. half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
  236. };
  237. return r;
  238. },
  239. getTreeCheckedNodes: function (setting, nodes, checked, results) {
  240. if (!nodes) return [];
  241. var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
  242. results = !results ? [] : results;
  243. for (var i = 0, l = nodes.length; i < l; i++) {
  244. var node = nodes[i];
  245. var children = data.nodeChildren(setting, node);
  246. var nodeChecked = data.nodeChecked(setting, node);
  247. if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) {
  248. results.push(node);
  249. if (onlyOne) {
  250. break;
  251. }
  252. }
  253. data.getTreeCheckedNodes(setting, children, checked, results);
  254. if (onlyOne && results.length > 0) {
  255. break;
  256. }
  257. }
  258. return results;
  259. },
  260. getTreeChangeCheckedNodes: function (setting, nodes, results) {
  261. if (!nodes) return [];
  262. results = !results ? [] : results;
  263. for (var i = 0, l = nodes.length; i < l; i++) {
  264. var node = nodes[i];
  265. var children = data.nodeChildren(setting, node);
  266. var nodeChecked = data.nodeChecked(setting, node);
  267. if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) {
  268. results.push(node);
  269. }
  270. data.getTreeChangeCheckedNodes(setting, children, results);
  271. }
  272. return results;
  273. },
  274. makeChkFlag: function (setting, node) {
  275. if (!node) return;
  276. var chkFlag = -1;
  277. var children = data.nodeChildren(setting, node);
  278. if (children) {
  279. for (var i = 0, l = children.length; i < l; i++) {
  280. var cNode = children[i];
  281. var nodeChecked = data.nodeChecked(setting, cNode);
  282. var tmp = -1;
  283. if (setting.check.chkStyle == consts.radio.STYLE) {
  284. if (cNode.nocheck === true || cNode.chkDisabled === true) {
  285. tmp = cNode.check_Child_State;
  286. } else if (cNode.halfCheck === true) {
  287. tmp = 2;
  288. } else if (nodeChecked) {
  289. tmp = 2;
  290. } else {
  291. tmp = cNode.check_Child_State > 0 ? 2 : 0;
  292. }
  293. if (tmp == 2) {
  294. chkFlag = 2;
  295. break;
  296. } else if (tmp == 0) {
  297. chkFlag = 0;
  298. }
  299. } else if (setting.check.chkStyle == consts.checkbox.STYLE) {
  300. if (cNode.nocheck === true || cNode.chkDisabled === true) {
  301. tmp = cNode.check_Child_State;
  302. } else if (cNode.halfCheck === true) {
  303. tmp = 1;
  304. } else if (nodeChecked) {
  305. tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
  306. } else {
  307. tmp = (cNode.check_Child_State > 0) ? 1 : 0;
  308. }
  309. if (tmp === 1) {
  310. chkFlag = 1;
  311. break;
  312. } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
  313. chkFlag = 1;
  314. break;
  315. } else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
  316. chkFlag = 1;
  317. break;
  318. } else if (tmp > -1) {
  319. chkFlag = tmp;
  320. }
  321. }
  322. }
  323. }
  324. node.check_Child_State = chkFlag;
  325. }
  326. },
  327. //method of event proxy
  328. _event = {},
  329. //method of event handler
  330. _handler = {
  331. onCheckNode: function (event, node) {
  332. if (node.chkDisabled === true) return false;
  333. var setting = data.getSetting(event.data.treeId);
  334. if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
  335. var nodeChecked = data.nodeChecked(setting, node);
  336. data.nodeChecked(setting, node, !nodeChecked);
  337. view.checkNodeRelation(setting, node);
  338. var checkObj = $$(node, consts.id.CHECK, setting);
  339. view.setChkClass(setting, checkObj, node);
  340. view.repairParentChkClassWithSelf(setting, node);
  341. setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
  342. return true;
  343. },
  344. onMouseoverCheck: function (event, node) {
  345. if (node.chkDisabled === true) return false;
  346. var setting = data.getSetting(event.data.treeId),
  347. checkObj = $$(node, consts.id.CHECK, setting);
  348. node.check_Focus = true;
  349. view.setChkClass(setting, checkObj, node);
  350. return true;
  351. },
  352. onMouseoutCheck: function (event, node) {
  353. if (node.chkDisabled === true) return false;
  354. var setting = data.getSetting(event.data.treeId),
  355. checkObj = $$(node, consts.id.CHECK, setting);
  356. node.check_Focus = false;
  357. view.setChkClass(setting, checkObj, node);
  358. return true;
  359. }
  360. },
  361. //method of tools for zTree
  362. _tools = {},
  363. //method of operate ztree dom
  364. _view = {
  365. checkNodeRelation: function (setting, node) {
  366. var pNode, i, l,
  367. r = consts.radio;
  368. var nodeChecked = data.nodeChecked(setting, node);
  369. if (setting.check.chkStyle == r.STYLE) {
  370. var checkedList = data.getRadioCheckedList(setting);
  371. if (nodeChecked) {
  372. if (setting.check.radioType == r.TYPE_ALL) {
  373. for (i = checkedList.length - 1; i >= 0; i--) {
  374. pNode = checkedList[i];
  375. var pNodeChecked = data.nodeChecked(setting, pNode);
  376. if (pNodeChecked && pNode != node) {
  377. data.nodeChecked(setting, pNode, false);
  378. checkedList.splice(i, 1);
  379. view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
  380. if (pNode.parentTId != node.parentTId) {
  381. view.repairParentChkClassWithSelf(setting, pNode);
  382. }
  383. }
  384. }
  385. checkedList.push(node);
  386. } else {
  387. var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
  388. var children = data.nodeChildren(setting, parentNode);
  389. for (i = 0, l = children.length; i < l; i++) {
  390. pNode = children[i];
  391. var pNodeChecked = data.nodeChecked(setting, pNode);
  392. if (pNodeChecked && pNode != node) {
  393. data.nodeChecked(setting, pNode, false);
  394. view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
  395. }
  396. }
  397. }
  398. } else if (setting.check.radioType == r.TYPE_ALL) {
  399. for (i = 0, l = checkedList.length; i < l; i++) {
  400. if (node == checkedList[i]) {
  401. checkedList.splice(i, 1);
  402. break;
  403. }
  404. }
  405. }
  406. } else {
  407. var children = data.nodeChildren(setting, node);
  408. if (nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
  409. view.setSonNodeCheckBox(setting, node, true);
  410. }
  411. if (!nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
  412. view.setSonNodeCheckBox(setting, node, false);
  413. }
  414. if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) {
  415. view.setParentNodeCheckBox(setting, node, true);
  416. }
  417. if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) {
  418. view.setParentNodeCheckBox(setting, node, false);
  419. }
  420. }
  421. },
  422. makeChkClass: function (setting, node) {
  423. var c = consts.checkbox, r = consts.radio,
  424. fullStyle = "";
  425. var nodeChecked = data.nodeChecked(setting, node);
  426. if (node.chkDisabled === true) {
  427. fullStyle = c.DISABLED;
  428. } else if (node.halfCheck) {
  429. fullStyle = c.PART;
  430. } else if (setting.check.chkStyle == r.STYLE) {
  431. fullStyle = (node.check_Child_State < 1) ? c.FULL : c.PART;
  432. } else {
  433. fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL : c.PART) : ((node.check_Child_State < 1) ? c.FULL : c.PART);
  434. }
  435. var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle;
  436. chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
  437. return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
  438. },
  439. repairAllChk: function (setting, checked) {
  440. if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
  441. var root = data.getRoot(setting);
  442. var children = data.nodeChildren(setting, root);
  443. for (var i = 0, l = children.length; i < l; i++) {
  444. var node = children[i];
  445. if (node.nocheck !== true && node.chkDisabled !== true) {
  446. data.nodeChecked(setting, node, checked);
  447. }
  448. view.setSonNodeCheckBox(setting, node, checked);
  449. }
  450. }
  451. },
  452. repairChkClass: function (setting, node) {
  453. if (!node) return;
  454. data.makeChkFlag(setting, node);
  455. if (node.nocheck !== true) {
  456. var checkObj = $$(node, consts.id.CHECK, setting);
  457. view.setChkClass(setting, checkObj, node);
  458. }
  459. },
  460. repairParentChkClass: function (setting, node) {
  461. if (!node || !node.parentTId) return;
  462. var pNode = node.getParentNode();
  463. view.repairChkClass(setting, pNode);
  464. view.repairParentChkClass(setting, pNode);
  465. },
  466. repairParentChkClassWithSelf: function (setting, node) {
  467. if (!node) return;
  468. var children = data.nodeChildren(setting, node);
  469. if (children && children.length > 0) {
  470. view.repairParentChkClass(setting, children[0]);
  471. } else {
  472. view.repairParentChkClass(setting, node);
  473. }
  474. },
  475. repairSonChkDisabled: function (setting, node, chkDisabled, inherit) {
  476. if (!node) return;
  477. if (node.chkDisabled != chkDisabled) {
  478. node.chkDisabled = chkDisabled;
  479. }
  480. view.repairChkClass(setting, node);
  481. var children = data.nodeChildren(setting, node);
  482. if (children && inherit) {
  483. for (var i = 0, l = children.length; i < l; i++) {
  484. var sNode = children[i];
  485. view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
  486. }
  487. }
  488. },
  489. repairParentChkDisabled: function (setting, node, chkDisabled, inherit) {
  490. if (!node) return;
  491. if (node.chkDisabled != chkDisabled && inherit) {
  492. node.chkDisabled = chkDisabled;
  493. }
  494. view.repairChkClass(setting, node);
  495. view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
  496. },
  497. setChkClass: function (setting, obj, node) {
  498. if (!obj) return;
  499. if (node.nocheck === true) {
  500. obj.hide();
  501. } else {
  502. obj.show();
  503. }
  504. obj.attr('class', view.makeChkClass(setting, node));
  505. },
  506. setParentNodeCheckBox: function (setting, node, value, srcNode) {
  507. var checkObj = $$(node, consts.id.CHECK, setting);
  508. if (!srcNode) srcNode = node;
  509. data.makeChkFlag(setting, node);
  510. if (node.nocheck !== true && node.chkDisabled !== true) {
  511. data.nodeChecked(setting, node, value);
  512. view.setChkClass(setting, checkObj, node);
  513. if (setting.check.autoCheckTrigger && node != srcNode) {
  514. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  515. }
  516. }
  517. if (node.parentTId) {
  518. var pSign = true;
  519. if (!value) {
  520. var pNodes = data.nodeChildren(setting, node.getParentNode());
  521. for (var i = 0, l = pNodes.length; i < l; i++) {
  522. var pNode = pNodes[i];
  523. var nodeChecked = data.nodeChecked(setting, pNode);
  524. if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked)
  525. || ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) {
  526. pSign = false;
  527. break;
  528. }
  529. }
  530. }
  531. if (pSign) {
  532. view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
  533. }
  534. }
  535. },
  536. setSonNodeCheckBox: function (setting, node, value, srcNode) {
  537. if (!node) return;
  538. var checkObj = $$(node, consts.id.CHECK, setting);
  539. if (!srcNode) srcNode = node;
  540. var hasDisable = false;
  541. var children = data.nodeChildren(setting, node);
  542. if (children) {
  543. for (var i = 0, l = children.length; i < l; i++) {
  544. var sNode = children[i];
  545. view.setSonNodeCheckBox(setting, sNode, value, srcNode);
  546. if (sNode.chkDisabled === true) hasDisable = true;
  547. }
  548. }
  549. if (node != data.getRoot(setting) && node.chkDisabled !== true) {
  550. if (hasDisable && node.nocheck !== true) {
  551. data.makeChkFlag(setting, node);
  552. }
  553. if (node.nocheck !== true && node.chkDisabled !== true) {
  554. data.nodeChecked(setting, node, value);
  555. if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1;
  556. } else {
  557. node.check_Child_State = -1;
  558. }
  559. view.setChkClass(setting, checkObj, node);
  560. if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
  561. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  562. }
  563. }
  564. }
  565. },
  566. _z = {
  567. tools: _tools,
  568. view: _view,
  569. event: _event,
  570. data: _data
  571. };
  572. $.extend(true, $.fn.zTree.consts, _consts);
  573. $.extend(true, $.fn.zTree._z, _z);
  574. var zt = $.fn.zTree,
  575. tools = zt._z.tools,
  576. consts = zt.consts,
  577. view = zt._z.view,
  578. data = zt._z.data,
  579. event = zt._z.event,
  580. $$ = tools.$;
  581. data.nodeChecked = function (setting, node, newChecked) {
  582. if (!node) {
  583. return false;
  584. }
  585. var key = setting.data.key.checked;
  586. if (typeof newChecked !== 'undefined') {
  587. if (typeof newChecked === "string") {
  588. newChecked = tools.eqs(newChecked, "true");
  589. }
  590. newChecked = !!newChecked;
  591. node[key] = newChecked;
  592. }
  593. return node[key];
  594. };
  595. data.exSetting(_setting);
  596. data.addInitBind(_bindEvent);
  597. data.addInitUnBind(_unbindEvent);
  598. data.addInitCache(_initCache);
  599. data.addInitNode(_initNode);
  600. data.addInitProxy(_eventProxy, true);
  601. data.addInitRoot(_initRoot);
  602. data.addBeforeA(_beforeA);
  603. data.addZTreeTools(_zTreeTools);
  604. var _createNodes = view.createNodes;
  605. view.createNodes = function (setting, level, nodes, parentNode, index) {
  606. if (_createNodes) _createNodes.apply(view, arguments);
  607. if (!nodes) return;
  608. view.repairParentChkClassWithSelf(setting, parentNode);
  609. }
  610. var _removeNode = view.removeNode;
  611. view.removeNode = function (setting, node) {
  612. var parentNode = node.getParentNode();
  613. if (_removeNode) _removeNode.apply(view, arguments);
  614. if (!node || !parentNode) return;
  615. view.repairChkClass(setting, parentNode);
  616. view.repairParentChkClass(setting, parentNode);
  617. }
  618. var _appendNodes = view.appendNodes;
  619. view.appendNodes = function (setting, level, nodes, parentNode, index, initFlag, openFlag) {
  620. var html = "";
  621. if (_appendNodes) {
  622. html = _appendNodes.apply(view, arguments);
  623. }
  624. if (parentNode) {
  625. data.makeChkFlag(setting, parentNode);
  626. }
  627. return html;
  628. }
  629. })(jQuery);