lr-workflow-ui.js 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  1. /*
  2. * 日 期:2017.03.22
  3. * 描 述:workflow-ui 工作流绘制组件
  4. */
  5. (function ($, learun) {
  6. "use strict";
  7. $.lrworkflow = {
  8. render: function ($self) {
  9. var dfop = $self[0].dfop;
  10. $self.addClass('lr-workflow');
  11. // 添加工具栏
  12. if (!dfop.isPreview) {
  13. var $tool = $('<div class="lr-workflow-tool" ></div>');
  14. $tool[0].dfop = dfop;
  15. $tool.append('<a type="cursor" class="lr-workflow-btndown" id="' + dfop.id + '_btn_cursor" title="' + dfop.nodeRemarks.cursor + '" ><b class="ico_cursor" /></a>');
  16. $tool.append('<a type="direct" class="lr-workflow-btn" id="' + dfop.id + '_btn_direct" title="' + dfop.nodeRemarks.direct + '" ><b class="ico_direct"/></a>');
  17. var toolbtnlen = dfop.toolBtns.length;
  18. if (toolbtnlen > 0) {
  19. $tool.append('<span></span>');
  20. for (var i = 0; i < toolbtnlen; ++i) {
  21. var btn = dfop.toolBtns[i];
  22. $tool.append('<a type="' + btn + '" id="' + dfop.id + '_btn_' + btn + '" class="lr-workflow-btn" title="' + dfop.nodeRemarks[btn] + '" ><b class="ico_' + btn + '"/></a>');//加入自定义按钮
  23. }
  24. }
  25. dfop.currentBtn = "cursor";
  26. $tool.on("click", function (e) {
  27. var $this = $(this);
  28. var dfop = $this[0].dfop;
  29. e = e || window.event;
  30. var tar;
  31. switch (e.target.tagName) {
  32. case "SPAN": return false;
  33. case "DIV": return false;
  34. case "B": tar = e.target.parentNode; break;
  35. case "A": tar = e.target;
  36. };
  37. var type = $(tar).attr("type");
  38. $.lrworkflow.switchToolBtn(dfop, type);
  39. return false;
  40. });
  41. $self.append($tool);
  42. }
  43. else {
  44. $self.addClass('lr-workflow-preview');
  45. }
  46. // 工作流画板(工作区域)
  47. $self.append('<div class="lr-workflow-work"></div>');
  48. var $workArea = $("<div class='lr-workflow-workinner' style='width:5000px;height:5000px'></div>")
  49. .attr({ "unselectable": "on", "onselectstart": 'return false', "onselect": 'document.selection.empty()' });
  50. $self.children(".lr-workflow-work").lrscroll();
  51. $self.children(".lr-workflow-work").find('.lr-scroll-box').append($workArea);
  52. $self.children(".lr-workflow-work").find('.lr-scroll-box').css({ 'width': 5000, 'height': 5000 });
  53. $workArea[0].dfop = dfop;
  54. $.lrworkflow.initDraw($workArea, dfop);
  55. $workArea.on("click", $.lrworkflow.clickWorkArea);
  56. $.lrworkflow.initNodeEvent($workArea);
  57. $.lrworkflow.initLineEvent($workArea);
  58. //对结点进行移动或者RESIZE时用来显示的遮罩层
  59. var $ghost = $("<div class='lr-workflow-rsghost'></div>").attr({ "unselectable": "on", "onselectstart": 'return false', "onselect": 'document.selection.empty()' });
  60. $self.append($ghost);
  61. var $lineMove = $('<div class="lr-workflow-linemover" style="display:none" ></div>');//操作折线时的移动框
  62. $workArea.append($lineMove);
  63. $lineMove.on("mousedown", { $workArea: $workArea }, function (e) {
  64. if (e.button == 2) return false;
  65. var lm = $(this);
  66. lm.css({ "background-color": "#333" });
  67. var $workArea = e.data.$workArea;
  68. var ev = $.lrworkflow.mousePosition(e), t = $.lrworkflow.getElCoordinate($workArea[0]);
  69. var X, Y;
  70. X = ev.x - t.left;
  71. Y = ev.y - t.top;
  72. var p = lm.position();
  73. var vX = X - p.left, vY = Y - p.top;
  74. var isMove = false;
  75. document.onmousemove = function (e) {
  76. if (!e) e = window.event;
  77. var ev = $.lrworkflow.mousePosition(e);
  78. var ps = lm.position();
  79. X = ev.x - t.left;
  80. Y = ev.y - t.top;
  81. if (lm.data("type") == "lr") {
  82. X = X - vX;
  83. if (X < 0) X = 0;
  84. else if (X > 5000)
  85. X = 5000;
  86. lm.css({ left: X + "px" });
  87. }
  88. else if (lm.data("type") == "tb") {
  89. Y = Y - vY;
  90. if (Y < 0) Y = 0;
  91. else if (Y > 5000)
  92. Y = 5000;
  93. lm.css({ top: Y + "px" });
  94. }
  95. isMove = true;
  96. }
  97. document.onmouseup = function (e) {
  98. var lineId = lm.data("tid");
  99. var dfop = $('#' + lineId)[0].dfop;
  100. if (isMove) {
  101. var p = lm.position();
  102. if (lm.data("type") == "lr")
  103. $.lrworkflow.setLineM(lineId, p.left + 3);
  104. else if (lm.data("type") == "tb")
  105. $.lrworkflow.setLineM(lineId, p.top + 3);
  106. }
  107. lm.css({ "background-color": "transparent" });
  108. if (dfop.focusId == lm.data("tid")) {
  109. $.lrworkflow.focusItem(lm.data("tid"));
  110. }
  111. document.onmousemove = null;
  112. document.onmouseup = null;
  113. }
  114. });
  115. // 设置线条工具条选定线时显示的操作框
  116. var $lineOper = $("<div class='lr-workflow-lineoper' style='display:none'><b class='lr'></b><b class='tb'></b><b class='sl'></b><b class='x'></b></div>");
  117. $workArea.append($lineOper);
  118. $lineOper.on("click", function (e) {
  119. if (!e) e = window.event;
  120. if (e.target.tagName != "A" && e.target.tagName != "B") return;
  121. var id = $(this).data("tid");
  122. var type = $(e.target).attr("class");
  123. if (type == 'x') {
  124. $.lrworkflow.delLine(id);
  125. this.style.display = "none";
  126. }
  127. else {
  128. $.lrworkflow.setLineType(id, type);
  129. }
  130. });
  131. },
  132. switchToolBtn: function (dfop, type) {
  133. var $oldBtn = $('#' + dfop.id + "_btn_" + dfop.currentBtn);
  134. var $newBtn = $('#' + dfop.id + "_btn_" + type);
  135. $oldBtn.removeClass('lr-workflow-btndown');
  136. $oldBtn.addClass('lr-workflow-btn');
  137. $newBtn.removeClass('lr-workflow-btn');
  138. $newBtn.addClass('lr-workflow-btndown');
  139. dfop.currentBtn = type;
  140. },
  141. initDraw: function ($workArea, dfop) {
  142. var $draw;
  143. var elem;
  144. $draw = document.createElementNS("http://www.w3.org/2000/svg", "svg");//可创建带有指定命名空间的元素节点
  145. $workArea.prepend($draw);
  146. var defs = document.createElementNS("http://www.w3.org/2000/svg", "defs");
  147. $draw.appendChild(defs);
  148. defs.appendChild($.lrworkflow.getSvgMarker("arrow1", "gray"));
  149. defs.appendChild($.lrworkflow.getSvgMarker("arrow2", "#ff3300"));
  150. defs.appendChild($.lrworkflow.getSvgMarker("arrow3", "#225ee1"));
  151. $draw.id = 'draw_' + dfop.id;
  152. $draw.style.width = "5000px";
  153. $draw.style.height = "5000px";
  154. },
  155. getSvgMarker: function (id, color) {
  156. var m = document.createElementNS("http://www.w3.org/2000/svg", "marker");
  157. m.setAttribute("id", id);
  158. m.setAttribute("viewBox", "0 0 6 6");
  159. m.setAttribute("refX", 5);
  160. m.setAttribute("refY", 3);
  161. m.setAttribute("markerUnits", "strokeWidth");
  162. m.setAttribute("markerWidth", 6);
  163. m.setAttribute("markerHeight", 6);
  164. m.setAttribute("orient", "auto");
  165. var path = document.createElementNS("http://www.w3.org/2000/svg", "path");
  166. path.setAttribute("d", "M 0 0 L 6 3 L 0 6 z");
  167. path.setAttribute("fill", color);
  168. path.setAttribute("stroke-width", 0);
  169. m.appendChild(path);
  170. return m;
  171. },
  172. clickWorkArea: function (e) {
  173. var $this = $(this);
  174. var dfop = $this[0].dfop;
  175. if (!dfop.isPreview) {
  176. e = e || window.event;
  177. var type = dfop.currentBtn;
  178. if (type == "cursor") {
  179. var t = $(e.target);
  180. var n = t.prop("tagName");
  181. if (n == "svg" || (n == "DIV" && t.prop("class").indexOf("lr-workflow-workinner") > -1)) {
  182. $.lrworkflow.blurItem(dfop);
  183. }
  184. return;
  185. }
  186. else if (type == "direct") {
  187. return;
  188. }
  189. var X, Y;
  190. var ev = $.lrworkflow.mousePosition(e), t = $.lrworkflow.getElCoordinate(this);
  191. X = ev.x - t.left;
  192. Y = ev.y - t.top;
  193. var name = dfop.nodeRemarks[type];
  194. var executeadd = true;
  195. if (type == 'startround') {
  196. name = "开始";
  197. if (dfop.hasStartround) {
  198. learun.alert.error('只能有一个开始节点');
  199. return false;
  200. }
  201. }
  202. if (type == 'endround') {
  203. name = "结束";
  204. if (dfop.hasEndround) {
  205. learun.alert.error('只能有一个结束节点');
  206. return false;
  207. }
  208. }
  209. $.lrworkflow.addNode($this, dfop, { id: learun.newGuid(), name: name, left: X, top: Y, type: type });
  210. }
  211. },
  212. // 取消所有结点/连线被选定的状态
  213. blurItem: function (dfop) {
  214. if (dfop.focusId != "") {
  215. var $item = $("#" + dfop.focusId);
  216. if ($item.prop("tagName") == "DIV") {
  217. $item.removeClass("lr-workflow-nodefocus");
  218. $item.find('.lr-workflow-nodeclose').hide();
  219. $item.removeClass("lr-workflow-nodemark");
  220. }
  221. else {
  222. var lineData = $.lrworkflow.getLine(dfop, dfop.focusId);
  223. if (!lineData.marked) {
  224. if (lineData.wftype == '2') {
  225. $item[0].childNodes[1].setAttribute("stroke", "#ff3300");
  226. $item[0].childNodes[1].setAttribute("marker-end", "url(#arrow2)");
  227. }
  228. else {
  229. $item[0].childNodes[1].setAttribute("stroke", "gray");
  230. $item[0].childNodes[1].setAttribute("marker-end", "url(#arrow1)");
  231. }
  232. }
  233. var $lineOper = $('.lr-workflow-lineoper');
  234. var $lineMove = $('.lr-workflow-linemover');
  235. $lineMove.hide().removeData("type").removeData("tid");
  236. $lineOper.hide().removeData("tid");
  237. }
  238. }
  239. dfop.focusId = "";
  240. return true;
  241. },
  242. // 选定某个结点/转换线
  243. focusItem: function (id) {
  244. var $item = $("#" + id);
  245. if ($item.length == 0) {
  246. return;
  247. }
  248. $item.removeClass("lr-workflow-nodemark");
  249. var dfop = $item[0].dfop;
  250. if (!this.blurItem(dfop)) {//先执行"取消选中",如果返回FLASE,则也会阻止选定事件继续进行.
  251. return;
  252. }
  253. if ($item.prop("tagName") == "DIV") {
  254. $item.addClass("lr-workflow-nodefocus");
  255. $item.find('.lr-workflow-nodeclose').show();
  256. }
  257. else {//如果是连接线
  258. $item[0].childNodes[1].setAttribute("stroke", "#225ee1");
  259. $item[0].childNodes[1].setAttribute("marker-end", "url(#arrow3)");
  260. var x, y, from, to;
  261. from = $item.attr("from").split(",");
  262. to = $item.attr("to").split(",");
  263. from[0] = parseInt(from[0], 10);
  264. from[1] = parseInt(from[1], 10);
  265. to[0] = parseInt(to[0], 10);
  266. to[1] = parseInt(to[1], 10);
  267. var lineData = $.lrworkflow.getLine(dfop, id);
  268. if (lineData.type == "lr") {
  269. from[0] = lineData.M;
  270. to[0] = from[0];
  271. var $lineMove = $('.lr-workflow-linemover');
  272. $lineMove.css({
  273. width: "5px", height: (to[1] - from[1]) * (to[1] > from[1] ? 1 : -1) + "px",
  274. left: from[0] - 3 + "px",
  275. top: (to[1] > from[1] ? from[1] : to[1]) + 1 + "px",
  276. cursor: "e-resize", display: "block"
  277. }).data({ "type": "lr", "tid": id });
  278. }
  279. else if (lineData.type == "tb") {
  280. from[1] = lineData.M;
  281. to[1] = from[1];
  282. var $lineMove = $('.lr-workflow-linemover');
  283. $lineMove.css({
  284. width: (to[0] - from[0]) * (to[0] > from[0] ? 1 : -1) + "px", height: "5px",
  285. left: (to[0] > from[0] ? from[0] : to[0]) + 1 + "px",
  286. top: from[1] - 3 + "px",
  287. cursor: "s-resize", display: "block"
  288. }).data({ "type": "tb", "tid": id });
  289. }
  290. x = (from[0] + to[0]) / 2 - 35;
  291. y = (from[1] + to[1]) / 2 + 6;
  292. var $lineOper = $('.lr-workflow-lineoper');
  293. $lineOper.css({ display: "block", left: x + "px", top: y + "px" }).data("tid", id);
  294. }
  295. dfop.focusId = id;
  296. $.lrworkflow.switchToolBtn(dfop, "cursor");
  297. },
  298. //获取一个DIV的绝对坐标的功能函数,即使是非绝对定位,一样能获取到
  299. getElCoordinate: function (dom) {
  300. var t = dom.offsetTop;
  301. var l = dom.offsetLeft;
  302. dom = dom.offsetParent;
  303. while (dom) {
  304. t += dom.offsetTop;
  305. l += dom.offsetLeft;
  306. dom = dom.offsetParent;
  307. }; return {
  308. top: t,
  309. left: l
  310. };
  311. },
  312. // 获取鼠标定位点坐标
  313. mousePosition: function (ev) {
  314. if (!ev) ev = window.event;
  315. if (ev.pageX || ev.pageY) {
  316. return { x: ev.pageX, y: ev.pageY };
  317. }
  318. return {
  319. x: ev.clientX + document.documentElement.scrollLeft - document.body.clientLeft,
  320. y: ev.clientY + document.documentElement.scrollTop - document.body.clientTop
  321. };
  322. },
  323. // 节点操作
  324. //增加一个流程结点,传参为一个JSON,有id,name,top,left,width,height,type(结点类型)等属性
  325. addNode: function ($workArea, dfop, node, isold) {
  326. var mark = node.type;
  327. var $node;
  328. if (!node.width || node.width < 150) node.width = 150;
  329. if (!node.height || node.height < 65) node.height = 65;
  330. if (!node.top || node.top < 0) node.top = 0;
  331. if (!node.left || node.left < 0) node.left = 0;
  332. if (mark == "conditionnode")
  333. {
  334. node.width = 160;
  335. node.height = 90;
  336. $node = $('<div class="lr-workflow-node item-conditionnode" id="' + node.id + '" ><div class="lr-workflow-nodeico"></div><b class="ico_' + node.type + 'div"></b><div class="lr-workflow-nodetext">' + node.name + '</div><div class="lr-workflow-nodeassemble" ></div></div>');
  337. }
  338. else if (mark != "startround" && mark != "endround") {
  339. $node = $('<div class="lr-workflow-node" id="' + node.id + '" ><div class="lr-workflow-nodeico"><b class="ico_' + node.type + '"></b></div><div class="lr-workflow-nodetext">' + node.name + '</div><div class="lr-workflow-nodeassemble" ></div></div>');
  340. }
  341. else {
  342. node.width = 52;
  343. node.height = 52;
  344. if (mark == 'startround') {
  345. node.name = "开始";
  346. dfop.hasStartround = true;
  347. }
  348. else if (mark == 'endround') {
  349. node.name = "结束";
  350. dfop.hasEndround = true;
  351. }
  352. $node = $('<div class="lr-workflow-node item-' + mark + '" id="' + node.id + '" ><div class="lr-workflow-nodeico"></div><div class="lr-workflow-nodetext">' + node.name + '</div><div class="lr-workflow-nodeassemble" ></div></div>');
  353. }
  354. $node.find('.lr-workflow-nodeassemble').append('<div class="lr-workflow-nodeclose"></div>');
  355. $node.find('.lr-workflow-nodeassemble').append('<div class="lr-workflow-nodespot left"><div class="lr-workflow-nodespotc"></div></div>');
  356. $node.find('.lr-workflow-nodeassemble').append('<div class="lr-workflow-nodespot top"><div class="lr-workflow-nodespotc"></div></div>');
  357. $node.find('.lr-workflow-nodeassemble').append('<div class="lr-workflow-nodespot right"><div class="lr-workflow-nodespotc"></div></div>');
  358. $node.find('.lr-workflow-nodeassemble').append('<div class="lr-workflow-nodespot bottom"><div class="lr-workflow-nodespotc"></div></div>');
  359. $node.css({ 'top': node.top + 'px', 'left': node.left + 'px', 'width': node.width + 'px', 'height': node.height + 'px' });
  360. if (node.state != undefined && (node.type == 'startround' || node.type == 'auditornode' || node.type == 'stepnode' || node.type == 'confluencenode')) {
  361. $node.css({ 'padding-left': '0','color':'#fff' }).find('.lr-workflow-nodeico').remove();
  362. switch (node.state) {//0正在处理 1 已处理同意 2 已处理不同意 3 未处理 4 当前需要处理的节点
  363. case '0':
  364. $node.css({ 'background': '#5bc0de', 'border': '0' });
  365. break;
  366. case '1':
  367. $node.css({ 'background': '#5cb85c', 'border': '0' });
  368. break;
  369. case '2':
  370. $node.css({ 'background': '#d9534f', 'border': '0' });
  371. break;
  372. case '3':
  373. $node.css({ 'background': '#999', 'border': '0' });
  374. break;
  375. case '4':
  376. $node.css({ 'background': '#f0ad4e', 'border': '0' });
  377. break;
  378. }
  379. }
  380. // 初始化节点的配置信息
  381. if (!isold) {
  382. switch (node.type) {
  383. case 'startround':
  384. node.wfForms = [];
  385. node.authorizeFields = [];
  386. node.iocName = '';
  387. node.dbSuccessId = '';
  388. node.dbSuccessSql = '';
  389. break;
  390. case 'stepnode':
  391. node.dbFailId = '';
  392. node.dbFailSql = '';
  393. case 'auditornode':
  394. node.auditors = [];
  395. node.wfForms = [];
  396. node.authorizeFields = [];
  397. node.iocName = '';
  398. node.dbSuccessId = '';
  399. node.dbSuccessSql = '';
  400. node.timeoutAction = 48;// 超时流转时间
  401. node.timeoutNotice = 24;// 超时通知时间
  402. break;
  403. case 'confluencenode':// 会签
  404. node.confluenceType = '1';
  405. node.confluenceRate = '100';
  406. node.iocName = '';
  407. node.dbSuccessId = '';
  408. node.dbSuccessSql = '';
  409. node.dbFailId = '';
  410. node.dbFailSql = '';
  411. break;
  412. case 'conditionnode':// 条件
  413. node.conditions = [];
  414. node.dbConditionId = "";
  415. node.conditionSql = "";
  416. break;
  417. }
  418. }
  419. $node[0].wfdata = node;
  420. $node[0].dfop = dfop;
  421. $workArea.append($node);
  422. dfop.node.push(node);
  423. },
  424. //删除结点
  425. delNode: function (dfop, nodeData) {
  426. var tmplines = [];
  427. for (var i = 0, l = dfop.line.length; i < l; i++) {
  428. var tmpLine = dfop.line[i];
  429. if (tmpLine.from != nodeData.id && tmpLine.to != nodeData.id) {
  430. tmplines.push(tmpLine);
  431. }
  432. else {
  433. $('#' + tmpLine.id).remove();
  434. }
  435. }
  436. $('#' + nodeData.id).remove();
  437. dfop.line = tmplines;
  438. dfop.node.splice(dfop.node.indexOf(nodeData), 1);
  439. if (nodeData.type == 'startround') {
  440. dfop.hasStartround = false;
  441. }
  442. else if (nodeData.type == 'endround') {
  443. dfop.hasEndround = false;
  444. }
  445. dfop.focusId = "";
  446. },
  447. //移动结点到一个新的位置
  448. moveNode: function (id, left, top) {
  449. if (left < 0) left = 0;
  450. if (top < 0) top = 0;
  451. var $node = $("#" + id);
  452. $node.css({ left: left + "px", top: top + "px" });
  453. var nodedata = $node[0].wfdata;
  454. var dfop = $node[0].dfop;
  455. nodedata.left = left;
  456. nodedata.top = top;
  457. //重画转换线
  458. this.resetLines(id, dfop);
  459. },
  460. // 更新节点名字
  461. updateNodeName: function ($workArea, nodeId) {
  462. var $node = $workArea.find('#' + nodeId);
  463. var nodeData = $node[0].wfdata;
  464. $node.find('.lr-workflow-nodetext').html(nodeData.name);
  465. },
  466. initNodeEvent: function ($workArea) {
  467. var dfop = $workArea[0].dfop;
  468. //节点双击事件
  469. $workArea.delegate(".lr-workflow-node", "dblclick", { $workArea: $workArea }, function (e) {
  470. var $workArea = e.data.$workArea;
  471. var dfop = $workArea[0].dfop;
  472. var $node = $(this);
  473. var nodeData = $node[0].wfdata;
  474. dfop.openNode(nodeData);
  475. });
  476. if (!dfop.isPreview) {
  477. //绑定点击事件
  478. $workArea.delegate(".lr-workflow-node", "click", function (e) {
  479. $.lrworkflow.focusItem(this.id);
  480. return false;
  481. });
  482. //绑定右击事件
  483. $workArea.delegate(".lr-workflow-node", "contextmenu", function (e) {
  484. //$.lrworkflow.focusItem(this.id);
  485. //return false;
  486. });
  487. //绑定用鼠标移动事件(节点拖动)
  488. $workArea.delegate(".lr-workflow-nodeico", "mousedown", { $workArea: $workArea }, function (e) {
  489. var $node = $(this).parents(".lr-workflow-node");
  490. var dfop = $node[0].dfop;
  491. var nodeData = $node[0].wfdata;
  492. e = e || window.event;
  493. if (dfop.$nowType == "direct") {
  494. return;
  495. }
  496. var id = $node.attr("id");
  497. var $workArea = e.data.$workArea;
  498. $.lrworkflow.focusItem(id);
  499. var ev = $.lrworkflow.mousePosition(e), t = $.lrworkflow.getElCoordinate($workArea[0]);
  500. var $ghost = $('#' + dfop.id).find('.lr-workflow-rsghost');
  501. if (nodeData.type == "endround" || nodeData.type == "startround" || nodeData.type == "conditionnode") {
  502. $ghost.css({ 'padding-left': '0px' });
  503. }
  504. else {
  505. $ghost.css({ 'padding-left': '48px' });
  506. }
  507. $node.children().clone().prependTo($ghost);
  508. if (nodeData.type == "conditionnode") {
  509. $ghost.find('b').css({ 'width': '100%', 'height': '100%', 'position': 'absolute', 'z-index': '-1' });
  510. }
  511. $ghost.find('.lr-workflow-nodeclose').remove();
  512. var X, Y;
  513. X = ev.x - t.left;
  514. Y = ev.y - t.top;
  515. var vX = X - nodeData.left, vY = Y - nodeData.top;
  516. var isMove = false;
  517. var hack = 1;
  518. if (navigator.userAgent.indexOf("8.0") != -1) hack = 0;
  519. document.onmousemove = function (e) {
  520. if (!e) e = window.event;
  521. var ev = $.lrworkflow.mousePosition(e);
  522. if (X == ev.x - vX && Y == ev.y - vY) return false;
  523. X = ev.x - vX; Y = ev.y - vY - 47;
  524. if (isMove && $ghost.css("display") == "none") {
  525. $ghost.css({
  526. display: "table",
  527. width: $('#' + id).css('width'), height: $('#' + id).css('height'),
  528. top: nodeData.top + "px",
  529. left: nodeData.left + t.left + "px", cursor: "move"
  530. });
  531. }
  532. if (X < 60) {
  533. X = 60;
  534. }
  535. else if (X + nodeData.width > t.left + $workArea.width()) {
  536. X = t.left + $workArea.width() - nodeData.width;
  537. }
  538. if (Y < 0) {
  539. Y = 0;
  540. }
  541. else if (Y + nodeData.height > t.top + $workArea.height() - 47) {
  542. Y = $workArea.height() - nodeData.height + t.top - 47;
  543. }
  544. $ghost.css({ left: X + "px", top: Y + "px" });
  545. isMove = true;
  546. }
  547. document.onmouseup = function (e) {
  548. if (isMove) $.lrworkflow.moveNode(id, X - t.left, Y + 47 - t.top);
  549. $ghost.empty().hide();
  550. document.onmousemove = null;
  551. document.onmouseup = null;
  552. }
  553. return false;
  554. });
  555. //绑定鼠标覆盖/移出事件
  556. $workArea.delegate(".lr-workflow-node", "mouseenter", { $workArea: $workArea }, function (e) {
  557. var dfop = e.data.$workArea[0].dfop;
  558. if (dfop.currentBtn != "direct") return;
  559. $(this).addClass("lr-workflow-nodemark");
  560. });
  561. $workArea.delegate(".lr-workflow-node", "mouseleave", { $workArea: $workArea }, function (e) {
  562. var dfop = e.data.$workArea[0].dfop;
  563. if (dfop.currentBtn != "direct") return;
  564. $(this).removeClass("lr-workflow-nodemark");
  565. });
  566. $workArea.delegate(".lr-workflow-nodespot", "mouseenter", { $workArea: $workArea }, function (e) {
  567. var dfop = e.data.$workArea[0].dfop;
  568. if (dfop.currentBtn != "direct") return;
  569. $(this).addClass("lr-workflow-nodespotmark");
  570. });
  571. $workArea.delegate(".lr-workflow-nodespot", "mouseleave", { $workArea: $workArea }, function (e) {
  572. var dfop = e.data.$workArea[0].dfop;
  573. if (dfop.currentBtn != "direct") return;
  574. $(this).removeClass("lr-workflow-nodespotmark");
  575. });
  576. //绑定连线时确定初始点
  577. $workArea.delegate(".lr-workflow-nodespot", "mousedown", { $workArea: $workArea }, function (e) {
  578. var dfop = e.data.$workArea[0].dfop;
  579. if (dfop.currentBtn != "direct") return;
  580. var $this = $(this);
  581. var $node = $this.parents('.lr-workflow-node');
  582. var nodeData = $node[0].wfdata;
  583. var X, Y;
  584. X = nodeData.left;
  585. Y = nodeData.top;
  586. var position = 'left';
  587. if ($this.hasClass('left')) {
  588. position = 'left';
  589. Y += nodeData.height / 2;
  590. }
  591. else if ($this.hasClass('top')) {
  592. position = 'top';
  593. X += nodeData.width / 2;
  594. }
  595. else if ($this.hasClass('right')) {
  596. position = 'right';
  597. X += nodeData.width;
  598. Y += nodeData.height / 2;
  599. }
  600. else if ($this.hasClass('bottom')) {
  601. position = 'bottom';
  602. X += nodeData.width / 2;
  603. Y += nodeData.height;
  604. }
  605. e.data.$workArea.data("lineStart", { "x": X, "y": Y, "id": nodeData.id, "position": position }).css("cursor", "crosshair");
  606. var line = $.lrworkflow.drawLine('1',"lr_workflow_tmp_line", [X, Y], [X, Y], true, true);
  607. var $draw = $('#' + dfop.id).find('svg');
  608. $draw.append(line);
  609. });
  610. //划线时用的绑定
  611. $workArea.mousemove(function (e) {
  612. var $workArea = $(this);
  613. var dfop = $workArea[0].dfop;
  614. if (dfop.currentBtn != "direct") return;
  615. var lineStart = $workArea.data("lineStart");
  616. if (!lineStart) return;
  617. var ev = $.lrworkflow.mousePosition(e), t = $.lrworkflow.getElCoordinate(this);
  618. var X, Y;
  619. X = ev.x - t.left;
  620. Y = ev.y - t.top;
  621. var line = document.getElementById("lr_workflow_tmp_line");
  622. line.childNodes[0].setAttribute("d", "M " + lineStart.x + " " + lineStart.y + " L " + X + " " + Y);
  623. line.childNodes[1].setAttribute("d", "M " + lineStart.x + " " + lineStart.y + " L " + X + " " + Y);
  624. if (line.childNodes[1].getAttribute("marker-end") == "url(\"#arrow2\")")
  625. line.childNodes[1].setAttribute("marker-end", "url(#arrow3)");
  626. else line.childNodes[1].setAttribute("marker-end", "url(#arrow3)");
  627. });
  628. $workArea.mouseup(function (e) {
  629. var $workArea = $(this);
  630. var dfop = $workArea[0].dfop;
  631. if (dfop.currentBtn != "direct") return;
  632. $(this).css("cursor", "auto").removeData("lineStart");
  633. $("#lr_workflow_tmp_line").remove();
  634. });
  635. //绑定连线时确定结束点
  636. $workArea.delegate(".lr-workflow-nodespot", "mouseup", { $workArea: $workArea }, function (e) {
  637. var $workArea = e.data.$workArea;
  638. var dfop = $workArea[0].dfop;
  639. if (dfop.currentBtn != "direct") return;
  640. var $this = $(this);
  641. var $node = $this.parents('.lr-workflow-node');
  642. var nodeData = $node[0].wfdata;
  643. var lineStart = $workArea.data("lineStart");
  644. var position = 'left';
  645. if ($this.hasClass('left')) {
  646. position = 'left';
  647. }
  648. else if ($this.hasClass('top')) {
  649. position = 'top';
  650. }
  651. else if ($this.hasClass('right')) {
  652. position = 'right';
  653. }
  654. else if ($this.hasClass('bottom')) {
  655. position = 'bottom';
  656. }
  657. if (lineStart) $.lrworkflow.addLine(dfop, { id: learun.newGuid(), from: lineStart.id, to: nodeData.id, sp: lineStart.position, ep: position, name: "" });
  658. });
  659. //绑定结点的删除功能
  660. $workArea.delegate(".lr-workflow-nodeclose", "click", function () {
  661. var $node = $(this).parents('.lr-workflow-node');
  662. var nodeData = $node[0].wfdata;
  663. var dfop = $node[0].dfop;
  664. $.lrworkflow.delNode(dfop, nodeData);
  665. return false;
  666. });
  667. }
  668. },
  669. initLineEvent: function ($workArea) {
  670. var dfop = $workArea[0].dfop;
  671. if (!dfop.isPreview) {
  672. $workArea.delegate('g', "click", function (e) {
  673. $.lrworkflow.focusItem(this.id);
  674. });
  675. $workArea.delegate('g', "dblclick", { $workArea: $workArea }, function (e) {
  676. var $workArea = e.data.$workArea;
  677. var dfop = $workArea[0].dfop;
  678. var lineData = $.lrworkflow.getLine(dfop, this.id);
  679. dfop.openLine(lineData);
  680. });
  681. }
  682. },
  683. // 获取线条数据
  684. getLine: function (dfop, lineId) {
  685. for (var i = 0, l = dfop.line.length; i < l; i++) {
  686. if (lineId == dfop.line[i].id) {
  687. return dfop.line[i];
  688. }
  689. }
  690. },
  691. // 获取线条端点坐标
  692. getLineSpotXY: function (nodeId, dfop, type) {
  693. var nodeData;
  694. for (var i = 0, l = dfop.node.length; i < l; i++) {
  695. if (nodeId == dfop.node[i].id) {
  696. nodeData = dfop.node[i];
  697. break;
  698. }
  699. }
  700. var X, Y;
  701. X = nodeData.left;
  702. Y = nodeData.top;
  703. switch (type)
  704. {
  705. case 'left':
  706. Y += nodeData.height / 2;
  707. break;
  708. case 'top':
  709. X += nodeData.width / 2;
  710. break;
  711. case 'right':
  712. X += nodeData.width;
  713. Y += nodeData.height / 2;
  714. break;
  715. case 'bottom':
  716. X += nodeData.width / 2;
  717. Y += nodeData.height;
  718. break;
  719. }
  720. return [X, Y];
  721. },
  722. // 绘制一条箭头线,并返回线的DOM
  723. drawLine: function (wftype, id, sp, ep, mark, dash, cursor) {
  724. var line;
  725. line = document.createElementNS("http://www.w3.org/2000/svg", "g");
  726. var hi = document.createElementNS("http://www.w3.org/2000/svg", "path");
  727. var path = document.createElementNS("http://www.w3.org/2000/svg", "path");
  728. if (id != "") line.setAttribute("id", id);
  729. line.setAttribute("from", sp[0] + "," + sp[1]);
  730. line.setAttribute("to", ep[0] + "," + ep[1]);
  731. hi.setAttribute("visibility", "hidden");
  732. hi.setAttribute("stroke-width", 9);
  733. hi.setAttribute("fill", "none");
  734. hi.setAttribute("stroke", "white");
  735. hi.setAttribute("d", "M " + sp[0] + " " + sp[1] + " L " + ep[0] + " " + ep[1]);
  736. hi.setAttribute("pointer-events", "stroke");
  737. path.setAttribute("d", "M " + sp[0] + " " + sp[1] + " L " + ep[0] + " " + ep[1]);
  738. path.setAttribute("stroke-width", 2.0);
  739. path.setAttribute("stroke-linecap", "round");
  740. path.setAttribute("fill", "none");
  741. if (dash) path.setAttribute("style", "stroke-dasharray:6,5");
  742. if (mark) {
  743. path.setAttribute("stroke", "#3498DB");//ff3300
  744. path.setAttribute("marker-end", "url(#arrow3)");
  745. }
  746. else if (wftype == '2')
  747. {
  748. path.setAttribute("stroke", "#ff3300");//ff3300
  749. path.setAttribute("marker-end", "url(#arrow2)");
  750. }
  751. else {
  752. path.setAttribute("stroke", "gray");
  753. path.setAttribute("marker-end", "url(#arrow1)");
  754. }
  755. ///console.log(wftype);
  756. line.appendChild(hi);
  757. line.appendChild(path);
  758. line.style.cursor = "crosshair";
  759. if (id != "" && id != "lr_workflow_tmp_line") {
  760. var text = document.createElementNS("http://www.w3.org/2000/svg", "text");
  761. //text.textContent=id;
  762. line.appendChild(text);
  763. var x = (ep[0] + sp[0]) / 2;
  764. var y = (ep[1] + sp[1]) / 2;
  765. text.setAttribute("text-anchor", "middle");
  766. text.setAttribute("x", x);
  767. text.setAttribute("y", y - 5);
  768. line.style.cursor = "pointer";
  769. text.style.cursor = "text";
  770. }
  771. return line;
  772. },
  773. //画一条只有两个中点的折线
  774. drawPoly: function (wftype, id, sp, m1, m2, ep, mark) {
  775. var poly, strPath;
  776. poly = document.createElementNS("http://www.w3.org/2000/svg", "g");
  777. var hi = document.createElementNS("http://www.w3.org/2000/svg", "path");
  778. var path = document.createElementNS("http://www.w3.org/2000/svg", "path");
  779. if (id != "") poly.setAttribute("id", id);
  780. poly.setAttribute("from", sp[0] + "," + sp[1]);
  781. poly.setAttribute("to", ep[0] + "," + ep[1]);
  782. hi.setAttribute("visibility", "hidden");
  783. hi.setAttribute("stroke-width", 9);
  784. hi.setAttribute("fill", "none");
  785. hi.setAttribute("stroke", "white");
  786. strPath = "M " + sp[0] + " " + sp[1];
  787. if (m1[0] != sp[0] || m1[1] != sp[1])
  788. strPath += " L " + m1[0] + " " + m1[1];
  789. if (m2[0] != ep[0] || m2[1] != ep[1])
  790. strPath += " L " + m2[0] + " " + m2[1];
  791. strPath += " L " + ep[0] + " " + ep[1];
  792. hi.setAttribute("d", strPath);
  793. hi.setAttribute("pointer-events", "stroke");
  794. path.setAttribute("d", strPath);
  795. path.setAttribute("stroke-width", 2.0);
  796. path.setAttribute("stroke-linecap", "round");
  797. path.setAttribute("fill", "none");
  798. if (mark) {
  799. path.setAttribute("stroke", "#3498DB");//ff3300
  800. path.setAttribute("marker-end", "url(#arrow3)");
  801. }
  802. else if (wftype == '2') {
  803. path.setAttribute("stroke", "#ff3300");//ff3300
  804. path.setAttribute("marker-end", "url(#arrow2)");
  805. }
  806. else {
  807. path.setAttribute("stroke", "gray");
  808. path.setAttribute("marker-end", "url(#arrow1)");
  809. }
  810. poly.appendChild(hi);
  811. poly.appendChild(path);
  812. var text = document.createElementNS("http://www.w3.org/2000/svg", "text");
  813. //text.textContent=id;
  814. poly.appendChild(text);
  815. var x = (m2[0] + m1[0]) / 2;
  816. var y = (m2[1] + m1[1]) / 2;
  817. text.setAttribute("text-anchor", "middle");
  818. text.setAttribute("x", x);
  819. text.setAttribute("y", y - 5);
  820. text.style.cursor = "text";
  821. poly.style.cursor = "pointer";
  822. return poly;
  823. },
  824. // 计算两个结点间要连折线的话,连线的所有坐标
  825. calcPolyPoints: function (SP, EP, type, M) {
  826. var m1 = [], m2 = [], m;
  827. if (type == "lr") {
  828. var m = M || (SP[0] + EP[0]) / 2;
  829. //粗略计算2个中点
  830. m1 = [m, SP[1]];
  831. m2 = [m, EP[1]];
  832. }
  833. //如果是允许中段可上下移动的折线,则参数M为可移动中段线的Y坐标
  834. else if (type == "tb") {
  835. var m = M || (SP[1] + EP[1]) / 2;
  836. //粗略计算2个中点
  837. m1 = [SP[0], m];
  838. m2 = [EP[0], m];
  839. }
  840. return { start: SP, m1: m1, m2: m2, end: EP };
  841. },
  842. // 增加一条线
  843. addLine: function (dfop, line) {
  844. var $line;
  845. if (line.from == line.to) return;
  846. // 避免两个节点间不能有一条以上同向接连线
  847. for (var i = 0, l = dfop.line.length; i < l; i++) {
  848. if ((line.from == dfop.line[i].from && line.to == dfop.line[i].to)) {
  849. return;
  850. }
  851. }
  852. // 获取开始和结束节点的坐标
  853. var sxy = $.lrworkflow.getLineSpotXY(line.from, dfop, line.sp);
  854. var exy = $.lrworkflow.getLineSpotXY(line.to, dfop, line.ep);
  855. line.name = line.name || '';
  856. line.wftype = line.wftype || '1';
  857. dfop.line.push(line);
  858. if (line.type && line.type != "sl") {
  859. var res = $.lrworkflow.calcPolyPoints(sxy, exy, line.type, line.M);
  860. $line = $.lrworkflow.drawPoly(line.wftype, line.id, res.start, res.m1, res.m2, res.end, line.mark);
  861. }
  862. else {
  863. line.type = "sl";//默认为直线
  864. $line = $.lrworkflow.drawLine(line.wftype, line.id, sxy, exy, line.mark);
  865. }
  866. var $draw = $('#' + dfop.id).find('svg');
  867. $($line)[0].dfop = dfop;
  868. if (line.name != "") {
  869. $($line).find('text').html(line.name);
  870. }
  871. $draw.append($line);
  872. },
  873. // 重构所有连向某个结点的线的显示,传参结构为$nodeData数组的一个单元结构
  874. resetLines: function (nodeId, dfop) {
  875. var $line;
  876. for (var i = 0, l = dfop.line.length; i < l; i++) {
  877. var sxy = [];
  878. var exy = [];
  879. var line = dfop.line[i];
  880. if (line.from == nodeId || line.to == nodeId) {
  881. sxy = $.lrworkflow.getLineSpotXY(line.from, dfop, line.sp);
  882. exy = $.lrworkflow.getLineSpotXY(line.to, dfop, line.ep);
  883. $('#' + line.id).remove();
  884. if (line.type == "sl") {
  885. $line = $.lrworkflow.drawLine(line.wftype, line.id, sxy, exy, line.mark);
  886. }
  887. else {
  888. var res = $.lrworkflow.calcPolyPoints(sxy, exy, line.type, line.M);
  889. $line = $.lrworkflow.drawPoly(line.wftype, line.id, res.start, res.m1, res.m2, res.end, line.mark);
  890. }
  891. var $draw = $('#' + dfop.id).find('svg');
  892. $($line)[0].dfop = dfop;
  893. $draw.append($line);
  894. var lineId = $($line).attr('id');
  895. var lineData = $.lrworkflow.getLine(dfop, lineId);
  896. $($line).find('text').html(lineData.name);
  897. }
  898. }
  899. },
  900. //重新设置连线的样式 newType= "sl":直线, "lr":中段可左右移动型折线, "tb":中段可上下移动型折线
  901. setLineType: function (id, newType) {
  902. var $line = $('#' + id);
  903. var dfop = $line[0].dfop;
  904. var lineData = $.lrworkflow.getLine(dfop, id);
  905. if (!newType || newType == null || newType == "" || newType == lineData.type) return false;
  906. var from = lineData.from;
  907. var to = lineData.to;
  908. lineData.type = newType;
  909. var sxy = $.lrworkflow.getLineSpotXY(from, dfop, lineData.sp);
  910. var exy = $.lrworkflow.getLineSpotXY(to, dfop, lineData.ep);
  911. var res;
  912. // 如果是变成折线
  913. if (newType != "sl") {
  914. var res = $.lrworkflow.calcPolyPoints(sxy, exy, lineData.type, lineData.M);
  915. $.lrworkflow.setLineM(id, $.lrworkflow.getMValue(sxy, exy, newType), true);
  916. }
  917. // 如果是变回直线
  918. else {
  919. delete lineData.M;
  920. var $lineMove = $('.lr-workflow-linemover');
  921. $lineMove.hide().removeData("type").removeData("tid");
  922. $line.remove();
  923. $line = $.lrworkflow.drawLine(lineData.wftype, lineData.id, sxy, exy, lineData.mark);
  924. var $draw = $('#' + dfop.id).find('svg');
  925. $($line)[0].dfop = dfop;
  926. $draw.append($line);
  927. var lineData = $.lrworkflow.getLine(dfop, id);
  928. $($line).find('text').html(lineData.name);
  929. }
  930. if (dfop.focusId == id) {
  931. $.lrworkflow.focusItem(id);
  932. }
  933. },
  934. //设置折线中段的X坐标值(可左右移动时)或Y坐标值(可上下移动时)
  935. setLineM: function (id, M, noStack) {
  936. var dfop = $('#' + id)[0].dfop;
  937. var lineData = $.lrworkflow.getLine(dfop, id);
  938. if (!lineData || M < 0 || !lineData.type || lineData.type == "sl") return false;
  939. var from = lineData.from;
  940. var to = lineData.to;
  941. lineData.M = M;
  942. var sxy = $.lrworkflow.getLineSpotXY(from, dfop, lineData.sp);
  943. var exy = $.lrworkflow.getLineSpotXY(to, dfop, lineData.ep);
  944. var ps = $.lrworkflow.calcPolyPoints(sxy, exy, lineData.type, lineData.M);
  945. $('#' + id).remove();
  946. console.log(lineData);
  947. var $line = $.lrworkflow.drawPoly(lineData.wftype, id, ps.start, ps.m1, ps.m2, ps.end, lineData.marked || dfop.focusId == id);
  948. var $draw = $('#' + dfop.id).find('svg');
  949. $($line)[0].dfop = dfop;
  950. $draw.append($line);
  951. $($line).find('text').html(lineData.name);
  952. },
  953. //初始化折线中段的X/Y坐标,mType='rb'时为X坐标,mType='tb'时为Y坐标
  954. getMValue: function (sxy, exy, mType) {
  955. if (mType == "lr") {
  956. return (sxy[0] + exy[0]) / 2;
  957. }
  958. else if (mType == "tb") {
  959. return (sxy[1] + exy[1]) / 2;
  960. }
  961. },
  962. // 删除线条
  963. delLine: function (lineId) {
  964. var $line = $('#' + lineId)
  965. var dfop = $line[0].dfop;
  966. for (var i = 0, l = dfop.line.length; i < l; i++) {
  967. if (lineId == dfop.line[i].id) {
  968. dfop.line.splice(i, 1);
  969. break;
  970. }
  971. }
  972. dfop.focusId = "";
  973. $line.remove();
  974. },
  975. updateLineName: function ($workArea, lineId) {
  976. var $line = $('#' + lineId);
  977. var dfop = $workArea[0].dfop;
  978. var lineData = $.lrworkflow.getLine(dfop, lineId);
  979. $line.find('text').html(lineData.name);
  980. if (lineData.wftype == '2') {
  981. $line[0].childNodes[1].setAttribute("stroke", "#ff3300");
  982. $line[0].childNodes[1].setAttribute("marker-end", "url(#arrow2)");
  983. }
  984. else {
  985. $line[0].childNodes[1].setAttribute("stroke", "gray");
  986. $line[0].childNodes[1].setAttribute("marker-end", "url(#arrow1)");
  987. }
  988. }
  989. };
  990. $.fn.lrworkflow = function (op) {
  991. var dfop = {
  992. openNode: function () { },
  993. openLine: function () { },
  994. toolBtns: ["startround", "endround", "stepnode", "confluencenode", "conditionnode", "auditornode"],//"childwfnode"
  995. nodeRemarks: {
  996. cursor: "选择指针",
  997. direct: "步骤连线",
  998. startround: "开始节点",
  999. endround: "结束节点",
  1000. stepnode: "普通节点",
  1001. confluencenode: "会签节点",
  1002. conditionnode: "条件判断节点",
  1003. auditornode: "传阅节点"
  1004. //childwfnode: "子流程节点"
  1005. },
  1006. node: [],
  1007. line: [],
  1008. hasStartround: false,
  1009. hasEndround: false,
  1010. focusId: ''
  1011. };
  1012. $.extend(dfop, op);
  1013. var $self = $(this);
  1014. dfop.id = $self.attr("id");
  1015. $self[0].dfop = dfop;
  1016. $.lrworkflow.render($self);
  1017. };
  1018. $.fn.lrworkflowGet = function () {
  1019. var $self = $(this);
  1020. var $workArea = $self.find(".lr-workflow-workinner");
  1021. var dfop = $workArea[0].dfop;
  1022. var data = {
  1023. nodes: dfop.node,
  1024. lines: dfop.line
  1025. };
  1026. return data;
  1027. }
  1028. $.fn.lrworkflowSet = function (name, op) {
  1029. var $self = $(this);
  1030. var $workArea = $self.find(".lr-workflow-workinner");
  1031. switch (name) {
  1032. case 'updateNodeName':
  1033. $.lrworkflow.updateNodeName($workArea, op.nodeId);
  1034. break;
  1035. case 'updateLineName':
  1036. $.lrworkflow.updateLineName($workArea, op.lineId);
  1037. break;
  1038. case 'set':
  1039. var dfop = $workArea[0].dfop;
  1040. for (var i = 0, l = op.data.nodes.length; i < l; i++) {
  1041. var node = op.data.nodes[i];
  1042. $.lrworkflow.addNode($workArea, dfop, node, true);
  1043. }
  1044. for (var i = 0, l = op.data.lines.length; i < l; i++) {
  1045. var line = op.data.lines[i];
  1046. $.lrworkflow.addLine(dfop, line);
  1047. }
  1048. break;
  1049. }
  1050. }
  1051. })(jQuery, top.learun);