List.js 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322
  1. MWF.xApplication.process.TaskCenter.List = new Class({
  2. initialize: function(container, app, filterData){
  3. this.container = $(container);
  4. this.app = app;
  5. this.css = this.app.css;
  6. this.currentPageData = [];
  7. this.nextPageData = [];
  8. this.prevPageData = [];
  9. this.initData();
  10. this.filterData = null;
  11. if (filterData) this.filterData = filterData;
  12. this.load();
  13. },
  14. initData: function(){
  15. this.count = 0;
  16. this.isCountShow = false;
  17. this.currentPage = 1;
  18. this.pageCount = 20;
  19. this.pages = 0;
  20. this.items = [];
  21. this.isItemsLoaded = false;
  22. this.isItemLoadding = false;
  23. this.loadItemQueue = 0;
  24. this.filterApplication = "";
  25. this.currentFilterNode = null;
  26. this.filterListNode = null;
  27. },
  28. load: function(){
  29. this.mask = new MWF.widget.Mask({"style": "desktop"});
  30. this.mask.loadNode(this.app.content);
  31. this.contentNode = new Element("div", {"styles": this.css.listContentNode}).inject(this.container);
  32. this.createActionBarNode();
  33. this.createListAreaNode();
  34. this.resetListAreaHeight();
  35. this.app.addEvent("resize", this.resetListAreaHeight.bind(this));
  36. //this.setAppContentSize();
  37. // this.listItemNext();
  38. },
  39. refresh: function(){
  40. this.mask = new MWF.widget.Mask({"style": "desktop"});
  41. this.mask.loadNode(this.app.content);
  42. this.initData();
  43. this.filterData = null;
  44. this.applicationFilterAreaNode.empty();
  45. this.createAppFilterNodes();
  46. this.listAreaNode.empty();
  47. this.resetListAreaHeight();
  48. this.app.getWorkCounts();
  49. },
  50. refilter: function(){
  51. this.mask = new MWF.widget.Mask({"style": "desktop"});
  52. this.mask.loadNode(this.app.content);
  53. this.initData();
  54. this.applicationFilterAreaNode.empty();
  55. this.createAppFilterNodes();
  56. this.listAreaNode.empty();
  57. this.resetListAreaHeight();
  58. },
  59. listItemNext: function(count){
  60. if (!this.isItemsLoaded){
  61. if (!this.isItemLoadding){
  62. this.isItemLoadding = true;
  63. this._getCurrentPageData(function(json){
  64. this.count = json.count;
  65. if (!this.isCountShow){
  66. this.currentFilterNode.getFirst("span").set("text", "("+this.count+")");
  67. this.isCountShow = true;
  68. }
  69. if (json.count<=this.items.length){
  70. this.isItemsLoaded = true;
  71. }
  72. json.data.each(function(task){
  73. this.items.push(this._createItem(task));
  74. }.bind(this));
  75. this.isItemLoadding = false;
  76. if (this.loadItemQueue>0){
  77. this.loadItemQueue--;
  78. this.listItemNext();
  79. }
  80. this.mask.hide();
  81. }.bind(this), count);
  82. }else{
  83. this.loadItemQueue++;
  84. }
  85. }
  86. },
  87. createActionBarNode: function(){
  88. this.actionBarNode = new Element("div", {"styles": this.css.actionBarNode}).inject(this.contentNode);
  89. this.isFilterOpen = false;
  90. this.filterActionNode = new Element("div", {
  91. "styles": this.css.filterActionNode,
  92. "text": this.app.lp.filter
  93. }).inject(this.actionBarNode);
  94. this.filterActionNode.addEvents({
  95. "click": function (e){this.showOrHideFilter();e.stopPropagation();}.bind(this)
  96. });
  97. this.applicationFilterAreaNode = new Element("div", {"styles": this.css.applicationFilterAreaNode}).inject(this.actionBarNode);
  98. this.createAppFilterNodes();
  99. },
  100. showOrHideFilter: function(){
  101. if (!this.isFilterOpen){
  102. if (!this.filterAreaMorph || !this.filterAreaMorph.isRunning()) this.showFilter();
  103. }else{
  104. if (this.filterAreaMorph || !this.filterAreaMorph.isRunning()) this.hideFilter();
  105. }
  106. },
  107. showFilter: function(){
  108. this.filterActionNode.setStyles(this.css.filterActionNode_check);
  109. if (!this.filterAreaNode) this.createFilterAreaNode();
  110. this.filterAreaTipNode.setStyle("display", "block");
  111. this.filterAreaNode.setStyle("display", "block");
  112. this.resizeFilterAreaNode();
  113. var size = this.app.content.getSize();
  114. var toStyle = {
  115. "width": (!layout.mobile) ? "460px" : ""+size.x+"px",
  116. "height": (!layout.mobile) ? "500px" : ""+size.y+"px"
  117. };
  118. this.isFilterOpen = true;
  119. this.filterAreaMorph.start(toStyle).chain(function(){
  120. this.createFilterAreaTitle();
  121. this.createFilterAreaContent();
  122. this.hideFilterFun = this.hideFilter.bind(this);
  123. $(document.body).addEvent("click", this.hideFilterFun);
  124. }.bind(this));
  125. },
  126. hideFilter: function(){
  127. if (this.filterAreaNode){
  128. var toStyle = {
  129. "width": "460px",
  130. "height": "0px"
  131. };
  132. this.filterAreaNode.empty();
  133. this.isFilterOpen = false;
  134. this.filterAreaMorph.start(toStyle).chain(function(){
  135. this.filterAreaNode.eliminate("input");
  136. this.filterAreaNode.setStyle("display", "none");
  137. this.filterAreaTipNode.setStyle("display", "none");
  138. this.filterActionNode.setStyles(this.css.filterActionNode);
  139. }.bind(this));
  140. $(document.body).removeEvent("click", this.hideFilterFun);
  141. }
  142. },
  143. createFilterAreaContent: function(){
  144. var contentListNode = new Element("div", {"styles": this.css.applicationFilterAreaContentListNode}).inject(this.filterAreaNode);
  145. var contentScrollNode = new Element("div", {"styles": this.css.applicationFilterAreaContentScrollNode}).inject(contentListNode);
  146. var contentNode = new Element("div", {"styles": {"overflow": "hidden", "padding-bottom": "20px"}}).inject(contentScrollNode);
  147. MWF.require("MWF.widget.ScrollBar", function(){
  148. new MWF.widget.ScrollBar(contentScrollNode, {
  149. "style":"default", "distance": 30, "friction": 4, "axis": {"x": false, "y": true}
  150. });
  151. }.bind(this));
  152. var _self = this;
  153. this.app.getAction(function(){
  154. this._getFilterCount(function(json){
  155. var obj = json.data;
  156. Object.each(obj, function(v, key){
  157. var categoryNode = new Element("div", {"styles": this.css.applicationFilterCategoryNode}).inject(contentNode);
  158. categoryNode.set("text", this.app.lp[key]);
  159. var itemAreaNode = new Element("div", {"styles": this.css.applicationFilterItemAreaNode}).inject(contentNode);
  160. // for (var x=0; x<10; x++){
  161. v.each(function(item){
  162. var itemNode = new Element("div", {"styles": this.css.applicationFilterItemNode}).inject(itemAreaNode);
  163. //itemNode.set("text", item.name+"("+item.count+")");
  164. itemNode.set("text", item.name);
  165. itemNode.store("value", item.value);
  166. itemNode.store("textname", item.name);
  167. itemNode.store("key", key);
  168. itemNode.addEvent("click", function(){
  169. if (this.hasClass("applicationFilterItemNode_over")){
  170. _self.unSelectedFilterItem(this);
  171. }else{
  172. _self.selectedFilterItem(this);
  173. }
  174. });
  175. if (this.filterData){
  176. if (this.filterData[key]){
  177. if (item.value === this.filterData[key].value){
  178. this.selectedFilterItem(itemNode);
  179. }
  180. }
  181. }
  182. }.bind(this));
  183. // }
  184. }.bind(this));
  185. }.bind(this));
  186. }.bind(this));
  187. },
  188. _getFilterCount: function(callback){
  189. this.app.action.listTaskCompletedFilterCount(function(json){
  190. if (callback) callback(json);
  191. });
  192. },
  193. unSelectedFilterItem: function(item){
  194. if (item.hasClass("applicationFilterItemNode_over")){
  195. // var value = item.retrieve("value");
  196. // var name = item.retrieve("textname");
  197. var key = item.retrieve("key");
  198. item.setStyles(this.css.applicationFilterItemNode);
  199. item.removeClass("applicationFilterItemNode_over");
  200. item.addClass("applicationFilterItemNode");
  201. if (!this.filterData) this.filterData = {};
  202. this.filterData[key] = null;
  203. delete this.filterData[key];
  204. item.getParent().eliminate("current");
  205. }
  206. },
  207. selectedFilterItem: function(item){
  208. if (!item.hasClass("applicationFilterItemNode_over")){
  209. var current = item.getParent().retrieve("current");
  210. if (current) this.unSelectedFilterItem(current);
  211. var value = item.retrieve("value");
  212. var key = item.retrieve("key");
  213. var name = item.retrieve("textname");
  214. item.setStyles(this.css.applicationFilterItemNode_over);
  215. item.removeClass("applicationFilterItemNode");
  216. item.addClass("applicationFilterItemNode_over");
  217. if (!this.filterData) this.filterData = {};
  218. this.filterData[key] = {"value": value, "name": name};
  219. item.getParent().store("current", item);
  220. }
  221. },
  222. createFilterAreaTitle: function(){
  223. var titleNode = new Element("div", {"styles": this.app.css.filterAreaTitleNode}).inject(this.filterAreaNode);
  224. var okNode = new Element("div", {"styles": this.app.css.filterAreaTitleActionOkNode, "text": this.app.lp.ok}).inject(titleNode);
  225. var clearNode = new Element("div", {"styles": this.app.css.filterAreaTitleActionClearNode, "text": this.app.lp.clear}).inject(titleNode);
  226. clearNode.addEvent("click", function(){
  227. this.filterAreaNode.getElements(".filterItem").each(function(el){
  228. this.unSelectedFilterItem(el);
  229. }.bind(this));
  230. var input = this.filterAreaNode.retrieve("input");
  231. input.set("value", "");
  232. this.filterData = null;
  233. this.hideFilter();
  234. this.refilter();
  235. }.bind(this));
  236. okNode.addEvent("click", function(){
  237. var input = this.filterAreaNode.retrieve("input");
  238. if (!this.filterData) this.filterData = {};
  239. var key = input.get("value");
  240. if (key && key!==this.app.lp.searchKey){
  241. this.filterData.key = key;
  242. }else{
  243. this.filterData.key = "";
  244. delete this.filterData.key
  245. }
  246. this.hideFilter();
  247. this.refilter();
  248. }.bind(this));
  249. var searchNode = new Element("div", {"styles": this.app.css.filterAreaTitleSearchNode}).inject(titleNode);
  250. var searchIconNode = new Element("div", {"styles": this.app.css.filterAreaTitleSearchIconNode}).inject(searchNode);
  251. var searchInputAreaNode = new Element("div", {"styles": this.app.css.filterAreaTitleSearchInputAreaNode}).inject(searchNode);
  252. var searchInputNode = new Element("input", {"styles": this.app.css.filterAreaTitleSearchInputNode, "value": this.app.lp.searchKey}).inject(searchInputAreaNode);
  253. if (this.filterData){
  254. if (this.filterData.key) searchInputNode.set("value", this.filterData.key);
  255. }
  256. this.filterAreaNode.store("input", searchInputNode);
  257. var key = this.app.lp.searchKey;
  258. searchInputNode.addEvents({
  259. "blur": function(){if (!this.get("value")) this.set("value", key)},
  260. "focus": function(){if (this.get("value")===key) this.set("value", "")}
  261. });
  262. },
  263. createFilterAreaNode: function(){
  264. this.filterAreaNode = new Element("div", {"styles": this.app.css.filterAreaNode}).inject(this.container);
  265. this.filterAreaNode.addEvent("click", function(e){e.stopPropagation();});
  266. this.filterAreaTipNode = new Element("div", {"styles": this.app.css.filterAreaTipNode}).inject(this.container);
  267. //var size = this.filterActionNode.getSize();
  268. this.filterAreaNode.setStyles({
  269. "width": (!layout.mobile) ? "460px" : ""+this.app.content.getSize().x+"px",
  270. "height": "0px"
  271. });
  272. this.filterAreaNode.position({
  273. relativeTo: this.filterActionNode,
  274. position: 'bottomRight',
  275. edge: 'upperRight',
  276. offset: {x:10, y: 7}
  277. });
  278. this.filterAreaTipNode.position({
  279. relativeTo: this.filterAreaNode,
  280. position: 'topRight',
  281. edge: 'bottomRight',
  282. offset: {x:-26, y: 1}
  283. });
  284. this.app.addEvent("resize", function(){
  285. this.resizeFilterAreaNode();
  286. }.bind(this));
  287. this.filterAreaMorph = new Fx.Morph(this.filterAreaNode, {
  288. duration: '100',
  289. transition: Fx.Transitions.Sine.easeInOut
  290. });
  291. },
  292. resizeFilterAreaNode: function(){
  293. if (this.filterAreaNode){
  294. this.filterAreaNode.position({
  295. relativeTo: this.filterActionNode,
  296. position: 'bottomRight',
  297. edge: 'upperRight',
  298. offset: {x:10, y: 7}
  299. });
  300. if (this.filterAreaTipNode){
  301. this.filterAreaTipNode.position({
  302. relativeTo: this.filterAreaNode,
  303. position: 'topRight',
  304. edge: 'bottomRight',
  305. offset: {x:-26, y: 1}
  306. });
  307. }
  308. }
  309. },
  310. createAppFilterNodes: function(){
  311. var allApp = {"name": this.app.lp.all, "application": "", "count": 0};
  312. this.allAppFilterNode = this.createAppFilterNode(allApp, "appFilterNode_current");
  313. this.currentFilterNode = this.allAppFilterNode;
  314. this._getApplicationCount(function(json){
  315. json.data.each(function(app){
  316. this.createAppFilterNode(app);
  317. }.bind(this));
  318. }.bind(this));
  319. },
  320. createAppFilterNode: function(app, style){
  321. style = style || "appFilterNode";
  322. var node = new Element("div", {"styles": this.app.css[style]}).inject(this.applicationFilterAreaNode);
  323. var text = (app.count) ? app.name+"<span>("+app.count+")</span>" : app.name+"<span></span>";
  324. node.set({"html": text, "id": app.value});
  325. var _self = this;
  326. node.addEvent("click", function(e){
  327. _self.filterByApplication(this);
  328. });
  329. return node;
  330. },
  331. filterByApplication: function(node){
  332. var id = node.get("id");
  333. if (!id){
  334. this.refresh();
  335. }else{
  336. if (this.currentFilterNode) this.currentFilterNode.setStyles(this.app.css.appFilterNode);
  337. this.initData();
  338. this.filterApplication = id;
  339. this.listAreaNode.empty();
  340. this.resetListAreaHeight();
  341. this.currentFilterNode = node;
  342. this.currentFilterNode.setStyles(this.app.css.appFilterNode_current);
  343. }
  344. },
  345. createListAreaNode: function(){
  346. this.listScrollAreaNode = new Element("div", {"styles": this.css.listScrollAreaNode}).inject(this.contentNode);
  347. this.listAreaNode = new Element("div", {"styles": this.css.listAreaNode}).inject(this.listScrollAreaNode);
  348. var _self = this;
  349. MWF.require("MWF.widget.ScrollBar", function(){
  350. new MWF.widget.ScrollBar(this.listScrollAreaNode, {
  351. "style":"xApp_TaskList", "where": "before", "distance": 30, "friction": 4, "axis": {"x": false, "y": true},
  352. "onScroll": function(y, x){
  353. //new Element("div", {"text": "sss-"+y}).inject(_self.listScrollAreaNode, "before");
  354. // _self.app.taskTitleTextNode.set("text", "start");
  355. // _self.app.taskTitleTextNode.set("text", y);
  356. // if (!detail){
  357. var scrollSize = _self.listScrollAreaNode.getScrollSize();
  358. var clientSize = _self.listScrollAreaNode.getSize();
  359. var scrollHeight = scrollSize.y-clientSize.y;
  360. if (y+200>scrollHeight) {
  361. if (!_self.isElementLoaded) _self.listItemNext();
  362. }
  363. // }else{
  364. // _self.app.taskTitleTextNode.set("text", y);
  365. // }
  366. }
  367. });
  368. }.bind(this));
  369. },
  370. // setAppContentSize: function(){
  371. // var size = this.app.contentNode.getSize();
  372. // var x = this.container.getSize().x+size.x;
  373. // this.container.setStyle("width", ""+x+"px");
  374. // },
  375. resetListAreaHeight: function(){
  376. if (layout.mobile){
  377. this.resetListAreaHeight_mobile();
  378. }else{
  379. this.resetListAreaHeight_pc();
  380. }
  381. },
  382. resetListAreaHeight_mobile: function(){
  383. var contentSize = this.app.contentNode.getSize();
  384. this.contentNode.setStyle("width", ""+contentSize.x+"px");
  385. var size = this.contentNode.getSize();
  386. var barSize = this.actionBarNode.getSize();
  387. var y = size.y - barSize.y;
  388. this.listScrollAreaNode.setStyle("height", ""+y+"px");
  389. if (this.listAreaNode){
  390. // var count = (size.x/402).toInt();
  391. // var x = 402 * count;
  392. // var m = (size.x-x)/2;
  393. // this.listAreaNode.setStyles({
  394. // "width": ""+x+"px",
  395. // "margin-left": ""+m+"px"
  396. // });
  397. //
  398. // if (this.actionBarNode) this.actionBarNode.setStyles({
  399. // "width": ""+x+"px",
  400. // "margin-left": ""+m+"px"
  401. // });
  402. // var hCount = (y/102).toInt()+1;
  403. // this.pageCount = count*hCount;
  404. this.pageCount = 50;
  405. if (this.items.length<this.pageCount){
  406. this.listItemNext(this.pageCount-this.items.length);
  407. }
  408. //this.listAreaNode
  409. }
  410. },
  411. resetListAreaHeight_pc: function(){
  412. var contentSize = this.app.contentNode.getSize();
  413. this.contentNode.setStyle("width", ""+contentSize.x+"px");
  414. var size = this.contentNode.getSize();
  415. var barSize = this.actionBarNode.getSize();
  416. var y = size.y - barSize.y;
  417. this.listScrollAreaNode.setStyle("height", ""+y+"px");
  418. if (this.listAreaNode){
  419. var count = (size.x/350).toInt();
  420. var x = 350 * count;
  421. var m = (size.x-x)/2;
  422. this.listAreaNode.setStyles({
  423. "width": ""+x+"px",
  424. "margin-left": ""+m+"px"
  425. });
  426. if (this.actionBarNode) this.actionBarNode.setStyles({
  427. "width": ""+x+"px",
  428. "margin-left": ""+m+"px"
  429. });
  430. var hCount = (y/182).toInt()+1;
  431. this.pageCount = count*hCount;
  432. if (this.items.length<this.pageCount){
  433. this.listItemNext(this.pageCount-this.items.length);
  434. }
  435. //this.listAreaNode
  436. }
  437. },
  438. show: function(){
  439. //if (!this.app.contentScroll){
  440. // this.app.contentScroll = new Fx.Scroll(this.app.contentNode, {"wheelStops": false});
  441. //}
  442. //this.app.contentScroll.toElement(this.contentNode, "x");
  443. if (this.app.currentList) this.app.currentList.hide();
  444. this.app.currentList = this;
  445. this.contentNode.setStyle("display", "block");
  446. //this.refresh();
  447. },
  448. hide: function(){
  449. this.contentNode.setStyle("display", "none");
  450. },
  451. _getCurrentPageData: function(callback, count){
  452. this.app.getAction(function(){
  453. var id;
  454. if (this.filterApplication){
  455. id = (this.items.length) ? this.items[this.items.length-1].data.id : "(0)";
  456. this.app.action.listTaskNextByApp(function(json){
  457. if (callback) callback(json);
  458. }, null, id, count || this.pageCount, this.filterApplication);
  459. }else{
  460. id = (this.items.length) ? this.items[this.items.length-1].data.id : "(0)";
  461. this.app.action.listTaskNext(function(json){
  462. if (callback) callback(json);
  463. }, null, id, count || this.pageCount);
  464. }
  465. }.bind(this));
  466. },
  467. _getApplicationCount: function(callback){
  468. this.app.getAction(function(){
  469. this.app.action.listTaskApplication(function(json){
  470. if (callback) callback(json);
  471. }.bind(this));
  472. }.bind(this));
  473. },
  474. _createItem: function(task){
  475. return new MWF.xApplication.process.TaskCenter.TaskList.Item(task, this)
  476. },
  477. showDatch: function(){
  478. if (!this.datchActionNode){
  479. this.datchActionNode = new Element("div", {"styles": this.css.datchActionNode, "text": this.app.lp.datch}).inject(this.app.content);
  480. this.datchActionNode.position({
  481. relativeTo: this.actionBarNode,
  482. position: "centerbottom",
  483. edge: "centerbottom"
  484. });
  485. this.datchActionNode.addEvent("click", function(e){
  486. this.datchProcess();
  487. }.bind(this));
  488. }
  489. },
  490. hideDatch: function(){
  491. if (this.datchActionNode){
  492. this.datchActionNode.destroy();
  493. this.datchActionNode = null;
  494. }
  495. },
  496. datchProcess: function(){
  497. var width = "580";
  498. var height = "260";
  499. size = this.app.content.getSize();
  500. var x = (size.x-width)/2;
  501. var y = (size.y-height)/2;
  502. if (x<0) x = 0;
  503. if (y<0) y = 0;
  504. var _self = this;
  505. MWF.require("MWF.xDesktop.Dialog", function() {
  506. var dlg = new MWF.xDesktop.Dialog({
  507. "title": this.app.lp.datch,
  508. "style": "datch",
  509. "top": y - 20,
  510. "left": x,
  511. "fromTop": y - 20,
  512. "fromLeft": x,
  513. "width": width,
  514. "height": height,
  515. "html": "",
  516. "maskNode": this.app.content,
  517. "container": this.app.content,
  518. // "buttonList": [
  519. // {
  520. // "text": MWF.LP.process.button.ok,
  521. // "action": function(){
  522. // //if (callback) callback(_self.view.selectedItems);
  523. // if (callback) callback(_self.view.getData());
  524. // this.close();
  525. // }
  526. // },
  527. // {
  528. // "text": MWF.LP.process.button.cancel,
  529. // "action": function(){this.close();}
  530. // }
  531. // ]
  532. });
  533. dlg.show();
  534. MWF.xDesktop.requireApp("process.Work", "Processor", function(){
  535. new MWF.xApplication.process.Work.Processor(dlg.content, this.selectedTask[0].data, {
  536. "style": "task",
  537. "onCancel": function(){
  538. dlg.close();
  539. delete this;
  540. },
  541. "onSubmit": function(routeName, opinion, medias){
  542. _self.submitDatchTask(routeName, opinion, medias, this);
  543. dlg.close();
  544. delete this;
  545. }
  546. })
  547. }.bind(this));
  548. }.bind(this));
  549. },
  550. submitDatchTask: function(routeName, opinion, medias, processor){
  551. this.hideDatch();
  552. this.selectedTask.each(function(item){
  553. item.submitTask(routeName, opinion, medias, processor, true);
  554. }.bind(this));
  555. this.selectedTask = [];
  556. }
  557. });
  558. MWF.xApplication.process.TaskCenter.List.Item = new Class({
  559. initialize: function(data, list){
  560. this.data = data;
  561. this.list = list;
  562. this.container = this.list.listAreaNode;
  563. this.load();
  564. },
  565. load: function(){
  566. this.node = new Element("div", {"styles": this.list.css.itemNode}).inject(this.container);
  567. if (layout.mobile){
  568. this.node.setStyles(this.list.css.itemNode_mobile);
  569. }
  570. this.mainContentNode = new Element("div", {"styles": this.list.css.itemMainContentAreaNode}).inject(this.node);
  571. this.timeContentNode = new Element("div", {"styles": this.list.css.itemTimeContentAreaNode}).inject(this.node);
  572. this.leftContentNode = new Element("div", {"styles": this.list.css.itemMainLeftContentAreaNode}).inject(this.mainContentNode);
  573. this.applicationIconAreaNode = new Element("div", {"styles": this.list.css.itemApplicationIconAreaNode, "title": this.data.applicationName}).inject(this.leftContentNode);
  574. this.timeIconNode = new Element("div", {"styles": this.list.css.itemTimeIconNode}).inject(this.leftContentNode);
  575. this.applicationIconNode = new Element("div", {"styles": this.list.css.itemApplicationIconNode}).inject(this.applicationIconAreaNode);
  576. this.actionContentNode = new Element("div", {"styles": this.list.css.itemMainActionContentAreaNode}).inject(this.mainContentNode);
  577. this.rightContentNode = new Element("div", {"styles": this.list.css.itemMainRightContentAreaNode}).inject(this.mainContentNode);
  578. this.applicationTitleNode = new Element("div", {"styles": this.list.css.itemApplicationTitleNode}).inject(this.rightContentNode);
  579. this.titleNode = new Element("div", {"styles": this.list.css.itemTitleNode}).inject(this.rightContentNode);
  580. this.activityNode = new Element("div", {"styles": this.list.css.itemActivityNode}).inject(this.rightContentNode);
  581. // this.contentNode = new Element("div", {"styles": this.list.css.itemContentNode}).inject(this.rightContentNode);
  582. // this.inforNode = new Element("div", {"styles": this.list.css.itemInforNode}).inject(this.contentNode);
  583. this.newIconNode = new Element("div", {"styles": this.list.css.itemNewIconNode}).inject(this.node);
  584. this.getApplicationIcon(function(icon){
  585. var pic = "/x_component_process_ApplicationExplorer/$Main/default/icon/application.png";
  586. if (icon.icon){
  587. pic = "data:image/png;base64,"+icon.icon;
  588. }
  589. this.applicationIconNode.makeLnk({
  590. "par": this._getLnkPar(pic)
  591. });
  592. }.bind(this));
  593. this.setContent();
  594. this.setNewIcon();
  595. this.setEvent();
  596. this.setTimeIcon();
  597. this.node.fade("in");
  598. },
  599. _getLnkPar: function(icon){
  600. return {
  601. "icon": icon,
  602. "title": "["+this.data.processName+"]"+(this.data.title || this.list.app.lp.unnamed),
  603. "par": (this.data.workCompleted) ? "process.Work#{\"workCompletedId\":\""+this.data.workCompleted+"\"}" : "process.Work#{\"workId\":\""+this.data.work+"\"}"
  604. };
  605. },
  606. setTimeIcon: function(){
  607. //this.data.expireTime = "2017-08-31 19:00";
  608. if (this.data.completed){
  609. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/pic_ok.png)");
  610. return true;
  611. }
  612. this.timeIconNode.empty();
  613. if (this.data.expireTime){
  614. var d1 = Date.parse(this.data.expireTime);
  615. var d2 = Date.parse(this.data.createTime);
  616. var now = new Date();
  617. var time1 = d2.diff(now, "second");
  618. var time2 = now.diff(d1, "second");
  619. var time3 = d2.diff(d1, "second");
  620. var n = time1/time3;
  621. var img = "";
  622. var text = this.list.app.lp.expire1;
  623. text = text.replace(/{time}/g, this.data.expireTime);
  624. if (n<0.5){
  625. img = "1.png";
  626. }else if (n<0.75){
  627. img = "2.png";
  628. }else if (n<1){
  629. text = this.list.app.lp.expire2.replace(/{time}/g, this.data.expireTime);
  630. img = "3.png";
  631. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/pic_jichao.png)");
  632. }else if (n<2){
  633. text = this.list.app.lp.expire3.replace(/{time}/g, this.data.expireTime);
  634. img = "4.png";
  635. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/pic_yichao.png)");
  636. }else{
  637. text = this.list.app.lp.expire3.replace(/{time}/g, this.data.expireTime);
  638. img = "5.png";
  639. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/pic_yanchao.png)");
  640. }
  641. this.timeIconNode.setStyle("background-image", "url("+this.list.app.path+this.list.app.options.style+"/time/"+img+")");
  642. this.timeIconNode.set("title", text);
  643. }
  644. },
  645. setEvent: function(){
  646. this.node.addEvents({
  647. "mouseover": function(){this.showAction();}.bind(this),
  648. "mouseout": function(){this.hideAction();}.bind(this)
  649. });
  650. if (this.editNode){
  651. this.editNode.addEvent("click", function(e){
  652. this.editTask();
  653. }.bind(this));
  654. }
  655. if (this.closeNode){
  656. this.closeNode.addEvent("click", function(e){
  657. this.closeEditTask();
  658. }.bind(this));
  659. }
  660. if (this.rightContentNode){
  661. this.rightContentNode.addEvent("click", function(e){
  662. this.openTask(e);
  663. }.bind(this));
  664. }
  665. if (this.applicationIconNode){
  666. this.applicationIconNode.addEvent("click", function(e){
  667. this.selectTask(e);
  668. }.bind(this));
  669. }
  670. },
  671. selectTask: function(){
  672. if (!this.list.selectedTask) this.list.selectedTask = [];
  673. if (!this.selectedStatus){
  674. this.list.selectedTask.push(this);
  675. this.mainContentNodeBorder = this.mainContentNode.getStyle("border");
  676. this.mainContentNode.setStyles(this.list.css.itemMainContentAreaNode_selected);
  677. this.selectedStatus = true;
  678. }else{
  679. this.list.selectedTask.erase(this);
  680. this.mainContentNode.setStyles(this.list.css.itemMainContentAreaNode);
  681. this.mainContentNode.setStyle("border", this.mainContentNodeBorder);
  682. this.selectedStatus = false;
  683. }
  684. if (this.checkProcess()){
  685. this.list.showDatch();
  686. }else{
  687. this.list.hideDatch();
  688. }
  689. },
  690. checkProcess: function(){
  691. var flag = true;
  692. var activity = "";
  693. if (this.list.selectedTask.length){
  694. for (var i=0; i<this.list.selectedTask.length; i++){
  695. var item = this.list.selectedTask[i];
  696. if (!item.data.allowRapid) return false;
  697. if (!activity){
  698. activity = item.data.activity;
  699. }else{
  700. if ((activity != item.data.activity) || (!item.data.allowRapid)) return false;
  701. }
  702. }
  703. }else{
  704. return false;
  705. }
  706. return true;
  707. },
  708. showAction: function(){
  709. // if (this.editNode) this.editNode.fade("in");
  710. // if (this.closeNode) this.closeNode.fade("in");
  711. },
  712. hideAction: function(){
  713. // if (this.editNode) this.editNode.fade("out");
  714. // if (this.closeNode) this.closeNode.fade("out");
  715. },
  716. openTask: function(e){
  717. // this._getJobByTask(function(data){
  718. var options = {"workId": this.data.work, "appId": "process.Work"+this.data.work};
  719. this.list.app.desktop.openApplication(e, "process.Work", options);
  720. // }.bind(this));
  721. },
  722. closeEditTask: function(callback){
  723. this.closeNode.setStyle("display", "none");
  724. this.flowInforLeftNode.destroy();
  725. this.flowInforRightNode.destroy();
  726. this.flowInforContentNode.destroy();
  727. this.flowInforScrollNode.destroy();
  728. this.flowInforNode.destroy();
  729. this.processNode.destroy();
  730. this.flowInforScrollFx = null;
  731. this.flowInforLeftNode = null;
  732. this.flowInforRightNode = null;
  733. this.flowInforScrollNode = null;
  734. this.flowInforContentNode = null;
  735. delete this.flowInforScrollFx;
  736. delete this.flowInforLeftNode;
  737. delete this.flowInforRightNode;
  738. delete this.flowInforScrollNode;
  739. delete this.flowInforContentNode;
  740. delete this.flowInforNode;
  741. delete this.processNode;
  742. var p = this.node.getPosition(this.list.app.content);
  743. this.list.css.itemNode_edit_from.top = ""+ p.y+"px";
  744. this.list.css.itemNode_edit_from.left = ""+ p.x+"px";
  745. var morph = new Fx.Morph(this.mainContentNode, {
  746. "duration": 200,
  747. "transition": Fx.Transitions.Expo.easeIn,
  748. "onComplete": function(){
  749. this.nodeClone.destroy();
  750. this.nodeClone = null;
  751. this.list.app.content.unmask();
  752. document.body.setStyle("-webkit-overflow-scrolling", "touch");
  753. this.mainContentNode.setStyles(this.list.css.itemMainContentAreaNode);
  754. this.mainContentNode.setStyle("opacity", 1);
  755. this.list.app.removeEvent("resize", this.resizeEditNodeFun);
  756. this.editNode.setStyle("display", "block");
  757. if (callback) callback();
  758. }.bind(this)
  759. });
  760. morph.start(this.list.css.itemNode_edit_from);
  761. },
  762. editTask: function(){
  763. if (layout.mobile){
  764. this.editTask_mobile();
  765. }else{
  766. this.editTask_pc();
  767. }
  768. },
  769. editTask_mobile: function(){
  770. if (!this.nodeClone){
  771. this._getJobByTask(function(data){
  772. this.nodeClone = this.mainContentNode.clone(false);
  773. this.nodeClone.inject(this.mainContentNode, "after");
  774. this.mainContentNode.setStyles(this.list.css.itemNode_edit_from_mobile);
  775. this.mainContentNode.position({
  776. relativeTo: this.nodeClone,
  777. position: "topleft",
  778. edge: "topleft"
  779. });
  780. this.showEditNode(data);
  781. }.bind(this));
  782. }
  783. },
  784. editTask_pc: function(){
  785. this.list.app.content.mask({
  786. "destroyOnHide": true,
  787. "id": "mask_"+this.data.id,
  788. "style": this.list.css.maskNode
  789. });
  790. this._getJobByTask(function(data){
  791. this.nodeClone = this.mainContentNode.clone(false);
  792. this.nodeClone.inject(this.mainContentNode, "after");
  793. this.mainContentNode.setStyles(this.list.css.itemNode_edit_from);
  794. this.mainContentNode.position({
  795. relativeTo: this.nodeClone,
  796. position: "topleft",
  797. edge: "topleft"
  798. });
  799. // this.nodeClone = this.node.clone(false);
  800. // this.nodeClone.inject(this.node, "after");
  801. // this.node.setStyles(this.list.css.itemNode_edit_from);
  802. // this.node.position({
  803. // relativeTo: this.nodeClone,
  804. // position: "topleft",
  805. // edge: "topleft"
  806. // });
  807. this.showEditNode(data);
  808. }.bind(this));
  809. },
  810. setEditTaskNodes: function(data){
  811. this.flowInforNode = new Element("div", {"styles": this.list.css.flowInforNode}).inject(this.mainContentNode);
  812. this.processNode = new Element("div", {"styles": this.list.css.processNode}).inject(this.mainContentNode);
  813. this.setFlowInfor(data);
  814. this.setProcessor();
  815. },
  816. setFlowChart: function(data){
  817. var idx = 0;
  818. data.workLogList.each(function(worklog){
  819. if (!worklog.taskCompletedList) worklog.taskCompletedList = [];
  820. if (!worklog.taskList) worklog.taskList = [];
  821. if (worklog.taskCompletedList.length || worklog.taskList.length){
  822. this.createFlowInforWorklogNode(worklog.fromActivityName, worklog.taskCompletedList, worklog.taskList || [], idx, worklog.fromActivityToken == data.task.activityToken);
  823. idx++;
  824. }
  825. }.bind(this));
  826. return idx;
  827. },
  828. setFlowInfor: function(data){
  829. this.flowInforLeftNode = new Element("div", {"styles": this.list.css.flowInforLeftNode}).inject(this.flowInforNode);
  830. this.flowInforRightNode = new Element("div", {"styles": this.list.css.flowInforRightNode}).inject(this.flowInforNode);
  831. this.flowInforScrollNode = new Element("div", {"styles": this.list.css.flowInforScrollNode}).inject(this.flowInforNode);
  832. this.flowInforContentNode = new Element("div", {"styles": this.list.css.flowInforContentNode}).inject(this.flowInforScrollNode);
  833. var idx = this.setFlowChart(data);
  834. var x = (idx*40)+((idx-1)*16);
  835. this.flowInforContentNode.setStyle("width", ""+x+"px");
  836. this.setFlowInforScroll();
  837. },
  838. toFlowInforLeft: function(){
  839. var size = this.flowInforScrollNode.getSize();
  840. var scrollSize = this.flowInforScrollNode.getScrollSize();
  841. var scroll = this.flowInforScrollNode.getScroll();
  842. if (scroll.x>0){
  843. var scrollX = scroll.x-size.x;
  844. if (scrollX<0) scrollX = 0;
  845. if (scrollX>0){
  846. // this.flowInforLeftNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/processor/left.png)");
  847. }else{
  848. this.flowInforLeftNode.setStyle("background-image", "");
  849. }
  850. if (scrollX+size.x<scrollSize.x){
  851. this.flowInforRightNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/processor/right.png)");
  852. }else{
  853. // this.flowInforRightNode.setStyle("background-image", "");
  854. }
  855. this.flowInforScrollFx.start(scrollX);
  856. }
  857. },
  858. toFlowInforRight: function(){
  859. var size = this.flowInforScrollNode.getSize();
  860. var scrollSize = this.flowInforScrollNode.getScrollSize();
  861. var scroll = this.flowInforScrollNode.getScroll();
  862. if (scroll.x+size.x<scrollSize.x){
  863. var scrollX = scroll.x+size.x;
  864. if (scrollX>scrollSize.x) scrollX = scrollSize.x;
  865. if (scrollX>0){
  866. this.flowInforLeftNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/processor/left.png)");
  867. }else{
  868. //this.flowInforLeftNode.setStyle("background-image", "");
  869. }
  870. if (scrollX+size.x<scrollSize.x){
  871. //this.flowInforRightNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/processor/right.png)");
  872. }else{
  873. this.flowInforRightNode.setStyle("background-image", "");
  874. }
  875. this.flowInforScrollFx.start(scrollX);
  876. }
  877. },
  878. setFlowInforScroll: function(){
  879. var size = this.flowInforScrollNode.getSize();
  880. var scrollSize = this.flowInforScrollNode.getScrollSize();
  881. var scroll = this.flowInforScrollNode.getScroll();
  882. if (scrollSize.x>size.x){
  883. if (!this.flowInforScrollFx) this.flowInforScrollFx = new Fx.Scroll(this.flowInforScrollNode, {"wheelStops": false});
  884. this.flowInforScrollFx.toRight();
  885. this.flowInforLeftNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/processor/left.png)");
  886. this.flowInforLeftNode.addEvent("click", function(){this.toFlowInforLeft();}.bind(this));
  887. this.flowInforRightNode.addEvent("click", function(){this.toFlowInforRight();}.bind(this));
  888. }
  889. },
  890. createFlowInforWorklogNode: function(activityName, taskCompleteList, taskList, idx, isCurrent){
  891. if (idx!=0) var logLineNode = new Element("div", {"styles": this.list.css.logLineNode}).inject(this.flowInforContentNode);
  892. var logActivityNode = new Element("div", {"styles": this.list.css.logActivityNode}).inject(this.flowInforContentNode);
  893. var logActivityIconNode = new Element("div", {"styles": this.list.css.logActivityIconNode}).inject(logActivityNode);
  894. var logActivityTextNode = new Element("div", {"styles": this.list.css.logActivityTextNode, "text": activityName}).inject(logActivityNode);
  895. var iconName = "user";
  896. var iconSuffix = "";
  897. if ((taskCompleteList.length+taskList.length)>1) iconName = "users";
  898. if (isCurrent) iconSuffix = "_red";
  899. var inforNode = new Element("div", {"styles": this.list.css.logInforNode});
  900. taskCompleteList.each(function(route){
  901. var routeNode = new Element("div", {"styles": this.list.css.logRouteNode}).inject(inforNode);
  902. routeNode.set("text", route.person.substring(0, route.person.indexOf("@"))+": ");
  903. var opinionNode = new Element("div", {"styles": this.list.css.logOpinionNode}).inject(inforNode);
  904. if (!route.opinion) route.opinion = "";
  905. opinionNode.set("text", "["+route.routeName+"] "+route.opinion);
  906. var timeNode = new Element("div", {"styles": this.list.css.logTimeNode}).inject(inforNode);
  907. timeNode.set("text", route.completedTime);
  908. if (this.list.app.desktop.session.user.distinguishedName === route.person) if (!iconSuffix) iconSuffix = "_yellow";
  909. }.bind(this));
  910. taskList.each(function(task){
  911. var taskTextNode = new Element("div", {"styles": this.list.css.taskTextNode}).inject(inforNode);
  912. taskTextNode.set("text", task.person.substring(0, task.person.indexOf("@"))+" "+this.list.app.lp.processing);
  913. }.bind(this));
  914. var icon = "url("+"/x_component_process_TaskCenter/$Main/default/processor/"+iconName+iconSuffix+".png)";
  915. logActivityIconNode.setStyle("background-image", icon);
  916. if (taskList.length){
  917. var countNode = new Element("div", {"styles": this.list.css.logTaskCountNode}).inject(logActivityNode);
  918. //var text = (taskList.length>99) ? "99+" : taskList.length;
  919. var text = taskList.length;
  920. countNode.set("text", text);
  921. }
  922. new mBox.Tooltip({
  923. content: inforNode,
  924. setStyles: {content: {padding: 10, lineHeight: 20}},
  925. attach: logActivityNode,
  926. transition: 'flyin',
  927. offset: {
  928. x: this.list.app.contentNode.getScroll().x,
  929. y: this.list.listScrollAreaNode.getScroll().y
  930. }
  931. });
  932. },
  933. setProcessor: function(){
  934. var _self = this;
  935. MWF.xDesktop.requireApp("process.Work", "Processor", function(){
  936. new MWF.xApplication.process.Work.Processor(this.processNode, this.data, {
  937. "style": "task",
  938. "mediaNode": this.mainContentNode,
  939. "onCancel": function(){
  940. _self.closeEditTask();
  941. delete this;
  942. },
  943. "onSubmit": function(routeName, opinion, medias){
  944. _self.submitTask(routeName, opinion, medias, this);
  945. delete this;
  946. }
  947. })
  948. }.bind(this));
  949. },
  950. addMessage: function(data){
  951. if (layout.desktop.message){
  952. var content = "";
  953. if (data.length){
  954. data.each(function(work){
  955. var users = [];
  956. work.taskList.each(function(task){
  957. users.push(task.person+"("+task.department+")");
  958. }.bind(this));
  959. content += "<div><b>"+this.list.app.lp.nextActivity+"<font style=\"color: #ea621f\">"+work.fromActivityName+"</font>, "+this.list.app.lp.nextUser+"<font style=\"color: #ea621f\">"+users.join(", ")+"</font></b></div>"
  960. }.bind(this));
  961. }else{
  962. content += this.list.app.lp.workCompleted;
  963. }
  964. var msg = {
  965. "subject": this.list.app.lp.taskProcessed,
  966. "content": "<div>"+this.list.app.lp.taskProcessedMessage+"“"+this.data.title+"”</div>"+content
  967. };
  968. layout.desktop.message.addTooltip(msg);
  969. layout.desktop.message.addMessage(msg);
  970. }
  971. },
  972. submitTask: function(routeName, opinion, medias, processor, flag){
  973. if (!opinion) opinion = routeName;
  974. this.data.routeName = routeName;
  975. this.data.opinion = opinion;
  976. var mediaIds = [];
  977. if (medias.length){
  978. medias.each(function(file){
  979. var formData = new FormData();
  980. formData.append("file", file);
  981. //formData.append("fileName", (new MWF.UUID()).toString()+".wav");
  982. formData.append("site", "$mediaOpinion");
  983. this.list.app.action.uploadAttachment(this.data.work, formData, file, function(json){
  984. mediaIds.push(json.data.id);
  985. }.bind(this), null, false);
  986. }.bind(this));
  987. }
  988. if (mediaIds.length) this.data.mediaOpinion = mediaIds.join(",");
  989. this.list.app.action.processTask(function(json){
  990. // this.list.app.notice(this.list.app.lp.taskProcessed, "success");
  991. if (processor) processor.destroy();
  992. if (!flag){
  993. this.closeEditTask(function(){
  994. this.node.destroy();
  995. this.list.refresh();
  996. this.addMessage(json.data);
  997. delete this;
  998. }.bind(this));
  999. }else{
  1000. this.node.destroy();
  1001. this.list.refresh();
  1002. this.addMessage(json.data);
  1003. delete this;
  1004. }
  1005. }.bind(this), null, this.data.id, this.data);
  1006. },
  1007. resizeEditNode: function(){
  1008. var p = this.getEditNodePosition();
  1009. var size = this.list.app.content.getSize();
  1010. var maskNode = this.list.app.window.node.getElement("#mask_"+this.data.id);
  1011. if (maskNode) maskNode.setStyles({"width": ""+size.x+"px", "height": ""+size.y+"px"});
  1012. this.mainContentNode.setStyles({"top": ""+ p.y+"px", "left": ""+ p.x +"px"});
  1013. },
  1014. getEditNodePosition: function(){
  1015. var size = this.list.app.content.getSize();
  1016. var p = this.node.getPosition(this.list.app.content);
  1017. var top = p.y;
  1018. var left = p.x;
  1019. var w = this.list.css.itemNode_edit.width.toInt();
  1020. var h = this.list.css.itemNode_edit.height.toInt();
  1021. if (top+h>size.y){
  1022. top = size.y-h;
  1023. if (top<0) top=0;
  1024. }
  1025. if (left+w>size.x){
  1026. left = size.x-w;
  1027. if (left<0) left=0;
  1028. }
  1029. // var top = size.y/2-230;
  1030. // var left = size.x/2-260;
  1031. // if (top<0) top = 0;
  1032. return {"x": left, "y": top};
  1033. },
  1034. showEditNode: function(data, callback){
  1035. if (layout.mobile){
  1036. this.showEditNode_mobile(data, callback);
  1037. }else{
  1038. this.showEditNode_pc(data, callback);
  1039. }
  1040. },
  1041. showEditNode_mobile: function(data, callback){
  1042. var p = this.list.app.tabAreaNode.getPosition(this.list.app.content);
  1043. var contentSize = this.list.app.contentNode.getSize();
  1044. var tabSize = this.list.app.tabAreaNode.getSize();
  1045. var y = contentSize.y+tabSize.y;
  1046. this.list.css.itemNode_edit.top = ""+ p.y+"px";
  1047. this.list.css.itemNode_edit.left = ""+ p.x+"px";
  1048. this.list.css.itemNode_edit.width = ""+ contentSize.x+"px";
  1049. this.list.css.itemNode_edit.height = ""+ y+"px";
  1050. document.body.setStyle("-webkit-overflow-scrolling", "auto");
  1051. this.editNode.setStyle("display", "none");
  1052. var morph = new Fx.Morph(this.mainContentNode, {
  1053. "duration": 200,
  1054. "transition": Fx.Transitions.Expo.easeOut,
  1055. "onComplete": function(){
  1056. this.resizeEditNodeFun = this.resizeEditNode.bind(this);
  1057. this.list.app.addEvent("resize", this.resizeEditNodeFun);
  1058. this.setEditTaskNodes(data);
  1059. this.closeNode.setStyle("display", "block");
  1060. if (callback) callback();
  1061. }.bind(this)
  1062. });
  1063. morph.start(this.list.css.itemNode_edit);
  1064. },
  1065. showEditNode_pc: function(data, callback){
  1066. var p = this.getEditNodePosition();
  1067. this.list.css.itemNode_edit.top = ""+ p.y+"px";
  1068. this.list.css.itemNode_edit.left = ""+ p.x+"px";
  1069. this.editNode.setStyle("display", "none");
  1070. var morph = new Fx.Morph(this.mainContentNode, {
  1071. "duration": 200,
  1072. "transition": Fx.Transitions.Expo.easeOut,
  1073. "onComplete": function(){
  1074. this.resizeEditNodeFun = this.resizeEditNode.bind(this);
  1075. this.list.app.addEvent("resize", this.resizeEditNodeFun);
  1076. this.setEditTaskNodes(data);
  1077. this.closeNode.setStyle("display", "block");
  1078. if (callback) callback();
  1079. }.bind(this)
  1080. });
  1081. morph.start(this.list.css.itemNode_edit);
  1082. },
  1083. _getJobByTask: function(callback){
  1084. this.list.app.action.getSimpleJobByTask(function(json){
  1085. if (callback) callback(json.data);
  1086. }.bind(this), null, this.data.id);
  1087. },
  1088. setContent: function(){
  1089. this.applicationTitleNode.set("text", this.data.applicationName);
  1090. this.titleNode.set("html", "<font style=\"color: #333;\">["+this.data.processName+"]&nbsp;&nbsp;</font>"+this.data.title);
  1091. this.titleNode.set("title", this.data.title);
  1092. this.activityNode.set("text", "( "+(this.data.activityName || this.list.app.lp.completed)+" )");
  1093. this.timeContentNode.set("text", this.list.app.lp.list_comedate+": "+this.data.startTime);
  1094. this.loadActions();
  1095. this.loadApplicationIcon();
  1096. //this.setTimeIconNode();
  1097. },
  1098. loadActions: function(){
  1099. if (this.data.allowRapid){
  1100. this.editNode = new Element("div", {"styles": this.list.css.titleActionEditNode}).inject(this.actionContentNode);
  1101. this.closeNode = new Element("div", {"styles": this.list.css.titleActionCloseNode}).inject(this.actionContentNode);
  1102. }
  1103. },
  1104. loadApplicationIcon: function(){
  1105. this.getApplicationIcon(function(icon){
  1106. if (icon.icon){
  1107. //this.mainContentNode.setStyle("border-top", "4px solid "+icon.iconHue);
  1108. this.applicationIconNode.setStyle("background-image", "url(data:image/png;base64,"+icon.icon+")");
  1109. }else{
  1110. this.mainContentNode.setStyle("border-top", "4px solid #4e82bd");
  1111. this.applicationIconNode.setStyle("background-image", "url("+"/x_component_process_ApplicationExplorer/$Main/default/icon/application.png)");
  1112. }
  1113. }.bind(this));
  1114. },
  1115. getApplicationIcon: function(callback){
  1116. var icon = this.list.app.appIcons[this.data.application];
  1117. if (!icon) {
  1118. this.list.app.action.getApplicationIcon(function (json) {
  1119. if (json.data){
  1120. if (json.data){
  1121. this.list.app.appIcons[this.data.application] = json.data;
  1122. if (callback) callback(json.data);
  1123. }
  1124. }else{
  1125. this.invalidItem = true;
  1126. if (callback) callback({
  1127. "icon": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEgElEQVR4Xu1aPXMTSRB9vUaGQqs6iCgi4Bfgq7I2lqWrSwgQMQHyPzAJIeguvOT4BxbBxYjgkquTrFiiCvkXYCKKCFMSFEjs9tWsrEKWvTtfuyvXrTbd6ZnuN69fz842IecP5Tx+rAFYMyDnCKxTYBUE4MrWta9UuLu49hWeHlJveJy1P6kzQAT7eWPzPgN1MFeI6FpckMx8DKIeAe2iP3mVNiipADALuvAIQAOgLbtd5SGAVtGfvkgDjMQB+Fz1ngXgPdlO64IimOGAnhe7/d90bePGJwbAuOY9AqMJwu0kHTwzF+MIhKbb6b9IYh1rAATdxxub+yRyPMOHgbbrT3Zt08IKgHGlvIUN7NvnuSlyPISPXbc3EDph9BgDMPplu4KAXiad67pRhFXD4Qelf1/3dG3FeCMARPDEzoHJgmnZMAU7JiBoAyBozw4OVr3zy0AKJlCAHd100ALgpL4frC7nZfzhYdGf7ugIoxYAo5r3Mmu1l4V8hglAu9TpP1C1UwZgXC03QLSvOvFKxzHvut1BS8UHDQC8t6kfclQ8VhnDOHK7/TsqQ5UAGFW9JhGeqUy4PIZu3AR/eG9iChtbcPDY7b5+LltYCkB40nMKb01U/9Kv93D5yVN8++N3fP/nb5kvp97b2IqJRFVwg+kdmSBKARhXt/dAzp9a3gOYBzC30wHBxvaUnwoskANQK7/RLXvLAeiAYGN7dpN46HYGP8dtXiwAJ5cZH3V2X+Tt1b/akSZxTIgKfj7Zl4d1bT0p+pPrcWkQC4Bp6ZMFch4IJjZKGyMpibEAjGpem4D7SgstDdIJSGesri8MvCp1+pGf6vEAVMsfTdR/7qRKYGKsqBRRj454njeHqAal7uB61PzxKVDzWBfx5fEyEOLmtw1+Prfb6UfGGfnCRACjgjEBIanghU9GACT9za8DQpLBh4eimLuCSAYkDYBwRAWEpINfA3BRGKCy+zonRh1xNkqB3IugQHic5zIoABjVyscE+kmHbotjZbQXgpf6QQj8qdQZRP6QXR+F43Y39x9DJkL4v/ocDoWw6g1BONXNIdMEm0sNG9szfjEO3W4/tj9BfiOU9yux2e/vwpFJNbC52LSxDY+/4E+uP71tfSkalsM8X4vP82pc9URnxi1Z/l+I94x3brev1Kki1YAfAOT819jsZGh+R5gVM2R3gMt+KDMgFBbR/uZs9nTLYlbBg3FYDCYVmfAt+qMFQHguEA0SG+iZVIU0gRCqTz4qqTZIzANI47bIFpzMWmQWQQBTe9VMEDsP4rpJf5CIRTsFFncqbJNzqLUyTWAcIuCGLu2tNGCZqieNki3TP0im1Bdq7/qTho7gnbeWFQNOsUG00IBEq2y6hyXGO4Cbqi0wMoATA+DHgWl7j4maSWtDqPIsApd3fciCTjQFzltsdl641ACchrU+iDxH0CoG31u2dE81BaJQn4FRqDNRXRylZMwIVR3UI+Z2MZi20wg6dQaoUDDsNV54TMuYylpxYxLXAFuHsrZfA5A14hdtvTUDLtqOZO1P7hnwH8CljF98DV13AAAAAElFTkSuQmCC",
  1128. "iconHue": "#4e82bd"
  1129. });
  1130. }
  1131. }.bind(this), function(){
  1132. this.invalidItem = true;
  1133. if (callback) callback({
  1134. "icon": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEgElEQVR4Xu1aPXMTSRB9vUaGQqs6iCgi4Bfgq7I2lqWrSwgQMQHyPzAJIeguvOT4BxbBxYjgkquTrFiiCvkXYCKKCFMSFEjs9tWsrEKWvTtfuyvXrTbd6ZnuN69fz842IecP5Tx+rAFYMyDnCKxTYBUE4MrWta9UuLu49hWeHlJveJy1P6kzQAT7eWPzPgN1MFeI6FpckMx8DKIeAe2iP3mVNiipADALuvAIQAOgLbtd5SGAVtGfvkgDjMQB+Fz1ngXgPdlO64IimOGAnhe7/d90bePGJwbAuOY9AqMJwu0kHTwzF+MIhKbb6b9IYh1rAATdxxub+yRyPMOHgbbrT3Zt08IKgHGlvIUN7NvnuSlyPISPXbc3EDph9BgDMPplu4KAXiad67pRhFXD4Qelf1/3dG3FeCMARPDEzoHJgmnZMAU7JiBoAyBozw4OVr3zy0AKJlCAHd100ALgpL4frC7nZfzhYdGf7ugIoxYAo5r3Mmu1l4V8hglAu9TpP1C1UwZgXC03QLSvOvFKxzHvut1BS8UHDQC8t6kfclQ8VhnDOHK7/TsqQ5UAGFW9JhGeqUy4PIZu3AR/eG9iChtbcPDY7b5+LltYCkB40nMKb01U/9Kv93D5yVN8++N3fP/nb5kvp97b2IqJRFVwg+kdmSBKARhXt/dAzp9a3gOYBzC30wHBxvaUnwoskANQK7/RLXvLAeiAYGN7dpN46HYGP8dtXiwAJ5cZH3V2X+Tt1b/akSZxTIgKfj7Zl4d1bT0p+pPrcWkQC4Bp6ZMFch4IJjZKGyMpibEAjGpem4D7SgstDdIJSGesri8MvCp1+pGf6vEAVMsfTdR/7qRKYGKsqBRRj454njeHqAal7uB61PzxKVDzWBfx5fEyEOLmtw1+Prfb6UfGGfnCRACjgjEBIanghU9GACT9za8DQpLBh4eimLuCSAYkDYBwRAWEpINfA3BRGKCy+zonRh1xNkqB3IugQHic5zIoABjVyscE+kmHbotjZbQXgpf6QQj8qdQZRP6QXR+F43Y39x9DJkL4v/ocDoWw6g1BONXNIdMEm0sNG9szfjEO3W4/tj9BfiOU9yux2e/vwpFJNbC52LSxDY+/4E+uP71tfSkalsM8X4vP82pc9URnxi1Z/l+I94x3brev1Kki1YAfAOT819jsZGh+R5gVM2R3gMt+KDMgFBbR/uZs9nTLYlbBg3FYDCYVmfAt+qMFQHguEA0SG+iZVIU0gRCqTz4qqTZIzANI47bIFpzMWmQWQQBTe9VMEDsP4rpJf5CIRTsFFncqbJNzqLUyTWAcIuCGLu2tNGCZqieNki3TP0im1Bdq7/qTho7gnbeWFQNOsUG00IBEq2y6hyXGO4Cbqi0wMoATA+DHgWl7j4maSWtDqPIsApd3fciCTjQFzltsdl641ACchrU+iDxH0CoG31u2dE81BaJQn4FRqDNRXRylZMwIVR3UI+Z2MZi20wg6dQaoUDDsNV54TMuYylpxYxLXAFuHsrZfA5A14hdtvTUDLtqOZO1P7hnwH8CljF98DV13AAAAAElFTkSuQmCC",
  1135. "iconHue": "#f44336"
  1136. });
  1137. }.bind(this), this.data.application);
  1138. }else{
  1139. if (callback) callback(icon);
  1140. }
  1141. },
  1142. setNewIcon: function(){
  1143. var start = new Date().parse(this.data.startTime);
  1144. var now = new Date();
  1145. if (now.getTime()-start.getTime()<86400000){
  1146. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/new.png)");
  1147. }
  1148. },
  1149. setTimeIconNode: function(){
  1150. var colors = ["#FF0000", "#00d400", "#f6ff0c"];
  1151. var idx = (Math.random()*3).toInt();
  1152. var color = colors[idx];
  1153. this.timeIconNode.setStyle("background-color", color);
  1154. //timeIconNode
  1155. }
  1156. //load: function(){
  1157. // this.node = this.table.insertRow(this.table.rows.length || 0);
  1158. // this.node.setStyles(this.list.css.itemLine);
  1159. //
  1160. // this.appNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.applicationName}).inject(this.node);
  1161. // this.titleNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.title}).inject(this.node);
  1162. // this.processNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.processName}).inject(this.node);
  1163. // this.activityNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.activityName}).inject(this.node);
  1164. // this.dateNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.updateTime}).inject(this.node);
  1165. //
  1166. //
  1167. // //this.titleNode = this.node.insertCell(this.node.cells.length || 0);
  1168. // //this.titleNode.setStyles(this.list.css.itemCell);
  1169. // //this.titleNode.set("text", this.data.title);
  1170. //}
  1171. });