packagetree.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. ; (function (factory) {
  2. if (typeof module === 'object' && typeof module.exports === 'object') {
  3. factory(require('jquery'), window, document);
  4. } else {
  5. factory(jQuery, window, document);
  6. }
  7. }(function ($, window, document, undefined) {
  8. var treeClass = 'iwb-package-tree',
  9. lineClass = 'line-v',
  10. roundClass = 'round-box',
  11. nodeRoundClass = 'round-node',
  12. nodeStartRoundClass = 'start-node',
  13. nodeEndRoundClass = 'end-node',
  14. nodeBlockClass = 'block-node',
  15. leftBlockClass = 'left',
  16. rightBlockClass = 'right',
  17. roundSettingClass = 'round-setting',
  18. contentClass = 'content',
  19. blockBoxClass = 'block-box',
  20. objBlockBoxClass = 'obj-block-box',
  21. evBlockBoxClass = 'evolution-block-box',
  22. blockContentClass = 'block-content',
  23. settingBoxClass = 'setting-box',
  24. settingBoxClass2 = 'setting-btn-box',
  25. flowBoxClass = 'flow-box',
  26. flowInfoClass = 'flow-info',
  27. flowNameClass = 'flow-name',
  28. flowSettingClass = 'flow-setting';
  29. var _SettingStr = '<div class="setting {0}" data-type="0" data-setting="{0}" data-type-rs="{2}">{1}<span>已配置</span></div>',
  30. _NonSettingStr = '<div class="setting no-setting {0}" data-type="{0}" data-setting="{0}" data-type-rs="{2}">{1}<span>未配置</span></div>';
  31. var PackageTree = function (elem, opts) {
  32. this.$nodeContainer = $(elem);
  33. this.opts = opts;
  34. this.defaultOptions = {
  35. 'data': {},
  36. 'nodeTitle': 'name',
  37. 'nodeMinWith': 280,
  38. 'nodeId': 'id',
  39. 'parentId': 'parentId',
  40. 'nodeClass': '',
  41. 'visibleLevel': 999,
  42. 'exportButton': false,
  43. 'exportFilename': 'PackageTree',
  44. 'exportFileExtension': 'png',
  45. 'draggable': true,
  46. 'dragDelay': 200,
  47. 'zoom': true,
  48. 'zoomMaxLimit': 2,
  49. 'zoomMinLimit': 0.5,
  50. 'exportDataInput': false,
  51. 'customMenu': 'package-menu',
  52. 'customMenuBefore': null,
  53. 'offset': undefined,
  54. 'flowDetailFun': undefined,
  55. 'settingFun': function(that) {
  56. console.log("setting", $(that).data("type"));
  57. }
  58. };
  59. };
  60. PackageTree.prototype = {
  61. init: function (opts) {
  62. var that = this;
  63. this.options = $.extend({}, this.defaultOptions, this.opts, opts || {});
  64. //
  65. var $nodeContainer = this.$nodeContainer;
  66. this.$nodeTree = $nodeContainer.find('.' + treeClass);
  67. if (this.$nodeTree && this.$nodeTree.length > 0) {
  68. if (this.options.offset) {
  69. this.options.offset = this.$nodeTree.offset();
  70. }
  71. this.$nodeTree.remove();
  72. } else {
  73. this.options.offset = false;
  74. }
  75. var data = this.options.data;
  76. var $nodeTree = this.$nodeTree = $('<div>',
  77. {
  78. 'data': { 'options': this.options },
  79. 'class': treeClass + (this.options.nodeClass !== '' ? ' ' + this.options.nodeClass : ''),
  80. });
  81. this.buildHierarchy($nodeTree, data);
  82. $nodeContainer.append($nodeTree);
  83. $nodeTree.find('.' + settingBoxClass2 + ' .setting').off("click.setting").on("click.setting",function() {that.options.settingFun($(this));});
  84. if (this.options.offset) {
  85. $nodeTree.offset(this.options.offset);
  86. }
  87. if (this.options.zoom) {
  88. this.$nodeContainer.on('wheel', { 'nt': that }, this.zoomWheel);
  89. }
  90. if (this.options.draggable) {
  91. this.drag(this.$nodeTree);
  92. }
  93. return this;
  94. },
  95. buildHierarchy: function ($appendTo, data) {
  96. var that = this;
  97. var opts = this.options;
  98. var $roundNode = $('<div>',
  99. { 'class': nodeRoundClass + ' ' + nodeStartRoundClass, text: (data.name ? data.name : '') + " 场景" });
  100. var $startBox = $('<div>', { 'class': roundClass }).append($('<div>', { 'class': lineClass }))
  101. .append($roundNode);
  102. that.customMenu($roundNode, function ($node,$menu) {
  103. $menu.find("a.dropdown-item").hide();
  104. $menu.find("a.dropdown-item.comp").show();
  105. $menu.find("a.dropdown-item.guide").show();
  106. if (!data.children || data.children.length===0) {
  107. $menu.find("a.dropdown-item.round.add").show();
  108. }
  109. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  110. opts.customMenuBefore($node, $menu);
  111. }
  112. });
  113. $appendTo.append($startBox);
  114. if (data.children && data.children.length > 0) {
  115. var i = 0;
  116. data.children.forEach(function (v) {
  117. i++;
  118. that.buildRoundInfoBox($appendTo, v, i === data.children.length);
  119. });
  120. }
  121. var $endNode = $('<div>', { 'class': roundClass }).append($('<div>', { 'class': lineClass })).append($('<div>', { 'class': nodeRoundClass + ' ' + nodeEndRoundClass, text: 'END' }));;
  122. $appendTo.append($endNode);
  123. },
  124. buildRoundInfoBox: function ($appendTo, data,isEnd) {
  125. var that = this;
  126. var $round = that.buildRoundInfo(data, isEnd);
  127. $appendTo.append($round);
  128. },
  129. buildRoundInfo: function (data,isEnd) {
  130. var that = this;
  131. var opts = this.options;
  132. var $round = $('<div>', { 'class': roundClass, data: { path: data.path, parentPath: data.parentPath } }).append($('<div>', { 'class': lineClass }));
  133. var blocks = $.extend([], data.children);
  134. var objBlock = blocks.shift();//第一个是客观情景块移除出来,剩下的是演化情景块,
  135. //左边是 客观情景块
  136. var $leftBlock = $('<div>', { 'class': nodeBlockClass + ' ' + leftBlockClass, data: { path: data.path, parentPath: data.parentPath } });
  137. //轮次配置
  138. that.buildRoundSettingBox($leftBlock, data);
  139. var $objBlockBox = $('<div>', { 'class': blockBoxClass + ' ' + objBlockBoxClass, data: { path: data.path, parentPath: data.parentPath } }).append('<div class="title">客观情景块 <span class="path" title="路径">(' + objBlock.path +')</span></div>');
  140. that.buildBlockContent($objBlockBox, objBlock);
  141. $leftBlock.append($objBlockBox);
  142. $round.append($leftBlock);
  143. //中间是 轮次几点
  144. var $roundNode = $('<div>', { 'class': nodeRoundClass + ' no-select', text: data.roundIndex, data: { path: data.path, parentPath: data.parentPath } });
  145. $round.append($roundNode);
  146. if (isEnd) {
  147. $roundNode.addClass("last");
  148. }
  149. that.customMenu($roundNode, function ($node, $menu) {
  150. $menu.find("a.dropdown-item").hide();
  151. $menu.find("a.dropdown-item.r-setting").show();
  152. $menu.find("a.dropdown-item.comp").show();
  153. $menu.find("a.dropdown-item.guide").show();
  154. if ($node.hasClass("last")) {
  155. $menu.find("a.dropdown-item.round").show();
  156. }
  157. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  158. opts.customMenuBefore($node, $menu);
  159. }
  160. });
  161. if (opts.draggable) {
  162. this.drag($roundNode);
  163. }
  164. //右边是 演化情景块
  165. var $rightBlock = $('<div>', { 'class': nodeBlockClass + ' ' + rightBlockClass, data: { path: data.path, parentPath: data.parentPath } });
  166. that.buildRightBlock($rightBlock, blocks,data.path);
  167. $round.append($rightBlock);
  168. return $round;
  169. },
  170. buildRoundSettingBox: function ($appendTo, data) {
  171. var that = this;
  172. var opts = this.options;
  173. var $setting = $('<div>', { 'class': roundSettingClass, data: { path: data.path, parentPath: data.parentPath } }).append('<div class="title">轮次规则配置</div>');
  174. var $setContent = $('<div>', { 'class': contentClass + ' ' + settingBoxClass2, data: { path: data.path, parentPath: data.parentPath } });
  175. var str = that.buildRoundSetting(data);
  176. $setContent.append(str);
  177. $setting.append($setContent);
  178. that.customMenu($setting, function ($node, $menu) {
  179. $menu.find("a.dropdown-item").hide();
  180. $menu.find("a.dropdown-item.r-setting").show();
  181. $menu.find("a.dropdown-item.comp").show();
  182. $menu.find("a.dropdown-item.guide").show();
  183. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  184. opts.customMenuBefore($node, $menu);
  185. }
  186. });
  187. $appendTo.append($setting);
  188. },
  189. buildRoundSetting: function (data) {
  190. var that = this;
  191. var str = '';
  192. str += '<div class="setting ' +
  193. (data.roundFullScore ? '' : 'no-setting') +
  194. ' score" data-type="score" data-type-rs="1" data-setting="roundSetting">轮次总分: <span class="value">' +
  195. data.roundFullScore +
  196. '</span> <span>分</span></div >';
  197. str += '<div class="setting ' +
  198. (data.controlRate ? '' : 'no-setting') +
  199. ' score" data-type="score" data-type-rs="1" data-setting="roundSetting">随机抽取概率: <span class="value">' +
  200. data.controlRate +
  201. '</span> <span>%</span></div >';
  202. str += '<div class="setting ' +
  203. (data.sceneCount ? '' : 'no-setting') +
  204. ' score" data-type="score" data-type-rs="1" data-setting="roundSetting">演化情景流数: <span class="value">' +
  205. data.sceneCount +
  206. '</span> <span>条</span></div >';
  207. str += that.buildSetting(data,true);
  208. return str;
  209. },
  210. buildSetting: function (data,isRound) {
  211. var str = '';
  212. if (data) {
  213. str += (data.guideNos ? _SettingStr : _NonSettingStr).format('guide', '引导信息', isRound?"1":"0");
  214. str += (data.preComponent ? _SettingStr : _NonSettingStr).format('PRE', '运行前事务', isRound ? "1" : "0");
  215. str += (data.runningComponent ? _SettingStr : _NonSettingStr).format('RUN', '运行时事务', isRound ? "1" : "0");
  216. str += (data.postComponent ? _SettingStr : _NonSettingStr).format('POST', '运行后事务', isRound ? "1" : "0");
  217. }
  218. return str;
  219. },
  220. buildRightBlock: function ($appendTo, data,parentPath) {
  221. var that = this;
  222. var opts = this.options;
  223. var $navTab = $('<ul>', { 'class': 'nav nav-tabs flex-column' });
  224. var $tabContent = $('<div>', { 'class': 'tab-content' });
  225. if (data && data.length > 0) {
  226. var i = 1;
  227. var ran = new Date().getTime();
  228. data.forEach(function (v) {
  229. var $item = that.buildEvTab(v, i, ran);
  230. $navTab.append($item);
  231. var $pane = that.buildEvTabPane(v, i, ran);
  232. $tabContent.append($pane);
  233. i++;
  234. });
  235. }
  236. var $tabBox = $('<div>', { 'class': 'tab-box', data: { path: '', parentPath: parentPath } })
  237. .append('<div class="title">情景块集合</div>')
  238. .append($navTab);
  239. that.customMenu($tabBox, function ($node, $menu) {
  240. $menu.find("a.dropdown-item").hide();
  241. $menu.find("a.dropdown-item.block.add").show();
  242. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  243. opts.customMenuBefore($node, $menu);
  244. }
  245. });
  246. var $tabContentBox = $('<div>', { 'class': 'tab-content-box' })
  247. .append($tabContent);
  248. $appendTo.append($tabContentBox, $tabBox);
  249. },
  250. buildEvTab: function (data, i, ran) {
  251. var that = this;
  252. var opts = this.options;
  253. var $item = $('<li>', { 'class': 'nav-item', 'data': { path: data.path, parentPath: data.parentPath } })
  254. .append($('<a>', {
  255. 'class': 'nav-link' + (i === 1 ? ' active' : '') ,
  256. 'href': '#ev-block-' + data.path + "_" + ran,
  257. 'text': '情景块 '
  258. }).attr('data-toggle', 'pill').append(' <span class="path" title="路径">(' + data.path + ')</span>'));
  259. that.customMenu($item, function ($node, $menu) {
  260. $menu.find("a.dropdown-item").hide();
  261. $menu.find("a.dropdown-item.block.delete").show();
  262. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  263. opts.customMenuBefore($node, $menu);
  264. }
  265. });
  266. return $item;
  267. },
  268. buildEvTabPane: function (data, i, ran) {
  269. var that = this;
  270. var $pane = $('<div>', {
  271. 'class': 'tab-pane fade text-left'+ (i === 1 ? ' show active' : ''),
  272. 'id': 'ev-block-' + data.path + "_" + ran
  273. });
  274. var $evBlockBox = $('<div>', { 'class': blockBoxClass + ' ' + evBlockBoxClass, data: { path: data.path, parentPath: data.parentPath } });
  275. $pane.append('<div class="title">演化情景块 <span class="path" title="路径">(' + data.path + ')</span></div>').append($evBlockBox);
  276. that.buildBlockContent($evBlockBox, data);
  277. return $pane;
  278. },
  279. buildBlockContent: function ($appendTo, data) {
  280. var that = this;
  281. var $blockContent = that.buildBlockContentInfo(data);
  282. $appendTo.append($blockContent);
  283. },
  284. buildBlockContentInfo: function ( data) {
  285. var that = this;
  286. var opts = this.options;
  287. var $blockContent = $('<div>', { 'class': blockContentClass });
  288. var $settingBox = $('<div>', { 'class': settingBoxClass + ' ' + settingBoxClass2, data: { path: data.path, parentPath: data.parentPath } })
  289. .append(that.buildSetting(data));
  290. that.customMenu($settingBox, function ($node, $menu) {
  291. $menu.find("a.dropdown-item").hide();
  292. $menu.find("a.dropdown-item.comp").show();
  293. $menu.find("a.dropdown-item.guide").show();
  294. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  295. opts.customMenuBefore($node, $menu);
  296. }
  297. });
  298. $blockContent.append($settingBox);
  299. that.buildFlowBox($blockContent, data);
  300. return $blockContent;
  301. },
  302. buildFlowBox: function ($appendTo, data) {
  303. var that = this;
  304. var opts = this.options;
  305. var $flowBox = $('<div>', { 'class': flowBoxClass, data: { path: data.path, parentPath: data.parentPath } });
  306. var $info = that.buildFlowInfo(data);
  307. $flowBox.append($info);
  308. that.customMenu($flowBox, function ($node, $menu) {
  309. $menu.find("a.dropdown-item").hide();
  310. $menu.find("a.dropdown-item.flow-s").show();
  311. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  312. opts.customMenuBefore($node, $menu);
  313. }
  314. });
  315. $appendTo.append($flowBox);
  316. },
  317. buildFlowInfo: function ( data) {
  318. var that = this;
  319. var opts = this.options;
  320. var $flowInfoBox = $('<div>');
  321. if (data.flowNos) {
  322. var flowNoArr = data.flowNos.split(","), flowNameArr = data.flowNames.split(",");
  323. flowNoArr.forEach(function (v, i) {
  324. var name = flowNameArr.length > i ? flowNameArr[i] : "";
  325. var $detail =
  326. $('<div>',
  327. {
  328. 'class': flowSettingClass,
  329. data: { flowNo: v, path: data.path, parentPath: data.parentPath }
  330. }).append($('<i>', { 'class': 'fa fa-list' }));
  331. if (opts.flowDetailFun && $.isFunction(opts.flowDetailFun)) {
  332. $detail.on('click', function (event) {
  333. event.preventDefault();
  334. event.stopPropagation();
  335. opts.flowDetailFun.call($detail, data.path, data.parentPath, $detail);
  336. });
  337. }
  338. var $flow = $('<div>', { 'class': flowInfoClass })
  339. .append($('<div>', { 'class': flowNameClass, text:v+" "+ name }))
  340. .append($detail);
  341. that.customMenu($detail, function ($node, $menu) {
  342. $menu.find("a.dropdown-item").hide();
  343. $menu.find("a.dropdown-item.flow-d").show();
  344. if (opts.customMenuBefore && $.type(opts.customMenuBefore) === 'function') {
  345. opts.customMenuBefore($node, $menu);
  346. }
  347. });
  348. $flowInfoBox.append($flow);
  349. });
  350. }
  351. return $flowInfoBox;
  352. },
  353. customMenu: function ($node,beforeFun) {
  354. var that = this;
  355. var opts = that.options;
  356. var $menu = typeof opts.customMenu === 'string' ? $('#' + opts.customMenu) : $(opts.customMenu);;
  357. $node.css('cursor', 'help');
  358. $node.contextmenu(function (e) {
  359. if (beforeFun && $.type(beforeFun) === 'function') {
  360. beforeFun($node, $menu);
  361. }
  362. e = e || window.event;
  363. //鼠标点的坐标
  364. var oX = e.clientX;
  365. var oY = e.clientY;
  366. //菜单出现后的位置
  367. $menu.fadeIn();
  368. $menu.offset({ top: oY, left: oX });
  369. //阻止浏览器默认事件
  370. return false; //一般点击右键会出现浏览器默认的右键菜单,写了这句代码就可以阻止该默认事件。)
  371. });
  372. $(document).on('click', function (e) {
  373. e = e || window.event;
  374. $menu.hide();
  375. });
  376. $node.on('click', function (e) {
  377. e = e || window.event;
  378. e.cancelBubble = true;
  379. });
  380. },
  381. zoomWheel: function (e) {
  382. var nt = e.data.nt;
  383. e.preventDefault();
  384. var newScale = 1 + (e.originalEvent.deltaY > 0 ? -0.05 : 0.05);
  385. nt.setChartScale(nt.$nodeTree, newScale);
  386. },
  387. setChartScale: function ($nodeTree, newScale) {
  388. var that = this;
  389. var opts = that.options;
  390. var lastTf = $nodeTree.css('transform');
  391. var matrix = '';
  392. var targetScale = 1;
  393. if (lastTf === 'none') {
  394. $nodeTree.css('transform', 'scale(' + newScale + ',' + newScale + ')');
  395. } else {
  396. matrix = lastTf.split(',');
  397. if (lastTf.indexOf('3d') === -1) {
  398. targetScale = Math.abs(window.parseFloat(matrix[3]) * newScale);
  399. if (targetScale > opts.zoomMinLimit && targetScale < opts.zoomMaxLimit) {
  400. $nodeTree.css('transform', lastTf + ' scale(' + newScale + ',' + newScale + ')');
  401. }
  402. } else {
  403. targetScale = Math.abs(window.parseFloat(matrix[1]) * newScale);
  404. if (targetScale > opts.zoomMinLimit && targetScale < opts.zoomMaxLimit) {
  405. $nodeTree.css('transform', lastTf + ' scale3d(' + newScale + ',' + newScale + ', 1)');
  406. }
  407. }
  408. }
  409. },
  410. drag: function ($node) {
  411. var that = this;
  412. var opts = that.options;
  413. var x = 0;
  414. var y = 0;
  415. var l = 0;
  416. var t = 0;
  417. var cursor = 'pointer';
  418. var timeout = undefined;
  419. $node.data('drag', false);
  420. //点击(松开后触发)
  421. $node.mousedown(function (e) {
  422. if (e.which === 3) {//禁止右键拖动
  423. return;
  424. }
  425. var $this = $(this);
  426. timeout = setTimeout(function() {
  427. //获取x坐标和y坐标
  428. x = e.clientX;
  429. y = e.clientY;
  430. //获取左部和顶部的偏移量
  431. l = that.$nodeTree.offset().left;
  432. t = that.$nodeTree.offset().top;
  433. //开关打开
  434. $node.data('drag', true);
  435. that.$nodeTree.fadeTo(20, 0.5);
  436. //设置样式
  437. cursor = $this.css('cursor');
  438. $this.css('cursor', 'move');
  439. }, opts.dragDelay);
  440. });
  441. that.$nodeContainer.mousemove(function (e) {
  442. e.preventDefault();
  443. if ($node.data('drag') !== true) {
  444. return;
  445. }
  446. //获取x和y
  447. var nx = e.clientX;
  448. var ny = e.clientY;
  449. //计算移动后的左偏移量和顶部的偏移量
  450. var nl = nx - (x - l);
  451. var nt = ny - (y - t);
  452. that.$nodeTree.offset({ top: nt, left: nl });
  453. });
  454. $node.mouseup(function () {
  455. //开关打开
  456. $node.data('drag', false);
  457. that.$nodeTree.fadeTo("fast", 1);
  458. //设置样式
  459. $(this).css('cursor', cursor);
  460. clearTimeout(timeout);
  461. });
  462. //$node.mouseleave(function(e) {
  463. // //开关打开
  464. // $node.data('drag', false).fadeTo("fast", 1);
  465. // //设置样式
  466. // $(this).css('cursor', 'default');
  467. //});
  468. },
  469. exportData: function (input) {
  470. var that = this;
  471. var $nodeContainer = this.$nodeContainer;
  472. input = input || this.options.exportDataInput;
  473. if ($(this).children('.spinner').length) {
  474. return false;
  475. }
  476. var img;
  477. var sourceChart = $nodeContainer.addClass('canvasContainer').find('.' + treeClass + ':not(".hidden")').get(0);
  478. var flag = that.options.direction === 'l2r' || that.options.direction === 'r2l';
  479. window.html2canvas(sourceChart, {
  480. 'width': flag ? sourceChart.clientHeight : sourceChart.clientWidth,
  481. 'height': flag ? sourceChart.clientWidth : sourceChart.clientHeight,
  482. 'onclone': function (cloneDoc) {
  483. $(cloneDoc).find('.canvasContainer').css('overflow', 'visible')
  484. .find('.' + treeClass + ':not(".hidden"):first').css('transform', '');
  485. },
  486. 'onrendered': function (canvas) {
  487. img = canvas.toDataURL("image/png");
  488. console.log("exportData-over");
  489. input.val(img);
  490. }
  491. })
  492. .then(function () {
  493. $nodeContainer.removeClass('canvasContainer');
  494. });
  495. return img;
  496. },
  497. refresh: function(opt) {
  498. var that = this;
  499. var opts = $.extend({}, this.options, opt || {});
  500. var data = opts.data, $node = opts.node, str, $that,$setting;
  501. if (data) {
  502. switch (opts.type) {
  503. case 'roundSetting':
  504. case 'guide':
  505. case 'PRE':
  506. case 'RUN':
  507. case 'POST':
  508. if ($node.hasClass(roundSettingClass)) {
  509. str = that.buildRoundSetting(data);
  510. $node.find('.' + contentClass).empty().html(str);
  511. } else if ($node.hasClass(settingBoxClass)) {
  512. str = that.buildSetting(data);
  513. $node.empty().html(str);
  514. } else if ($node.hasClass(nodeRoundClass)) {
  515. var $settingBox = $node.parent().find('.' + roundSettingClass);
  516. if ($settingBox.length === 1) {
  517. str = that.buildRoundSetting(data);
  518. $settingBox.find('.' + contentClass).empty().html(str);
  519. }
  520. }
  521. $setting = $node;
  522. break;
  523. case 'flow':
  524. var $info = that.buildFlowInfo(data);
  525. $node.empty().append($info);
  526. break;
  527. case 'addRound':
  528. $('.' + roundClass + ' .' + nodeRoundClass).removeClass('last');
  529. var $round = that.buildRoundInfo(data, true);
  530. $node.parent().after($round);
  531. $setting = $round;
  532. break;
  533. case 'deleteRound':
  534. $node.closest('.round-box').prev().find('.round-node').addClass('last');
  535. $node.closest('.round-box').remove();
  536. break;
  537. case 'addBlock':
  538. $that = $node.closest('.' + nodeBlockClass);
  539. var $item = that.buildEvTab(data);
  540. $that.find('.tab-box .nav').append($item);
  541. var $pane = that.buildEvTabPane(data);
  542. $that.find('.tab-content-box .tab-content').append($pane);
  543. $item.find('.nav-link').tab('show');
  544. break;
  545. case 'deleteBlock':
  546. $that = $node.closest('.' + nodeBlockClass);
  547. if ($node.find('.nav-link').hasClass('active')) {
  548. $that.find('.tab-box .nav .nav-item').eq(0).find('.nav-link').tab('show');
  549. $that.find('.tab-content-box .tab-content .tab-pane').eq(0).addClass('active show');
  550. }
  551. $node.remove();
  552. $that.find('.tab-content-box .tab-content').find('#ev-block-' + data.path).remove();
  553. break;
  554. default:
  555. init(data);
  556. break;
  557. }
  558. if ($setting) {
  559. $setting.find('.setting').off("click.setting").on("click.setting", function () { that.options.settingFun($(this)); });
  560. }
  561. }
  562. }
  563. };
  564. var allowedMethods = ["refresh"];
  565. $.fn.packageTree = function (option) {
  566. var value,
  567. args = Array.prototype.slice.call(arguments, 1);
  568. this.each(function () {
  569. var $this = $(this);
  570. var data = $this.data('iwb.package.tree'),
  571. options = $.extend({}, $this.data(),
  572. typeof option === 'object' && option);
  573. if (typeof option === 'string') {
  574. if ($.inArray(option, allowedMethods) < 0) {
  575. throw new Error("Unknown method: " + option);
  576. }
  577. if (!data) {
  578. return;
  579. }
  580. value = data[option].apply(data, args);
  581. //if (option === 'destroy') {
  582. // $this.removeData('iwb.package.tree');
  583. // $this.removeData('iwb.package.tree.init');
  584. // return;
  585. //}
  586. } else {
  587. data = new PackageTree(this, options).init();
  588. $this.data('iwb.package.tree', data);
  589. }
  590. //if ($this.data('iwb.package.tree.init')) {
  591. // return;
  592. //}
  593. //$this.data('iwb.package.tree.init', true);
  594. //if (!data) {
  595. // data = new PackageTree(this, options).init();
  596. // $this.data('iwb.package.tree', data);
  597. //}
  598. });
  599. return typeof value === 'undefined' ? this : value;
  600. };
  601. }));