List.js 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326
  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. var content = "";
  952. if (data.length){
  953. data.each(function(work){
  954. var users = [];
  955. work.taskList.each(function(task){
  956. users.push(task.person+"("+task.department+")");
  957. }.bind(this));
  958. 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>"
  959. }.bind(this));
  960. }else{
  961. content += this.list.app.lp.workCompleted;
  962. }
  963. //
  964. //
  965. //data.taskList.each(function(list){
  966. // content += "<div><b>"+this.list.app.lp.nextActivity+"<font style=\"color: #ea621f\">"+list.activityName+"</font>, "+this.list.app.lp.nextUser+"<font style=\"color: #ea621f\">"+list.personList.join(", ")+"</font></b></div>"
  967. //}.bind(this));
  968. var msg = {
  969. "subject": this.list.app.lp.taskProcessed,
  970. "content": "<div>"+this.list.app.lp.taskProcessedMessage+"“"+this.data.title+"”</div>"+content
  971. };
  972. layout.desktop.message.addTooltip(msg);
  973. layout.desktop.message.addMessage(msg);
  974. },
  975. submitTask: function(routeName, opinion, medias, processor, flag){
  976. if (!opinion) opinion = routeName;
  977. this.data.routeName = routeName;
  978. this.data.opinion = opinion;
  979. var mediaIds = [];
  980. if (medias.length){
  981. medias.each(function(file){
  982. var formData = new FormData();
  983. formData.append("file", file);
  984. //formData.append("fileName", (new MWF.UUID()).toString()+".wav");
  985. formData.append("site", "$mediaOpinion");
  986. this.list.app.action.uploadAttachment(this.data.work, formData, file, function(json){
  987. mediaIds.push(json.data.id);
  988. }.bind(this), null, false);
  989. }.bind(this));
  990. }
  991. if (mediaIds.length) this.data.mediaOpinion = mediaIds.join(",");
  992. this.list.app.action.processTask(function(json){
  993. // this.list.app.notice(this.list.app.lp.taskProcessed, "success");
  994. if (processor) processor.destroy();
  995. if (!flag){
  996. this.closeEditTask(function(){
  997. this.node.destroy();
  998. this.list.refresh();
  999. this.addMessage(json.data);
  1000. delete this;
  1001. }.bind(this));
  1002. }else{
  1003. this.node.destroy();
  1004. this.list.refresh();
  1005. this.addMessage(json.data);
  1006. delete this;
  1007. }
  1008. }.bind(this), null, this.data.id, this.data);
  1009. },
  1010. resizeEditNode: function(){
  1011. var p = this.getEditNodePosition();
  1012. var size = this.list.app.content.getSize();
  1013. var maskNode = this.list.app.window.node.getElement("#mask_"+this.data.id);
  1014. if (maskNode) maskNode.setStyles({"width": ""+size.x+"px", "height": ""+size.y+"px"});
  1015. this.mainContentNode.setStyles({"top": ""+ p.y+"px", "left": ""+ p.x +"px"});
  1016. },
  1017. getEditNodePosition: function(){
  1018. var size = this.list.app.content.getSize();
  1019. var p = this.node.getPosition(this.list.app.content);
  1020. var top = p.y;
  1021. var left = p.x;
  1022. var w = this.list.css.itemNode_edit.width.toInt();
  1023. var h = this.list.css.itemNode_edit.height.toInt();
  1024. if (top+h>size.y){
  1025. top = size.y-h;
  1026. if (top<0) top=0;
  1027. }
  1028. if (left+w>size.x){
  1029. left = size.x-w;
  1030. if (left<0) left=0;
  1031. }
  1032. // var top = size.y/2-230;
  1033. // var left = size.x/2-260;
  1034. // if (top<0) top = 0;
  1035. return {"x": left, "y": top};
  1036. },
  1037. showEditNode: function(data, callback){
  1038. if (layout.mobile){
  1039. this.showEditNode_mobile(data, callback);
  1040. }else{
  1041. this.showEditNode_pc(data, callback);
  1042. }
  1043. },
  1044. showEditNode_mobile: function(data, callback){
  1045. var p = this.list.app.tabAreaNode.getPosition(this.list.app.content);
  1046. var contentSize = this.list.app.contentNode.getSize();
  1047. var tabSize = this.list.app.tabAreaNode.getSize();
  1048. var y = contentSize.y+tabSize.y;
  1049. this.list.css.itemNode_edit.top = ""+ p.y+"px";
  1050. this.list.css.itemNode_edit.left = ""+ p.x+"px";
  1051. this.list.css.itemNode_edit.width = ""+ contentSize.x+"px";
  1052. this.list.css.itemNode_edit.height = ""+ y+"px";
  1053. document.body.setStyle("-webkit-overflow-scrolling", "auto");
  1054. this.editNode.setStyle("display", "none");
  1055. var morph = new Fx.Morph(this.mainContentNode, {
  1056. "duration": 200,
  1057. "transition": Fx.Transitions.Expo.easeOut,
  1058. "onComplete": function(){
  1059. this.resizeEditNodeFun = this.resizeEditNode.bind(this);
  1060. this.list.app.addEvent("resize", this.resizeEditNodeFun);
  1061. this.setEditTaskNodes(data);
  1062. this.closeNode.setStyle("display", "block");
  1063. if (callback) callback();
  1064. }.bind(this)
  1065. });
  1066. morph.start(this.list.css.itemNode_edit);
  1067. },
  1068. showEditNode_pc: function(data, callback){
  1069. var p = this.getEditNodePosition();
  1070. this.list.css.itemNode_edit.top = ""+ p.y+"px";
  1071. this.list.css.itemNode_edit.left = ""+ p.x+"px";
  1072. this.editNode.setStyle("display", "none");
  1073. var morph = new Fx.Morph(this.mainContentNode, {
  1074. "duration": 200,
  1075. "transition": Fx.Transitions.Expo.easeOut,
  1076. "onComplete": function(){
  1077. this.resizeEditNodeFun = this.resizeEditNode.bind(this);
  1078. this.list.app.addEvent("resize", this.resizeEditNodeFun);
  1079. this.setEditTaskNodes(data);
  1080. this.closeNode.setStyle("display", "block");
  1081. if (callback) callback();
  1082. }.bind(this)
  1083. });
  1084. morph.start(this.list.css.itemNode_edit);
  1085. },
  1086. _getJobByTask: function(callback){
  1087. this.list.app.action.getSimpleJobByTask(function(json){
  1088. if (callback) callback(json.data);
  1089. }.bind(this), null, this.data.id);
  1090. },
  1091. setContent: function(){
  1092. this.applicationTitleNode.set("text", this.data.applicationName);
  1093. this.titleNode.set("html", "<font style=\"color: #333;\">["+this.data.processName+"]&nbsp;&nbsp;</font>"+this.data.title);
  1094. this.titleNode.set("title", this.data.title);
  1095. this.activityNode.set("text", "( "+(this.data.activityName || this.list.app.lp.completed)+" )");
  1096. this.timeContentNode.set("text", this.list.app.lp.list_comedate+": "+this.data.startTime);
  1097. this.loadActions();
  1098. this.loadApplicationIcon();
  1099. //this.setTimeIconNode();
  1100. },
  1101. loadActions: function(){
  1102. if (this.data.allowRapid){
  1103. this.editNode = new Element("div", {"styles": this.list.css.titleActionEditNode}).inject(this.actionContentNode);
  1104. this.closeNode = new Element("div", {"styles": this.list.css.titleActionCloseNode}).inject(this.actionContentNode);
  1105. }
  1106. },
  1107. loadApplicationIcon: function(){
  1108. this.getApplicationIcon(function(icon){
  1109. if (icon.icon){
  1110. //this.mainContentNode.setStyle("border-top", "4px solid "+icon.iconHue);
  1111. this.applicationIconNode.setStyle("background-image", "url(data:image/png;base64,"+icon.icon+")");
  1112. }else{
  1113. this.mainContentNode.setStyle("border-top", "4px solid #4e82bd");
  1114. this.applicationIconNode.setStyle("background-image", "url("+"/x_component_process_ApplicationExplorer/$Main/default/icon/application.png)");
  1115. }
  1116. }.bind(this));
  1117. },
  1118. getApplicationIcon: function(callback){
  1119. var icon = this.list.app.appIcons[this.data.application];
  1120. if (!icon) {
  1121. this.list.app.action.getApplicationIcon(function (json) {
  1122. if (json.data){
  1123. if (json.data){
  1124. this.list.app.appIcons[this.data.application] = json.data;
  1125. if (callback) callback(json.data);
  1126. }
  1127. }else{
  1128. this.invalidItem = true;
  1129. if (callback) callback({
  1130. "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",
  1131. "iconHue": "#4e82bd"
  1132. });
  1133. }
  1134. }.bind(this), function(){
  1135. this.invalidItem = true;
  1136. if (callback) callback({
  1137. "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",
  1138. "iconHue": "#f44336"
  1139. });
  1140. }.bind(this), this.data.application);
  1141. }else{
  1142. if (callback) callback(icon);
  1143. }
  1144. },
  1145. setNewIcon: function(){
  1146. var start = new Date().parse(this.data.startTime);
  1147. var now = new Date();
  1148. if (now.getTime()-start.getTime()<86400000){
  1149. this.newIconNode.setStyle("background-image", "url("+"/x_component_process_TaskCenter/$Main/default/time/new.png)");
  1150. }
  1151. },
  1152. setTimeIconNode: function(){
  1153. var colors = ["#FF0000", "#00d400", "#f6ff0c"];
  1154. var idx = (Math.random()*3).toInt();
  1155. var color = colors[idx];
  1156. this.timeIconNode.setStyle("background-color", color);
  1157. //timeIconNode
  1158. }
  1159. //load: function(){
  1160. // this.node = this.table.insertRow(this.table.rows.length || 0);
  1161. // this.node.setStyles(this.list.css.itemLine);
  1162. //
  1163. // this.appNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.applicationName}).inject(this.node);
  1164. // this.titleNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.title}).inject(this.node);
  1165. // this.processNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.processName}).inject(this.node);
  1166. // this.activityNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.activityName}).inject(this.node);
  1167. // this.dateNode = new Element("td", {"styles": this.list.css.itemCell, "text": this.data.updateTime}).inject(this.node);
  1168. //
  1169. //
  1170. // //this.titleNode = this.node.insertCell(this.node.cells.length || 0);
  1171. // //this.titleNode.setStyles(this.list.css.itemCell);
  1172. // //this.titleNode.set("text", this.data.title);
  1173. //}
  1174. });