Project.js 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285
  1. /*
  2. this.data //project的数据
  3. this.currentProjectGroupData //当前taskgroup的数据
  4. */
  5. MWF.xApplication.TeamWork = MWF.xApplication.TeamWork || {};
  6. MWF.xDesktop.requireApp("TeamWork", "Common", null, false);
  7. MWF.xApplication.TeamWork.Project = new Class({
  8. Extends: MWF.widget.Common,
  9. Implements: [Options, Events],
  10. options: {
  11. "style": "default"
  12. },
  13. initialize: function (container, app, data, options) {
  14. this.setOptions(options);
  15. this.container = container;
  16. this.app = app;
  17. this.lp = this.app.lp.project;
  18. //this.actions = this.app.restActions;
  19. this.rootActions = this.app.rootActions;
  20. this.actions = this.rootActions.ProjectAction;
  21. //this.taskActions = this.rootActions.TaskAction;
  22. this.path = "/x_component_TeamWork/$Project/";
  23. this.cssPath = this.path+this.options.style+"/css.wcss";
  24. this._loadCss();
  25. this.data = data;
  26. },
  27. load: function () {
  28. this.container.setStyles({display:"flex"});
  29. this.container.empty();
  30. this.createTopBarLayout();
  31. this.createContentLayout();
  32. this.topBarTabItemTask.click();
  33. },
  34. createTopBarLayout:function(){
  35. var _self = this;
  36. this.topBarLayout = new Element("div.topBarLayout",{styles:this.css.topBarLayout}).inject(this.container);
  37. this.topBarBackContainer = new Element("div.topBarBackContainer",{styles:this.css.topBarBackContainer}).inject(this.topBarLayout);
  38. this.topBarBackHomeIcon = new Element("div.topBarBackHomeIcon",{styles:this.css.topBarBackHomeIcon}).inject(this.topBarBackContainer);
  39. this.topBarBackHomeIcon.addEvents({
  40. click:function(){
  41. var pl = new MWF.xApplication.TeamWork.ProjectList(this.container,this.app,this.actions,{});
  42. pl.load();
  43. }.bind(this),
  44. mouseover:function(){
  45. var opt={
  46. axis: "y" //箭头在x轴还是y轴上展现
  47. };
  48. this.app.showTips(this.topBarBackHomeIcon,{_html:"<div style='margin:2px 5px;'>"+this.lp.backProject+"</div>"},opt);
  49. }.bind(this)
  50. });
  51. this.topBarBackHomeNext = new Element("div.topBarBackHomeNext",{styles:this.css.topBarBackHomeNext}).inject(this.topBarBackContainer);
  52. this.topBarBackHomeTextContainer = new Element("div.topBarBackHomeTextContainer",{styles:this.css.topBarBackHomeTextContainer}).inject(this.topBarBackContainer);
  53. this.topBarBackHomeText = new Element("div.topBarBackHomeText",{styles:this.css.topBarBackHomeText,text:this.data.title}).inject(this.topBarBackHomeTextContainer);
  54. this.topBarBackHomeArrow = new Element("div.topBarBackHomeArrow",{styles:this.css.topBarBackHomeArrow}).inject(this.topBarBackHomeTextContainer);
  55. this.topBarBackHomeTextContainer.addEvents({
  56. click:function(){
  57. var plist = new MWF.xApplication.TeamWork.Project.ProjectList(this.container, this.topBarBackHomeTextContainer, this.app, this.data, {
  58. css:this.css,
  59. lp:this.lp,
  60. axis : "y",
  61. position : { //node 固定的位置
  62. x : "right", //x轴上left center right, auto 系统自动计算
  63. y : "auto" //y 轴上top middle bottom, auto 系统自动计算
  64. },
  65. priorityOfAuto :{
  66. x : [ "center", "right", "left" ], //当position x 为 auto 时候的优先级
  67. y : [ "middle", "bottom", "top" ] //当position y 为 auto 时候的优先级
  68. },
  69. nodeStyles : {
  70. "min-width":"300px",
  71. "padding":"2px",
  72. "border-radius":"5px",
  73. "z-index" : "101"
  74. }
  75. });
  76. plist.load();
  77. }.bind(this),
  78. mouseover:function(){this.getElements("div").setStyles({"color":"#4a90e2"})},
  79. mouseout:function () { this.getElements("div").setStyles({"color":"#333333"}) }
  80. });
  81. this.topBarTabsContainer = new Element("div.topBarTabsContainer",{styles:this.css.topBarTabsContainer}).inject(this.topBarLayout);
  82. this.topBarTabItemTask = new Element("div.topBarTabItemTask",{styles:this.css.topBarTabItemTask,text:this.lp.task}).inject(this.topBarTabsContainer);
  83. this.topBarTabItemTask.addEvents({
  84. click:function(){
  85. this.topBarTabItemTask.setStyles({"color":"#4A90E2","border-bottom":"2px solid #4A90E2"});
  86. this.topBarTabItemStat.setStyles({"color":"","border-bottom":"0px"});
  87. this.createTaskLayout();
  88. }.bind(this)
  89. });
  90. this.topBarTabItemStat = new Element("div.topBarTabItemStat",{styles:this.css.topBarTabItemStat,text:this.lp.stat}).inject(this.topBarTabsContainer);
  91. this.topBarTabItemStat.addEvents({
  92. click:function(){
  93. this.topBarTabItemTask.setStyles({"color":"","border-bottom":"0px"});
  94. this.topBarTabItemStat.setStyles({"color":"#4A90E2","border-bottom":"2px solid #4A90E2"});
  95. this.createStatLayout();
  96. }.bind(this)
  97. });
  98. this.topBarSettingContainer = new Element("div.topBarSettingContainer",{styles:this.css.topBarSettingContainer}).inject(this.topBarLayout);
  99. this.topBarSettingMenuContainer = new Element("div.topBarSettingMenuContainer",{styles:this.css.topBarSettingMenuContainer}).inject(this.topBarSettingContainer);
  100. this.topBarSettingMenuContainer.addEvents({
  101. click:function(){
  102. MWF.xDesktop.requireApp("TeamWork", "ProjectSetting", function(){
  103. var ps = new MWF.xApplication.TeamWork.ProjectSetting(this,this.data,
  104. {"width": "800","height": "80%",
  105. onPostOpen:function(){
  106. ps.formAreaNode.setStyles({"top":"10px"});
  107. var fx = new Fx.Tween(ps.formAreaNode,{duration:200});
  108. fx.start(["top"] ,"10px", "100px");
  109. },
  110. onPostClose:function(json){
  111. }
  112. },{
  113. container : this.container,
  114. lp : this.app.lp.projectSetting,
  115. css:_self.css
  116. }
  117. );
  118. ps.open();
  119. }.bind(this));
  120. }.bind(this),
  121. mouseover:function(){
  122. this.topBarSettingMenuContainer.getElements(".topBarSettingMenuIcon").setStyles({
  123. "background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_caidan_click.png)"
  124. });
  125. this.topBarSettingMenuContainer.getElements(".topBarSettingMenuText").setStyles({
  126. "color":"#4A90E2"
  127. });
  128. }.bind(this),
  129. mouseout:function(){
  130. this.topBarSettingMenuContainer.getElements(".topBarSettingMenuIcon").setStyles({
  131. "background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_caidan.png)"
  132. });
  133. this.topBarSettingMenuContainer.getElements(".topBarSettingMenuText").setStyles({
  134. "color":"#666666"
  135. });
  136. }.bind(this)
  137. });
  138. this.topBarSettingMenuIcon = new Element("div.topBarSettingMenuIcon",{styles:this.css.topBarSettingMenuIcon}).inject(this.topBarSettingMenuContainer);
  139. this.topBarSettingMenuText = new Element("div.topBarSettingMenuText",{styles:this.css.topBarSettingMenuText,text:this.lp.setting}).inject(this.topBarSettingMenuContainer);
  140. },
  141. createContentLayout:function(){
  142. this.contentLayout = new Element("div.contentLayout",{styles:this.css.contentLayout}).inject(this.container);
  143. },
  144. createTaskLayout:function(){
  145. if(this.contentLayout) this.contentLayout.empty();
  146. this.createNaviContent();
  147. this.createTaskContent();
  148. },
  149. createNaviContent:function(){
  150. if(this.naviLayout) this.naviLayout.destroy();
  151. this.naviLayout = new Element("div.naviLayout",{styles:this.css.naviLayout}).inject(this.contentLayout);
  152. this.app.setLoading(this.naviLayout);
  153. this.rootActions.TaskAction.statiticMyProject(this.data.id,function(json){
  154. this.projectGroupData = json.data;
  155. if(this.projectGroupData.groups && this.projectGroupData.groups.length>0){
  156. this.currentProjectGroupData = this.projectGroupData.groups[0]; //默认只有一个分组
  157. }
  158. this.naviLayout.empty();
  159. this.createNaviTask();
  160. this.createNaviView();
  161. this.naviTopMyTaskLayout.click();
  162. }.bind(this));
  163. },
  164. createNaviTask:function(){
  165. var _self = this;
  166. if(!this.currentProjectGroupData) return;
  167. if(this.naviTop) this.naviTop.destroy();
  168. this.naviTop = new Element("div.naviTop",{styles:this.css.naviTop}).inject(this.naviLayout);
  169. this.naviTopSearchContainer = new Element("div.naviTopSearchContainer",{styles:this.css.naviTopSearchContainer}).inject(this.naviTop);
  170. this.naviTopSearchIn = new Element("input.naviTopSearchIn",{styles:this.css.naviTopSearchIn,placeholder:this.lp.searchTask}).inject(this.naviTopSearchContainer);
  171. this.naviTopSearchIn.addEvents({
  172. keypress:function(e){
  173. this.searchLoading = true;
  174. var keycode = (e.event.keyCode ? e.event.keyCode : e.event.which);
  175. if (keycode == 13 || keycode == 10) {
  176. var key = this.naviTopSearchIn.get("value").trim();
  177. if(key=="") return;
  178. if(this.searchLoading) this.openSearch(key)
  179. }
  180. }.bind(this)
  181. });
  182. this.naviTopTaskContainer = new Element("div.naviTopTaskContainer",{styles:this.css.naviTopTaskContainer}).inject(this.naviTop);
  183. this.naviTopTaskText = new Element("div.naviTopTaskText",{styles:this.css.naviTopTaskText,text:this.lp.task}).inject(this.naviTopTaskContainer);
  184. this.naviTopTaskAdd = new Element("div.naviTopTaskAdd",{styles:this.css.naviTopTaskAdd}).inject(this.naviTopTaskContainer);
  185. this.naviTopTaskAdd.addEvents({
  186. click:function(){
  187. var data = {
  188. projectObj:this,
  189. taskGroupId:this.currentProjectGroupData.id,
  190. //projectId:this.data.id,
  191. taskListIds:[]
  192. };
  193. var opt = {
  194. onCreateTask:function(){
  195. this.createTaskGroup();
  196. }.bind(this)
  197. };
  198. var newTask = new MWF.xApplication.TeamWork.Project.NewTask(this,data,opt,{});
  199. newTask.open();
  200. }.bind(this),
  201. mouseover:function(){
  202. this.naviTopTaskAdd.setStyles({
  203. "background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_zengjia_blue2_click.png)"
  204. });
  205. this.app.showTips(this.naviTopTaskAdd,{_html:"<div style='margin:2px 5px;'>"+this.lp.taskAdd+"</div>"});
  206. }.bind(this),
  207. mouseout:function(){
  208. this.naviTopTaskAdd.setStyles({
  209. "background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_jia.png)"
  210. });
  211. }.bind(this)
  212. });
  213. this.naviTopMyTaskLayout = new Element("div.naviTopMyTaskLayout",{styles:this.css.naviTopMyTaskLayout}).inject(this.naviTop);
  214. this.naviTopMyTaskLayout.addEvents({
  215. click:function(){
  216. this.curNaviItem = "group";
  217. this.naviTopMyTaskLayout.setStyles({"background-color":"#F2F5F7"});
  218. this.naviViewContainer.getElements(".naviItemContainer").each(function(d){
  219. this.naviItemChange(d,"leave")
  220. }.bind(this));
  221. this.createTaskGroup();
  222. }.bind(this),
  223. mouseover:function(){ if(_self.curNaviItem!="group") this.setStyles({"background-color":"#F2F5F7"}) },
  224. mouseout:function(){ if(_self.curNaviItem!="group") this.setStyles({"background-color":""}) }
  225. });
  226. this.naviTopMyTaskContainer = new Element("div.naviTopMyTaskContainer",{styles:this.css.naviTopMyTaskContainer}).inject(this.naviTopMyTaskLayout);
  227. this.naviTopMyTaskText = new Element("div.naviTopMyTaskText",{styles:this.css.naviTopMyTaskText,text:this.lp.myTask}).inject(this.naviTopMyTaskContainer);
  228. this.naviTopMyTaskCount = new Element("div.naviTopMyTaskCount",{styles:this.css.naviTopMyTaskCount,text:"("+this.currentProjectGroupData.completedTotal+"/"+this.currentProjectGroupData.taskTotal+")"}).inject(this.naviTopMyTaskContainer);
  229. this.naviTopTaskLineContainer = new Element("div.naviTopTaskLineContainer",{styles:this.css.naviTopTaskLineContainer}).inject(this.naviTopMyTaskLayout);
  230. this.naviTopTaskLine = new Element("div.naviTopTaskLine",{styles:this.css.naviTopTaskLine}).inject(this.naviTopTaskLineContainer);
  231. this.loadTaskLine();
  232. //this.naviTopMyTaskLayout.click();
  233. },
  234. loadTaskLine:function(){
  235. this.completeLine = new Element("div.completeLine",{styles:this.css.completeLine}).inject(this.naviTopTaskLine);
  236. this.completeLine.addEvents({
  237. mouseover:function(){
  238. this.app.showTips(this.completeLine,{_html:"<div style='margin:2px 5px;'>"+this.lp.taskCompleteText+":"+this.currentProjectGroupData.completedTotal+"</div>"});
  239. }.bind(this)
  240. });
  241. this.overLine = new Element("div.overLine",{styles:this.css.overLine}).inject(this.naviTopTaskLine);
  242. this.overLine.addEvents({
  243. mouseover:function(){
  244. this.app.showTips(this.overLine,{_html:"<div style='margin:2px 5px;'>"+this.lp.taskCompleteText+":"+this.currentProjectGroupData.overtimeTotal+"</div>"});
  245. }.bind(this)
  246. });
  247. if(this.currentProjectGroupData){
  248. var taskTotal = this.currentProjectGroupData.taskTotal;
  249. var completedTotal = this.currentProjectGroupData.completedTotal;
  250. var overtimeTotal = this.currentProjectGroupData.overtimeTotal;
  251. //alert(taskTotal);alert(completedTotal);alert(overtimeTotal);
  252. if(taskTotal){
  253. var _width = this.naviTopTaskLine.getWidth();
  254. var completePixel =_width * (completedTotal / taskTotal);
  255. var overPixel =_width * (overtimeTotal / taskTotal);
  256. this.completeLine.setStyles({"width":completePixel+"px"});
  257. this.overLine.setStyles({"width":overPixel+"px"});
  258. }
  259. }
  260. },
  261. createNaviView:function(){
  262. if(this.naviView) this.naviView.destroy();
  263. this.naviView = new Element("div.naviView",{styles:this.css.naviView}).inject(this.naviLayout);
  264. this.naviViewTitleContainer = new Element("div.naviViewTitleContainer",{styles:this.css.naviViewTitleContainer}).inject(this.naviView);
  265. this.naviViewTitle = new Element("div.naviViewTitle",{styles:this.css.naviViewTitle,text:this.lp.viewTitle}).inject(this.naviViewTitleContainer);
  266. this.naviViewAdd = new Element("div.naviViewAdd",{styles:this.css.naviViewAdd}).inject(this.naviViewTitleContainer);
  267. this.naviViewAdd.addEvents({
  268. click:function(){
  269. }.bind(this),
  270. mouseover:function(){
  271. this.naviViewAdd.setStyles({
  272. "background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_zengjia_blue2_click.png)"
  273. });
  274. this.app.showTips(this.naviViewAdd,{_html:"<div style='margin:2px 5px;'>"+this.lp.viewAdd+"</div>"});
  275. }.bind(this),
  276. mouseout:function(){
  277. this.naviViewAdd.setStyles({
  278. "background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_jia.png)"
  279. });
  280. }.bind(this)
  281. });
  282. this.createNaviViewItem();
  283. },
  284. createNaviViewItem:function(){
  285. var _self = this;
  286. if(this.naviViewContainer) this.naviViewContainer.destroy();
  287. this.naviViewContainer = new Element("div.naviViewContainer",{styles:this.css.naviViewContainer}).inject(this.naviView);
  288. this.viewData = this.viewData || this.projectGroupData.views;
  289. this.viewData.each(function(json){
  290. if(json.name==this.lp.viewItemAll){//所有任务
  291. this.naviItemAllContainer = new Element("div.naviItemContainer",{styles:this.css.naviItemContainer}).inject(this.naviViewContainer);
  292. this.naviItemAllIcon = new Element("div.naviItemAllIcon",{styles:this.css.naviItemAllIcon}).inject(this.naviItemAllContainer);
  293. this.naviItemAllText = new Element("div.naviItemText",{styles:this.css.naviItemText,text:this.lp.viewItemAll}).inject(this.naviItemAllContainer);
  294. this.naviItemAllContainer.addEvents({
  295. click:function(){
  296. this.curNaviItem = json.name;
  297. this.openView(this.naviItemAllContainer);
  298. }.bind(this),
  299. mouseenter:function(){ if(_self.curNaviItem != json.name) _self.naviItemChange(this,"enter")},
  300. mouseleave:function(){ if(_self.curNaviItem != json.name) _self.naviItemChange(this,"leave")}
  301. });
  302. }else if(json.name==this.lp.viewItemMy){
  303. //我的任务
  304. this.naviItemMyContainer = new Element("div.naviItemContainer",{styles:this.css.naviItemContainer}).inject(this.naviViewContainer);
  305. this.naviItemMyIcon = new Element("div.naviItemMyIcon",{styles:this.css.naviItemMyIcon}).inject(this.naviItemMyContainer);
  306. this.naviItemMyText = new Element("div.naviItemText",{styles:this.css.naviItemText,text:this.lp.viewItemMy}).inject(this.naviItemMyContainer);
  307. this.naviItemMyMore = new Element("div.naviItemMore",{styles:this.css.naviItemMore}).inject(this.naviItemMyContainer);
  308. this.naviItemMyMore.addEvent(
  309. "click",function(e){
  310. this.openNaviViewMore(this.naviItemMyMore);
  311. e.stopPropagation();
  312. }.bind(this)
  313. );
  314. this.naviItemMyContainer.addEvents({
  315. click:function(){
  316. this.curNaviItem = json.name;
  317. this.openView(this.naviItemMyContainer);
  318. }.bind(this),
  319. mouseenter:function(){ if(_self.curNaviItem != json.name) _self.naviItemChange(this,"enter")},
  320. mouseleave:function(){ if(_self.curNaviItem != json.name) _self.naviItemChange(this,"leave")}
  321. });
  322. }else if(json.name==this.lp.viewItemFlow){
  323. //未完成的任务
  324. this.naviItemFlowContainer = new Element("div.naviItemContainer",{styles:this.css.naviItemContainer}).inject(this.naviViewContainer);
  325. this.naviItemFlowIcon = new Element("div.naviItemFlowIcon",{styles:this.css.naviItemFlowIcon}).inject(this.naviItemFlowContainer);
  326. this.naviItemFlowText = new Element("div.naviItemText",{styles:this.css.naviItemText,text:this.lp.viewItemFlow}).inject(this.naviItemFlowContainer);
  327. this.naviItemFlowMore = new Element("div.naviItemMore",{styles:this.css.naviItemMore}).inject(this.naviItemFlowContainer);
  328. this.naviItemFlowMore.addEvent(
  329. "click",function(e){
  330. this.openNaviViewMore(this.naviItemFlowMore);
  331. e.stopPropagation();
  332. }.bind(this)
  333. );
  334. this.naviItemFlowContainer.addEvents({
  335. click:function(){
  336. alert("open")
  337. }.bind(this),
  338. mouseenter:function(){ _self.naviItemChange(this,"enter")},
  339. mouseleave:function(){_self.naviItemChange(this,"leave")}
  340. });
  341. }else if(json.name==this.lp.viewItemComplete){
  342. //已完成任务
  343. this.naviItemCompleteContainer = new Element("div.naviItemContainer",{styles:this.css.naviItemContainer}).inject(this.naviViewContainer);
  344. this.naviItemCompleteIcon = new Element("div.naviItemCompleteIcon",{styles:this.css.naviItemCompleteIcon}).inject(this.naviItemCompleteContainer);
  345. this.naviItemCompleteText = new Element("div.naviItemText",{styles:this.css.naviItemText,text:this.lp.viewItemComplete}).inject(this.naviItemCompleteContainer);
  346. this.naviItemCompleteMore = new Element("div.naviItemMore",{styles:this.css.naviItemMore}).inject(this.naviItemCompleteContainer);
  347. this.naviItemCompleteMore.addEvent(
  348. "click",function(e){
  349. this.openNaviViewMore(this.naviItemCompleteMore);
  350. e.stopPropagation();
  351. }.bind(this)
  352. );
  353. this.naviItemCompleteContainer.addEvents({
  354. click:function(){
  355. alert("open")
  356. }.bind(this),
  357. mouseenter:function(){ _self.naviItemChange(this,"enter")},
  358. mouseleave:function(){_self.naviItemChange(this,"leave")}
  359. });
  360. }else if(json.name==this.lp.viewItemOver){
  361. //已逾期任务
  362. this.naviItemOverContainer = new Element("div.naviItemContainer",{styles:this.css.naviItemContainer}).inject(this.naviViewContainer);
  363. this.naviItemOverIcon = new Element("div.naviItemOverIcon",{styles:this.css.naviItemOverIcon}).inject(this.naviItemOverContainer);
  364. this.naviItemOverText = new Element("div.naviItemText",{styles:this.css.naviItemText,text:this.lp.viewItemOver}).inject(this.naviItemOverContainer);
  365. this.naviItemOverMore = new Element("div.naviItemMore",{styles:this.css.naviItemMore}).inject(this.naviItemOverContainer);
  366. this.naviItemOverMore.addEvent(
  367. "click",function(e){
  368. this.openNaviViewMore(this.naviItemOverMore);
  369. e.stopPropagation();
  370. }.bind(this)
  371. );
  372. this.naviItemOverContainer.addEvents({
  373. click:function(){
  374. alert("open")
  375. }.bind(this),
  376. mouseenter:function(){ _self.naviItemChange(this,"enter")},
  377. mouseleave:function(){_self.naviItemChange(this,"leave")}
  378. });
  379. }else{
  380. //自定义视图
  381. }
  382. }.bind(this));
  383. },
  384. naviItemChange:function(node,action){
  385. if(action == "enter"){
  386. node.setStyles({"background-color":"#F2F5F7"});
  387. divs = node.getElements("div");
  388. divs[0].setStyles({"background-image":divs[0].getStyle("background-image").replace(".png","_click.png")});
  389. divs[1].setStyles({"color":"#4A90E2"});
  390. if(divs[2]){
  391. divs[2].setStyles({"background-image":divs[2].getStyle("background-image").replace(".png","_click.png")});
  392. }
  393. }else if(action == "leave"){
  394. node.setStyles({"background-color":""});
  395. divs = node.getElements("div");
  396. divs[0].setStyles({"background-image":divs[0].getStyle("background-image").replace("_click.png",".png")});
  397. divs[1].setStyles({"color":"#2A2A2A"});
  398. if(divs[2]){
  399. divs[2].setStyles({"background-image":divs[2].getStyle("background-image").replace("_click.png",".png")});
  400. }
  401. }
  402. },
  403. openNaviViewMore:function(node){
  404. var tooltip = new MWF.xApplication.TeamWork.Project.NaviViewTip(this.container, node, this.app, {}, {
  405. css:this.css,
  406. lp:this.lp,
  407. axis : "y",
  408. nodeStyles : {
  409. "min-width":"100px",
  410. "padding":"2px",
  411. "border-radius":"5px",
  412. "z-index" : "101"
  413. },
  414. onPostLoad:function(){
  415. tooltip.node.setStyles({"opacity":"0"});
  416. var fx = new Fx.Tween(tooltip.node,{duration:200});
  417. fx.start(["opacity"] ,"0", "1");
  418. },
  419. onClose:function(rd){
  420. // customGroupItemContainer.set("atIn","no");
  421. // if(rd)_self.reloadProjectGroup();
  422. }
  423. });
  424. tooltip.load();
  425. },
  426. createTaskContent:function(){
  427. this.taskContentLayout = new Element("div.taskContentLayout",{styles:this.css.taskContentLayout}).inject(this.contentLayout);
  428. },
  429. createTaskGroup:function(){ //右侧内容
  430. if(this.currentProjectGroupData && this.currentProjectGroupData.id){
  431. this.app.setLoading(this.taskContentLayout);
  432. //this.actions.taskGroupList(this.currentProjectGroupData.id,function(json){
  433. this.rootActions.TaskListAction.listWithTaskGroup(this.currentProjectGroupData.id,function(json){
  434. this.taskContentLayout.empty();
  435. json.data.each(function(data,i){
  436. //if(i>0) return;
  437. var taskGroupLayout = new Element("div.taskGroupLayout",{styles:this.css.taskGroupLayout,id:data.id}).inject(this.taskContentLayout);
  438. taskGroupLayout.set("sortable",data.control.sortable); //控制是否能排序
  439. this.createTaskGroupItemLayout(taskGroupLayout,data);
  440. }.bind(this));
  441. //新建任务列表按钮
  442. this.newTaskGroupContainer = new Element("div.newTaskGroupContainer",{styles:this.css.newTaskGroupContainer}).inject(this.taskContentLayout);
  443. this.newTaskGroupContainer.addEvents({
  444. click:function(){
  445. var data = {
  446. isNew:true,
  447. taskGroupId:this.currentProjectGroupData.id,
  448. projectId:this.data.id
  449. };
  450. var opt = {
  451. onCreateTask:function(){
  452. this.createTaskGroup();
  453. }.bind(this)
  454. };
  455. var newTaskGroup = new MWF.xApplication.TeamWork.Project.NewTaskGroup(this,data,opt,{});
  456. newTaskGroup.open();
  457. }.bind(this),
  458. mouseover:function(){
  459. this.newTaskGroupIcon.setStyles({"background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_jia_20_click.png)"});
  460. this.newTaskGroupText.setStyles({"color":"#4A90E2","font-size":"16px"});
  461. }.bind(this),
  462. mouseout:function(){
  463. this.newTaskGroupIcon.setStyles({"background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_jia.png)"});
  464. this.newTaskGroupText.setStyles({"color":"#999999","font-size":"12px"});
  465. }.bind(this)
  466. });
  467. this.newTaskGroupIcon = new Element("div.newTaskGroupIcon",{styles:this.css.newTaskGroupIcon}).inject(this.newTaskGroupContainer);
  468. this.newTaskGroupText = new Element("div.newTaskGroupText",{styles:this.css.newTaskGroupText,text:this.lp.taskGroupAdd}).inject(this.newTaskGroupContainer);
  469. }.bind(this))
  470. }
  471. },
  472. createTaskGroupItemLayout:function(node,data){
  473. var _self = this;
  474. node.empty();
  475. var taskGroupItemTitleContainer = new Element("div.taskGroupItemTitleContainer",{styles:this.css.taskGroupItemTitleContainer}).inject(node);
  476. new Element("div.taskGroupItemTitleText",{styles:this.css.taskGroupItemTitleText,text:data.name}).inject(taskGroupItemTitleContainer);
  477. new Element("div.taskGroupItemTitleCount",{styles:this.css.taskGroupItemTitleCount,text:"("+data.taskCount+")"}).inject(taskGroupItemTitleContainer);
  478. if(data.control.sortable){
  479. var taskGroupItemTitleMore = new Element("div.taskGroupItemTitleMore",{styles:this.css.taskGroupItemTitleMore}).inject(taskGroupItemTitleContainer);
  480. taskGroupItemTitleMore.addEvents({
  481. click:function(){
  482. data.projectObj = this;
  483. data.node = node;
  484. var menu = new MWF.xApplication.TeamWork.Project.TaskGroupMenu(this.container, taskGroupItemTitleMore, this.app, data, {
  485. css:this.css,
  486. lp:this.lp,
  487. axis : "y",
  488. nodeStyles : {
  489. "min-width":"100px",
  490. "padding":"2px",
  491. "border-radius":"5px",
  492. "z-index" : "101"
  493. },
  494. onPostLoad:function(){
  495. menu.node.setStyles({"opacity":"0","top":(menu.node.getStyle("top").toInt()-10)+"px"});
  496. var fx = new Fx.Tween(menu.node,{duration:200});
  497. fx.start(["opacity"] ,"0", "1");
  498. },
  499. onClose:function(rd){
  500. if(!rd)return;
  501. _self.createTaskGroup()
  502. }
  503. });
  504. menu.load();
  505. }.bind(this),
  506. mouseover:function(){this.setStyles({"background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_more_click.png)"})},
  507. mouseout:function(){this.setStyles({"background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_more.png)"})}
  508. });
  509. }
  510. var taskGroupItemTitleAdd = new Element("div.taskGroupItemTitleAdd",{styles:this.css.taskGroupItemTitleAdd}).inject(taskGroupItemTitleContainer);
  511. if(!data.control.sortable) taskGroupItemTitleAdd.setStyle("margin-right","20px");
  512. taskGroupItemTitleAdd.addEvents({
  513. click:function(){
  514. var pdata = {
  515. projectObj:this,
  516. taskGroupId:this.currentProjectGroupData.id,
  517. //projectId:this.data.id,
  518. taskListIds:[data.id]
  519. };
  520. var opt = {
  521. onCreateTask:function(){
  522. this.createTaskGroup();
  523. }.bind(this)
  524. };
  525. var newTask = new MWF.xApplication.TeamWork.Project.NewTask(this,pdata,opt,{});
  526. newTask.open();
  527. }.bind(this),
  528. mouseover:function(){this.setStyles({"background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_zengjia_blue2_click.png)"})},
  529. mouseout:function(){this.setStyles({"background-image":"url(/x_component_TeamWork/$Project/default/icon/icon_jia.png)"})}
  530. });
  531. var taskGroupItemTitleReload = new Element("div.taskGroupItemTitleReload",{styles:this.css.taskGroupItemTitleReload, title:this.lp.reload}).inject(taskGroupItemTitleContainer);
  532. //if(!data.control.sortable) taskGroupItemTitleAdd.setStyle("margin-right","20px");
  533. taskGroupItemTitleReload.addEvents({
  534. click:function(){
  535. this.createTaskGroupItemLayout(node,data)
  536. }.bind(this)
  537. });
  538. var taskGroupItemContainer = new Element("div.taskGroupItemContainer",{styles:this.css.taskGroupItemContainer}).inject(node);
  539. var _h = node.getHeight().toInt()-taskGroupItemTitleContainer.getHeight().toInt() - 10 - 10;
  540. taskGroupItemContainer.setStyles({"height":_h+"px"});
  541. this.app.setScrollBar(taskGroupItemContainer);
  542. this.app.setLoading(taskGroupItemContainer);
  543. //this.actions.taskListByListId(this.data.id,data.id,function(json){
  544. this.rootActions.TaskAction.listMyTaskWithTaskListId(this.data.id,data.id,function(json){
  545. taskGroupItemContainer.empty();
  546. var taskListData = json.data;
  547. //alert(JSON.stringify(taskListData));
  548. taskListData.each(function(d){
  549. //var taskItemContainerDrag = new Element("div.taskItemContainerDrag.dragin",{styles:this.css.taskItemContainerDrag}).inject(taskGroupItemContainer);
  550. var taskItemContainer = new Element("div.taskItemContainer.dragin",{styles:this.css.taskItemContainer}).inject(taskGroupItemContainer);
  551. taskItemContainer.set("id",d.id);
  552. this.loadTaskNode(taskItemContainer,d);
  553. var int;
  554. var upTime = 0;
  555. var time = 200;
  556. taskItemContainer.addEvents({
  557. click:function(e){
  558. //解决click和mousedown事件冲突
  559. if(upTime>0){
  560. this.openTask(d.id,function(){ taskItemContainer.destroy() }.bind(this));
  561. upTime = 0
  562. }
  563. }.bind(this),
  564. mouseenter:function(){
  565. int = window.setInterval(function(){
  566. if(taskItemContainer.getElement(".taskItemHover").getWidth() == 10) return;
  567. taskItemContainer.getElement(".taskItemHover").setStyles({
  568. "width":(taskItemContainer.getElement(".taskItemHover").getWidth()+1)+"px"
  569. });
  570. }.bind(this),30)
  571. },
  572. mouseleave:function(){
  573. window.clearInterval(int);
  574. taskItemContainer.getElement(".taskItemHover").setStyles({"width":"5px"});
  575. }.bind(this),
  576. mouseup:function(){
  577. upTime = new Date().getTime();
  578. },
  579. mousedown:function(e){
  580. var position = taskItemContainer.getPosition();
  581. var clone = taskItemContainer.clone(true,true);
  582. clone.removeClass("dragin");
  583. clone.setStyles({
  584. "top":position.y+"px",
  585. "left":position.x+"px",
  586. "z-index":"9999",
  587. "position":"absolute",
  588. "cursor":"move"
  589. });
  590. var _height = clone.getHeight().toInt() - 2;
  591. var myDrag = new Drag.Move(clone, {
  592. container: this.taskContentLayout,
  593. //handle: taskItemHover,
  594. droppables: $$('.dragin'),
  595. onStart:function(el){
  596. if(upTime>0){
  597. myDrag.stop();
  598. }else{
  599. el.inject($(document.body));
  600. taskItemContainer.setStyles({"border":"1px dotted #000000","opacity":"0.3"});
  601. }
  602. },
  603. onLeave:function(el,dr){
  604. var pre = dr.getPrevious();
  605. if(pre && pre.get("class")=="taskItemInsertLine") {
  606. pre.destroy();
  607. }
  608. },
  609. onEnter:function(el,dr){
  610. var pre = dr.getPrevious();
  611. if(!pre || (pre && pre.get("class")!="taskItemInsertLine")){
  612. if(el.get("id")!=dr.get("id")){
  613. new Element("div.taskItemInsertLine",{styles:_self.css.taskItemInsertLine}).inject(dr,"before");
  614. }
  615. }
  616. },
  617. onDrop:function(el, dr, e){
  618. var taskId = el.get("id");
  619. var taskInId = null;
  620. var taskGroupInId = null;
  621. var taskGroupFromId = null;
  622. var taskGroupFromSortable = null;
  623. var taskGroupInSortable = null;
  624. el.setStyles({"cursor":""});
  625. if(!dr){
  626. //没有移入,还原
  627. var fx = new Fx.Tween(el,{duration:time});
  628. fx.start(["top"] ,el.getPosition().y+"px", taskItemContainer.getPosition().y+"px");
  629. var fx2 = new Fx.Tween(el,{duration:time});
  630. fx2.start(["left"] ,el.getPosition().x+"px", taskItemContainer.getPosition().x+"px");
  631. window.setTimeout(function(){
  632. taskItemContainer.setStyles({"border":"1px solid #e6e6e6","opacity":"1"});
  633. el.destroy()
  634. },time)
  635. }else{
  636. if(el.get("id")==dr.get("id")){ //如果移动的是本身的拷贝,恢复
  637. taskItemContainer.setStyles({"border":"1px solid #e6e6e6","opacity":"1"});
  638. el.destroy();
  639. }else{
  640. taskInId = dr.get("id");
  641. taskGroupFromId = taskItemContainer.getParent().getParent().get("id");
  642. taskGroupInId = dr.getParent().getParent().get("id");
  643. taskGroupFromSortable = taskItemContainer.getParent().getParent().get("sortable");
  644. taskGroupInSortable = dr.getParent().getParent().get("sortable");
  645. var pre = dr.getPrevious();
  646. if(pre && pre.get("class")=="taskItemInsertLine") {
  647. //alert("taskid="+taskId+",taskInId="+taskInId+",taskgroupFromid="+taskGroupFromId+",taskGroupInId="+taskGroupInId);
  648. if(taskGroupInSortable == "false"){
  649. //未分类视图不允许移入,还原并删除el对象
  650. _self.app.notice("未分类列表不允许移入","error");
  651. taskItemContainer.setStyles({"border":"1px solid #e6e6e6","opacity":"1"});
  652. if(pre && pre.get("class")=="taskItemInsertLine"){
  653. pre.destroy();
  654. el.destroy();
  655. }
  656. return ;
  657. }
  658. var data = {
  659. taskId:taskId,
  660. behindTaskId:taskInId
  661. };
  662. _self.rootActions.TaskListAction.addTask2ListWithBehindTask(taskGroupInId,data,function(json){
  663. if(json.type == "success"){ //返回成功后再换位置
  664. //fx fx2 动画clone到移入位置
  665. var fx = new Fx.Tween(el,{duration:time});
  666. fx.start(["top"] ,el.getPosition().y+"px", pre.getPosition().y+"px");
  667. var fx2 = new Fx.Tween(el,{duration:time});
  668. fx2.start(["left"] ,el.getPosition().x+"px", pre.getPosition().x+"px");
  669. //利用pre撑大高度
  670. pre.setStyles({"border":"0px","background-color":"#ffffff","height":(el.getHeight().toInt())+"px"});
  671. //var fx3 = new Fx.Tween(pre,{duration:time});
  672. //fx3.start(["height"] ,"0px", _height+"px");
  673. //新建一个占用原来位置
  674. var tmpdiv = taskItemContainer.clone();
  675. tmpdiv.setStyles({"border":"0px"});
  676. tmpdiv.empty();
  677. tmpdiv.inject(taskItemContainer,"before");
  678. //设置原有位置none
  679. taskItemContainer.setStyles({"display":"none"});
  680. //动画完成后插入真正的对象,恢复原位,并删除pre和clone
  681. window.setTimeout(function(){
  682. pre.destroy();
  683. taskItemContainer.setStyles({"border":"1px solid #e6e6e6","height":_height+"px","display":"block","opacity":"1"});
  684. taskItemContainer.inject(dr,"before");
  685. //fx4把临时占用的位置删除
  686. var fx4 = new Fx.Tween(tmpdiv,{duration:time});
  687. fx4.start(["height"] ,_height+"px", "0px");
  688. window.setTimeout(function(){
  689. if(tmpdiv) tmpdiv.destroy()
  690. },time);
  691. //删除clone即el对象
  692. el.destroy();
  693. },time);
  694. //刷新其他需要加载的位置,比如数量
  695. var taskGroupFrom = taskItemContainer.getParent().getParent();
  696. var taskGroupIn = dr.getParent().getParent();
  697. //_self.actions.taskGroupGet(_self.currentProjectGroupData.id,taskGroupFromId,function(json){
  698. _self.rootActions.TaskListAction.get(_self.currentProjectGroupData.id,taskGroupFromId,function(json){
  699. taskGroupFrom.getElement(".taskGroupItemTitleCount").set("text","("+json.data.taskCount +")")
  700. });
  701. _self.actions.taskGroupGet(_self.currentProjectGroupData.id,taskGroupInId,function(json){
  702. taskGroupIn.getElement(".taskGroupItemTitleCount").set("text","("+json.data.taskCount +")")
  703. })
  704. }else{
  705. //返回失败,还原并删除el对象
  706. taskItemContainer.setStyles({"border":"1px solid #e6e6e6","opacity":"1"});
  707. if(pre && pre.get("class")=="taskItemInsertLine"){
  708. pre.destroy();
  709. el.destroy();
  710. }
  711. }
  712. },function(xhr,text,error){
  713. _self.app.showErrorMessage(xhr,text,error);
  714. taskItemContainer.setStyles({"border":"1px solid #e6e6e6","opacity":"1"});
  715. if(pre && pre.get("class")=="taskItemInsertLine"){
  716. pre.destroy();
  717. el.destroy();
  718. }
  719. });
  720. }
  721. }
  722. }
  723. }
  724. });
  725. //传递鼠标事件e
  726. myDrag.start(e)
  727. }.bind(this)
  728. });
  729. }.bind(this));
  730. //最后加一行占位
  731. var emptyDrag = new Element("div.empty.dragin",{name:"item",styles:{
  732. "width":"100%",
  733. "height":"50px"
  734. }}).inject(taskGroupItemContainer);
  735. }.bind(this));
  736. },
  737. loadTaskNode:function(taskItemContainer,d){
  738. taskItemContainer.empty();
  739. var taskItemHover = new Element("div.taskItemHover",{styles:this.css.taskItemHover}).inject(taskItemContainer);
  740. if(d.priority == this.lp.urgency)taskItemHover.setStyle("background-color","#ffaf38");
  741. else if(d.priority == this.lp.emergency)taskItemHover.setStyle("background-color","#ff0000");
  742. var taskItemContent = new Element("div.taskItemContent",{styles:this.css.taskItemContent}).inject(taskItemContainer);
  743. var taskItemTitle = new Element("div.taskItemTitle",{styles:this.css.taskItemTitle,text:d.name}).inject(taskItemContent);
  744. var taskItemDetail = new Element("div.taskItemDetail",{styles:this.css.taskItemDetail}).inject(taskItemContent);
  745. //时限
  746. var taskItemLimit = new Element("div.taskItemLimit",{styles:this.css.taskItemLimit}).inject(taskItemDetail);
  747. taskItemLimit.set("text",this.app.formatDate(d.startTime) + " - " + this.app.formatDate(d.endTime));
  748. var intd = (this.app.compareWithNow(d.endTime)).intervalDay;
  749. //alert(d.endTime + "**************" + intd);
  750. if(intd==-1){
  751. taskItemLimit.setStyle("background-color","#E6240E");
  752. }else if(intd==0){
  753. taskItemLimit.setStyle("background-color","#fa8c15");
  754. }else{
  755. taskItemLimit.setStyle("background-color","#1b9aee");
  756. }
  757. //标签 taskTag等
  758. var taskItemTags = new Element("div.taskItemTags",{styles:this.css.taskItemTags}).inject(taskItemDetail);
  759. this.rootActions.TaskTagAction.listWithTask(d.id,function(json){
  760. json.data.each(function(data){
  761. var taskTagContent = new Element("div.taskTagContent",{styles:this.css.taskTagContent}).inject(taskItemTags);
  762. var taskTagColor = new Element("span",{styles:this.css.taskTagColor}).inject(taskTagContent);
  763. taskTagColor.setStyle("background-color",data.tagColor);
  764. new Element("span",{styles:this.css.taskTagText,text:data.tag}).inject(taskTagContent);
  765. }.bind(this));
  766. }.bind(this),null,false);
  767. taskItemHover.setStyles({"height":taskItemContainer.getHeight()});
  768. },
  769. openTask:function(id,callback){
  770. var data = {
  771. taskId:id
  772. };
  773. var opt = {
  774. "onPostClose":function(dd){
  775. if(!dd) return;
  776. if(dd.act == "remove"){
  777. if(callback){
  778. callback()
  779. }
  780. //this.createTaskGroup();
  781. }
  782. }.bind(this)
  783. };
  784. MWF.xDesktop.requireApp("TeamWork", "Task", function(){
  785. var task = new MWF.xApplication.TeamWork.Task(this,data,opt);
  786. task.open();
  787. }.bind(this));
  788. },
  789. openView:function(obj){
  790. this.naviTopMyTaskLayout.setStyles({"background-color":""});
  791. var _self = this;
  792. this.naviViewContainer.getElements(".naviItemContainer").each(function(d){
  793. this.naviItemChange(d,"leave")
  794. }.bind(this));
  795. this.naviItemChange(obj,"enter");
  796. if(this.viewContainer) delete this.viewContainer;
  797. if(this.viewListContainer) delete this.viewListContainer;
  798. this.taskContentLayout.empty();
  799. var viewContainer = this.viewContainer = new Element("div.viewContainer",{styles:this.css.viewContainer}).inject(this.taskContentLayout);
  800. viewContainer.addEvents({
  801. scroll:function(){
  802. var sTop = this.getScrollTop();
  803. var sHeight = this.getScrollHeight();
  804. var cHeight = viewContainer.getHeight();
  805. if(sHeight - sTop < cHeight+10){ //偏移量
  806. if(_self.viewLoading){
  807. _self.loadView(_self.curViewTaskId)
  808. }
  809. }
  810. }
  811. });
  812. var viewListContainer = this.viewListContainer = new Element("div.viewListContainer",{styles:this.css.viewListContainer}).inject(viewContainer);
  813. this.loadView()
  814. },
  815. openSearch:function(key){
  816. var _self = this;
  817. if(this.viewListContainer) delete this.viewListContainer;
  818. this.taskContentLayout.empty();
  819. var viewContainer = new Element("div.viewContainer",{styles:this.css.viewContainer}).inject(this.taskContentLayout);
  820. var viewListContainer = this.viewListContainer = new Element("div.viewListContainer",{styles:this.css.viewListContainer}).inject(viewContainer);
  821. //this.loadView()
  822. var data = {
  823. project:this.data.id,
  824. title:key
  825. };
  826. var tmpLoading = new Element("div.tmpLoading",{styles:{"background-color":"#ffffff"}}).inject(viewListContainer);
  827. this.app.setLoading(tmpLoading);
  828. this.searchLoading = false;
  829. this.actions.taskListNext("(0)",100,data,function(json){
  830. viewListContainer.empty();
  831. json.data.each(function(data){
  832. this.loadViewItem(data)
  833. }.bind(this));
  834. if(json.count==0){
  835. new Element("div.none",{styles:{
  836. "height":"100px",
  837. "line-height":"100px",
  838. "width":"100%",
  839. "text-align":"center",
  840. "background-color":"#ffffff",
  841. "font-size":"16px"
  842. },text:"未查找到数据"}).inject(this.viewListContainer);
  843. }
  844. this.searchLoading = true;
  845. }.bind(this))
  846. },
  847. loadView:function(id){
  848. this.viewListContainer.getElements(".viewNext").destroy();
  849. var data = {
  850. project:this.data.id
  851. };
  852. var tmpLoading = new Element("div.tmpLoading",{styles:{"background-color":"#ffffff"}}).inject(this.viewListContainer);
  853. this.app.setLoading(tmpLoading);
  854. this.viewLoading = false;
  855. this.actions.taskListNext(id||"(0)",10,data,function(json){
  856. this.viewListContainer.getElements(".tmpLoading").destroy();
  857. json.data.each(function(data){
  858. this.loadViewItem(data);
  859. this.curViewTaskId = data.id;
  860. }.bind(this));
  861. this.viewLoading = true;
  862. var sHeight = this.viewListContainer.getHeight();
  863. var cHeight = this.viewContainer.getHeight();
  864. if(sHeight<cHeight){
  865. var viewNext = new Element("div.viewNext",{styles:this.css.viewNext,text:"下一页"}).inject(this.viewListContainer);
  866. viewNext.addEvents({
  867. click:function(){
  868. this.loadView(this.curViewTaskId)
  869. }.bind(this)
  870. })
  871. }
  872. // if(sHeight - sTop < cHeight+10){ //偏移量
  873. // if(_self.viewLoading){
  874. // _self.loadView(_self.curViewTaskId)
  875. // }
  876. // }
  877. }.bind(this))
  878. },
  879. loadViewItem:function(data){
  880. var viewItem = new Element("div.viewItem",{styles:this.css.viewItem}).inject(this.viewListContainer);
  881. var viewName = new Element("div.viewName",{styles:this.css.viewName,text:data.name}).inject(viewItem);
  882. var viewStatus = new Element("div.viewStatus",{styles:this.css.viewStatus,text:data.priority}).inject(viewItem);
  883. var viewDuty = new Element("div.viewDuty",{styles:this.css.viewDuty}).inject(viewItem);
  884. var viewDutyIcon = new Element("div.viewDutyIcon",{styles:this.css.viewDutyIcon}).inject(viewDuty);
  885. if(data.executor && data.executor!=""){
  886. viewDutyIcon.set("text",data.executor.split("@")[0].substr(0,1));
  887. viewDutyIcon.set("title",data.executor.split("@")[0])
  888. }
  889. viewItem.addEvents({
  890. mouseover:function(){ this.setStyles({"background-color":"#F2F5F7"}) },
  891. mouseout:function(){ this.setStyles({"background-color":"#ffffff"}) },
  892. click:function(){
  893. this.openTask(data.id,function(){ viewItem.destroy() }.bind(this))
  894. }.bind(this)
  895. })
  896. },
  897. createStatLayout:function(){
  898. MWF.xDesktop.requireApp("TeamWork", "Stat", function(){
  899. var stat = new MWF.xApplication.TeamWork.Stat(this.contentLayout,this.app,this.data,{
  900. }
  901. );
  902. stat.load();
  903. }.bind(this));
  904. },
  905. test:function(){
  906. }
  907. });
  908. MWF.xApplication.TeamWork.Project.NewTask = new Class({
  909. Extends: MPopupForm,
  910. options : {
  911. "style": "default",
  912. "width": 400,
  913. "height": 250,
  914. "top": null,
  915. "left": null,
  916. "bottom" : null,
  917. "right" : null,
  918. "minWidth" : 300,
  919. "minHeight" : 220,
  920. "closeByClickMask" : true,
  921. "hasTopContent" : true,
  922. "hasTop":true,
  923. "hasBottom": false,
  924. "hasIcon": false,
  925. "title":""
  926. },
  927. _createTableContent:function(){
  928. this.rootActions = this.app.rootActions;
  929. if(this.formTopTextNode) this.formTopTextNode.set("text",this.lp.newTaskTitle);
  930. //this.formTableArea
  931. this.titleContainer = new Element("div.titleContainer",{styles:this.css.titleContainer}).inject(this.formTableArea);
  932. this.titleValue = new Element("input.titleValue",{styles:this.css.titleValue,placeholder:this.lp.newTaskPlaceholder}).inject(this.titleContainer);
  933. this.actionContainer = new Element("div.actionContainer",{styles:this.css.actionContainer}).inject(this.formTableArea);
  934. this.okAction = new Element("div.okAction",{styles:this.css.okAction,text:this.lp.newTaskOk}).inject(this.actionContainer);
  935. this.okAction.addEvents({
  936. click:function(){
  937. if(this.titleValue.get("value").trim()=="") return;
  938. var data={
  939. taskGroupId:this.data.taskGroupId,
  940. taskListIds:this.data.taskListIds || [],
  941. name: this.titleValue.get("value").trim()
  942. };
  943. this.rootActions.TaskAction.save(data,function(json){
  944. if(json.data.id){
  945. var data = {
  946. projectObj:this.data.projectObj || null,
  947. taskId:json.data.id
  948. };
  949. var opt = {
  950. };
  951. MWF.xDesktop.requireApp("TeamWork", "Task", function(){
  952. var task = new MWF.xApplication.TeamWork.Task(this,data,opt);
  953. task.open();
  954. }.bind(this));
  955. this.fireEvent("createTask");
  956. this.close();
  957. }
  958. }.bind(this))
  959. }.bind(this)
  960. });
  961. this.closeAction = new Element("div.closeAction",{styles:this.css.closeAction,text:this.lp.newTaskClose}).inject(this.actionContainer);
  962. this.closeAction.addEvents({
  963. click:function(){
  964. this.close();
  965. }.bind(this)
  966. });
  967. }
  968. });
  969. MWF.xApplication.TeamWork.Project.NewTaskGroup = new Class({
  970. Extends: MPopupForm,
  971. options : {
  972. "style": "default",
  973. "width": 400,
  974. "height": 250,
  975. "top": null,
  976. "left": null,
  977. "bottom" : null,
  978. "right" : null,
  979. "minWidth" : 300,
  980. "minHeight" : 220,
  981. "closeByClickMask" : true,
  982. "hasTopContent" : true,
  983. "hasTop":true,
  984. "hasBottom": false,
  985. "hasIcon": false,
  986. "title":""
  987. },
  988. _createTableContent:function(){
  989. this.rootActions = this.app.rootActions;
  990. this.explorer = this.data.projectObj;
  991. if(this.formTopTextNode) this.formTopTextNode.set("text",this.data.isNew?this.lp.taskGroupAdd:this.lp.taskGroupEdit);
  992. //this.formTableArea
  993. this.titleContainer = new Element("div.titleContainer",{styles:this.css.titleContainer}).inject(this.formTableArea);
  994. this.titleValue = new Element("input.titleValue",{styles:this.css.titleValue,placeholder:this.lp.newTaskListPlaceholder}).inject(this.titleContainer);
  995. var val = this.data.isNew?"":this.data.name;
  996. this.titleValue.set("value",val);
  997. this.actionContainer = new Element("div.actionContainer",{styles:this.css.actionContainer}).inject(this.formTableArea);
  998. this.okAction = new Element("div.okAction",{styles:this.css.okAction,text:this.lp.newTaskOk}).inject(this.actionContainer);
  999. this.okAction.addEvents({
  1000. click:function(){
  1001. if(this.titleValue.get("value").trim()=="") return;
  1002. var data={
  1003. id:this.data.id || "",
  1004. taskGroup:this.data.taskGroupId,
  1005. project:this.data.projectId,
  1006. name: this.titleValue.get("value").trim()
  1007. };
  1008. this.rootActions.TaskListAction.save(data,function(json){
  1009. this.fireEvent("createTask");
  1010. this.close(json);
  1011. if(this.explorer){
  1012. if(this.data.node){
  1013. if(json.data.id){
  1014. this.rootActions.TaskListAction.get(this.explorer.currentProjectGroupData.id,json.data.id,function(json){
  1015. this.explorer.createTaskGroupItemLayout(this.data.node,json.data)
  1016. }.bind(this));
  1017. }else{
  1018. this.explorer.createTaskGroup()
  1019. }
  1020. }else{
  1021. this.explorer.createTaskGroup()
  1022. }
  1023. }
  1024. }.bind(this))
  1025. }.bind(this)
  1026. });
  1027. this.closeAction = new Element("div.closeAction",{styles:this.css.closeAction,text:this.lp.newTaskClose}).inject(this.actionContainer);
  1028. this.closeAction.addEvents({
  1029. click:function(){
  1030. this.close();
  1031. }.bind(this)
  1032. });
  1033. }
  1034. });
  1035. MWF.xApplication.TeamWork.Project.TaskGroupMenu = new Class({
  1036. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1037. options : {
  1038. // displayDelay : 300,
  1039. hasArrow:false,
  1040. event:"click"
  1041. },
  1042. _loadCustom : function( callback ){
  1043. var _self = this;
  1044. this.css = this.options.css;
  1045. this.lp = this.options.lp;
  1046. //this.data
  1047. this.menuTipLayout = new Element("div.menuTipLayout",{styles:this.css.menuTipLayout}).inject(this.contentNode);
  1048. this.menuTipTitle = new Element("div.menuTipTitle",{styles:this.css.menuTipTitle,text:this.lp.taskGroup}).inject(this.menuTipLayout);
  1049. this.menuTipEditContainer = new Element("div.menuTipContainer",{styles:this.css.menuTipContainer}).inject(this.menuTipLayout);
  1050. this.menuTipEditIcon = new Element("div.menuTipEditIcon",{styles:this.css.menuTipEditIcon}).inject(this.menuTipEditContainer);
  1051. this.menuTipEditText = new Element("div.menuTipEditText",{styles:this.css.menuTipText,text:this.lp.taskGroupEdit}).inject(this.menuTipEditContainer);
  1052. this.menuTipEditContainer.addEvents({
  1053. click:function(){
  1054. var data = this.data;
  1055. data.isNew = false;
  1056. var opt = {
  1057. };
  1058. var newTaskGroup = new MWF.xApplication.TeamWork.Project.NewTaskGroup(this,data,opt,{});
  1059. newTaskGroup.open();
  1060. this.close();
  1061. }.bind(this),
  1062. mouseover:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1063. mouseout:function(){this.setStyles({"background-color":""})}
  1064. });
  1065. this.menuTipRemoveContainer = new Element("div.menuTipContainer",{styles:this.css.menuTipContainer}).inject(this.menuTipLayout);
  1066. this.menuTipRemoveIcon = new Element("div.menuTipRemoveIcon",{styles:this.css.menuTipRemoveIcon}).inject(this.menuTipRemoveContainer);
  1067. this.menuTipRemoveText = new Element("div.menuTipRemoveText",{styles:this.css.menuTipText,text:this.lp.taskGroupRemove}).inject(this.menuTipRemoveContainer);
  1068. this.menuTipRemoveContainer.addEvents({
  1069. click:function(e){
  1070. _self.app.confirm("warn",e,_self.app.lp.common.confirm.removeTitle,_self.app.lp.common.confirm.removeContent,300,120,function(){
  1071. if(_self.data.id){
  1072. _self.rootActions.TaskListAction.delete(_self.data.id,function(json){
  1073. this.close();
  1074. _self.close(json)
  1075. }.bind(this))
  1076. }
  1077. },function(){
  1078. this.close();
  1079. });
  1080. }.bind(this),
  1081. mouseover:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1082. mouseout:function(){this.setStyles({"background-color":""})}
  1083. });
  1084. if(callback)callback();
  1085. }
  1086. });
  1087. MWF.xApplication.TeamWork.Project.NaviViewTip = new Class({
  1088. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1089. options : {
  1090. // displayDelay : 300,
  1091. hasArrow:false,
  1092. event:"click"
  1093. },
  1094. _loadCustom : function( callback ){
  1095. var _self = this;
  1096. this.css = this.options.css;
  1097. this.lp = this.options.lp;
  1098. //this.data
  1099. this.menuTipLayout = new Element("div.menuTipLayout",{styles:this.css.menuTipLayout}).inject(this.contentNode);
  1100. this.menuTipTitle = new Element("div.menuTipTitle",{styles:this.css.menuTipTitle,text:this.lp.view}).inject(this.menuTipLayout);
  1101. this.menuTipEditContainer = new Element("div.menuTipContainer",{styles:this.css.menuTipContainer}).inject(this.menuTipLayout);
  1102. this.menuTipEditIcon = new Element("div.menuTipEditIcon",{styles:this.css.menuTipEditIcon}).inject(this.menuTipEditContainer);
  1103. this.menuTipEditText = new Element("div.menuTipEditText",{styles:this.css.menuTipText,text:this.lp.viewEdit}).inject(this.menuTipEditContainer);
  1104. this.menuTipEditContainer.addEvents({
  1105. click:function(){
  1106. }.bind(this),
  1107. mouseover:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1108. mouseout:function(){this.setStyles({"background-color":""})}
  1109. });
  1110. this.menuTipRemoveContainer = new Element("div.menuTipContainer",{styles:this.css.menuTipContainer}).inject(this.menuTipLayout);
  1111. this.menuTipRemoveIcon = new Element("div.menuTipRemoveIcon",{styles:this.css.menuTipRemoveIcon}).inject(this.menuTipRemoveContainer);
  1112. this.menuTipRemoveText = new Element("div.menuTipRemoveText",{styles:this.css.menuTipText,text:this.lp.viewRemove}).inject(this.menuTipRemoveContainer);
  1113. this.menuTipRemoveContainer.addEvents({
  1114. click:function(e){
  1115. _self.app.confirm("warn",e,_self.app.lp.common.confirm.removeTitle,_self.app.lp.common.confirm.removeContent,300,120,function(){
  1116. },function(){
  1117. this.close();
  1118. });
  1119. }.bind(this),
  1120. mouseover:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1121. mouseout:function(){this.setStyles({"background-color":""})}
  1122. });
  1123. if(callback)callback();
  1124. }
  1125. });
  1126. MWF.xApplication.TeamWork.Project.ProjectList = new Class({
  1127. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1128. options : {
  1129. // displayDelay : 300,
  1130. hasArrow:false,
  1131. event:"click"
  1132. },
  1133. _loadCustom : function(callback){
  1134. var _self = this;
  1135. this.css = this.options.css;
  1136. this.lp = this.options.lp;
  1137. //this.data
  1138. //this.contentNode
  1139. this.itemLayout = new Element("div.itemLayout",{styles:this.css.itemLayout}).inject(this.contentNode);
  1140. this.app.setLoading(this.itemLayout);
  1141. this.rootActions.ProjectAction.listStarNextWithFilter("(0)",100,{},function(json){
  1142. this.app.setScrollBar(this.itemLayout);
  1143. this.itemLayout.empty();
  1144. if(json.data && json.data.length>0){
  1145. this.starText = new Element("div.starText",{styles:this.css.itemText,text:this.lp.starItem}).inject(this.itemLayout);
  1146. json.data.each(function(data){
  1147. var projectListContainer = new Element("div.projectListContainer",{styles:this.css.projectListContainer}).inject(this.itemLayout);
  1148. var projectListIcon = new Element("div.projectListIcon",{styles:this.css.projectListIcon}).inject(projectListContainer);
  1149. if(data.icon && data.icon!=""){
  1150. projectListIcon.setStyles({"background-image":"url('"+MWF.xDesktop.getImageSrc( data.icon )+"')"});
  1151. }
  1152. new Element("div.projectListText",{styles:this.css.projectListText,text:data.title}).inject(projectListContainer);
  1153. if(this.data.id == data.id){
  1154. new Element("div.projectListSelect",{styles:this.css.projectListSelect}).inject(projectListContainer);
  1155. }
  1156. projectListContainer.addEvents({
  1157. click:function(){
  1158. MWF.xDesktop.requireApp("TeamWork", "Project", function(){
  1159. var p = new MWF.xApplication.TeamWork.Project(this.container,this.app,data,{});
  1160. p.load();
  1161. }.bind(this));
  1162. }.bind(this),
  1163. mouseover:function () { this.setStyles({"background-color":"#F2F5F7"})},
  1164. mouseout:function () { this.setStyles({"background-color":""})}
  1165. });
  1166. }.bind(this))
  1167. }
  1168. var tmpContainer = new Element("div.tmpContainer").inject(this.itemLayout);
  1169. this.app.setLoading(tmpContainer);
  1170. this.rootActions.ProjectAction.listNextWithFilter("(0)",100,{},function(json){
  1171. tmpContainer.destroy();
  1172. this.allItemText = new Element("div.allItemText",{styles:this.css.itemText,text:this.lp.allItem}).inject(this.itemLayout);
  1173. json.data.each(function(data){
  1174. var projectListContainer = new Element("div.projectListContainer",{styles:this.css.projectListContainer}).inject(this.itemLayout);
  1175. var projectListIcon = new Element("div.projectListIcon",{styles:this.css.projectListIcon}).inject(projectListContainer);
  1176. if(data.icon && data.icon!=""){
  1177. projectListIcon.setStyles({"background-image":"url('"+MWF.xDesktop.getImageSrc( data.icon )+"')"});
  1178. }
  1179. new Element("div.projectListText",{styles:this.css.projectListText,text:data.title}).inject(projectListContainer);
  1180. if(this.data.id == data.id){
  1181. new Element("div.projectListSelect",{styles:this.css.projectListSelect}).inject(projectListContainer);
  1182. }
  1183. projectListContainer.addEvents({
  1184. click:function(){
  1185. MWF.xDesktop.requireApp("TeamWork", "Project", function(){
  1186. var p = new MWF.xApplication.TeamWork.Project(this.container,this.app,data,{});
  1187. p.load();
  1188. }.bind(this));
  1189. }.bind(this),
  1190. mouseover:function () { this.setStyles({"background-color":"#F2F5F7"})},
  1191. mouseout:function () { this.setStyles({"background-color":""})}
  1192. });
  1193. }.bind(this));
  1194. }.bind(this))
  1195. }.bind(this));
  1196. if(callback)callback();
  1197. }
  1198. });