TaskCompletedList.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. MWF.xDesktop.requireApp("process.TaskCenter", "List", null, false);
  2. MWF.xApplication.process.TaskCenter.TaskCompletedList = new Class({
  3. Extends: MWF.xApplication.process.TaskCenter.List,
  4. createAppFilterNodes: function(){
  5. var allApp = {"name": this.app.lp.all, "application": "", "count": 0};
  6. this.allAppFilterNode = this.createAppFilterNode(allApp, "appFilterNode_current");
  7. this.currentFilterNode = this.allAppFilterNode;
  8. this.filterListNode = new Element("div", {"styles": this.css.filterListNode}).inject(this.applicationFilterAreaNode);
  9. },
  10. createFilterItemNode: function(key, v){
  11. var _self = this;
  12. var node = new Element("div", {"styles": this.css.filterListItemNode}).inject(this.filterListNode);
  13. var actionNode = new Element("div", {"styles": this.css.filterListItemActionNode}).inject(node);
  14. var textNode = new Element("div", {"styles": this.css.filterListItemTextNode}).inject(node);
  15. textNode.set("text", this.app.lp[key]+": "+ v.name);
  16. actionNode.store("key", key);
  17. node.addEvents({
  18. "mouseover": function(){
  19. this.setStyles(_self.css.filterListItemNode_over);
  20. this.getLast().setStyles(_self.css.filterListItemTextNode_over);
  21. this.getFirst().setStyles(_self.css.filterListItemActionNode_over);
  22. },
  23. "mouseout": function(){
  24. this.setStyles(_self.css.filterListItemNode);
  25. this.getLast().setStyles(_self.css.filterListItemTextNode);
  26. this.getFirst().setStyles(_self.css.filterListItemActionNode);
  27. }
  28. });
  29. actionNode.addEvent("click", function(){
  30. var key = this.retrieve("key");
  31. if (_self.filterData[key]) _self.filterData[key] = null;
  32. delete _self.filterData[key];
  33. this.destroy();
  34. _self.refilter();
  35. });
  36. },
  37. _getCurrentPageData: function(callback, count){
  38. this.app.getAction(function(){
  39. if (this.filterData){
  40. this.filterListNode.empty();
  41. var data = {};
  42. Object.each(this.filterData, function(v, key){
  43. if (key!=="key"){
  44. if (v) {
  45. //data[this.app.options.filterMap[key]] = v.value;
  46. if (!data[this.app.options.filterMap[key]]) data[this.app.options.filterMap[key]] = [];
  47. data[this.app.options.filterMap[key]].push(v.value);
  48. this.createFilterItemNode(key, v);
  49. }
  50. }else{
  51. data.key = v;
  52. }
  53. }.bind(this));
  54. if (this.filterData.key){
  55. this.createFilterItemNode("key", {"name": this.filterData.key});
  56. }
  57. var id = (this.items.length) ? this.items[this.items.length-1].data.id : "(0)";
  58. this.app.action.listTaskCompletedFilter(function(json){
  59. if (callback) callback(json);
  60. }, null, id, count || this.pageCount, data);
  61. }else{
  62. var id = (this.items.length) ? this.items[this.items.length-1].data.id : "(0)";
  63. this.app.action.listTaskCompletedNext(function(json){
  64. if (callback) callback(json);
  65. }, null, id, count || this.pageCount);
  66. }
  67. }.bind(this));
  68. },
  69. _getApplicationCount: function(callback){
  70. this.app.getAction(function(){
  71. this.app.action.listTaskCompletedApplication(function(json){
  72. if (callback) callback(json);
  73. }.bind(this));
  74. }.bind(this));
  75. },
  76. _createItem: function(task){
  77. return new MWF.xApplication.process.TaskCenter.TaskCompletedList.Item(task, this)
  78. }
  79. });
  80. MWF.xApplication.process.TaskCenter.TaskCompletedList.Item = new Class({
  81. Extends: MWF.xApplication.process.TaskCenter.List.Item,
  82. loadActions: function(){
  83. this.showTaskCompletedNode = new Element("div", {"styles": this.list.css.titleActionShowNode}).inject(this.actionContentNode);
  84. this.closeTaskCompletedNode = new Element("div", {"styles": this.list.css.titleActionCloseNode}).inject(this.actionContentNode);
  85. },
  86. setTimeIcon: function(){
  87. if (this.data.completed){
  88. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/pic_ok.png)");
  89. return true;
  90. }
  91. },
  92. setEvent: function(){
  93. this.node.addEvents({
  94. "mouseover": function(){this.showAction();}.bind(this),
  95. "mouseout": function(){this.hideAction();}.bind(this)
  96. });
  97. if (this.showTaskCompletedNode){
  98. this.showTaskCompletedNode.addEvent("click", function(e){
  99. this.showTaskCompleted();
  100. }.bind(this));
  101. }
  102. if (this.closeTaskCompletedNode){
  103. this.closeTaskCompletedNode.addEvent("click", function(e){
  104. this.closeTaskCompleted();
  105. }.bind(this));
  106. }
  107. if (this.rightContentNode){
  108. this.rightContentNode.addEvent("click", function(e){
  109. this.showTaskCompleted(e);
  110. }.bind(this));
  111. }
  112. },
  113. setFlowChart: function(data){
  114. var idx = 0;
  115. debugger;
  116. data.workLogTokenList = {};
  117. var current = data.workLogList.shift();
  118. data.workLogList.push(current);
  119. data.workLogList.each(function(worklog){
  120. data.workLogTokenList[worklog.fromActivityToken] = worklog;
  121. if (!worklog.taskCompletedList) worklog.taskCompletedList = [];
  122. if (!worklog.taskList) worklog.taskList = [];
  123. if (worklog.taskCompletedList.length || worklog.taskList.length){
  124. this.createFlowInforWorklogNode(worklog.fromActivityName, worklog.taskCompletedList, worklog.taskList || [], idx, worklog.fromActivityToken == data.taskCompleted.activityToken);
  125. idx++;
  126. }
  127. }.bind(this));
  128. return idx;
  129. },
  130. showAction: function(){
  131. //if (this.showTaskCompletedNode) this.showTaskCompletedNode.fade("in");
  132. },
  133. hideAction: function(){
  134. //if (this.showTaskCompletedNode) this.showTaskCompletedNode.fade("out");
  135. },
  136. _getJobByTaskComplete: function(){
  137. this.list.app.action.getSimpleJobByTaskCompleted(function(json){
  138. if (callback) callback(json.data);
  139. }.bind(this), null, this.data.id);
  140. },
  141. showTaskCompleted: function(){
  142. if (layout.mobile){
  143. this.showTaskCompleted_mobile();
  144. }else{
  145. this.showTaskCompleted_pc();
  146. }
  147. },
  148. showTaskCompleted_mobile: function(){
  149. if (!this.nodeClone){
  150. this._getSimpleJobByTaskComplete(function(data){
  151. this.nodeClone = this.mainContentNode.clone(false);
  152. this.nodeClone.inject(this.mainContentNode, "after");
  153. this.mainContentNode.setStyles(this.list.css.itemNode_edit_from_mobile);
  154. this.mainContentNode.position({
  155. relativeTo: this.nodeClone,
  156. position: "topleft",
  157. edge: "topleft"
  158. });
  159. this.showEditTaskCompletedNode(data);
  160. }.bind(this));
  161. }
  162. },
  163. showTaskCompleted_pc: function(){
  164. if (!this.nodeClone){
  165. this.list.app.content.mask({
  166. "destroyOnHide": true,
  167. "id": "mask_"+this.data.id,
  168. "style": this.list.css.maskNode
  169. });
  170. this._getSimpleJobByTaskComplete(function(data){
  171. this.nodeClone = this.mainContentNode.clone(false);
  172. this.nodeClone.inject(this.mainContentNode, "after");
  173. this.mainContentNode.setStyles(this.list.css.itemNode_edit_from);
  174. this.mainContentNode.position({
  175. relativeTo: this.nodeClone,
  176. position: "topleft",
  177. edge: "topleft"
  178. });
  179. this.showEditTaskCompletedNode(data);
  180. }.bind(this));
  181. }
  182. },
  183. _getSimpleJobByTaskComplete: function(callback){
  184. this.list.app.action.getSimpleJobByTaskCompleted(function(json){
  185. if (callback) callback(json.data);
  186. }.bind(this), null, this.data.id);
  187. },
  188. showEditTaskCompletedNode: function(data, callback){
  189. if (layout.mobile){
  190. this.showEditTaskCompletedNode_mobile(data, callback);
  191. }else{
  192. this.showEditTaskCompletedNode_pc(data, callback);
  193. }
  194. },
  195. showEditTaskCompletedNode_mobile: function(data, callback){
  196. var p = this.list.app.tabAreaNode.getPosition(this.list.app.content);
  197. var contentSize = this.list.app.contentNode.getSize();
  198. var tabSize = this.list.app.tabAreaNode.getSize();
  199. var y = contentSize.y+tabSize.y;
  200. this.list.css.itemNode_edit.top = ""+ p.y+"px";
  201. this.list.css.itemNode_edit.left = ""+ p.x+"px";
  202. this.list.css.itemNode_edit.width = ""+ contentSize.x+"px";
  203. this.list.css.itemNode_edit.height = ""+ y+"px";
  204. document.body.setStyle("-webkit-overflow-scrolling", "auto");
  205. this.showTaskCompletedNode.setStyle("display", "none");
  206. var morph = new Fx.Morph(this.mainContentNode, {
  207. "duration": 200,
  208. "transition": Fx.Transitions.Expo.easeOut,
  209. "onComplete": function(){
  210. this.resizeEditNodeFun = this.resizeEditNode.bind(this);
  211. this.list.app.addEvent("resize", this.resizeEditNodeFun);
  212. this.setEditTaskCompleledNodes(data);
  213. this.closeTaskCompletedNode.setStyle("display", "block");
  214. if (callback) callback();
  215. }.bind(this)
  216. });
  217. morph.start(this.list.css.itemNode_edit);
  218. },
  219. showEditTaskCompletedNode_pc: function(data, callback){
  220. var p = this.getEditNodePosition();
  221. this.list.css.itemNode_edit.top = ""+ p.y+"px";
  222. this.list.css.itemNode_edit.left = ""+ p.x+"px";
  223. this.showTaskCompletedNode.setStyle("display", "none");
  224. var morph = new Fx.Morph(this.mainContentNode, {
  225. "duration": 200,
  226. "transition": Fx.Transitions.Expo.easeOut,
  227. "onComplete": function(){
  228. this.resizeEditNodeFun = this.resizeEditNode.bind(this);
  229. this.list.app.addEvent("resize", this.resizeEditNodeFun);
  230. this.setEditTaskCompleledNodes(data);
  231. this.closeTaskCompletedNode.setStyle("display", "block");
  232. if (callback) callback();
  233. }.bind(this)
  234. });
  235. morph.start(this.list.css.itemNode_edit);
  236. },
  237. setEditTaskCompleledNodes: function(data){
  238. this.flowInforNode = new Element("div", {"styles": this.list.css.flowInforNode}).inject(this.mainContentNode);
  239. // this.processNode = new Element("div", {"styles": this.list.css.processNode}).inject(this.node);
  240. this.workInforNode = new Element("div", {"styles": this.list.css.workInforNode}).inject(this.mainContentNode);
  241. // this.myDoneInforNode = new Element("div", {"styles": this.list.css.myDoneInforNode}).inject(this.node);
  242. MWF.require("MWF.widget.ScrollBar", function(){
  243. new MWF.widget.ScrollBar(this.workInforNode, {
  244. "style":"xApp_Task_infor", "where": "before", "distance": 30, "friction": 4, "axis": {"x": false, "y": true}
  245. });
  246. }.bind(this));
  247. this.setFlowInfor(data);
  248. this.setWorkInfor(data);
  249. // this.setProcessor();
  250. },
  251. setWorkInfor: function(data){
  252. var lp = this.list.app.lp;
  253. var taskCompletedWorkInforTitleNode = new Element("div", {
  254. "styles": this.list.css.taskCompletedWorkInforTitleNode,
  255. "text": lp.currentFileStatus
  256. }).inject(this.workInforNode);
  257. data.workList.each(function(work){
  258. var log = data.workLogTokenList[work.activityToken];
  259. if (log){
  260. var users = [];
  261. log.taskList.each(function(task){
  262. var unit = task.department || task.unit || "";
  263. unit = unit.substring(0, unit.indexOf("@"));
  264. users.push(task.person.substring(0, task.person.indexOf("@"))+((unit) ? "("+unit+")" : ""));
  265. }.bind(this));
  266. var html = "<table border=\"0\" width=\"96%\" align=\"center\"><tr>" +
  267. "<td style=\"white-space: normal;word-break: break-all;word-wrap:break-word;\">"+
  268. ""+lp.fileat+"<font style=\"color: #00F\"> "+log.fromTime.substr(0, log.fromTime.lastIndexOf(":"))+" </font>"+lp.flowto+"<font style=\"color: #00F\"> ["+log.fromActivityName+"] </font>" +
  269. "<br/><font style=\"font-weight:bold\">"+lp.list_owner+": </font>"+users.join(", ")+"</td>" +
  270. "<td style=\"width:60px; text-align:right\"><div id=\""+work.id+"\">打开</div></td>" +
  271. "</tr></table>";
  272. var taskCompletedWorkInforNode = new Element("div", {
  273. "styles": this.list.css.taskCompletedWorkInforNode,
  274. "html": html
  275. }).inject(this.workInforNode);
  276. var table = taskCompletedWorkInforNode.getElement("table");
  277. //table
  278. var openNode = taskCompletedWorkInforNode.getElement("div");
  279. if (openNode) {
  280. openNode.setStyles(this.list.css.taskCompletedOpenNode);
  281. var _self = this;
  282. openNode.addEvent("click", function(e){
  283. var id = this.get("id");
  284. _self.openWorkByTaskCompleted(e, id);
  285. });
  286. }
  287. }
  288. }.bind(this));
  289. data.workCompletedList.each(function(work){
  290. // var log = data.workLogTokenList[work.activityToken];
  291. // if (log){
  292. var html = "<table border=\"0\" width=\"90%\" align=\"center\"><tr>" +
  293. "<td>“"+work.title+"”"+lp.fileat+""+work.completedTime+""+lp.completed+"</td>" +
  294. "<td><div id=\""+work.id+"\">打开</div></td>" +
  295. "</tr></table>";
  296. var taskCompletedWorkInforNode = new Element("div", {
  297. "styles": this.list.css.taskCompletedWorkInforNode,
  298. "html": html
  299. }).inject(this.workInforNode);
  300. var openNode = taskCompletedWorkInforNode.getElement("div");
  301. if (openNode) {
  302. openNode.setStyles(this.list.css.taskCompletedOpenNode);
  303. var _self = this;
  304. openNode.addEvent("click", function(e){
  305. var id = this.get("id");
  306. _self.openWorkCompleteedByTaskCompleted(e, id);
  307. });
  308. }
  309. // }
  310. }.bind(this));
  311. },
  312. openWorkByTaskCompleted: function(e, id){
  313. var options = {"workId": id, "readonly": true, "appId": id};
  314. this.list.app.desktop.openApplication(e, "process.Work", options);
  315. },
  316. openWorkCompleteedByTaskCompleted: function(e, id){
  317. var options = {"workCompletedId": id, "readonly": true, "appId": id};
  318. this.list.app.desktop.openApplication(e, "process.Work", options);
  319. },
  320. closeTaskCompleted: function(callback){
  321. this.closeTaskCompletedNode.setStyle("display", "none");
  322. this.flowInforLeftNode.destroy();
  323. this.flowInforRightNode.destroy();
  324. this.flowInforContentNode.destroy();
  325. this.flowInforScrollNode.destroy();
  326. this.flowInforNode.destroy();
  327. this.workInforNode.destroy();
  328. // this.processNode.destroy();
  329. this.flowInforScrollFx = null;
  330. this.flowInforLeftNode = null;
  331. this.flowInforRightNode = null;
  332. this.flowInforScrollNode = null;
  333. this.flowInforContentNode = null;
  334. this.flowInforNode = null;
  335. this.workInforNode = null;
  336. delete this.flowInforScrollFx;
  337. delete this.flowInforLeftNode;
  338. delete this.flowInforRightNode;
  339. delete this.flowInforScrollNode;
  340. delete this.flowInforContentNode;
  341. delete this.flowInforNode;
  342. delete this.workInforNode;
  343. this.closeTaskCompletedDom();
  344. },
  345. closeTaskCompletedDom: function(callback){
  346. var p = this.nodeClone.getPosition(this.list.app.content);
  347. this.list.css.itemNode_edit_from.top = ""+ p.y+"px";
  348. this.list.css.itemNode_edit_from.left = ""+ p.x+"px";
  349. var morph = new Fx.Morph(this.mainContentNode, {
  350. "duration": 200,
  351. "transition": Fx.Transitions.Expo.easeIn,
  352. "onComplete": function(){
  353. this.nodeClone.destroy();
  354. this.nodeClone = null;
  355. this.list.app.content.unmask();
  356. this.mainContentNode.setStyles(this.list.css.itemMainContentAreaNode);
  357. this.mainContentNode.setStyle("opacity", 1);
  358. document.body.setStyle("-webkit-overflow-scrolling", "touch");
  359. this.list.app.removeEvent("resize", this.resizeEditNodeFun);
  360. this.showTaskCompletedNode.setStyle("display", "block");
  361. if (callback) callback();
  362. }.bind(this)
  363. });
  364. morph.start(this.list.css.itemNode_edit_from);
  365. }
  366. });