Task.js 95 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952
  1. MWF.xApplication.TeamWork = MWF.xApplication.TeamWork || {};
  2. MWF.xApplication.TeamWork.Task = new Class({
  3. Extends: MPopupForm,
  4. Implements: [Options, Events],
  5. options: {
  6. "style": "default",
  7. "width": 1000,
  8. "height": "90%",
  9. "top": null,
  10. "left": null,
  11. "bottom" : null,
  12. "right" : null,
  13. "minWidth" : 300,
  14. "minHeight" : 220,
  15. "isLimitSize": true,
  16. "ifFade": false,
  17. "hasTop": false,
  18. "hasTopIcon" : false,
  19. "hasTopContent" : false,
  20. "hasIcon": false,
  21. "hasBottom": false,
  22. "hasMask" : true,
  23. "closeByClickMask" : false,
  24. "hasScroll" : false,
  25. "scrollType" : "",
  26. "title": "",
  27. "draggable": false,
  28. "resizeable" : false,
  29. "maxAction" : false,
  30. "closeAction": false,
  31. "relativeToApp" : true,
  32. "sizeRelateTo" : "app", //desktop
  33. "resultSeparator" : ","
  34. },
  35. initialize: function (explorer, data, options, para) {
  36. this.setOptions(options);
  37. this.explorer = explorer;
  38. this.app = this.explorer.app;
  39. this.container = this.app.content;
  40. this.rootActions = this.app.rootActions;
  41. this.actions = this.rootActions.TaskAction;
  42. this.data = data || {};
  43. this.css = {};
  44. this.cssPath = "/x_component_TeamWork/$Task/"+this.options.style+"/css.wcss";
  45. this.load();
  46. this.lp = this.app.lp.task;
  47. },
  48. close: function (data) {
  49. //愤愤愤愤
  50. this.fireEvent("queryClose");
  51. this._close();
  52. //if( this.form ){
  53. // this.form.destroy();
  54. //}
  55. if(this.setFormNodeSizeFun && this.app && this.app.removeEvent ){
  56. this.app.removeEvent("resize",this.setFormNodeSizeFun);
  57. }
  58. if( this.formMaskNode )this.formMaskNode.destroy();
  59. if( this.formAreaNode )this.formAreaNode.destroy();
  60. this.fireEvent("postClose",[data]);
  61. delete this;
  62. },
  63. openTask:function(data){
  64. //this.data.taskId = data.id;
  65. //alert("id="+this.data.taskId)
  66. // this.formAreaNode.setStyles({"opacity":"1"});
  67. // var fx = new Fx.Tween(this.formAreaNode,{duration:400});
  68. // fx.start(["opacity"] ,"1", "0");
  69. var ef = new Fx.Morph(this.formAreaNode, {
  70. duration: 200,
  71. transition: Fx.Transitions.Sine.easeOut,
  72. onStart:function(){},
  73. onComplete:function(){
  74. this._createTableContent();
  75. }.bind(this)
  76. });
  77. ef.start({
  78. 'opacity': [1, 0]
  79. });
  80. //this.formAreaNode.setStyles({"opacity":0});
  81. //this._createTableContent();
  82. },
  83. _createTableContent: function () {
  84. var _self = this;
  85. this.getTaskData(function(){
  86. this.formTableArea.empty();
  87. this.topLayout = new Element("div.topLayout",{styles:this.css.topLayout}).inject(this.formTableArea);
  88. //this.topImage = new Element("div.topImage",{styles:this.css.topImage}).inject(this.topLayout);
  89. this.topContent = new Element("div.topContent",{styles:this.css.topContent,text:this.taskData.name}).inject(this.topLayout);
  90. if(this.isNew){
  91. this.topContent.set("text",this.lp.newTask)
  92. }
  93. this.topIconContainer = new Element("div.topIconContainer",{styles:this.css.topIconContainer}).inject(this.topLayout);
  94. //更多
  95. this.topIconMore = new Element("div.topIconMore",{styles:this.css.topIconMore,title:this.lp.more}).inject(this.topIconContainer);
  96. this.topIconMore.addEvents({
  97. click:function(){
  98. var tm = new MWF.xApplication.TeamWork.Task.TaskMore(this.container, this.topIconMore, this.app, {data:this.taskData}, {
  99. css:this.css, lp:this.lp, axis : "y",
  100. position : { //node 固定的位置
  101. x : "auto",
  102. y : "middle"
  103. },
  104. nodeStyles : {
  105. "min-width":"200px",
  106. "padding":"2px",
  107. "border-radius":"5px",
  108. "box-shadow":"0px 0px 4px 0px #999999",
  109. "z-index" : "201"
  110. },
  111. onPostLoad:function(){
  112. tm.node.setStyles({"opacity":"0","top":(tm.node.getStyle("top").toInt()+4)+"px"});
  113. var fx = new Fx.Tween(tm.node,{duration:400});
  114. fx.start(["opacity"] ,"0", "1");
  115. },
  116. onClose:function(rd){
  117. if(!rd) return;
  118. if(rd.act == "remove"){
  119. this.close(rd);
  120. if(this.data.projectObj){ //reload project
  121. this.data.projectObj.createTaskGroup()
  122. }
  123. }
  124. }.bind(this)
  125. },null,this);
  126. tm.load();
  127. }.bind(this),
  128. mouseover:function(){
  129. this.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_more_click.png)"});
  130. },
  131. mouseout:function(){
  132. this.setStyles(_self.css.topIconMore)
  133. }
  134. });
  135. //关闭
  136. this.topIconClose = new Element("div.topIconClose",{styles:this.css.topIconClose,title:this.lp.close}).inject(this.topIconContainer);
  137. this.topIconClose.addEvents({
  138. click:function(){
  139. this.close()
  140. }.bind(this),
  141. mouseover:function(){
  142. this.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_off_click.png)"});
  143. },
  144. mouseout:function(){
  145. this.setStyles(_self.css.topIconClose)
  146. }
  147. });
  148. this.contentLayout = new Element("div.contentLayout",{styles:this.css.contentLayout}).inject(this.formTableArea);
  149. this.createContentLayout();
  150. this.createDetailLayout();
  151. this.formAreaNode.setStyles({"opacity":1})
  152. }.bind(this));
  153. },
  154. createContentLayout:function(){
  155. var _self = this;
  156. this.taskInforContainer = new Element("div.taskInforContainer",{styles:this.css.taskInforContainer}).inject(this.contentLayout);
  157. this.taskActionBar = new Element("div.taskActionBar",{styles:this.css.taskActionBar}).inject(this.taskInforContainer);
  158. if(this.taskData.parent!="0"){
  159. this.taskActionParentContent = new Element("div.taskActionParentContent").inject(this.taskActionBar);
  160. this.taskActionParentIcon = new Element("div.taskActionParentIcon",{styles:this.css.taskActionParentIcon}).inject(this.taskActionParentContent);
  161. this.taskActionParentText = new Element("div.taskActionParentText",{styles:this.css.taskActionParentText,text:this.lp.taskBelongText+":"}).inject(this.taskActionParentContent);
  162. this.taskActionParentValue = new Element("div.taskActionParentValue",{styles:this.css.taskActionParentValue}).inject(this.taskActionParentContent);
  163. this.actions.get(this.taskData.parent,function(json){
  164. this.taskActionParentValue.set("text",json.data.name);
  165. this.taskActionParentValue.addEvents({
  166. click:function(){
  167. this.data.taskId = json.data.id;
  168. this.openTask()
  169. }.bind(this)
  170. });
  171. }.bind(this))
  172. }
  173. // this.taskActionSave = new Element("div.taskActionSave",{styles:this.css.taskActionSave,text:this.lp.save}).inject(this.taskActionBar);
  174. // this.taskActionSave.addEvents({
  175. // click:function(){
  176. // this.saveTaskData();
  177. // }.bind(this),
  178. // mouseover:function(){
  179. // this.setStyles({
  180. // "color":"#ffffff",
  181. // "background-color":"#4A90E2",
  182. // "border":"1px solid #4A90E2"
  183. // })
  184. // },
  185. // mouseout:function(){
  186. // this.setStyles(_self.css.taskActionSave)
  187. // }
  188. // });
  189. this.taskInforLayout = new Element("div.taskInforLayout",{styles:this.css.taskInforLayout}).inject(this.taskInforContainer);
  190. this.taskInforContent = new Element("div.taskInforContent",{styles:this.css.taskInforContent}).inject(this.taskInforLayout);
  191. this.app.setScrollBar(this.taskInforContent);
  192. //名称
  193. this.taskNameContainer = Element("div.taskNameContainer",{styles:this.css.taskNameContainer}).inject(this.taskInforContent);
  194. //状态
  195. this.taskStatusContainer = Element("div.taskStatusContainer",{styles:this.css.taskStatusContainer}).inject(this.taskInforContent);
  196. this.taskStatusIcon = Element("div.taskStatusIcon",{styles:this.css.taskStatusIcon}).inject(this.taskStatusContainer);
  197. this.taskStatusText = Element("div.taskStatusText",{styles:this.css.taskStatusText,text:this.lp.taskStatus}).inject(this.taskStatusContainer);
  198. this.taskStatusValue = Element("div.taskStatusValue",{styles:this.css.taskStatusValue}).inject(this.taskStatusContainer);
  199. //责任人
  200. this.taskDutyContainer = Element("div.taskDutyContainer",{styles:this.css.taskDutyContainer}).inject(this.taskInforContent);
  201. this.taskDutyIcon = Element("div.taskDutyIcon",{styles:this.css.taskDutyIcon}).inject(this.taskDutyContainer);
  202. this.taskDutyText = Element("div.taskDutyText",{styles:this.css.taskDutyText,text:this.lp.taskDuty}).inject(this.taskDutyContainer);
  203. this.taskDutyValue = Element("div.taskDutyValue",{styles:this.css.taskDutyValue}).inject(this.taskDutyContainer);
  204. //时间
  205. this.taskTimeContainer = Element("div.taskTimeContainer",{styles:this.css.taskTimeContainer}).inject(this.taskInforContent);
  206. this.taskTimeIcon = Element("div.taskTimeIcon",{styles:this.css.taskTimeIcon}).inject(this.taskTimeContainer);
  207. this.taskTimeText = Element("div.taskTimeText",{styles:this.css.taskTimeText,text:this.lp.taskTime}).inject(this.taskTimeContainer);
  208. this.taskTimeValue = Element("div.taskTimeValue",{styles:this.css.taskTimeValue}).inject(this.taskTimeContainer);
  209. //备注
  210. this.taskRemarkContainer = Element("div.taskRemarkContainer",{styles:this.css.taskRemarkContainer}).inject(this.taskInforContent);
  211. this.taskRemarkIcon = Element("div.taskRemarkIcon",{styles:this.css.taskRemarkIcon}).inject(this.taskRemarkContainer);
  212. this.taskRemarkText = Element("div.taskRemarkText",{styles:this.css.taskRemarkText,text:this.lp.taskRemark}).inject(this.taskRemarkContainer);
  213. this.taskRemarkValue = Element("div.taskRemarkValue",{styles:this.css.taskRemarkValue}).inject(this.taskRemarkContainer);
  214. //优先级
  215. this.taskPriorityContainer = Element("div.taskPriorityContainer",{styles:this.css.taskPriorityContainer}).inject(this.taskInforContent);
  216. this.taskPriorityIcon = Element("div.taskPriorityIcon",{styles:this.css.taskPriorityIcon}).inject(this.taskPriorityContainer);
  217. this.taskPriorityText = Element("div.taskPriorityText",{styles:this.css.taskPriorityText,text:this.lp.taskPriority}).inject(this.taskPriorityContainer);
  218. this.taskPriorityValue = Element("div.taskPriorityValue",{styles:this.css.taskPriorityValue}).inject(this.taskPriorityContainer);
  219. //扩展字段
  220. if(this.taskData.extFieldConfigs && this.taskData.extFieldConfigs.length>0){
  221. this.taskExtFieldContainer = new Element("div.taskExtFieldContainer",{styles:this.css.taskExtFieldContainer}).inject(this.taskInforContent);
  222. this.loadTaskExtField();
  223. }
  224. //标签
  225. this.taskTagContainer = Element("div.taskTagContainer",{styles:this.css.taskTagContainer}).inject(this.taskInforContent);
  226. this.taskTagIcon = Element("div.taskTagIcon",{styles:this.css.taskTagIcon}).inject(this.taskTagContainer);
  227. this.taskTagText = Element("div.taskTagText",{styles:this.css.taskTagText,text:this.lp.taskTag}).inject(this.taskTagContainer);
  228. this.taskTagValue = Element("div.taskTagValue",{styles:this.css.taskTagValue}).inject(this.taskTagContainer);
  229. //附件 -- 换成其他样式
  230. // this.taskAttachmentContainer = Element("div.taskAttachmentContainer",{styles:this.css.taskAttachmentContainer}).inject(this.taskInforContent);
  231. // this.taskAttachmentIcon = Element("div.taskAttachmentIcon",{styles:this.css.taskAttachmentIcon}).inject(this.taskAttachmentContainer);
  232. // this.taskAttachmentText = Element("div.taskAttachmentText",{styles:this.css.taskAttachmentText,text:this.lp.taskAttachment}).inject(this.taskAttachmentContainer);
  233. // this.taskAttachmentValue = Element("div.taskAtchatBarEmojitachmentValue",{styles:this.css.taskAttachmentValue}).inject(this.taskAttachmentContainer);
  234. //附件
  235. this.taskAttachmentListContainer = new Element("div.taskAttachmentListContainer",{styles:this.css.taskAttachmentListContainer}).inject(this.taskInforContent);
  236. this.loadTaskAttachmentListContainer();
  237. this.setTaskData();
  238. //this.setAuth();
  239. //子任务
  240. this.subTaskContainer = new Element("div.subTaskContainer",{styles:this.css.subTaskContainer}).inject(this.taskInforContent);
  241. this.loadSubTaskContainer();
  242. //占位
  243. new Element("div",{styles:{"width":"100%","height":"100px"}}).inject(this.taskInforContent)
  244. },
  245. loadTaskExtField:function(){
  246. this.taskData.extFieldConfigs.each(function(data){
  247. this.loadTaskExtFieldItem(data);
  248. }.bind(this))
  249. },
  250. loadTaskExtFieldItem:function(data){
  251. var taskExtFieldItem = new Element("div.taskExtFieldItem",{styles:this.css.taskExtFieldItem}).inject(this.taskExtFieldContainer);
  252. var taskExtFieldIcon = new Element("div.taskExtFieldIcon",{styles:this.css.taskExtFieldIcon}).inject(taskExtFieldItem);
  253. var taskExtFieldText = new Element("div.taskExtFieldText",{styles:this.css.taskExtFieldText}).inject(taskExtFieldItem);
  254. new Element("p",{styles:{
  255. "justify-content": "center",
  256. "align-items":"center"
  257. },text:data.displayName}).inject(taskExtFieldText);
  258. if(data.displayType.toUpperCase() == "TEXT"){
  259. }
  260. },
  261. createDetailLayout:function(){
  262. this.taskDetailLayout = new Element("div.taskDetailLayout",{styles:this.css.taskDetailLayout}).inject(this.contentLayout);
  263. this.taskParticipateContainer = new Element("div.taskParticipateContainer",{styles:this.css.taskParticipateContainer}).inject(this.taskDetailLayout);
  264. this.createParticipateContainer();
  265. this.taskDynamicContainer = new Element("div.taskDynamicContainer",{styles:this.css.taskDynamicContainer}).inject(this.taskDetailLayout);
  266. this.createDynamicContainer();
  267. this.taskChatContainer = new Element("div.taskChatContainer",{styles:this.css.taskChatContainer}).inject(this.taskDetailLayout);
  268. this.createChatContainer();
  269. },
  270. createParticipateContainer:function(){
  271. this.taskParticipateContainer.empty();
  272. this.participateTitle = new Element("div.participateTitle",{styles:this.css.participateTitle}).inject(this.taskParticipateContainer);
  273. this.participateTitleText = new Element("div.participateTitleText",{styles:this.css.participateTitleText}).inject(this.participateTitle);
  274. this.participateTitleIcon = new Element("div.participateTitleIcon",{styles:this.css.participateTitleIcon,title:this.lp.taskReaderAdd}).inject(this.participateTitle);
  275. this.participateTitleIcon.addEvents({
  276. click:function(){
  277. this.selectPerson(this.participateTitleIcon,null,["identity","unit"],0,
  278. function(json){
  279. if(json.length>0){
  280. this.taskData.participantList = this.taskData.participantList.concat(json);
  281. //this.actions.updateParticipantList(this.taskData.id,{participantList:this.taskData.participantList},function(json){
  282. this.actions.updateParticipant(this.taskData.id,{participantList:this.taskData.participantList},function(json){
  283. if(json.data.dynamics){
  284. json.data.dynamics.each(function(dd){
  285. this.loadDynamicItem(dd,"bottom")
  286. }.bind(this))
  287. }
  288. this.dynamicContent.scrollTo(0,this.dynamicContent.getScrollSize().y);
  289. this.createParticipateContainer();
  290. }.bind(this))
  291. }
  292. }.bind(this)
  293. );
  294. }.bind(this)
  295. });
  296. this.participateValue = new Element("div.participateValue",{styles:this.css.participateValue}).inject(this.taskParticipateContainer);
  297. this.setScrollBar(this.participateValue);
  298. if(this.taskData.participantList){
  299. count = this.taskData.participantList.length;
  300. this.participateTitleText.set("text",this.lp.taskReader + " . " + count);
  301. this.taskData.participantList.each(function(d){
  302. var flag = true;
  303. if(this.taskData.executor){
  304. if(d === this.taskData.executor) flag = false
  305. }
  306. this.loadparticipantPerson(this.participateValue,d,flag);
  307. }.bind(this));
  308. }
  309. },
  310. createDynamicContainer:function(){
  311. var _self = this;
  312. this.taskDynamicContainer.empty();
  313. this.dynamicBar = new Element("div.dynamicBar",{styles:this.css.dynamicBar}).inject(this.taskDynamicContainer);
  314. this.dynamicBar.addEvents({
  315. mouseover:function(){
  316. this.dynamicText.setStyle("color","#4a90e2");
  317. this.dynamicIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_dw_click.png)")
  318. }.bind(this),
  319. mouseout:function(){
  320. this.dynamicText.setStyle("color","#666666");
  321. this.dynamicIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_dw.png)")
  322. }.bind(this),
  323. click:function(){
  324. var pc = new MWF.xApplication.TeamWork.Task.DynamicType(this.container, this.dynamicBar, this.app, {data:this.taskData}, {
  325. css:this.css, lp:this.lp, axis : "y",
  326. position : { //node 固定的位置
  327. x : "right",
  328. y : "middle"
  329. },
  330. nodeStyles : {
  331. "min-width":"150px",
  332. "padding":"2px",
  333. "border-radius":"5px",
  334. "box-shadow":"0px 0px 4px 0px #999999",
  335. "z-index" : "201"
  336. },
  337. onPostLoad:function(){
  338. pc.node.setStyles({"opacity":"0","top":(pc.node.getStyle("top").toInt()-6)+"px","left":(pc.node.getStyle("left").toInt()+10)+"px"});
  339. var fx = new Fx.Tween(pc.node,{duration:400});
  340. fx.start(["opacity"] ,"0", "1");
  341. },
  342. onClose:function(rd){
  343. if(!rd) return;
  344. if(rd.value == "all"){
  345. filter = {};
  346. this.dynamicText.set("text",this.lp.dynamicAll)
  347. }else if(rd.value == "chat"){
  348. filter = {objectType:"CHAT"};
  349. this.dynamicText.set("text",this.lp.dynamicChat)
  350. }else if(rd.value == "attachment"){
  351. this.dynamicText.set("text",this.lp.dynamicAttachment)
  352. filter = {objectType:"ATTACHMENT"};
  353. }
  354. this.dynamicContent.empty();
  355. this.dyncurCount = 0;
  356. this.createDynamicContent(null,filter,function(){
  357. this.dynamicContent.scrollTo(0,this.dynamicContent.getScrollSize().y);
  358. this.getDynamicStatus = false;
  359. }.bind(this))
  360. }.bind(this)
  361. });
  362. pc.load();
  363. }.bind(this),
  364. });
  365. this.dynamicText = new Element("div.dynamicText",{styles:this.css.dynamicText,text:this.lp.dynamicAll}).inject(this.dynamicBar);
  366. this.dynamicIcon = new Element("div.dynamicIcon",{styles:this.css.dynamicIcon}).inject(this.dynamicBar);
  367. this.dynamicContent = new Element("div.dynamicContent",{styles:this.css.dynamicContent}).inject(this.taskDynamicContainer);
  368. var filter = {};
  369. var _y = this.dynamicContent.getScrollSize().y;
  370. this.dynamicContent.addEvents({
  371. scroll:function(){
  372. if(this.getScrollTop()==0){
  373. //alert("top")
  374. //加载下一页
  375. if(_self.getDynamicStatus) return;
  376. if(_self.dyncurCount>=_self.dyntotal) return;
  377. _self.createDynamicContent(_self.curDynamicId,filter,function(){
  378. _self.dynamicContent.scrollTo(0,_y);
  379. _self.getDynamicStatus = false;
  380. });
  381. }
  382. }
  383. });
  384. this.createDynamicContent(null,filter,function(){
  385. this.dynamicContent.scrollTo(0,this.dynamicContent.getScrollSize().y);
  386. this.getDynamicStatus = false;
  387. }.bind(this));
  388. },
  389. createDynamicContent:function(id,data,callback){
  390. this.getDynamicStatus = true;
  391. var _self = this, id = id || "(0)", count = 15, taskId = this.taskData.id;
  392. this.curDynamicId = id;
  393. //this.dyntotal = 0;
  394. this.dyncurCount = this.dyncurCount || 0;
  395. this.tmpdynamicLoading = new Element("div").inject(this.dynamicContent,"top");
  396. this.app.setLoading(this.tmpdynamicLoading);
  397. this.rootActions.DynamicAction.listNextWithTask(id,count,taskId,data||{},function(json){
  398. //this.actions.taskDynamicListNext(id,count,taskId,data||{},function(json){
  399. if(this.tmpdynamicLoading)this.tmpdynamicLoading.destroy();
  400. //this.getDynamicStatus = false;
  401. if(json.type == "success"){
  402. this.dyntotal = json.count;
  403. json.data.each(function(d,i){
  404. this.curDynamicId = d.id;
  405. this.loadDynamicItem(d);
  406. }.bind(this));
  407. if(callback)callback(json)
  408. }
  409. }.bind(this))
  410. },
  411. loadDynamicItem:function(data,where){
  412. this.dyncurCount = this.dyncurCount + 1;
  413. var dynamicItem = new Element("div.dynamicItem",{styles:this.css.dynamicItem}).inject(this.dynamicContent,where||"top");
  414. var dynamicItemIcon = new Element("div.dynamicItemIcon",{styles:this.css.dynamicItemIcon}).inject(dynamicItem);
  415. var optType = data.optType.toUpperCase();
  416. var objectType = data.objectType.toUpperCase();
  417. if(objectType == "CHAT"){
  418. //if(optType.toUpperCase() == "PUBLISH"){
  419. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_chat.png)")
  420. //}
  421. }else if(objectType == "ATTACHMENT"){
  422. if(optType == "DELETE"){ //UPLOAD、DOWNLOAD、DELETE
  423. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_remove.png)")
  424. }else{
  425. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_attachment.png)")
  426. }
  427. }else if(objectType == "TASK"){
  428. //UPDATE_NAME、UPDATE_EXECUTOR、UPDATE_STATUS、UPDATE_TIME、UPDATE_PROGRESS、ADD_TAGS、REMOVE_TAGS、
  429. //ADD_MANAGER、REMOVE_MANAGER、ADD_PARTICIPANTS、REMOVE_PARTICIPANTS、CREATE、DELETE
  430. if(optType=="SPLIT"){
  431. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_subtask.png)")
  432. }else if(optType=="DELETE_SUBTASK"){
  433. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_remove.png)")
  434. }else if(optType=="UPDATE_EXECUTOR"){
  435. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_duty.png)")
  436. }else if(optType=="UPDATE_NAME"){
  437. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_title.png)")
  438. }else if(optType=="UPDATE_WORKSTATUS"){
  439. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_status.png)")
  440. }else if(optType=="UPDATE_WORKDATE"){
  441. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_time.png)")
  442. }else if(optType=="UPDATE_DESCRIPTION"){
  443. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_remark.png)")
  444. }else if(optType=="ADD_PARTICIPANTS" || optType == "REMOVE_PARTICIPANTS"){
  445. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_participant.png)")
  446. }else if(optType=="CREATE"){
  447. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_jia.png)")
  448. }else{
  449. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_edit.png)")
  450. }
  451. }else if(objectType=="TASK_TAG"){
  452. if(optType=="REMOVE"){
  453. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_remove.png)")
  454. }else{
  455. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/dy_tag.png)")
  456. }
  457. }
  458. var dynamicItemText = new Element("div.dynamicItemText",{styles:this.css.dynamicItemText}).inject(dynamicItem);
  459. if(objectType == "CHAT"){
  460. new Element("div.dynamicItemUser",{styles:this.css.dynamicItemUser,text:data.operator.split("@")[0]}).inject(dynamicItemText);
  461. var chattext = data.description.split("\n").join("<br/>");
  462. //转换表情
  463. for(var item in this.app.lp.emoji){
  464. var val = this.app.lp.emoji[item]; //alert(val)
  465. chattext = chattext.split("["+val+"]").join('<img style="margin:0px 2px;" src="/x_component_TeamWork/$Emoji/default/icon/'+item+'.png" />');
  466. }
  467. new Element("div.dynamicItemUserChat",{styles:{"margin-top":"5px"},html:chattext}).inject(dynamicItemText);
  468. }else{
  469. dynamicItemText.set("text",data.description);
  470. }
  471. var dynamicItemTime = new Element("div.dynamicItemTime",{styles:this.css.dynamicItemTime}).inject(dynamicItem);
  472. dynamicItemTime.set("text",this.app.compareWithNow(data.createTime).text);
  473. //最后加一层清除浮动
  474. new Element("div.dynamicItemTime",{styles:{"clear":"both"}}).inject(dynamicItem);
  475. },
  476. createChatContainer:function(){
  477. this.taskChatContainer.empty();
  478. var node = this.taskChatContainer;
  479. this.chatContent = new Element("div.chatContent",{styles:this.css.chatContent}).inject(node);
  480. this.chatTextarea = new Element("textarea.chatTextarea",{styles:this.css.chatTextarea,placeholder:this.lp.chatPlaceholder}).inject(this.chatContent);
  481. this.chatTextarea.addEvents({
  482. keypress:function(e){
  483. var keycode = (e.event.keyCode ? e.event.keyCode : e.event.which);
  484. if (e.event.ctrlKey && (keycode == 13 || keycode == 10)) {
  485. this.chatBarSend.click();
  486. }
  487. }.bind(this)
  488. });
  489. this.chatBarContent = new Element("div.chatBarContent",{styles:this.css.chatBarContent}).inject(node);
  490. this.chatBarTool = new Element("div.chatBarTool",{styles:this.css.chatBarTool}).inject(this.chatBarContent);
  491. this.chatBarEmoji = new Element("div.chatBarEmoji",{styles:this.css.chatBarEmoji,title:this.lp.chatInsertEmoji}).inject(this.chatBarTool);
  492. this.chatBarEmoji.addEvents({
  493. mouseover:function(){this.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_emoji_click.png)")},
  494. mouseout:function(){this.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_emoji.png)")},
  495. click:function(){
  496. MWF.xDesktop.requireApp("TeamWork", "Emoji", function(){
  497. var pc = new MWF.xApplication.TeamWork.Emoji(this,this.container, this.chatBarEmoji, this.app, {}, {
  498. css:this.css, lp:this.lp, axis : "y",
  499. position : { //node 固定的位置
  500. x : "right",
  501. y : "middle"
  502. },
  503. nodeStyles : {
  504. "min-width":"200px",
  505. "max-width":"210px",
  506. "height":"80px",
  507. "padding":"2px",
  508. "border-radius":"5px",
  509. "box-shadow":"0px 0px 4px 0px #999999",
  510. "z-index" : "201"
  511. },
  512. onPostLoad:function(){
  513. pc.node.setStyles({"opacity":"0","top":(pc.node.getStyle("top").toInt())+"px"});
  514. var fx = new Fx.Tween(pc.node,{duration:400});
  515. fx.start(["opacity"] ,"0", "1");
  516. },
  517. onClose:function(rd){
  518. if(!rd) return;
  519. if(rd.value && rd.value !=""){
  520. this.chatTextarea.set("value",this.chatTextarea.get("value")+"["+rd.value+"]")
  521. }
  522. }.bind(this)
  523. });
  524. pc.load();
  525. }.bind(this))
  526. }.bind(this)
  527. });
  528. this.chatBarSend = new Element("div.chatBarSend",{styles:this.css.chatBarSend,text:this.lp.chatSend}).inject(this.chatBarContent);
  529. this.chatBarSend.addEvents({
  530. click:function(){
  531. if(this.chatTextarea.get("value").trim()=="") return;
  532. var data = {
  533. taskId : this.taskData.id,
  534. content : this.chatTextarea.get("value").trim()
  535. };
  536. //this.actions.chatCreate(data,function(json){
  537. this.rootActions.ChatAction.create(data,function(json){
  538. if(json.data.id){
  539. this.rootActions.ChatAction.get(json.data.id,function(json){
  540. var person = json.data.sender;
  541. var content = json.data.content;
  542. var dynamicItem = new Element("div.dynamicItem",{styles:this.css.dynamicItem}).inject(this.dynamicContent);
  543. var dynamicItemIcon = new Element("div.dynamicItemIcon",{styles:this.css.dynamicItemIcon}).inject(dynamicItem);
  544. dynamicItemIcon.setStyle("background-image","url(/x_component_TeamWork/$Task/default/icon/icon_chat.png)")
  545. var dynamicItemText = new Element("div.dynamicItemText",{styles:this.css.dynamicItemText}).inject(dynamicItem);
  546. new Element("div.dynamicItemUser",{styles:this.css.dynamicItemUser,text:person.split("@")[0]}).inject(dynamicItemText);
  547. var chattext = content.split("\n").join("<br/>");
  548. for(var item in this.app.lp.emoji){
  549. var val = this.app.lp.emoji[item];
  550. chattext = chattext.split("["+val+"]").join('<img style="margin:0 2px;" src="/x_component_TeamWork/$Emoji/default/icon/'+item+'.png" />');
  551. }
  552. new Element("div.dynamicItemUserChat",{styles:{"margin-top":"5px"},html:chattext}).inject(dynamicItemText);
  553. var dynamicItemTime = new Element("div.dynamicItemTime",{styles:this.css.dynamicItemTime}).inject(dynamicItem);
  554. dynamicItemTime.set("text","刚刚");
  555. new Element("div.dynamicItemTime",{styles:{"clear":"both"}}).inject(dynamicItem);
  556. this.dynamicContent.scrollTo(0,this.dynamicContent.getScrollSize().y);
  557. }.bind(this))
  558. }
  559. this.createChatContainer()
  560. }.bind(this))
  561. }.bind(this)
  562. })
  563. },
  564. addDynamicItem:function(){
  565. },
  566. getTaskData:function(callback){
  567. if(this.data.taskId){
  568. //this.actions.taskGet(this.data.taskId,function(json){
  569. this.actions.get(this.data.taskId,function(json){
  570. if(json.data) {
  571. this.taskData = json.data;
  572. if(callback)callback()
  573. }
  574. }.bind(this))
  575. }
  576. },
  577. setTaskData:function(){
  578. var _self = this;
  579. //名称
  580. if(this.taskNameContainer){
  581. this.loadNameValue();
  582. }
  583. //状态
  584. if(this.taskStatusValue){
  585. this.loadStatusValue()
  586. }
  587. //负责人
  588. if(this.taskDutyValue){
  589. this.loadDutyValue()
  590. }
  591. //时间
  592. if(this.taskTimeContainer){
  593. this.loadTimeValue()
  594. }
  595. //备注
  596. if(this.taskRemarkContainer){
  597. this.loadRemarkValue()
  598. }
  599. //优先级
  600. if(this.taskPriorityValue){
  601. this.loadPriorityValue()
  602. }
  603. //标签
  604. if(this.taskTagValue){
  605. this.loadTagValue()
  606. }
  607. //附件
  608. if(this.taskAttachmentValue){
  609. this.loadAttachment(this.taskAttachmentValue)
  610. }
  611. },
  612. saveTaskData:function(callback) {
  613. if(this.editor){
  614. this.taskData.description = encodeURI(this.editor.getData());
  615. }
  616. this.actions.save(this.taskData,function(json){
  617. if(this.editor) delete this.editor;
  618. //alert(JSON.stringify(json));
  619. this.reload();
  620. //刷新project区域内的task,可能有更新,删除等 干脆直接载入区域
  621. var data = {
  622. "act":"save",
  623. "taskId":json.data.id
  624. };
  625. this.reloadOutContent(data);
  626. }.bind(this))
  627. },
  628. reloadOutContent:function(json){
  629. if(json.act == "save"){
  630. //保存操作,刷新task即可
  631. var taskNode = this.explorer.container.getElementById(json.taskId);
  632. if(!taskNode) return;
  633. this.actions.get(json.taskId,function(d){
  634. this.explorer.loadTaskNode(taskNode,d.data)
  635. }.bind(this));
  636. }
  637. },
  638. updateSingleProperty:function(data,callback){
  639. //this.actions.updateSingleProperty(data.taskId,data,function(json){
  640. this.actions.updateSingleProperty(data.taskId,data,function(json){
  641. if(json.data.dynamics){
  642. json.data.dynamics.each(function(dd){
  643. this.loadDynamicItem(dd,"bottom");
  644. }.bind(this))
  645. }
  646. this.dynamicContent.scrollTo(0,this.dynamicContent.getScrollSize().y);
  647. if(callback)callback(json.data)
  648. }.bind(this))
  649. },
  650. loadNameValue:function(){ //名称
  651. var _self = this;
  652. this.taskNameContainer.set("text",this.taskData.name);
  653. if(true){ //权限修改
  654. var node = this.taskNameContainer;
  655. var nameEdit = false;
  656. var overStatus = null;
  657. node.addEvents({
  658. mouseenter:function(){
  659. overStatus = window.setTimeout(function(){
  660. var opt={ axis: "y", position : { x : "auto", y : "top"} };
  661. //_self.app.showTips(node,{_html:"<div style='margin:2px 5px;'>"+_self.lp.editTip+"</div>"},opt);
  662. node.set("title",_self.lp.editTip);
  663. },300);
  664. if(this.getElement("input")) return;
  665. var name = this.get("text");
  666. node.empty();
  667. var input = new Element("input.taskNameInput",{type:"text",value:name,styles:_self.css.taskNameInput}).inject(node);
  668. input.addEvents({
  669. click:function(ev){
  670. nameEdit = true;
  671. if(_self.app.st&&_self.app.st.node)_self.app.st.node.destroy();
  672. delete _self.app.st;
  673. ev.stopPropagation()
  674. },
  675. blur:function(){
  676. var v = this.get("value").trim();
  677. if(v=="" || v == _self.taskData.name){
  678. _self.taskNameContainer.empty();
  679. _self.taskNameContainer.set("text",_self.taskData.name);
  680. _self.taskNameContainer.setStyles({"background-color":""});
  681. _self.taskData.name = v;
  682. }else{
  683. if(v != _self.taskData.name){
  684. var sd = {
  685. taskId:_self.taskData.id,
  686. property:"name",
  687. mainValue:v,
  688. secondaryValue:""
  689. }
  690. _self.updateSingleProperty(sd,function(json){
  691. _self.taskNameContainer.empty();
  692. _self.taskNameContainer.set("text",v);
  693. _self.taskNameContainer.setStyles({"background-color":""});
  694. _self.taskData.name = v;
  695. nameEdit = false;
  696. })
  697. }
  698. }
  699. }
  700. });
  701. },
  702. mouseleave:function(){
  703. window.clearTimeout(overStatus);
  704. if(!nameEdit){
  705. if(this.getElement("input")){
  706. var n = this.getElement("input").get("value");
  707. this.empty();
  708. this.set("text",n);
  709. }
  710. this.setStyles({"background-color":""})
  711. }
  712. }
  713. });
  714. }
  715. },
  716. loadStatusValue:function(){ //状态
  717. var _self = this;
  718. if(this.taskStatusValue) this.taskStatusValue.empty();
  719. this.taskStatusValueContainer = new Element("div.taskStatusValueContainer",{styles:this.css.taskStatusValueContainer}).inject(this.taskStatusValue);
  720. this.taskStatusValueIcon = new Element("div.taskStatusValueIcon",{styles:this.css.taskStatusValueIcon}).inject(this.taskStatusValueContainer);
  721. this.taskStatusValueText = new Element("div.taskStatusValueText",{styles:this.css.taskStatusValueText}).inject(this.taskStatusValueContainer);
  722. if(this.taskData.workStatus == "draft"){
  723. this.taskStatusValueContainer.setStyles({"color":"#666666"});
  724. this.taskStatusValueIcon.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_draft.png)"});
  725. this.taskStatusValueText.set("text",this.lp.status.draft);
  726. }else if(this.taskData.workStatus == "flow"){
  727. this.taskStatusValueContainer.setStyles({"color":"#666666"});
  728. this.taskStatusValueIcon.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_flow.png)"});
  729. this.taskStatusValueText.set("text",this.lp.status.flow);
  730. }else if(this.taskData.workStatus == "processing") {
  731. this.taskStatusValueContainer.setStyles({"color": "#666666"});
  732. this.taskStatusValueIcon.setStyles({"background-image": "url(/x_component_TeamWork/$Task/default/icon/icon_flow.png)"});
  733. this.taskStatusValueText.set("text",this.lp.status.processing);
  734. }else if(this.taskData.workStatus == "completed"){
  735. this.taskStatusValueContainer.setStyles({"color":"#69b439"});
  736. this.taskStatusValueIcon.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_complete.png)"});
  737. this.taskStatusValueText.set("text",this.lp.status.completed);
  738. }
  739. if(true){ //权限
  740. this.taskStatusValueContainer.addEvents({
  741. click:function(){
  742. var sc = new MWF.xApplication.TeamWork.Task.StatusCheck(this.container, this.taskStatusValueContainer, this.app, {data:this.taskData}, {
  743. css:this.css, lp:this.lp, axis : "y",
  744. position : { //node 固定的位置
  745. x : "right",
  746. y : "middle"
  747. },
  748. nodeStyles : {
  749. "min-width":"200px",
  750. "padding":"2px",
  751. "border-radius":"5px",
  752. "box-shadow":"0px 0px 4px 0px #999999",
  753. "z-index" : "201"
  754. },
  755. onPostLoad:function(){
  756. sc.node.setStyles({"opacity":"0","top":(sc.node.getStyle("top").toInt()+4)+"px"});
  757. var fx = new Fx.Tween(sc.node,{duration:400});
  758. fx.start(["opacity"] ,"0", "1");
  759. },
  760. onClose:function(rd){
  761. if(!rd) return;
  762. if(rd.status){
  763. if(rd.status != this.taskData.workStatus){
  764. var sd = {
  765. taskId:_self.taskData.id,
  766. property:"workStatus",
  767. mainValue:rd.status,
  768. secondaryValue:""
  769. };
  770. _self.updateSingleProperty(sd,function(){
  771. this.taskData.workStatus = rd.status;
  772. this.loadStatusValue();
  773. }.bind(this))
  774. }
  775. }
  776. }.bind(this)
  777. });
  778. sc.load();
  779. }.bind(this),
  780. mouseover:function(){
  781. this.setStyles({"background-color":"#efefef"});
  782. this.getElement(".taskStatusValueIcon").setStyles({ "background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_down.png)"})
  783. },
  784. mouseout:function(){
  785. this.setStyles(_self.css.taskStatusValueContainer);
  786. var bgurl = "url(/x_component_TeamWork/$Task/default/icon/icon_draft.png)";
  787. if(_self.taskData.workStatus == "processing")bgurl = "url(/x_component_TeamWork/$Task/default/icon/icon_flow.png)";
  788. else if(_self.taskData.workStatus == "completed")bgurl = "url(/x_component_TeamWork/$Task/default/icon/icon_complete.png)";
  789. this.getElement(".taskStatusValueIcon").setStyles({"background-image":bgurl})
  790. }
  791. });
  792. }
  793. },
  794. loadDutyValue:function(){
  795. var _self = this;
  796. if(this.taskDutyValue) this.taskDutyValue.empty();
  797. this.taskDutyValueContainer = new Element("div.taskDutyValueContainer",{styles:this.css.taskDutyValueContainer}).inject(this.taskDutyValue);
  798. if(true){//权限
  799. if(this.taskData.executor==""){
  800. this.taskDutyAddIcon = new Element("div.taskDutyAddIcon",{styles:this.css.taskDutyAddIcon}).inject(this.taskDutyValueContainer);
  801. this.taskDutyAddText = new Element("div.taskDutyAddText",{styles:this.css.taskDutyAddText,text:this.lp.addDuty}).inject(this.taskDutyValueContainer);
  802. this.taskDutyAddText.addEvents({
  803. mouseover:function(){this.setStyles({"color":"#4a90e2"})},
  804. mouseout:function(){this.setStyles({"color":"#666666"})},
  805. click:function(){
  806. this.selectPerson(this.taskDutyAddText,"identity",null,1,
  807. function(json){
  808. if(json.length>0){
  809. this.taskData.executor = json[0];
  810. this.loadDutyValue()
  811. }
  812. }.bind(this));
  813. }.bind(this)
  814. })
  815. }else{
  816. this.loadTaskPerson(this.taskDutyValueContainer,this.taskData.executor,true);
  817. }
  818. }else{
  819. if(this.taskData.executor!=""){
  820. this.loadTaskPerson(this.taskDutyValueContainer,this.taskData.executor);
  821. }
  822. }
  823. },
  824. loadTimeValue:function(){
  825. var _self = this;
  826. this.taskStartTime = new Element("div.taskStartTime",{styles:this.css.taskStartTime}).inject(this.taskTimeContainer);
  827. this.taskTimeLine = new Element("div.taskTimeLine",{styles:this.css.taskTimeLine,text:"-"}).inject(this.taskTimeContainer);
  828. this.taskEndTime = new Element("div.taskEndTime",{styles:this.css.taskEndTime}).inject(this.taskTimeContainer);
  829. if(this.taskData.startTime && this.taskData.startTime!=""){
  830. this.taskStartTime.set("text",this.taskData.startTime);
  831. this.taskStartTime.setStyles({"color":"#333333"});
  832. }else{
  833. this.taskStartTime.set("text",this.lp.taskTimeStart);
  834. }
  835. if(this.taskData.endTime && this.taskData.endTime!=""){
  836. this.taskEndTime.set("text",this.taskData.endTime);
  837. this.taskEndTime.setStyles({"color":"#333333"});
  838. }else{
  839. this.taskEndTime.set("text",this.lp.taskTimeEnd);
  840. }
  841. if(true){ //权限
  842. this.taskStartTime.setStyles({"background-color":"#f5f5f5","cursor":"pointer"});
  843. this.taskEndTime.setStyles({"background-color":"#f5f5f5","cursor":"pointer"});
  844. this.taskStartTime.addEvents({
  845. click:function(){
  846. var opt = {
  847. type:"datetime"
  848. };
  849. this.app.selectCalendar(this.taskStartTime,this.container,opt,function(json){
  850. var sd = {
  851. taskId:_self.taskData.id,
  852. property:"startTime",
  853. secondaryValue:""
  854. };
  855. if(json.action == "ok"){
  856. this.taskStartTime.set("text",json.dateString+":00");
  857. sd.mainValue = json.dateString+":00"
  858. }else if(json.action == "clear"){
  859. this.taskStartTime.set("text",this.lp.taskTimeStart);
  860. sd.mainValue = ""
  861. }
  862. this.updateSingleProperty(sd)
  863. }.bind(this))
  864. }.bind(this)
  865. });
  866. this.taskEndTime.addEvents({
  867. click:function(){
  868. var opt = {
  869. type:"datetime"
  870. };
  871. this.app.selectCalendar(this.taskEndTime,this.container,opt,function(json){
  872. var sd = {
  873. taskId:_self.taskData.id,
  874. property:"endTime",
  875. secondaryValue:""
  876. };
  877. if(json.action == "ok"){
  878. this.taskEndTime.set("text",json.dateString+":00");
  879. sd.mainValue = json.dateString + ":00"
  880. }else if(json.action == "clear"){
  881. this.taskEndTime.set("text",this.lp.taskTimeEnd);
  882. sd.mainValue = ""
  883. }
  884. this.updateSingleProperty(sd)
  885. }.bind(this))
  886. }.bind(this)
  887. })
  888. }
  889. },
  890. loadRemarkValue:function(){
  891. var _self = this;
  892. var value = this.taskData.description || "";
  893. value = decodeURI(value);
  894. this.taskRemarkValue.set("html",value);
  895. if(this.taskRemarkValue.getFirst("p")){
  896. this.taskRemarkValue.getFirst("p").setStyles({"margin-top":"0px"})
  897. }
  898. if(this.editor) delete this.editor;
  899. if(true){ //权限
  900. if(value == ""){
  901. this.taskRemarkValue.set("text",this.lp.editTip);
  902. }
  903. this.taskRemarkValue.removeEvents(["click"])
  904. this.taskRemarkValue.addEvents({
  905. click:function(e){
  906. this.taskRemarkValue.setStyles({"background-color":"","color":""});
  907. this.taskRemarkValue.removeEvents(["mouseenter"]);
  908. if(!this.editor)this.taskRemarkValue.empty();
  909. this.loadRemarkEditor(this.taskRemarkValue,value,"taskRemark");
  910. e.stopPropagation();
  911. }.bind(this),
  912. mouseenter:function(){
  913. this.taskRemarkValue.setStyles({"background-color":"#f5f5f5","color":"#999999"})
  914. }.bind(this),
  915. mouseleave:function(){
  916. this.taskRemarkValue.setStyles({"background-color":"","color":""})
  917. }.bind(this)
  918. });
  919. }
  920. },
  921. loadPriorityValue:function(){
  922. if(this.taskPriorityValue)this.taskPriorityValue.empty();
  923. var node = new Element("div.taskPriorityValueText",{styles:this.css.taskPriorityValueText}).inject(this.taskPriorityValue);
  924. var curColor = "#999999";
  925. if(this.taskData.priority){
  926. node.set("text",this.taskData.priority);
  927. if(this.taskData.priority == this.lp.priority.urgency) curColor = "#ffaf38";
  928. else if(this.taskData.priority == this.lp.priority.emergency) curColor = "#ff4f3e";
  929. node.setStyles({"color":curColor,"border":"1px solid "+curColor+""})
  930. }else{
  931. node.set("text",this.lp.priority.normal)
  932. }
  933. node.addEvents({
  934. click:function(){
  935. var pc = new MWF.xApplication.TeamWork.Task.PriorityCheck(this.container, node, this.app, {data:this.taskData}, {
  936. css:this.css, lp:this.lp, axis : "y",
  937. position : { //node 固定的位置
  938. x : "right",
  939. y : "middle"
  940. },
  941. nodeStyles : {
  942. "min-width":"200px",
  943. "padding":"2px",
  944. "border-radius":"5px",
  945. "box-shadow":"0px 0px 4px 0px #999999",
  946. "z-index" : "201"
  947. },
  948. onPostLoad:function(){
  949. pc.node.setStyles({"opacity":"0","top":(pc.node.getStyle("top").toInt()+4)+"px"});
  950. var fx = new Fx.Tween(pc.node,{duration:400});
  951. fx.start(["opacity"] ,"0", "1");
  952. },
  953. onClose:function(rd){
  954. if(!rd) return;
  955. if(rd.value){
  956. if(rd.value != this.taskData.priority){
  957. var sd = {
  958. taskId:this.taskData.id,
  959. property:"priority",
  960. mainValue:rd.value,
  961. secondaryValue:""
  962. };
  963. this.updateSingleProperty(sd,function(){
  964. this.taskData.priority = rd.value;
  965. this.loadPriorityValue();
  966. }.bind(this))
  967. }
  968. }
  969. this.loadPriorityValue();
  970. }.bind(this)
  971. });
  972. pc.load();
  973. }.bind(this),
  974. mouseover:function(){
  975. this.setStyles({"border":"1px solid #4A90E2","color":"#4A90E2"})
  976. },
  977. mouseout:function(){
  978. this.setStyles({"border":"1px solid "+curColor+"","color":curColor})
  979. }
  980. })
  981. },
  982. loadTagValue:function(){
  983. if(this.taskTagValue)this.taskTagValue.empty();
  984. this.taskTagLayout = new Element("div.taskTagLayout",{styles:this.css.taskTagLayout}).inject(this.taskTagValue);
  985. this.taskTagAddContainer = new Element("div.taskTagAddContainer",{styles:this.css.taskTagAddContainer}).inject(this.taskTagValue);
  986. this.taskTagAddText = new Element("div.taskTagAddText",{styles:this.css.taskTagAddText,text:this.lp.taskTagAddText}).inject(this.taskTagAddContainer);
  987. this.taskTagAddText.addEvents({
  988. mouseover:function(){this.setStyles({"color":"#4A90E2"})},
  989. mouseout:function(){this.setStyles({"color":"#666666"})},
  990. click:function(){
  991. this.loadTaskTag(this.taskTagAddText)
  992. }.bind(this)
  993. });
  994. this.taskTagAdd = new Element("div.taskTagAdd",{styles:this.css.taskTagAdd}).inject(this.taskTagAddContainer);
  995. this.taskTagAdd.addEvents({
  996. mouseover:function(){this.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_subtask_add.png)"})},
  997. mouseout:function(){this.setStyles({"background-image":"url(/x_component_TeamWork/$Task/default/icon/icon_jia.png)"})},
  998. click:function(){
  999. this.loadTaskTag(this.taskTagAdd)
  1000. }.bind(this)
  1001. });
  1002. if(!this.taskData.tags || this.taskData.tags.length==0){
  1003. this.taskTagAdd.hide();
  1004. }else{
  1005. this.taskTagAddText.hide();
  1006. this.taskData.tags.each(function(json){
  1007. this.loadTagItem(json)
  1008. }.bind(this))
  1009. }
  1010. },
  1011. loadTagItem:function(data){
  1012. var _self = this;
  1013. var tagItemContainer = new Element("div.tagItemContainer",{styles:this.css.tagItemContainer,id:data.id}).inject(this.taskTagLayout);
  1014. tagItemContainer.setStyles({"background-color":data.tagColor});
  1015. tagItemContainer.addEvents({
  1016. mouseenter:function(){
  1017. var tagItemClose = new Element("div.tagItemClose",{styles:_self.css.tagItemClose}).inject(tagItemContainer);
  1018. tagItemContainer.setStyles({"width":(tagItemContainer.getWidth().toInt()+2)+"px"});
  1019. tagItemText.setStyles({"margin-right":"5px"});
  1020. tagItemText.set("title",data.tag);
  1021. tagItemClose.addEvents({
  1022. click:function(){
  1023. _self.rootActions.TaskTagAction.removeTagRele(_self.taskData.id,data.id,function(json){
  1024. if(json.data.dynamics){
  1025. json.data.dynamics.each(function(dd){
  1026. _self.loadDynamicItem(dd,"bottom")
  1027. })
  1028. }
  1029. _self.dynamicContent.scrollTo(0,_self.dynamicContent.getScrollSize().y);
  1030. tagItemContainer.destroy();
  1031. _self.taskData.tags.each(function(ddd){
  1032. if(ddd.id == data.id){
  1033. _self.taskData.tags.erase(ddd)
  1034. }
  1035. })
  1036. })
  1037. }
  1038. })
  1039. },
  1040. mouseleave:function(){
  1041. //tagItemContainer.setStyles({"width":(tagItemContainer.getWidth().toInt()-this.getElement(".tagItemClose").getWidth()-2)+"px"});
  1042. tagItemContainer.setStyles({"width":""});
  1043. tagItemText.setStyles({"margin-right":"10px"});
  1044. this.getElement(".tagItemClose").destroy();
  1045. }
  1046. });
  1047. var tagItemText = new Element("div.tagItemText",{styles:this.css.tagItemText}).inject(tagItemContainer);
  1048. tagItemText.set("text",data.tag);
  1049. },
  1050. loadTaskTag:function(node){
  1051. MWF.xDesktop.requireApp("TeamWork", "TaskTag", function(){
  1052. //alert(JSON.stringify(this.taskData.tags))
  1053. var data = {
  1054. projectId:this.taskData.project,
  1055. taskId:this.taskData.id,
  1056. taskTags:this.taskData.tags||[]
  1057. };
  1058. var pc = new MWF.xApplication.TeamWork.TaskTag(this.container, node, this.app, data, {
  1059. axis : "y",
  1060. position : { //node 固定的位置
  1061. x : "right",
  1062. y : "middle"
  1063. },
  1064. nodeStyles : {
  1065. "min-width":"200px",
  1066. "width":"210px",
  1067. //"height":"80px",
  1068. "padding":"2px",
  1069. "border-radius":"2px",
  1070. "box-shadow":"0px 0px 4px 0px #999999",
  1071. "z-index" : "201"
  1072. },
  1073. onPostLoad:function(){
  1074. pc.node.setStyles({"opacity":"0","top":(pc.node.getStyle("top").toInt())+"px"});
  1075. var fx = new Fx.Tween(pc.node,{duration:400});
  1076. fx.start(["opacity"] ,"0", "1");
  1077. },
  1078. onClose:function(rd){
  1079. if(!rd) return;
  1080. // if(rd.value && rd.value !=""){
  1081. // this.chatTextarea.set("value",this.chatTextarea.get("value")+"["+rd.value+"]")
  1082. // }
  1083. }.bind(this)
  1084. },null,this);
  1085. pc.load();
  1086. }.bind(this))
  1087. },
  1088. loadRemarkEditor:function(parent,value,name){
  1089. if(this.editor)return;
  1090. COMMON.AjaxModule.load("ckeditor", function(){
  1091. //CKEDITOR.disableAutoInline = true;
  1092. var item = new Element("div",{
  1093. "name" : name,
  1094. "id" : name
  1095. });
  1096. //item.set( attr );
  1097. if(parent)item.inject(parent);
  1098. //if( value )item.set("html", value);
  1099. var editorConfig = {
  1100. "autoGrow_maxHeight": 400,
  1101. //"autoGrow_minHeight": 300,
  1102. "resize_enabled": true,
  1103. //"resize_maxHeight": "3000",
  1104. //"resize_minHeight": "200",
  1105. "autoParagraph": true,
  1106. "autoUpdateElement": true,
  1107. "enterMode": 1,
  1108. "height": 100,
  1109. "width": 480,
  1110. "readOnly": false,
  1111. "startupFocus" : true,
  1112. toolbar : [
  1113. //{ name: 'document', items : [ 'Preview' ] },
  1114. //{ name: 'clipboard', items : [ 'Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
  1115. { name: 'basicstyles', items : [ 'Bold','Underline','Strike','-','RemoveFormat' ] },
  1116. //{ name: 'paragraph', items : [ 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock' ] },
  1117. { name: 'styles', items : [ 'Font','FontSize' ] },
  1118. { name: 'colors', items : [ 'TextColor' ] },
  1119. { name: 'links', items : [ 'Link','Unlink' ] },
  1120. //{ name: 'insert', items : [ 'Image' ] },
  1121. { name: 'tools', items : [ 'Maximize','-' ] }
  1122. ]
  1123. };
  1124. if( this.options.RTFConfig ){
  1125. editorConfig = Object.merge( editorConfig, this.options.RTFConfig )
  1126. }
  1127. if( editorConfig.skin )editorConfig.skin = "moono-lisa";
  1128. this.editor = CKEDITOR.replace(item, editorConfig);
  1129. //this.items.push( this.editor );
  1130. this.editor.setData(value);
  1131. this.editor.on('instanceReady', function (e) {
  1132. this.editor.focus();
  1133. var range = this.editor.createRange();
  1134. range.moveToElementEditEnd(this.editor.editable());
  1135. this.editor.getSelection().selectRanges([range]);
  1136. this.taskRemarkActionContainer = new Element("div.taskRemarkActionContainer",{styles:this.css.taskRemarkActionContainer}).inject(parent);
  1137. this.taskRemarkActionOk = new Element("div.taskRemarkActionOk",{styles:this.css.taskRemarkActionOk,text:this.lp.save}).inject(this.taskRemarkActionContainer);
  1138. this.taskRemarkActionOk.addEvents({
  1139. mouseover:function(){this.setStyles({"opacity":"0.9"})},
  1140. mouseout:function(){this.setStyles({"opacity":"1"})},
  1141. click:function(e){
  1142. var sd = {
  1143. taskId:this.taskData.id,
  1144. property:"description",
  1145. dataType:"RichText",
  1146. mainValue:encodeURI(this.editor.getData()),
  1147. secondaryValue:this.editor.document.getBody().getText()
  1148. }
  1149. this.updateSingleProperty(sd,function(json){
  1150. this.taskData.description = encodeURI(this.editor.getData());
  1151. this.loadRemarkValue()
  1152. delete this.editor;
  1153. }.bind(this))
  1154. e.stopPropagation();
  1155. //this.taskData.description = encodeURI(this.editor.getData());
  1156. }.bind(this)
  1157. });
  1158. this.taskRemarkActionCancel = new Element("div.taskRemarkActionCancel",{styles:this.css.taskRemarkActionCancel,text:this.lp.cancel}).inject(this.taskRemarkActionContainer);
  1159. this.taskRemarkActionCancel.addEvents({
  1160. mouseover:function(){this.setStyles({"color":"#4A90E2"})},
  1161. mouseout:function(){this.setStyles({"color":"#999999"})},
  1162. click:function(e){
  1163. this.loadRemarkValue();
  1164. e.stopPropagation()
  1165. }.bind(this)
  1166. })
  1167. }.bind(this))
  1168. }.bind(this));
  1169. },
  1170. loadAttachment: function( area ){ alert("loadtaskatt")
  1171. MWF.xDesktop.requireApp("TeamWork", "TaskAttachment", function(){
  1172. this.attachment = new MWF.xApplication.TeamWork.TaskAttachment( area, this.app, this.actions, this.app.lp, {
  1173. size:"max",
  1174. documentId : this.taskData.id,
  1175. //isNew : this.options.isNew,
  1176. //isEdited : this.options.isEdited,
  1177. onQueryUploadAttachment : function(){
  1178. this.attachment.isQueryUploadSuccess = true;
  1179. if( !this.taskData.id || this.taskData.id=="" ){
  1180. }
  1181. }.bind(this)
  1182. });
  1183. this.attachment.load();
  1184. }.bind(this));
  1185. },
  1186. loadTaskAttachmentListContainer:function(){
  1187. MWF.xDesktop.requireApp("TeamWork", "TaskAttachmentList", function(){
  1188. var data = {
  1189. id:this.taskData.id
  1190. };
  1191. var opt = {};
  1192. this.attachment = new MWF.xApplication.TeamWork.TaskAttachmentList( this,this.taskAttachmentListContainer, data, opt);
  1193. this.attachment.load();
  1194. }.bind(this));
  1195. },
  1196. loadSubTaskContainer:function(){
  1197. this.subTaskContainer.empty();
  1198. this.subTaskTitleContent = new Element("div.subTaskTitleContent",{styles:this.css.subTaskTitleContent}).inject(this.subTaskContainer);
  1199. this.subTaskTitleIcon = new Element("div.subTaskTitleIcon",{styles:this.css.subTaskTitleIcon}).inject(this.subTaskTitleContent);
  1200. this.subTaskTitleText = new Element("div.subTaskTitleText",{styles:this.css.subTaskTitleText,text:this.lp.taskSubName+""}).inject(this.subTaskTitleContent);
  1201. this.subTaskValueContent = new Element("div.subTaskValueContent",{styles:this.css.subTaskValueContent}).inject(this.subTaskContainer);
  1202. this.subTaskAddContainer = new Element("div.subTaskAddContainer",{styles:this.css.subTaskAddContainer}).inject(this.subTaskValueContent);
  1203. //子任务列表
  1204. this.subTaskListContent = new Element("div.subTaskListContent",{styles:this.css.subTaskListContent}).inject(this.subTaskAddContainer);
  1205. this.loadSubTask();
  1206. //添加子任务
  1207. this.subTaskNewContent = new Element("div.subTaskNewContent",{styles:this.css.subTaskNewContent}).inject(this.subTaskAddContainer);
  1208. this.subTaskNewIcon = new Element("div.subTaskNewIcon",{styles:this.css.subTaskNewIcon}).inject(this.subTaskNewContent);
  1209. this.subTaskNewText = new Element("div.subTaskNewText",{styles:this.css.subTaskNewText,text:this.lp.taskSubText}).inject(this.subTaskNewContent);
  1210. this.subTaskNewContent.addEvents({
  1211. click:function(){
  1212. this.subTaskNewContent.hide();
  1213. if(this.subTaskNewContainer)this.subTaskNewContainer.destroy();
  1214. this.subTaskNewContainer = new Element("div.subTaskNewContainer",{styles:this.css.subTaskNewContainer}).inject(this.subTaskAddContainer);
  1215. this.subTaskNewValue = new Element("div.subTaskNewValue",{styles:this.css.subTaskNewValue}).inject(this.subTaskNewContainer);
  1216. this.subTaskNewInput = new Element("input.subTaskNewInput",{styles:this.css.subTaskNewInput,placeholder:this.lp.taskSubNamePlaceholder}).inject(this.subTaskNewValue);
  1217. this.subTaskNewPerson = new Element("div.subTaskNewPerson",{styles:this.css.subTaskNewPerson}).inject(this.subTaskNewValue);
  1218. this.subTaskNewPerson.addEvent("click",function(){
  1219. this.selectPerson(this.subTaskNewPerson,"identity",null,1,
  1220. function(json){
  1221. if(json.length>0){
  1222. this.taskSubNewPerson = json[0];
  1223. this.loadSubTaskPerson(this.subTaskNewPerson,json[0],true)
  1224. }
  1225. }.bind(this)
  1226. );
  1227. }.bind(this));
  1228. this.subTaskNewAction = new Element("div.subTaskNewAction",{styles:this.css.subTaskNewAction}).inject(this.subTaskNewContainer);
  1229. this.subTaskNewCancel = new Element("div.subTaskNewCancel",{styles:this.css.subTaskNewCancel,text:this.lp.cancel}).inject(this.subTaskNewAction);
  1230. this.subTaskNewCancel.addEvents({
  1231. click:function(){
  1232. this.subTaskNewContent.show();
  1233. this.subTaskNewContainer.destroy()
  1234. }.bind(this),
  1235. mouseover:function(){
  1236. this.setStyles({"color":"#4A90E2"})
  1237. },
  1238. mouseout:function(){
  1239. this.setStyles({"color":"#666666"})
  1240. }
  1241. });
  1242. this.subTaskNewOK = new Element("div.subTaskNewOK",{styles:this.css.subTaskNewOK,text:this.lp.save}).inject(this.subTaskNewAction);
  1243. this.subTaskNewOK.addEvents({
  1244. click:function(){
  1245. if(this.subTaskNewInput.get("value").trim()=="") return;
  1246. var data = {
  1247. name:this.subTaskNewInput.get("value").trim(),
  1248. project:this.taskData.project,
  1249. parent:this.taskData.id,
  1250. executor:this.taskSubNewPerson || ""
  1251. };
  1252. this.actions.save(data,function(json){
  1253. this.taskSubNewPerson = "";
  1254. if(json.data.id){
  1255. //this.actions.taskGet(json.data.id,function(d){
  1256. this.actions.get(json.data.id,function(d){
  1257. this.loadSubTaskItem(this.subTaskListContent,d.data);
  1258. }.bind(this))
  1259. }
  1260. this.subTaskNewContent.show();
  1261. this.subTaskNewContainer.destroy();
  1262. if(json.data.dynamics){
  1263. json.data.dynamics.each(function(dd){
  1264. this.loadDynamicItem(dd,"bottom")
  1265. }.bind(this));
  1266. }
  1267. this.dynamicContent.scrollTo(0,this.dynamicContent.getScrollSize().y);
  1268. }.bind(this))
  1269. }.bind(this)
  1270. })
  1271. }.bind(this)
  1272. });
  1273. },
  1274. loadSubTask:function(){
  1275. var node = this.subTaskListContent;
  1276. node.empty();
  1277. this.actions.listSubTaskWithTaskId(this.taskData.id,function(json){
  1278. json.data.each(function(data){
  1279. this.loadSubTaskItem(node,data);
  1280. }.bind(this))
  1281. }.bind(this))
  1282. },
  1283. loadSubTaskItem:function(node,data){
  1284. var subTaskItemContainer = new Element("div.subTaskItemContainer",{styles:this.css.subTaskItemContainer,id:data.id}).inject(node);
  1285. var subTaskItemText = new Element("div.subTaskItemText",{styles:this.css.subTaskItemText,text:data.name,title:this.lp.taskSubDes}).inject(subTaskItemContainer);
  1286. subTaskItemText.addEvents({
  1287. mouseover:function(){
  1288. this.setStyles({"background-color":"#f5f5f5"})
  1289. },
  1290. mouseout:function(){
  1291. this.setStyles({"background-color":""})
  1292. },
  1293. click:function(){
  1294. var id = subTaskItemContainer.get("id");
  1295. if(id && id!=""){
  1296. this.data.taskId = id;
  1297. this.openTask()
  1298. }
  1299. }.bind(this)
  1300. });
  1301. var subTaskItemPerson = new Element("div.subTaskItemPerson",{styles:this.css.subTaskItemPerson}).inject(subTaskItemContainer);
  1302. // subTaskItemPerson.addEvent("click",function(){
  1303. // this.selectPerson(subTaskItemPerson,"identity",null,1,
  1304. // function(json){
  1305. // if(json.length>0){
  1306. // this.loadSubTaskPerson(subTaskItemPerson,json[0],true)
  1307. // }
  1308. // }.bind(this)
  1309. // );
  1310. // }.bind(this));
  1311. if(data.executor && data.executor!=""){
  1312. this.loadSubTaskPerson(subTaskItemPerson,data.executor)
  1313. }
  1314. },
  1315. loadSubTaskPerson:function(node,identity,flag){
  1316. if(flag==null) flag=false;
  1317. node.empty();
  1318. var taskSubNewPerson = identity;
  1319. var _self = this
  1320. var name = identity.split("@")[0];
  1321. var container = new Element("div",{styles:{"height":"30px","padding":"0px 8px 0px 2px","border-radius":"4px","float":"left","position":"relative"}}).inject(node);
  1322. container.set("title",name);
  1323. var circleStyles={
  1324. "width":"24px","height":"24px","border-radius":"20px","float":"left",
  1325. "background-color":"#4A90E2","color":"#ffffff","line-height":"22px",
  1326. "text-align":"center","margin-top":"3px","font-size":"12px"
  1327. };
  1328. var closeStyles={
  1329. "width":"16px","height":"16px","position":"absolute","right":"-5px","top":"-2px",
  1330. "background":"url(/x_component_TeamWork/$Task/default/icon/icon_off.png) no-repeat center"
  1331. };
  1332. var circleDiv = new Element("div",{styles:circleStyles,text:name.substr(0,1)}).inject(container);
  1333. if(flag){ //权限
  1334. container.addEvents({
  1335. mouseenter:function(){
  1336. var closeIcon = new Element("div.closeIcon",{styles:closeStyles}).inject(this);
  1337. closeIcon.addEvents({
  1338. click:function(e){
  1339. node.empty();
  1340. node.setStyles(_self.css.subTaskNewPerson);
  1341. container.destroy();
  1342. e.stopPropagation();
  1343. }
  1344. });
  1345. this.setStyles({"background-color":"#efefef","cursor":"pointer"});
  1346. },
  1347. mouseleave:function(){
  1348. if(this.getElement(".closeIcon"))this.getElement(".closeIcon").destroy();
  1349. this.setStyles({"background-color":""})
  1350. },
  1351. click:function(e){
  1352. this.selectPerson(this.subTaskNewPerson,"identity",null,1,
  1353. function(json){
  1354. if(json.length>0){
  1355. taskSubNewPerson = json[0];
  1356. this.loadSubTaskPerson(this.subTaskNewPerson,json[0],true)
  1357. }
  1358. }.bind(this)
  1359. );
  1360. e.stopPropagation();
  1361. }.bind(this)
  1362. })
  1363. }
  1364. },
  1365. loadTaskPerson:function(node,identity,flag){
  1366. var _self = this
  1367. var name = identity.split("@")[0];
  1368. var container = new Element("div",{styles:{"height":"30px","padding":"0 0px","border-radius":"4px","float":"left","position":"relative"}}).inject(node);
  1369. var circleStyles={
  1370. "width":"24px","height":"24px","border-radius":"20px","float":"left",
  1371. "background-color":"#4A90E2","color":"#ffffff","line-height":"22px",
  1372. "text-align":"center","margin-top":"3px","font-size":"12px"
  1373. };
  1374. var nameStyles={
  1375. "height":"24px","float":"left","margin-left":"2px","margin-right":"10px",
  1376. "color":"#333333","line-height":"22px","margin-top":"3px"
  1377. };
  1378. var closeStyles={
  1379. "width":"16px","height":"16px","position":"absolute","right":"0px",
  1380. "background":"url(/x_component_TeamWork/$Task/default/icon/icon_off.png) no-repeat center"
  1381. };
  1382. var circleDiv = new Element("div",{styles:circleStyles,text:name.substr(0,1)}).inject(container);
  1383. var nameDiv = new Element("div",{styles:nameStyles,text:name}).inject(container);
  1384. if(flag){ //权限
  1385. container.addEvents({
  1386. mouseenter:function(){
  1387. // var closeIcon = new Element("div.closeIcon",{styles:closeStyles}).inject(this);
  1388. // closeIcon.addEvents({
  1389. // click:function(e){
  1390. // // _self.taskData.executor = "";
  1391. // // _self.loadDutyValue();
  1392. //
  1393. // var sd = {
  1394. // taskId:_self.taskData.id,
  1395. // property:"executor",
  1396. // mainValue:"",
  1397. // secondaryValue:""
  1398. // };
  1399. // _self.updateSingleProperty(sd,function(){
  1400. // _self.taskData.executor = "";
  1401. // _self.loadDutyValue()
  1402. // })
  1403. //
  1404. // e.stopPropagation();
  1405. // }
  1406. // });
  1407. this.setStyles({"background-color":"#efefef","cursor":"pointer"});
  1408. },
  1409. mouseleave:function(){
  1410. if(this.getElement(".closeIcon"))this.getElement(".closeIcon").destroy();
  1411. this.setStyles({"background-color":""})
  1412. },
  1413. click:function(e){
  1414. _self.selectPerson(_self.taskDutyAddText,"identity",null,1,
  1415. function(json){
  1416. if(json.length>0){
  1417. if(_self.taskData.executor!=json[0]){
  1418. var sd = {
  1419. taskId:_self.taskData.id,
  1420. property:"executor",
  1421. mainValue:json[0],
  1422. secondaryValue:""
  1423. };
  1424. _self.updateSingleProperty(sd,function(){
  1425. _self.taskData.executor = json[0];
  1426. _self.loadDutyValue()
  1427. })
  1428. }
  1429. }
  1430. }
  1431. );
  1432. }
  1433. })
  1434. }
  1435. },
  1436. loadparticipantPerson:function(node,identity,flag){
  1437. var _self = this;
  1438. var name = identity.split("@")[0];
  1439. var container = new Element("div",{styles:{"height":"30px","padding":"0 0px","border-radius":"4px","float":"left","position":"relative"}}).inject(node);
  1440. var circleStyles={
  1441. "width":"24px","height":"24px","border-radius":"20px","float":"left",
  1442. "background-color":"#4A90E2","color":"#ffffff","line-height":"22px",
  1443. "text-align":"center","margin-top":"3px","font-size":"12px"
  1444. };
  1445. var nameStyles={
  1446. "height":"24px","float":"left","margin-left":"2px","margin-right":"16px",
  1447. "color":"#333333","line-height":"22px","margin-top":"3px"
  1448. };
  1449. var closeStyles={
  1450. "width":"16px","height":"16px","position":"absolute","right":"0px",
  1451. "background":"url(/x_component_TeamWork/$Task/default/icon/icon_off.png) no-repeat center"
  1452. };
  1453. var circleDiv = new Element("div",{styles:circleStyles,text:name.substr(0,1)}).inject(container);
  1454. var nameDiv = new Element("div",{styles:nameStyles,text:name}).inject(container);
  1455. if(flag){ //权限
  1456. container.addEvents({
  1457. mouseenter:function(){
  1458. var closeIcon = new Element("div.closeIcon",{styles:closeStyles}).inject(this);
  1459. closeIcon.addEvents({
  1460. click:function(e){
  1461. var index = _self.taskData.participantList.indexOf(identity);
  1462. if(index>-1){
  1463. _self.taskData.participantList.erase(identity)
  1464. }
  1465. _self.actions.updateParticipant(_self.taskData.id,{participantList:_self.taskData.participantList},function(json){
  1466. _self.createParticipateContainer();
  1467. if(json.data.dynamics){
  1468. json.data.dynamics.each(function(dd){
  1469. _self.loadDynamicItem(dd,"bottom")
  1470. })
  1471. }
  1472. _self.dynamicContent.scrollTo(0,_self.dynamicContent.getScrollSize().y);
  1473. });
  1474. e.stopPropagation();
  1475. }
  1476. });
  1477. this.setStyles({"background-color":"#efefef","cursor":"pointer"});
  1478. },
  1479. mouseleave:function(){
  1480. if(this.getElement(".closeIcon"))this.getElement(".closeIcon").destroy();
  1481. this.setStyles({"background-color":""})
  1482. }
  1483. })
  1484. }
  1485. },
  1486. setAuth:function(){
  1487. var _self = this;
  1488. //名称
  1489. },
  1490. reload : function( keepData ){
  1491. // if( keepData ){
  1492. // this.data = this.form.getResult(false, this.options.resultSeparator, false, false, true);
  1493. // }
  1494. this.formTopNode = null;
  1495. if(this.setFormNodeSizeFun && this.app && this.app.removeEvent){
  1496. this.app.removeEvent("resize",this.setFormNodeSizeFun);
  1497. }
  1498. if( this.formMaskNode )this.formMaskNode.destroy();
  1499. if( this.formAreaNode )this.formAreaNode.destroy();
  1500. if( this.isNew ){
  1501. this.create();
  1502. }else if( this.isEdited ){
  1503. this.edit();
  1504. }else{
  1505. this.open();
  1506. }
  1507. },
  1508. selectPerson: function( item, type,types,count,callback ) {
  1509. MWF.xDesktop.requireApp("Selector", "package", null, false);
  1510. this.fireEvent("querySelect", this);
  1511. var value = [];
  1512. var options = {
  1513. "type": type,
  1514. "types":types,
  1515. "title": "选人",
  1516. "count": count,
  1517. "values": value || [],
  1518. "onComplete": function (items) {
  1519. var arr = [];
  1520. items.each(function (item) {
  1521. arr.push(item.data.distinguishedName);
  1522. }.bind(this));
  1523. if(callback)callback(arr);
  1524. }.bind(this)
  1525. };
  1526. var selector = new MWF.O2Selector(this.app.content, options);
  1527. }
  1528. });
  1529. MWF.xApplication.TeamWork.Task.TaskMore = new Class({
  1530. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1531. options : {
  1532. // displayDelay : 300,
  1533. hasArrow:false,
  1534. event:"click"
  1535. },
  1536. _loadCustom : function( callback ){
  1537. this.rootActions = this.app.rootActions;
  1538. var _self = this;
  1539. this.css = this.options.css;
  1540. this.lp = this.options.lp;
  1541. //this.data
  1542. //this.contentNode
  1543. var topMoreTitle = new Element("div.topMoreTitle",{styles:this.css.topMoreTitle,text:this.lp.taskMenu}).inject(this.contentNode);
  1544. var copyTask = new Element("div.copyTask",{styles:this.css.topMoreItem}).inject(this.contentNode);
  1545. copyTask.addEvents({
  1546. mouseenter:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1547. mouseleave:function(){this.setStyles({"background-color":""})}
  1548. });
  1549. var copyTaskIcon = new Element("div.copyTaskIcon",{styles:this.css.topMoreItemIcon}).inject(copyTask);
  1550. copyTaskIcon.setStyles({"background":"url(/x_component_TeamWork/$Task/default/icon/taskcopy.png) no-repeat center"});
  1551. var copyTaskText = new Element("div.copyTaskText",{styles:this.css.topMoreItemText,text:this.lp.taskCopy}).inject(copyTask);
  1552. var moveTask = new Element("div.moveTask",{styles:this.css.topMoreItem}).inject(this.contentNode);
  1553. moveTask.addEvents({
  1554. mouseenter:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1555. mouseleave:function(){this.setStyles({"background-color":""})},
  1556. click:function(){
  1557. var data = this.data;
  1558. var opt = {};
  1559. MWF.xDesktop.requireApp("TeamWork", "TaskMove", function(){
  1560. var taskmove = new MWF.xApplication.TeamWork.TaskMove(this.explorer,data,opt);
  1561. taskmove.open();
  1562. var fx = new Fx.Tween(this.node,{duration:200});
  1563. fx.start(["opacity"] ,"1", "0").chain(function(){this.close()}.bind(this));
  1564. }.bind(this));
  1565. }.bind(this)
  1566. });
  1567. var moveTaskIcon = new Element("div.moveTaskIcon",{styles:this.css.topMoreItemIcon}).inject(moveTask);
  1568. moveTaskIcon.setStyles({"background":"url(/x_component_TeamWork/$Task/default/icon/taskmove.png) no-repeat center"});
  1569. var moveTaskText = new Element("div.moveTaskText",{styles:this.css.topMoreItemText,text:this.lp.taskMove}).inject(moveTask);
  1570. // var favTask = new Element("div.favTask",{styles:this.css.topMoreItem}).inject(this.contentNode);
  1571. // favTask.addEvents({
  1572. // mouseenter:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1573. // mouseleave:function(){this.setStyles({"background-color":""})}
  1574. // });
  1575. // var favTaskIcon = new Element("div.favTaskIcon",{styles:this.css.topMoreItemIcon}).inject(favTask);
  1576. // favTaskIcon.setStyles({"background":"url(/x_component_TeamWork/$Task/default/icon/taskfav.png) no-repeat center"});
  1577. // var favTaskText = new Element("div.favTaskText",{styles:this.css.topMoreItemText,text:this.lp.taskFav}).inject(favTask);
  1578. var subTask = new Element("div.subTask",{styles:this.css.topMoreItem}).inject(this.contentNode);
  1579. subTask.addEvents({
  1580. click:function(){
  1581. var data = this.data;
  1582. MWF.xDesktop.requireApp("TeamWork", "TaskSub", function(){
  1583. var opt = {
  1584. "onPostOpen":function(){
  1585. //tasksub.formAreaNode.setStyles({"height":"0px","width":"0px","overflow":"hidden"})
  1586. //tasksub.formAreaNode.setStyles({"top":"10px"});
  1587. var fx = new Fx.Tween(tasksub.formAreaNode,{duration:200});
  1588. fx.start(["top"] ,"10px", "100px");
  1589. }
  1590. };
  1591. var tasksub = new MWF.xApplication.TeamWork.TaskSub(this.explorer,data,opt);
  1592. tasksub.open();
  1593. var fx = new Fx.Tween(this.node,{duration:200});
  1594. fx.start(["opacity"] ,"1", "0").chain(function(){this.close()}.bind(this));
  1595. }.bind(this));
  1596. }.bind(this),
  1597. mouseenter:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1598. mouseleave:function(){this.setStyles({"background-color":""})}
  1599. });
  1600. var subTaskIcon = new Element("div.subTaskIcon",{styles:this.css.topMoreItemIcon}).inject(subTask);
  1601. subTaskIcon.setStyles({"background":"url(/x_component_TeamWork/$Task/default/icon/tasksub.png) no-repeat center"});
  1602. var subTaskText = new Element("div.subTaskText",{styles:this.css.topMoreItemText,text:this.lp.taskSub}).inject(subTask);
  1603. var removeTask = new Element("div.removeTask",{styles:this.css.topMoreItem}).inject(this.contentNode);
  1604. removeTask.addEvents({
  1605. click:function(e){
  1606. _self.app.confirm("warn",e,_self.app.lp.common.confirm.removeTitle,_self.app.lp.common.confirm.removeContent,300,120,function(){
  1607. _self.rootActions.TaskAction.delete(_self.data.data.id,function(){
  1608. var rd = {"act":"remove"};
  1609. _self.close(rd);
  1610. this.close()
  1611. }.bind(this))
  1612. },function(){
  1613. this.close();
  1614. });
  1615. },
  1616. mouseenter:function(){this.setStyles({"background-color":"#F7F7F7"})},
  1617. mouseleave:function(){this.setStyles({"background-color":""})}
  1618. });
  1619. var removeTaskIcon = new Element("div.removeTaskIcon",{styles:this.css.topMoreItemIcon}).inject(removeTask);
  1620. removeTaskIcon.setStyles({"background":"url(/x_component_TeamWork/$Task/default/icon/taskremove.png) no-repeat center"});
  1621. var removeTaskText = new Element("div.removeTaskText",{styles:this.css.topMoreItemText,text:this.lp.taskRemove}).inject(removeTask);
  1622. if(callback)callback();
  1623. }
  1624. });
  1625. MWF.xApplication.TeamWork.Task.StatusCheck = new Class({
  1626. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1627. options : {
  1628. // displayDelay : 300,
  1629. hasArrow:false,
  1630. event:"click"
  1631. },
  1632. _loadCustom : function( callback ){
  1633. var _self = this;
  1634. this.css = this.options.css;
  1635. this.lp = this.options.lp;
  1636. //this.data
  1637. var container = {
  1638. "cursor":"pointer",
  1639. "height":"40px",
  1640. "width":"100%"
  1641. };
  1642. var text={
  1643. "height":"30px","line-height":"30px","float":"left",
  1644. "padding-left":"10px","padding-right":"10px","margin-left":"6px","margin-top":"5px",
  1645. "font-size":"13px","color":"#666666","border-radius":"2px"
  1646. };
  1647. var icon = {
  1648. "float":"right","width":"24px","height":"24px",
  1649. "margin-top":"6px","margin-right":"8px",
  1650. "background":"url(/x_component_TeamWork/$Task/default/icon/icon_dagou.png) no-repeat center"
  1651. };
  1652. var flowContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1653. var flowText = new Element("div",{styles:text,text:this.lp.status.processing}).inject(flowContainer);
  1654. flowText.setStyles({"background-color":"#f0f0f0"});
  1655. if(this.data.data.workStatus == "processing"){
  1656. var flowIcon = new Element("div",{styles:icon}).inject(flowContainer);
  1657. }
  1658. flowContainer.addEvents({
  1659. click:function(){
  1660. var data = {"status":"processing"};
  1661. this.close(data)
  1662. }.bind(this),
  1663. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1664. mouseout:function(){this.setStyles({"background-color":""})}
  1665. });
  1666. var completeContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1667. var completeText = new Element("div",{styles:text,text:this.lp.status.completed}).inject(completeContainer);
  1668. completeText.setStyles({"color":"#69b439","background-color":"#f1f9ec"});
  1669. if(this.data.data.workStatus == "completed"){
  1670. var completeIcon = new Element("div",{styles:icon}).inject(completeContainer);
  1671. }
  1672. completeContainer.addEvents({
  1673. click:function(){
  1674. var data = {"status":"completed"};
  1675. this.close(data)
  1676. }.bind(this),
  1677. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1678. mouseout:function(){this.setStyles({"background-color":""})}
  1679. });
  1680. if(callback)callback();
  1681. }
  1682. });
  1683. MWF.xApplication.TeamWork.Task.PriorityCheck = new Class({
  1684. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1685. options : {
  1686. // displayDelay : 300,
  1687. hasArrow:false,
  1688. event:"click"
  1689. },
  1690. _loadCustom : function( callback ){
  1691. var _self = this;
  1692. this.css = this.options.css;
  1693. this.lp = this.options.lp;
  1694. //this.data
  1695. //this.contentNode
  1696. var container = {
  1697. "cursor":"pointer",
  1698. "height":"40px",
  1699. "width":"100%"
  1700. };
  1701. var text={
  1702. "height":"25px","line-height":"25px","float":"left","width":"50px","text-align":"center",
  1703. "margin-left":"6px","margin-top":"8px",
  1704. "font-size":"13px","color":"#666666","border-radius":"2px"
  1705. };
  1706. var icon = {
  1707. "float":"right","width":"24px","height":"24px",
  1708. "margin-top":"6px","margin-right":"8px",
  1709. "background":"url(/x_component_TeamWork/$Task/default/icon/icon_dagou.png) no-repeat center"
  1710. };
  1711. var normalContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1712. var normalText = new Element("div",{styles:text,text:this.lp.priority.normal}).inject(normalContainer);
  1713. normalText.setStyles({"color":"#999999","border":"1px solid #999999"});
  1714. if(this.data.data.priority == this.lp.priority.normal){
  1715. new Element("div",{styles:icon}).inject(normalContainer);
  1716. }
  1717. normalContainer.addEvents({
  1718. click:function(){
  1719. var data = {"value":this.lp.priority.normal};
  1720. this.close(data)
  1721. }.bind(this),
  1722. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1723. mouseout:function(){this.setStyles({"background-color":""})}
  1724. });
  1725. var urgencyContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1726. var urgencyText = new Element("div",{styles:text,text:this.lp.priority.urgency}).inject(urgencyContainer);
  1727. urgencyText.setStyles({"color":"#ffaf38","border":"1px solid #ffaf38"});
  1728. if(this.data.data.priority == this.lp.priority.urgency){
  1729. new Element("div",{styles:icon}).inject(urgencyContainer);
  1730. }
  1731. urgencyContainer.addEvents({
  1732. click:function(){
  1733. var data = {"value":this.lp.priority.urgency};
  1734. this.close(data)
  1735. }.bind(this),
  1736. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1737. mouseout:function(){this.setStyles({"background-color":""})}
  1738. });
  1739. var emergencyContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1740. var emergencyText = new Element("div",{styles:text,text:this.lp.priority.emergency}).inject(emergencyContainer);
  1741. emergencyText.setStyles({"color":"#ff4f3e","border":"1px solid #ff4f3e"});
  1742. if(this.data.data.priority == this.lp.priority.emergency){
  1743. new Element("div",{styles:icon}).inject(emergencyContainer);
  1744. }
  1745. emergencyContainer.addEvents({
  1746. click:function(){
  1747. var data = {"value":this.lp.priority.emergency};
  1748. this.close(data)
  1749. }.bind(this),
  1750. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1751. mouseout:function(){this.setStyles({"background-color":""})}
  1752. });
  1753. if(callback)callback();
  1754. }
  1755. });
  1756. MWF.xApplication.TeamWork.Task.DynamicType = new Class({
  1757. Extends: MWF.xApplication.TeamWork.Common.ToolTips,
  1758. options : {
  1759. // displayDelay : 300,
  1760. hasArrow:false,
  1761. event:"click"
  1762. },
  1763. _loadCustom : function( callback ){
  1764. var _self = this;
  1765. this.css = this.options.css;
  1766. this.lp = this.options.lp;
  1767. //this.data
  1768. //this.contentNode
  1769. var container = {
  1770. "cursor":"pointer",
  1771. "height":"40px",
  1772. "width":"100%"
  1773. };
  1774. var text={
  1775. "height":"25px","line-height":"25px","float":"left","width":"100%",
  1776. "margin-left":"6px","margin-top":"8px",
  1777. "font-size":"13px","color":"#666666","border-radius":"2px"
  1778. };
  1779. var icon = {
  1780. "float":"right","width":"24px","height":"24px",
  1781. "margin-top":"6px","margin-right":"8px",
  1782. "background":"url(/x_component_TeamWork/$Task/default/icon/icon_dagou.png) no-repeat center"
  1783. };
  1784. var allContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1785. var allText = new Element("div",{styles:text,text:this.lp.dynamicAll}).inject(allContainer);
  1786. allText.setStyles({"color":"#999999","border":"0px solid #999999"});
  1787. allContainer.addEvents({
  1788. click:function(){
  1789. var data = {"value":"all"};
  1790. this.close(data)
  1791. }.bind(this),
  1792. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1793. mouseout:function(){this.setStyles({"background-color":""})}
  1794. });
  1795. var attachmentContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1796. var attachmentText = new Element("div",{styles:text,text:this.lp.dynamicAttachment}).inject(attachmentContainer);
  1797. attachmentText.setStyles({"color":"#999999","border":"0px solid #999999"});
  1798. attachmentContainer.addEvents({
  1799. click:function(){
  1800. var data = {"value":"attachment"};
  1801. this.close(data)
  1802. }.bind(this),
  1803. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1804. mouseout:function(){this.setStyles({"background-color":""})}
  1805. });
  1806. var chatContainer = new Element("div",{styles:container}).inject(this.contentNode);
  1807. var chatText = new Element("div",{styles:text,text:this.lp.dynamicChat}).inject(chatContainer);
  1808. chatText.setStyles({"color":"#999999","border":"0px solid #999999"});
  1809. chatContainer.addEvents({
  1810. click:function(){
  1811. var data = {"value":"chat"};
  1812. this.close(data)
  1813. }.bind(this),
  1814. mouseover:function(){this.setStyles({"background-color":"#f2f5f7"})},
  1815. mouseout:function(){this.setStyles({"background-color":""})}
  1816. });
  1817. if(callback)callback();
  1818. }
  1819. });