main.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856
  1. /*
  2. 添加节点类别
  3. */
  4. function addNode(parentId, nodeId, nodeLable, position, isDisplay) {
  5. var panel = d3.select("#" + parentId);
  6. panel.append('div')
  7. .style('position', 'absolute')
  8. .style('top', position.y).style('left', position.x)
  9. .style('border', 'none').attr('align', 'center')
  10. // .style('background','#4169E1')
  11. .style('border-radius', '9px')
  12. // .style('cursor', 'pointer')
  13. .style('color', '#4169E1')
  14. .style('font-size', '25px')
  15. .style('padding-left', '10px')
  16. .style('padding-right', '10px')
  17. .style('padding-top', '5px')
  18. .style('padding-bottom', '5px')
  19. .style("margin", '0 auto')
  20. .attr('id', nodeId).classed('node', true)
  21. // .attr('data-toggle','modal')
  22. // .attr('data-target',"#myModal")
  23. // .attr('onclick', 'openMyModal(\'' + nodeId + '\')')
  24. .text(nodeLable);
  25. panel.append('div')
  26. .style('position', 'absolute')
  27. .style('top', (parseInt(position.y.split("px")[0]) + 40).toString() + 'px').style('left', position.x)
  28. .style('border', 'none').attr('align', 'center')
  29. // .style('background','#4169E1')
  30. .style('width', (document.getElementById(nodeId).offsetWidth).toString() + 'px')
  31. .style('text-align', 'center')
  32. .style('border-radius', '9px')
  33. .style('cursor', 'pointer')
  34. .style('color', '#4169E1')
  35. .style('font-size', '25px')
  36. .style('padding-left', '10px')
  37. .style('padding-right', '10px')
  38. .style('padding-top', '5px')
  39. .style('padding-bottom', '5px')
  40. .style("margin", '0 auto')
  41. .attr('id', nodeId + "btn")
  42. .classed('node', true)
  43. // .attr('data-toggle','modal')
  44. // .attr('data-target',"#myModal")
  45. .attr('onclick', 'openMyModal(\'' + nodeId + '\')')
  46. .text("+");
  47. return jsPlumb.getSelector('#' + nodeId)[0];
  48. }
  49. /*
  50. 添加两侧节点
  51. */
  52. function addSideNode(parentId, nodeId, nodeLable, position, isDisplay) {
  53. var panel = d3.select("#" + parentId);
  54. panel.append('div')
  55. .style('position', 'absolute')
  56. .style('top', position.y).style('left', position.x)
  57. .style('border', '1px #4169E1 solid').attr('align', 'center')
  58. .style('background', '#4169E1')
  59. .style('cursor', 'pointer')
  60. .style('border-radius', '9px')
  61. .style('color', 'white')
  62. .style('font-size', '25px')
  63. .style('padding-left', '10px')
  64. .style('padding-right', '10px')
  65. .style('padding-top', '5px')
  66. .style('padding-bottom', '5px')
  67. .style("margin", '0 auto')
  68. .attr('id', nodeId).classed('node', true)
  69. .text(nodeLable);
  70. isDisplay ? panel.append('div')
  71. .style('position', 'absolute')
  72. .style('top', (parseInt(position.y.split("px")[0]) + 40).toString() + 'px').style('left', position.x)
  73. .style('border', 'none').attr('align', 'center')
  74. // .style('background','#4169E1')
  75. .style('width', (document.getElementById(nodeId).offsetWidth).toString() + 'px')
  76. .style('text-align', 'center')
  77. .style('border-radius', '9px')
  78. .style('cursor', 'pointer')
  79. .style('color', '#4169E1')
  80. .style('font-size', '25px')
  81. .style('padding-left', '10px')
  82. .style('padding-right', '10px')
  83. .style('padding-top', '5px')
  84. .style('padding-bottom', '5px')
  85. .style("margin", '0 auto')
  86. .attr('id', nodeId + "btn")
  87. .classed('node', true)
  88. // .attr('data-toggle','modal')
  89. // .attr('data-target',"#myModal")
  90. .attr('onclick', 'openAppendModal(\'' + nodeId + '\')')
  91. .text("+") : "";
  92. return jsPlumb.getSelector('#' + nodeId)[0];
  93. }
  94. /*
  95. 添加中间节点
  96. */
  97. function addMiddleNode(parentId, nodeId, nodeLable, position, isDisplay) {
  98. var panel = d3.select("#" + parentId);
  99. panel.append('div')
  100. .style('position', 'absolute')
  101. .style('top', position.y).style('left', position.x)
  102. .style('border', '1px #4169E1 solid').attr('align', 'center')
  103. .style('background', '#ffffff')
  104. .style('cursor', 'pointer')
  105. .style('border-radius', '9px')
  106. .style('color', '#4169E1')
  107. .style('font-size', '25px')
  108. .style('padding-left', '10px')
  109. .style('padding-right', '10px')
  110. .style('padding-top', '5px')
  111. .style('padding-bottom', '5px')
  112. .style("margin", '0 auto')
  113. .attr('id', nodeId).classed('node', true)
  114. .text(nodeLable);
  115. isDisplay ? panel.append('div')
  116. .style('position', 'absolute')
  117. .style('top', (parseInt(position.y.split("px")[0]) + 40).toString() + 'px').style('left', position.x)
  118. .style('border', 'none').attr('align', 'center')
  119. // .style('background','#4169E1')
  120. .style('width', (document.getElementById(nodeId).offsetWidth).toString() + 'px')
  121. .style('text-align', 'center')
  122. .style('border-radius', '9px')
  123. .style('cursor', 'pointer')
  124. .style('color', '#4169E1')
  125. .style('font-size', '25px')
  126. .style('padding-left', '10px')
  127. .style('padding-right', '10px')
  128. .style('padding-top', '5px')
  129. .style('padding-bottom', '5px')
  130. .style("margin", '0 auto')
  131. .attr('id', nodeId + "btn")
  132. .classed('node', true)
  133. // .attr('data-toggle','modal')
  134. // .attr('data-target',"#myModal")
  135. .attr('onclick', 'openAppendModal(\'' + nodeId + '\')')
  136. .text("+") : "";
  137. return jsPlumb.getSelector('#' + nodeId)[0];
  138. }
  139. var aaa = 1;
  140. /*
  141. 添加节点类别输入
  142. */
  143. function addTypeInput() {
  144. if (event.keyCode == 13) {
  145. aaa = aaa + 1;
  146. var name = "types" + aaa.toString();
  147. var str = '<div class="form-group"><label style="vertical-align: middle;display:inline-block;width: 100%;">' + aaa + '<input type="text" id="' + name + '" class="form-control" placeholder="请输入节点类别名字" style="width: 92%;display:inline-block;margin-left: 5px;" onkeydown="addTypeInput()"></label></div>'
  148. $("#bbb").append(str);
  149. var inputs = document.getElementById("bbb").getElementsByTagName("input");
  150. inputs[inputs.length - 1].focus();
  151. }
  152. }
  153. /*
  154. 添加节点名字输入
  155. */
  156. function addInput() {
  157. if (event.keyCode == 13) {
  158. aaa = aaa + 1;
  159. var name = "names" + aaa.toString();
  160. var str = '<div class="form-group"><label style="vertical-align: middle;display:inline-block;width: 100%;">' + aaa + '<input type="text" id="' + name + '" class="form-control" placeholder="请输入节点名字" style="width: 92%;display:inline-block;margin-left: 5px;" onkeydown="addInput()"></label></div>';
  161. $("#aaa").append(str);
  162. var inputs = document.getElementById("aaa").getElementsByTagName("input");
  163. inputs[inputs.length - 1].focus();
  164. }
  165. }
  166. /*
  167. 追加节点名字输入
  168. */
  169. function addAppendInput() {
  170. if (event.keyCode == 13) {
  171. aaa = aaa + 1;
  172. var name = "appendnames" + aaa.toString();
  173. var str = '<div class="form-group"><label style="vertical-align: middle;display:inline-block;width: 100%;">' + aaa + '<input type="text" id="' + name + '" class="form-control" placeholder="请输入节点名字" style="width: 92%;display:inline-block;margin-left: 5px;" onkeydown="addAppendInput()"></label></div>';
  174. $("#ccc").append(str);
  175. var inputs = document.getElementById("ccc").getElementsByTagName("input");
  176. inputs[inputs.length - 1].focus();
  177. }
  178. }
  179. /*
  180. 手动打开添加节点模态框
  181. */
  182. function openMyModal(id) {
  183. $("#myModal").modal('show');
  184. $("#column").val(id.split("node")[1])
  185. }
  186. /*
  187. 手动打开追加节点模态框
  188. */
  189. function openAppendModal(id) {
  190. $("#appendModal").modal('show');
  191. $("#appendNode").val(id)
  192. }
  193. /*
  194. 提交节点类别
  195. */
  196. function SubmitType() {
  197. for (var i = 1; i <= aaa; i++) {
  198. if (i == 1) {
  199. var b = 20;
  200. var a = addNode('flow-panel', 'node1', $('#types' + i).val(), { x: '80px', y: b.toString() + 'px' });
  201. }
  202. else if (i == 2) {
  203. var b = 20;
  204. var a = addNode('flow-panel', 'node2', $('#types' + i).val(), { x: '380px', y: b.toString() + 'px' });
  205. }
  206. else if (i == 3) {
  207. var b = 20;
  208. var a = addNode('flow-panel', 'node3', $('#types' + i).val(), { x: '680px', y: b.toString() + 'px' });
  209. }
  210. else {
  211. var b = 20;
  212. var a = addNode('flow-panel', 'node4', $('#types' + i).val(), { x: '980px', y: b.toString() + 'px' });
  213. }
  214. $('#types' + i).val('');
  215. }
  216. $("#bbb").html("");
  217. aaa = 1;
  218. var str = '<div class="form-group"><label style="vertical-align: middle;display:inline-block;width: 100%;">1<input type="text" id="types1" class="form-control" placeholder="请输入节点类别名字" style="width: 92%;display:inline-block;" onkeydown="addTypeInput()"></label></div>'
  219. $("#bbb").append(str);
  220. $("#Modal").modal('hide');
  221. }
  222. var globalInstance;
  223. /*
  224. 提交添加节点
  225. */
  226. function SubmitNode(instance) {
  227. var column = $('#column').val();
  228. $('#node' + column.toString() + "btn").remove();
  229. if (column == 1) {
  230. for (var i = 1; i <= aaa; i++) {
  231. if (i == aaa) {
  232. var b = 20 + i * 80;
  233. var a = addSideNode('flow-panel', 'nodeA' + i.toString(), $('#names' + i.toString()).val(), { x: '80px', y: b.toString() + 'px' }, true);
  234. addPorts(instance, a, ['out'], 'output');
  235. // instance.makeSource(a, {
  236. // endpoint: "Dot",
  237. // anchor: ["Perimeter", { shape: "Circle" }],
  238. // MaxConnections: -1
  239. // })
  240. }
  241. else {
  242. var b = 20 + i * 80;
  243. var a = addSideNode('flow-panel', 'nodeA' + i.toString(), $('#names' + i.toString()).val(), { x: '80px', y: b.toString() + 'px' }, false);
  244. addPorts(instance, a, ['out'], 'output');
  245. // instance.makeSource(a, {
  246. // endpoint: "Dot",
  247. // anchor: ["Perimeter", { shape: "Circle" }],
  248. // MaxConnections: -1
  249. // })
  250. }
  251. $('#names' + i).val('')
  252. }
  253. }
  254. else if (column == 2) {
  255. for (var i = 1; i <= aaa; i++) {
  256. if (i == aaa) {
  257. var b = 20 + i * 80;
  258. var a = addMiddleNode('flow-panel', 'nodeB' + i.toString(), $('#names' + i.toString()).val(), { x: '380px', y: b.toString() + 'px' }, true);
  259. addPorts(instance, a, ['in'], 'input');
  260. addPorts(instance, a, ['out'], 'output');
  261. // instance.makeSource(a, {
  262. // endpoint: "Dot",
  263. // anchor: ["Perimeter", { shape: "Circle" }],
  264. // MaxConnections: -1
  265. // })
  266. // instance.makeTarget(a, {
  267. // endpoint: "Dot",
  268. // anchor: ["Perimeter", { shape: "Circle" }],
  269. // MaxConnections: -1
  270. // })
  271. }
  272. else {
  273. var b = 20 + i * 80;
  274. var a = addMiddleNode('flow-panel', 'nodeB' + i.toString(), $('#names' + i.toString()).val(), { x: '380px', y: b.toString() + 'px' }, false);
  275. addPorts(instance, a, ['in'], 'input');
  276. addPorts(instance, a, ['out'], 'output');
  277. // instance.makeSource(a, {
  278. // endpoint: "Dot",
  279. // anchor: ["Perimeter", { shape: "Circle" }],
  280. // MaxConnections: -1
  281. // })
  282. // instance.makeTarget(a, {
  283. // endpoint: "Dot",
  284. // anchor: ["Perimeter", { shape: "Circle" }],
  285. // MaxConnections: -1
  286. // })
  287. }
  288. $('#names' + i).val('')
  289. }
  290. }
  291. else if (column == 3) {
  292. for (var i = 1; i <= aaa; i++) {
  293. if (i == aaa) {
  294. var b = 20 + i * 80;
  295. var a = addMiddleNode('flow-panel', 'nodeC' + i.toString(), $('#names' + i.toString()).val(), { x: '680px', y: b.toString() + 'px' }, true);
  296. addPorts(instance, a, ['in'], 'input');
  297. addPorts(instance, a, ['out'], 'output');
  298. // instance.makeSource(a, {
  299. // endpoint: "Dot",
  300. // anchor: ["Perimeter", { shape: "Circle" }],
  301. // MaxConnections: -1
  302. // })
  303. // instance.makeTarget(a, {
  304. // endpoint: "Dot",
  305. // anchor: ["Perimeter", { shape: "Circle" }],
  306. // MaxConnections: -1
  307. // })
  308. }
  309. else {
  310. var b = 20 + i * 80;
  311. var a = addMiddleNode('flow-panel', 'nodeC' + i.toString(), $('#names' + i.toString()).val(), { x: '680px', y: b.toString() + 'px' }, false);
  312. addPorts(instance, a, ['in'], 'input');
  313. addPorts(instance, a, ['out'], 'output');
  314. // instance.makeSource(a, {
  315. // endpoint: "Dot",
  316. // anchor: ["Perimeter", { shape: "Circle" }],
  317. // MaxConnections: -1
  318. // })
  319. // instance.makeTarget(a, {
  320. // endpoint: "Dot",
  321. // anchor: ["Perimeter", { shape: "Circle" }],
  322. // MaxConnections: -1
  323. // })
  324. }
  325. $('#names' + i).val('')
  326. }
  327. }
  328. else {
  329. for (var i = 1; i <= aaa; i++) {
  330. if (i == aaa) {
  331. var b = 20 + i * 80;
  332. var a = addSideNode('flow-panel', 'nodeD' + i.toString(), $('#names' + i.toString()).val(), { x: '980px', y: b.toString() + 'px' }, true);
  333. addPorts(instance, a, ['in'], 'input');
  334. // instance.makeTarget(a, {
  335. // endpoint: "Dot",
  336. // anchor: ["Perimeter", { shape: "Circle" }],
  337. // MaxConnections: -1
  338. // })
  339. }
  340. else {
  341. var b = 20 + i * 80;
  342. var a = addSideNode('flow-panel', 'nodeD' + i.toString(), $('#names' + i.toString()).val(), { x: '980px', y: b.toString() + 'px' }, false);
  343. addPorts(instance, a, ['in'], 'input');
  344. // instance.makeTarget(a, {
  345. // endpoint: "Dot",
  346. // anchor: ["Perimeter", { shape: "Circle" }],
  347. // MaxConnections: -1
  348. // })
  349. }
  350. $('#names' + i).val('')
  351. }
  352. }
  353. $('#column').val('');
  354. $("#aaa").html("");
  355. aaa = 1;
  356. var str = '<div class="form-group"><label style="vertical-align: middle;display:inline-block;width: 100%;">1 <input type="text" id="names1" class="form-control" placeholder="请输入节点名字" style="width: 92%;display:inline-block;" onkeydown="addInput()"></label></div>'
  357. $("#aaa").append(str);
  358. $("#myModal").modal('hide');
  359. globalInstance = instance;
  360. }
  361. /*
  362. 提交追加节点
  363. */
  364. function SubmitAppendNode(instance, id) {
  365. var column = id.split("node")[1];
  366. if (column.indexOf("A") != -1) {
  367. $('#' + id + 'btn').remove();
  368. for (var i = 1; i <= aaa; i++) {
  369. var j = i + parseInt(column.split("A")[1]);
  370. if (i == aaa) {
  371. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  372. var a = addSideNode('flow-panel', 'nodeA' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '80px', y: b.toString() + 'px' }, true);
  373. addPorts(instance, a, ['out'], 'output');
  374. // instance.makeSource(a, {
  375. // endpoint: "Dot",
  376. // anchor: ["Perimeter", { shape: "Circle" }],
  377. // MaxConnections: -1
  378. // })
  379. }
  380. else {
  381. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  382. var a = addSideNode('flow-panel', 'nodeA' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '80px', y: b.toString() + 'px' }, false);
  383. addPorts(instance, a, ['out'], 'output');
  384. // instance.makeSource(a, {
  385. // endpoint: "Dot",
  386. // anchor: ["Perimeter", { shape: "Circle" }],
  387. // MaxConnections: -1
  388. // })
  389. }
  390. $('#appendnames' + i).val('')
  391. }
  392. }
  393. else if (column.indexOf("B") != -1) {
  394. $('#' + id + 'btn').remove();
  395. for (var i = 1; i <= aaa; i++) {
  396. var j = i + parseInt(column.split("B")[1]);
  397. if (i == aaa) {
  398. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  399. var a = addMiddleNode('flow-panel', 'nodeB' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '380px', y: b.toString() + 'px' }, true);
  400. addPorts(instance, a, ['in'], 'input');
  401. addPorts(instance, a, ['out'], 'output');
  402. // instance.makeSource(a, {
  403. // endpoint: "Dot",
  404. // anchor: ["Perimeter", { shape: "Circle" }],
  405. // MaxConnections: -1
  406. // })
  407. // instance.makeTarget(a, {
  408. // endpoint: "Dot",
  409. // anchor: ["Perimeter", { shape: "Circle" }],
  410. // MaxConnections: -1
  411. // })
  412. }
  413. else {
  414. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  415. var a = addMiddleNode('flow-panel', 'nodeB' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '380px', y: b.toString() + 'px' }, false);
  416. addPorts(instance, a, ['in'], 'input');
  417. addPorts(instance, a, ['out'], 'output');
  418. // instance.makeSource(a, {
  419. // endpoint: "Dot",
  420. // anchor: ["Perimeter", { shape: "Circle" }],
  421. // MaxConnections: -1
  422. // })
  423. // instance.makeTarget(a, {
  424. // endpoint: "Dot",
  425. // anchor: ["Perimeter", { shape: "Circle" }],
  426. // MaxConnections: -1
  427. // })
  428. }
  429. $('#appendnames' + i).val('')
  430. }
  431. }
  432. else if (column.indexOf("C") != -1) {
  433. $('#' + id + 'btn').remove();
  434. for (var i = 1; i <= aaa; i++) {
  435. var j = i + parseInt(column.split("C")[1]);
  436. if (i == aaa) {
  437. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  438. var a = addMiddleNode('flow-panel', 'nodeC' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '680px', y: b.toString() + 'px' }, true);
  439. addPorts(instance, a, ['in'], 'input');
  440. addPorts(instance, a, ['out'], 'output');
  441. // instance.makeSource(a, {
  442. // endpoint: "Dot",
  443. // anchor: ["Perimeter", { shape: "Circle" }],
  444. // MaxConnections: -1
  445. // })
  446. // instance.makeTarget(a, {
  447. // endpoint: "Dot",
  448. // anchor: ["Perimeter", { shape: "Circle" }],
  449. // MaxConnections: -1
  450. // })
  451. }
  452. else {
  453. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  454. var a = addMiddleNode('flow-panel', 'nodeC' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '680px', y: b.toString() + 'px' }, false);
  455. addPorts(instance, a, ['in'], 'input');
  456. addPorts(instance, a, ['out'], 'output');
  457. // instance.makeSource(a, {
  458. // endpoint: "Dot",
  459. // anchor: ["Perimeter", { shape: "Circle" }],
  460. // MaxConnections: -1
  461. // })
  462. // instance.makeTarget(a, {
  463. // endpoint: "Dot",
  464. // anchor: ["Perimeter", { shape: "Circle" }],
  465. // MaxConnections: -1
  466. // })
  467. }
  468. $('#appendnames' + i).val('')
  469. }
  470. }
  471. else {
  472. $('#' + id + 'btn').remove();
  473. for (var i = 1; i <= aaa; i++) {
  474. var j = i + parseInt(column.split("D")[1]);
  475. if (i == aaa) {
  476. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  477. var a = addSideNode('flow-panel', 'nodeD' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '980px', y: b.toString() + 'px' }, true);
  478. addPorts(instance, a, ['in'], 'input');
  479. // instance.makeTarget(a, {
  480. // endpoint: "Dot",
  481. // anchor: ["Perimeter", { shape: "Circle" }],
  482. // MaxConnections: -1
  483. // })
  484. }
  485. else {
  486. var b = parseInt(document.getElementById(id).style.top.split("px")[0]) + i * 80;
  487. var a = addSideNode('flow-panel', 'nodeD' + j.toString(), $('#appendnames' + i.toString()).val(), { x: '980px', y: b.toString() + 'px' }, false);
  488. addPorts(instance, a, ['in'], 'input');
  489. // instance.makeTarget(a, {
  490. // endpoint: "Dot",
  491. // anchor: ["Perimeter", { shape: "Circle" }],
  492. // MaxConnections: -1
  493. // })
  494. }
  495. $('#appendnames' + i).val('')
  496. }
  497. }
  498. $('#appendNode').val('');
  499. $("#ccc").html("");
  500. aaa = 1;
  501. var str = '<div class="form-group"><label style="vertical-align: middle;display:inline-block;width: 100%;">1 <input type="text" id="appendnames1" class="form-control" placeholder="请输入节点名字" style="width: 92%;display:inline-block;" onkeydown="addAppendInput()"></label></div>'
  502. $("#ccc").append(str);
  503. $("#appendModal").modal('hide');
  504. globalInstance = instance;
  505. }
  506. function modifyNode(text, id) {
  507. var left = document.getElementById(id).style.left;
  508. var top = document.getElementById(id).style.top;
  509. document.getElementById(id).nextElementSibling.remove();
  510. $("#" + id).remove();
  511. if (id.indexOf("nodeA") != -1) {
  512. var a = addSideNode('flow-panel', 'nodeA' + id.split("nodeA")[1], text, { x: left, y: top });
  513. addPorts(globalInstance, a, ['out'], 'output');
  514. // globalInstance.makeSource(a, {
  515. // endpoint: "Dot",
  516. // anchor: ["Perimeter", { shape: "Circle" }],
  517. // MaxConnections: -1
  518. // })
  519. // document.getElementById(id).nextElementSibling.style.left = (parseInt(document.getElementById(id).style.left.split("px")[0]) + parseInt((parseInt((document.getElementById(id).offsetWidth)) / 10)) * 10).toString() + "px";
  520. }
  521. else if (id.indexOf("nodeB") != -1) {
  522. var a = addMiddleNode('flow-panel', 'nodeB' + id.split("nodeB")[1], text, { x: left, y: top });
  523. addPorts(globalInstance, a, ['in'], 'input');
  524. addPorts(globalInstance, a, ['out'], 'output');
  525. // globalInstance.makeSource(a, {
  526. // endpoint: "Dot",
  527. // anchor: ["Perimeter", { shape: "Circle" }],
  528. // MaxConnections: -1
  529. // })
  530. // globalInstance.makeTarget(a, {
  531. // endpoint: "Dot",
  532. // anchor: ["Perimeter", { shape: "Circle" }],
  533. // MaxConnections: -1
  534. // })
  535. }
  536. else if (id.indexOf("nodeC") != -1) {
  537. var a = addMiddleNode('flow-panel', 'nodeC' + id.split("nodeC")[1], text, { x: left, y: top });
  538. addPorts(globalInstance, a, ['in'], 'input');
  539. addPorts(globalInstance, a, ['out'], 'output');
  540. // globalInstance.makeSource(a, {
  541. // endpoint: "Dot",
  542. // anchor: ["Perimeter", { shape: "Circle" }],
  543. // MaxConnections: -1
  544. // })
  545. // globalInstance.makeTarget(a, {
  546. // endpoint: "Dot",
  547. // anchor: ["Perimeter", { shape: "Circle" }],
  548. // MaxConnections: -1
  549. // })
  550. }
  551. else {
  552. var a = addSideNode('flow-panel', 'nodeD' + id.split("nodeD")[1], text, { x: left, y: top });
  553. addPorts(globalInstance, a, ['in'], 'input');
  554. // globalInstance.makeTarget(a, {
  555. // endpoint: "Dot",
  556. // anchor: ["Perimeter", { shape: "Circle" }],
  557. // MaxConnections: -1
  558. // })
  559. }
  560. }
  561. /*
  562. 添加连接点
  563. */
  564. function addPorts(instance, node, ports, type) {
  565. //Assume horizental layout
  566. var number_of_ports = ports.length;
  567. var i = 0;
  568. var height = $(node).height(); //Note, jquery does not include border for height
  569. var y_offset = 1 / (number_of_ports + 1);
  570. var y = 0;
  571. var connectorStyle = {
  572. // 端点的样式
  573. // paintStyle: {
  574. // fill: '#7AB02C',
  575. // radius: 7
  576. // },
  577. // endpointStyle: { fill: 'lightgray', outlineStroke: 'darkgray', outlineWidth: 2 },
  578. // // // 鼠标移上样式
  579. // // hoverPaintStyle: {
  580. // // fill: '#216477',
  581. // // stroke: '#216477'
  582. // // },
  583. // // // 连线类型
  584. // connector: ['Straight', {
  585. // stub: [40, 60],
  586. // gap: 10,
  587. // cornerRadius: 5,
  588. // alwaysRespectStubs: true
  589. // }],
  590. // // // 连线样式
  591. // connectorStyle: {
  592. // strokeWidth: 3,
  593. // stroke: '#4169E1',
  594. // // joinstyle: 'round',
  595. // // outlineStroke: 'none',
  596. // // // 线外边的宽,值越大,线的点击范围越大
  597. // // outlineWidth: 10
  598. // },
  599. // connectorHoverStyle: {
  600. // stroke: 'green'
  601. // },
  602. connectorOverlays: [
  603. // 箭头
  604. ['Arrow', { width: 12, length: 12, location: 1 }]
  605. ]
  606. }
  607. for (; i < number_of_ports; i++) {
  608. var anchor = [0, 0, 0, 0];
  609. var paintStyle = { radius: 4, fillStyle: '#7FFFAA' };
  610. var isSource = false, isTarget = false;
  611. if (type === 'output') {
  612. anchor[0] = 1;
  613. paintStyle.fillStyle = '#7FFFAA';
  614. isSource = true;
  615. } else {
  616. isTarget = true;
  617. }
  618. anchor[1] = y + y_offset;
  619. y = anchor[1];
  620. instance.addEndpoint(node, {
  621. uuid: node.getAttribute("id") + "-" + ports[i],
  622. paintStyle: paintStyle,
  623. anchor: anchor,
  624. maxConnections: -1,
  625. isSource: isSource,
  626. isTarget: isTarget
  627. }, connectorStyle);
  628. }
  629. }
  630. /*
  631. 连接连接点
  632. */
  633. function connectPorts(instance, node1, port1, node2, port2) {
  634. // declare some common values:
  635. var color = "gray";
  636. var arrowCommon = { foldback: 0.8, fillStyle: color, width: 5 },
  637. // use three-arg spec to create two different arrows with the common values:
  638. overlays = [
  639. ["Arrow", { location: 0.8 }, arrowCommon],
  640. ["Arrow", { location: 0.2, direction: -1 }, arrowCommon]
  641. ];
  642. var uuid_source = node1.getAttribute("id") + "-" + port1;
  643. var uuid_target = node2.getAttribute("id") + "-" + port2;
  644. instance.connect({ uuids: [uuid_source, uuid_target] });
  645. }
  646. // function getTreeData() {
  647. // var tree = [
  648. // {
  649. // text: "Nodes",
  650. // nodes: [
  651. // {
  652. // text: "Node1",
  653. // },
  654. // {
  655. // text: "Node2"
  656. // }
  657. // ]
  658. // }
  659. // ];
  660. // return tree;
  661. // }
  662. jsPlumb.ready(function () {
  663. console.log("jsPlumb is ready to use");
  664. //Initialize JsPlumb
  665. var color = "#4169E1";
  666. var instance = jsPlumb.getInstance({
  667. // notice the 'curviness' argument to this Bezier curve. the curves on this page are far smoother
  668. // than the curves on the first demo, which use the default curviness value.
  669. Connector: ["Straight", { curviness: 50 }],
  670. DragOptions: { cursor: "pointer", zIndex: 2000 },
  671. PaintStyle: { strokeStyle: color, lineWidth: 2 },
  672. EndpointStyle: { radius: 4, fillStyle: color },
  673. HoverPaintStyle: { strokeStyle: "#4169E1" },
  674. EndpointHoverStyle: { fillStyle: "#7FFFAA" },
  675. Container: "flow-panel"
  676. });
  677. //Initialize Control Tree View
  678. // $('#control-panel').treeview({ data: getTreeData() });
  679. //Handle drag and drop
  680. // $('.list-group-item').attr('draggable', 'true').on('dragstart', function (ev) {
  681. // //ev.dataTransfer.setData("text", ev.target.id);
  682. // ev.originalEvent.dataTransfer.setData('text', ev.target.textContent);
  683. // console.log('drag start');
  684. // });
  685. // $('#flow-panel').on('drop', function (ev) {
  686. // //avoid event conlict for jsPlumb
  687. // if (ev.target.className.indexOf('_jsPlumb') >= 0) {
  688. // return;
  689. // }
  690. // ev.preventDefault();
  691. // var mx = '' + ev.originalEvent.offsetX + 'px';
  692. // var my = '' + ev.originalEvent.offsetY + 'px';
  693. // console.log('on drop : ' + ev.originalEvent.dataTransfer.getData('text'));
  694. // var uid = new Date().getTime();
  695. // var node = addNode('flow-panel', 'node' + uid, 'node', { x: mx, y: my });
  696. // addPorts(instance, node, ['out'], 'output');
  697. // addPorts(instance, node, ['in1', 'in2'], 'input');
  698. // instance.draggable($(node));
  699. // }).on('dragover', function (ev) {
  700. // ev.preventDefault();
  701. // console.log('on drag over');
  702. // });
  703. $("#SubmitNode").on('click', function () {
  704. SubmitNode(instance)
  705. });
  706. $("#SubmitType").on('click', function () {
  707. SubmitType()
  708. });
  709. $("#SubmitModify").on('click', function () {
  710. modifyNode($("#Node").val(), $("#modifyNode").val());
  711. $("#modifyModal").modal('hide');
  712. });
  713. $("#SubmitAppend").on('click', function () {
  714. SubmitAppendNode(instance, $("#appendNode").val());
  715. $("#appendModal").modal('hide');
  716. });
  717. var touchtime = new Date().getTime();
  718. $(document).on("click", function (e) {
  719. if ((new Date()).getTime() - touchtime < 500) {
  720. console.log("dblclick");
  721. e.preventDefault();
  722. if ($(e.target).attr('id') && $(e.target).attr('id').indexOf("node") != -1 && $(e.target).attr('id').indexOf("btn") == -1) {
  723. var v_id = $(e.target).attr('id');
  724. $("#modifyModal").modal('show');
  725. $("#modifyNode").val(v_id);
  726. var str = $("#" + v_id).text();
  727. $("#Node").val(str);
  728. }
  729. } else {
  730. touchtime = new Date().getTime();
  731. // console.log("click")
  732. }
  733. });
  734. $(document).on("mousedown", function (e) {
  735. time = setTimeout(() => {
  736. if ($(e.target).attr('id') && $(e.target).attr('id').indexOf("node") != -1 && $(e.target).attr('id').indexOf("btn") == -1) {
  737. instance.remove($(e.target).attr('id'))
  738. }
  739. }, 1000)
  740. });
  741. $(document).on("touchstart", function (e) {
  742. time = setTimeout(() => {
  743. if ($(e.target).attr('id') && $(e.target).attr('id').indexOf("node") != -1 && $(e.target).attr('id').indexOf("btn") == -1) {
  744. instance.remove($(e.target).attr('id'))
  745. }
  746. }, 1000)
  747. });
  748. $(document).on("mouseup", function (e) {
  749. clearTimeout(time);
  750. });
  751. $(document).on("touchend", function (e) {
  752. clearTimeout(time);
  753. });
  754. instance.doWhileSuspended(function () {
  755. // declare some common values:
  756. // var arrowCommon = { foldback:0.8, fillStyle:color, width:5 },
  757. // // use three-arg spec to create two different arrows with the common values:
  758. // overlays = [
  759. // [ "Arrow", { location:0.8 }, arrowCommon ],
  760. // [ "Arrow", { location:0.2, direction:-1 }, arrowCommon ]
  761. // ];
  762. // var node1 = addNode('flow-panel','node1', 'node1', {x:'80px',y:'20px'});
  763. // var node2 = addNode('flow-panel','node2', 'node2', {x:'280px',y:'20px'});
  764. // var node3 = addNode('flow-panel','node3', 'node3', {x:'500px',y:'20px'});
  765. // var node4 = addNode('flow-panel','node4', 'node4', {x:'700px',y:'20px'});
  766. // var node5 = addNode('flow-panel','node5', 'node5', {x:'80px',y:'100px'});
  767. // var node6 = addNode('flow-panel','node6', 'node6', {x:'700px',y:'100px'});
  768. // addPorts(instance, node1, ['out'],'output');
  769. // addPorts(instance, node2, ['in'],'input');
  770. // addPorts(instance, node2, ['out'],'output');
  771. // addPorts(instance, node3, ['in'],'input');
  772. // addPorts(instance, node3, ['out'],'output');
  773. // addPorts(instance, node4, ['in'],'input');
  774. // addPorts(instance, node5, ['out'],'output');
  775. // addPorts(instance, node6, ['in'],'input');
  776. // connectPorts(instance, node1, 'out', node2, 'in');
  777. instance.draggable($('.node'));
  778. });
  779. instance.bind('click', function (conn, originalEvent) {
  780. if (confirm('确定删除所点击的连接吗?')) {
  781. instance.detach(conn);
  782. }
  783. })
  784. jsPlumb.fire("jsFlowLoaded", instance);
  785. });