WebSocket.js 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. MWF.xDesktop = MWF.xDesktop || {};
  2. MWF.xApplication = MWF.xApplication || {};
  3. MWF.require("MWF.xDesktop.Actions.RestActions", null, false);
  4. MWF.xDesktop.WebSocket = new Class({
  5. Implements: [Options, Events],
  6. options: {},
  7. initialize: function(options){
  8. var addressObj = layout.serviceAddressList["x_message_assemble_communicate"];
  9. var uri = new URI(window.location.href);
  10. var scheme = uri.get("scheme");
  11. var wsScheme = (scheme.toString().toLowerCase()==="https") ? "wss" : "ws";
  12. this.ws = wsScheme+"://"+addressObj.host+(addressObj.port==80 ? "" : ":"+addressObj.port)+addressObj.context+"/ws/collaboration";
  13. this.reConnect = true;
  14. this.checking = false;
  15. this.heartTimeout = 30000;
  16. this.checkingTimeout = 4000;
  17. this.heartMsg = "heartbeat";
  18. this.maxErrorCount = 10;
  19. this.errorCount = 0;
  20. // var addressObj = layout.desktop.serviceAddressList["x_collaboration_assemble_websocket"];
  21. // this.ws = "ws://"+addressObj.host+(addressObj.port==80 ? "" : ":"+addressObj.port)+addressObj.context+"/ws/collaboration";
  22. //var ws = "ws://hbxa01.bf.ctc.com/x_collaboration_assemble_websocket/ws/collaboration";
  23. //使用轮询方式处理消息.....
  24. // this.webSocket = {
  25. // "readyState":"1",
  26. // "close": function(){},
  27. // "open": function(){}
  28. // };
  29. // window.setInterval(function(){
  30. // o2.Actions.get("")
  31. // }, 10000);
  32. ///*暂时不启用WebSocket了------------
  33. //this.ws = this.ws+"?x-token="+encodeURIComponent(Cookie.read("x-token"))+"&authorization="+encodeURIComponent(Cookie.read("x-token"));
  34. this.connect();
  35. },
  36. connect: function(){
  37. if (layout.config.webSocketEnable){
  38. var ws = this.ws+"?x-token="+encodeURIComponent(layout.session.token);
  39. ws = o2.filterUrl(ws);
  40. try{
  41. this.webSocket = new WebSocket(ws);
  42. //this.webSocket = new WebSocket(this.ws);
  43. this.webSocket.onopen = function (e){this.onOpen(e);}.bind(this);
  44. this.webSocket.onclose = function (e){this.onClose(e);}.bind(this);
  45. this.webSocket.onmessage = function (e){this.onMessage(e);}.bind(this);
  46. this.webSocket.onerror = function (e){this.onError(e);}.bind(this);
  47. //---------------------------------*/
  48. }catch(e){
  49. //WebSocket.close();
  50. //this.webSocket = new WebSocket(this.ws);
  51. this.errorCount++;
  52. console.log("Unable to connect to the websocket server, will retry in "+(this.checkingTimeout/1000)+" seconds");
  53. this.checkRetry();
  54. // if (this.webSocket){
  55. // this.close();
  56. // //this.webSocket = new WebSocket(this.ws);
  57. // }
  58. }
  59. }
  60. },
  61. onOpen: function(e){
  62. this.errorCount = 0;
  63. console.log("websocket is open, You can receive system messages");
  64. this.heartbeat();
  65. //MWF.xDesktop.notice("success", {"x": "right", "y": "top"}, "websocket is open ...");
  66. },
  67. onClose: function(e){
  68. console.log("websocket is closed. ");
  69. //if (this.reConnect) this.checkRetry();
  70. //MWF.xDesktop.notice("success", {"x": "right", "y": "top"}, "websocket is closed ...");
  71. },
  72. onMessage: function(e){
  73. if (e.data){
  74. try{
  75. if (e.data===this.heartMsg){
  76. this.heartbeat();
  77. //console.log("get heartbeat...");
  78. return true;
  79. }
  80. var data = JSON.decode(e.data);
  81. switch (data.category){
  82. case "dialog":
  83. switch (data.type){
  84. case "text":
  85. this.receiveChatMessage(data);
  86. break;
  87. default:
  88. }
  89. break;
  90. default:
  91. switch (data.type){
  92. case "task":
  93. case "task_create":
  94. case "task_urge":
  95. case "task_expire":
  96. case "task_press":
  97. this.receiveTaskMessage(data);
  98. break;
  99. case "read":
  100. case "read_create":
  101. this.receiveReadMessage(data);
  102. break;
  103. case "review":
  104. this.receiveReviewMessage(data);
  105. break;
  106. case "fileEditor":
  107. case "attachment_editor":
  108. case "attachment_editorCancel":
  109. case "attachment_editorModify":
  110. this.receiveFileEditorMessage(data);
  111. break;
  112. case "fileShare":
  113. case "attachment_share":
  114. case "attachment_shareCancel":
  115. this.receiveFileShareMessage(data);
  116. break;
  117. case "meetingInvite":
  118. case "meeting_invite":
  119. this.receiveMeetingInviteMessage(data);
  120. break;
  121. case "meetingCancel":
  122. case "meeting_cancel":
  123. this.receiveMeetingCancelMessage(data);
  124. break;
  125. case "meetingAccept":
  126. case "meeting_accept":
  127. this.receiveMeetingAcceptMessage(data);
  128. break;
  129. case "meetingReject":
  130. case "meeting_reject":
  131. this.receiveMeetingRejectMessage(data);
  132. break;
  133. case "attendanceAppealInvite":
  134. this.receiveAttendanceAppealInviteMessage(data);
  135. break;
  136. case "attendanceAppealAccept":
  137. this.receiveAttendanceAppealAcceptMessage(data);
  138. break;
  139. case "attendanceAppealReject":
  140. this.receiveAttendanceAppealRejectMessage(data);
  141. break;
  142. case "calendar_alarm":
  143. this.receiveCalendarAlarmMessage(data);
  144. break;
  145. case "teamwork_taskCreate":
  146. case "teamwork_taskUpdate":
  147. case "teamwork_taskDelelte":
  148. case "teamwork_taskOvertime":
  149. case "teamwork_taskChat":
  150. this.receiveTeamWorkMessage(data);
  151. break;
  152. case "custom_create":
  153. this.receiveCustomMessage(data);
  154. case "im_create":
  155. console.log("im 消息来了!!!");
  156. this.receiveIMMessage(data);
  157. break;
  158. case "cms_publish" :
  159. this.receiveCMSPublishMessage(data);
  160. break;
  161. default:
  162. }
  163. }
  164. }catch(e){}
  165. }
  166. },
  167. onError: function(e){
  168. this.errorCount++;
  169. //console.log(e);
  170. console.log("Unable to connect to the websocket server, will retry in "+(this.checkingTimeout/1000)+" seconds.");
  171. this.checkRetry();
  172. //MWF.xDesktop.notice("success", {"x": "right", "y": "top"}, "websocket is error ...");
  173. },
  174. checkRetry: function(){
  175. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  176. if (this.heartbeatCheck) window.clearTimeout(this.heartbeatCheck);
  177. if (this.errorCount < this.maxErrorCount) this.serverCheck = window.setTimeout(function(){
  178. this.retry();
  179. }.bind(this), this.checkingTimeout);
  180. },
  181. retry: function(){
  182. if (this.webSocket){
  183. this.close();
  184. }
  185. console.log("Retry connect to websocket server. ("+this.errorCount+"/"+this.maxErrorCount+")");
  186. this.connect();
  187. },
  188. close: function(){
  189. this.reConnect = false;
  190. if (this.webSocket) this.webSocket.close();
  191. //WebSocket.close();
  192. },
  193. send: function(msg){
  194. if (!this.webSocket || this.webSocket.readyState != 1) {
  195. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  196. this.retry();
  197. }
  198. // try{
  199. this.webSocket.send(JSON.encode(msg));
  200. // }catch(e){
  201. // this.retry();
  202. // this.webSocket.send(JSON.encode(msg));
  203. // }
  204. },
  205. heartbeat: function(){
  206. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  207. if (this.heartbeatCheck) window.clearTimeout(this.heartbeatCheck);
  208. this.heartbeatCheck = window.setTimeout(function(){
  209. this.sendHeartbeat(this.heartMsg);
  210. }.bind(this), this.heartTimeout);
  211. },
  212. sendHeartbeat: function(msg){
  213. if (!this.webSocket || this.webSocket.readyState != 1) {
  214. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  215. this.retry();
  216. }
  217. try{
  218. //console.log("send heartbeat ...");
  219. this.webSocket.send(msg);
  220. this.checkRetry();
  221. }catch(e){
  222. //console.log("send heartbeat error !!!");
  223. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  224. this.retry();
  225. //this.initialize();
  226. }
  227. },
  228. receiveCMSPublishMessage: function(data){
  229. var content = "<font style='color: #ea621f'>"+(data.body.creatorPerson||"").split("@")[0]+"</font>"+MWF.LP.desktop.messsage.publishDocument+data.body.title;
  230. var msg = {
  231. "subject": data.body.categoryName,
  232. "content": content
  233. };
  234. var messageItem = layout.desktop.message.addMessage(msg);
  235. var tooltipItem = layout.desktop.message.addTooltip(msg);
  236. tooltipItem.contentNode.addEvent("click", function(e){
  237. layout.desktop.message.hide();
  238. var appId = "cms.Document"+data.body.id;
  239. if ( layout.desktop.apps && layout.desktop.apps[appId] ) {
  240. layout.desktop.apps[appId].setCurrent();
  241. }else{
  242. var options = {"documentId": data.body.id, "appId": appId};
  243. layout.desktop.openApplication(e, "cms.Document", options);
  244. }
  245. });
  246. messageItem.contentNode.addEvent("click", function(e){
  247. layout.desktop.message.addUnread(-1);
  248. layout.desktop.message.hide();
  249. var appId = "cms.Document"+data.body.id;
  250. if ( layout.desktop.apps && layout.desktop.apps[appId] ) {
  251. layout.desktop.apps[appId].setCurrent();
  252. }else{
  253. var options = {"documentId": data.body.id, "appId": appId};
  254. layout.desktop.openApplication(e, "cms.Document", options);
  255. }
  256. });
  257. },
  258. receiveChatMessage: function(data){
  259. if (layout.desktop.widgets["IMIMWidget"]) layout.desktop.widgets["IMIMWidget"].receiveChatMessage(data);
  260. //if (layout.desktop.top.userPanel) layout.desktop.top.userPanel.receiveChatMessage(data);
  261. },
  262. openWork: function(id, e){
  263. o2.Actions.get("x_processplatform_assemble_surface").getWorkInfor(id, function(){
  264. var options = {"workId": id, "appId": "process.Work"+id};
  265. layout.desktop.openApplication(e, "process.Work", options);
  266. }.bind(this), function(){
  267. layout.desktop.openApplication(e, "process.TaskCenter", null, {
  268. "status": {
  269. "navi": "task"
  270. }
  271. });
  272. }.bind(this));
  273. },
  274. receiveTaskMessage: function(data){
  275. var task = data.body;
  276. //var content = MWF.LP.desktop.messsage.receiveTask+"《"+task.title+"》, "+MWF.LP.desktop.messsage.activity+": <font style='color: #ea621f'>"+(task.activityName || "")+"</font>";
  277. var content = data.title;
  278. content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.appliction+": </font><font style='color: #ea621f'>"+task.applicationName+"</font>; "+
  279. "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.process+": </font><font style='color: #ea621f'>"+task.processName+"</font>";
  280. var msg = {
  281. "subject": MWF.LP.desktop.messsage.taskMessage,
  282. "content": content
  283. };
  284. var messageItem = layout.desktop.message.addMessage(msg, data.body.startTime);
  285. var tooltipItem = layout.desktop.message.addTooltip(msg, data.body.startTime);
  286. tooltipItem.contentNode.addEvent("click", function(e){
  287. layout.desktop.message.hide();
  288. this.openWork(task.work,e);
  289. }.bind(this));
  290. messageItem.contentNode.addEvent("click", function(e){
  291. layout.desktop.message.addUnread(-1);
  292. layout.desktop.message.hide();
  293. this.openWork(task.work,e);
  294. }.bind(this));
  295. },
  296. receiveReadMessage: function(data){
  297. var read = data.body;
  298. //var content = MWF.LP.desktop.messsage.receiveRead+"《"+read.title+"》. ";
  299. var content = data.title;
  300. content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.appliction+": </font><font style='color: #ea621f'>"+read.applicationName+"</font>; "+
  301. "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.process+": </font><font style='color: #ea621f'>"+read.processName+"</font>";
  302. var msg = {
  303. "subject": MWF.LP.desktop.messsage.readMessage,
  304. "content": content
  305. };
  306. var messageItem = layout.desktop.message.addMessage(msg, data.body.startTime);
  307. var tooltipItem = layout.desktop.message.addTooltip(msg, data.body.startTime);
  308. tooltipItem.contentNode.addEvent("click", function(e){
  309. layout.desktop.message.hide();
  310. this.openWork(read.work,e);
  311. }.bind(this));
  312. messageItem.contentNode.addEvent("click", function(e){
  313. layout.desktop.message.addUnread(-1);
  314. layout.desktop.message.hide();
  315. this.openWork(read.work,e);
  316. }.bind(this));
  317. },
  318. receiveCustomMessage: function(data){
  319. var content = "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.customMessage+":</font>"+data.body;
  320. var msg = {
  321. "subject": MWF.LP.desktop.messsage.customMessageTitle,
  322. "content": content
  323. };
  324. var messageItem = layout.desktop.message.addMessage(msg);
  325. var tooltipItem = layout.desktop.message.addTooltip(msg);
  326. },
  327. receiveIMMessage: function(data){
  328. var imBody = data.body;
  329. var jsonBody = imBody.body;
  330. var conversationId = imBody.conversationId;
  331. var body = JSON.parse(jsonBody);
  332. var msgBody = body.body; //默认text 文本消息
  333. if (body.type && body.type == "emoji") { //表情 消息
  334. msgBody = "[表情]";
  335. }
  336. var content = "<font style='color: #333; font-weight: bold'>"+data.title+"</font>: "+msgBody;
  337. var msg = {
  338. "subject": MWF.LP.desktop.messsage.customMessageTitle,
  339. "content": content
  340. };
  341. var messageItem = layout.desktop.message.addMessage(msg);
  342. var options = {"conversationId": conversationId};
  343. messageItem.contentNode.addEvent("click", function(e){
  344. layout.desktop.message.addUnread(-1);
  345. layout.desktop.message.hide();
  346. layout.desktop.openApplication(e, "IMV2", options);
  347. }.bind(this));
  348. var tooltipItem = layout.desktop.message.addTooltip(msg);
  349. tooltipItem.contentNode.addEvent("click", function(e){
  350. layout.desktop.message.hide();
  351. layout.desktop.openApplication(e, "IMV2", options);
  352. }.bind(this));
  353. },
  354. receiveReviewMessage: function(data){
  355. var content = MWF.LP.desktop.messsage.receiveReview+"《"+data.title+"》. ";
  356. content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.appliction+": </font><font style='color: #ea621f'>"+data.applicationName+"</font>; "+
  357. "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.process+": </font><font style='color: #ea621f'>"+data.processName+"</font>";
  358. var msg = {
  359. "subject": MWF.LP.desktop.messsage.reviewMessage,
  360. "content": content
  361. };
  362. var messageItem = layout.desktop.message.addMessage(msg, data.body.startTime);
  363. var tooltipItem = layout.desktop.message.addTooltip(msg, data.body.startTime);
  364. tooltipItem.contentNode.addEvent("click", function(e){
  365. layout.desktop.message.hide();
  366. layout.desktop.openApplication(e, "process.TaskCenter", null, {
  367. "status": {
  368. "navi": "review"
  369. }
  370. });
  371. });
  372. messageItem.contentNode.addEvent("click", function(e){
  373. layout.desktop.message.addUnread(-1);
  374. layout.desktop.message.hide();
  375. layout.desktop.openApplication(e, "process.TaskCenter", null, {
  376. "status": {
  377. "navi": "review"
  378. }
  379. });
  380. });
  381. },
  382. receiveFileEditorMessage: function(data){
  383. var content = "<font style='color: #ea621f; font-weight: bold'>"+MWF.name.cn(data.body.person)+"</font> "+MWF.LP.desktop.messsage.receiveFileEditor+"“"+data.body.name+"”. ";
  384. var msg = {
  385. "subject": MWF.LP.desktop.messsage.fileEditorMessage,
  386. "content": content
  387. };
  388. var messageItem = layout.desktop.message.addMessage(msg, ((data.body) ? data.body.startTime : ""));
  389. var tooltipItem = layout.desktop.message.addTooltip(msg, ((data.body) ? data.body.startTime : ""));
  390. tooltipItem.contentNode.addEvent("click", function(e){
  391. layout.desktop.message.hide();
  392. layout.desktop.openApplication(e, "File", null, {
  393. "status": {
  394. "tab": "editor",
  395. "node": data.person
  396. }
  397. });
  398. });
  399. messageItem.contentNode.addEvent("click", function(e){
  400. layout.desktop.message.addUnread(-1);
  401. layout.desktop.message.hide();
  402. layout.desktop.openApplication(e, "File", null, {
  403. "status": {
  404. "tab": "editor",
  405. "node": data.person
  406. }
  407. });
  408. });
  409. },
  410. receiveFileShareMessage: function(data){
  411. var content = "<font style='color: #ea621f; font-weight: bold'>"+MWF.name.cn(data.body.person)+"</font> "+MWF.LP.desktop.messsage.receiveFileShare+"“"+data.body.name+"”. ";
  412. var msg = {
  413. "subject": MWF.LP.desktop.messsage.fileShareMessage,
  414. "content": content
  415. };
  416. var messageItem = layout.desktop.message.addMessage(msg, ((data.body) ? data.body.createTime : ""));
  417. var tooltipItem = layout.desktop.message.addTooltip(msg, ((data.body) ? data.body.createTime : ""));
  418. tooltipItem.contentNode.addEvent("click", function(e){
  419. layout.desktop.message.hide();
  420. //应用市场中的云文件,门户cloudFile
  421. o2.Actions.load("x_portal_assemble_surface").PortalAction.get("cloudFile", function () {
  422. layout.desktop.openApplication(e, "portal.Portal", {
  423. portalId : "cloudFile"
  424. });
  425. }, function(){
  426. layout.desktop.openApplication(e, "File", null, {
  427. "status": {
  428. "tab": "share",
  429. "node": data.person
  430. }
  431. });
  432. })
  433. });
  434. messageItem.contentNode.addEvent("click", function(e){
  435. layout.desktop.message.addUnread(-1);
  436. layout.desktop.message.hide();
  437. layout.desktop.openApplication(e, "File", null, {
  438. "status": {
  439. "tab": "share",
  440. "node": data.person
  441. }
  442. });
  443. });
  444. },
  445. getMeeting: function(data, callback){
  446. //this.action = new MWF.xDesktop.Actions.RestActions("/Actions/action.json", "x_meeting_assemble_control", "x_component_Meeting");
  447. //var action = new MWF.xDesktop.Actions.RestActions("/Actions/action.json", "x_meeting_assemble_control", "x_component_Meeting");
  448. if( data.body && typeOf( data.body ) === "object" ){
  449. var data = data.body;
  450. MWF.Actions.get("x_meeting_assemble_control").getRoom(data.room, function(roomJson){
  451. data.roomName = roomJson.data.name;
  452. MWF.Actions.get("x_meeting_assemble_control").getBuilding(roomJson.data.building, function(buildingJson){
  453. data.buildingName = buildingJson.data.name;
  454. if (callback) callback(data);
  455. }.bind(this));
  456. }.bind(this));
  457. }else{
  458. MWF.Actions.get("x_meeting_assemble_control").getMeeting(data.metting, function(json){
  459. var data = json.data;
  460. MWF.Actions.get("x_meeting_assemble_control").getRoom(data.room, function(roomJson){
  461. data.roomName = roomJson.data.name;
  462. MWF.Actions.get("x_meeting_assemble_control").getBuilding(roomJson.data.building, function(buildingJson){
  463. data.buildingName = buildingJson.data.name;
  464. if (callback) callback(data);
  465. }.bind(this));
  466. }.bind(this));
  467. }.bind(this));
  468. }
  469. },
  470. receiveMeetingInviteMessage: function(data){
  471. this.getMeeting(data, function(meeting){
  472. var content = MWF.LP.desktop.messsage.meetingInvite;
  473. content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  474. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  475. content = content.replace(/{date}/g, date);
  476. content = content.replace(/{subject}/g, meeting.subject);
  477. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  478. var msg = {
  479. "subject": MWF.LP.desktop.messsage.meetingInviteMessage,
  480. "content": content
  481. };
  482. var messageItem = layout.desktop.message.addMessage(msg, ((data.body) ? data.body.startTime : ""));
  483. var tooltipItem = layout.desktop.message.addTooltip(msg, ((data.body) ? data.body.startTime : ""));
  484. tooltipItem.contentNode.addEvent("click", function(e){
  485. layout.desktop.message.hide();
  486. layout.desktop.openApplication(e, "Meeting", null);
  487. });
  488. messageItem.contentNode.addEvent("click", function(e){
  489. layout.desktop.message.addUnread(-1);
  490. layout.desktop.message.hide();
  491. layout.desktop.openApplication(e, "Meeting", null);
  492. });
  493. }.bind(this));
  494. },
  495. receiveMeetingCancelMessage: function(data){
  496. this.getMeeting(data, function(meeting){
  497. var content = MWF.LP.desktop.messsage.meetingCancel;
  498. content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  499. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  500. content = content.replace(/{date}/g, date);
  501. content = content.replace(/{subject}/g, meeting.subject);
  502. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  503. var msg = {
  504. "subject": MWF.LP.desktop.messsage.meetingCancelMessage,
  505. "content": content
  506. };
  507. var messageItem = layout.desktop.message.addMessage(msg, ((data.body) ? data.body.startTime : ""));
  508. var tooltipItem = layout.desktop.message.addTooltip(msg, ((data.body) ? data.body.startTime : ""));
  509. tooltipItem.contentNode.addEvent("click", function(e){
  510. layout.desktop.message.hide();
  511. layout.desktop.openApplication(e, "Meeting", null);
  512. });
  513. messageItem.contentNode.addEvent("click", function(e){
  514. layout.desktop.message.addUnread(-1);
  515. layout.desktop.message.hide();
  516. layout.desktop.openApplication(e, "Meeting", null);
  517. });
  518. }.bind(this));
  519. },
  520. receiveMeetingAcceptMessage: function(data){
  521. this.getMeeting(data, function(meeting){
  522. var content = MWF.LP.desktop.messsage.meetingAccept;
  523. //content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  524. content = content.replace(/{person}/g, MWF.name.cn(data.person));
  525. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  526. content = content.replace(/{date}/g, date);
  527. content = content.replace(/{subject}/g, meeting.subject);
  528. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  529. var msg = {
  530. "subject": MWF.LP.desktop.messsage.meetingAcceptMessage,
  531. "content": content
  532. };
  533. var messageItem = layout.desktop.message.addMessage(msg, ((data.body) ? data.body.startTime : ""));
  534. var tooltipItem = layout.desktop.message.addTooltip(msg, ((data.body) ? data.body.startTime : ""));
  535. tooltipItem.contentNode.addEvent("click", function(e){
  536. layout.desktop.message.hide();
  537. layout.desktop.openApplication(e, "Meeting", null);
  538. });
  539. messageItem.contentNode.addEvent("click", function(e){
  540. layout.desktop.message.addUnread(-1);
  541. layout.desktop.message.hide();
  542. layout.desktop.openApplication(e, "Meeting", null);
  543. });
  544. }.bind(this));
  545. },
  546. receiveMeetingRejectMessage: function(data){
  547. this.getMeeting(data, function(meeting){
  548. var content = MWF.LP.desktop.messsage.meetingReject;
  549. //content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  550. content = content.replace(/{person}/g, MWF.name.cn(data.person));
  551. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  552. content = content.replace(/{date}/g, date);
  553. content = content.replace(/{subject}/g, meeting.subject);
  554. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  555. var msg = {
  556. "subject": MWF.LP.desktop.messsage.meetingRejectMessage,
  557. "content": content
  558. };
  559. var messageItem = layout.desktop.message.addMessage(msg, ((data.body) ? data.body.startTime : ""));
  560. var tooltipItem = layout.desktop.message.addTooltip(msg, ((data.body) ? data.body.startTime : ""));
  561. tooltipItem.contentNode.addEvent("click", function(e){
  562. layout.desktop.message.hide();
  563. layout.desktop.openApplication(e, "Meeting", null);
  564. });
  565. messageItem.contentNode.addEvent("click", function(e){
  566. layout.desktop.message.addUnread(-1);
  567. layout.desktop.message.hide();
  568. layout.desktop.openApplication(e, "Meeting", null);
  569. });
  570. }.bind(this));
  571. },
  572. receiveAttendanceAppealInviteMessage : function(data){
  573. var content = MWF.LP.desktop.messsage.attendanceAppealInvite;
  574. content = content.replace(/{subject}/g, data.subject);
  575. var msg = {
  576. "subject": MWF.LP.desktop.messsage.attendanceAppealInviteMessage,
  577. "content": content
  578. };
  579. var messageItem = layout.desktop.message.addMessage(msg);
  580. var tooltipItem = layout.desktop.message.addTooltip(msg);
  581. tooltipItem.contentNode.addEvent("click", function(e){
  582. layout.desktop.message.hide();
  583. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"13"});
  584. });
  585. messageItem.contentNode.addEvent("click", function(e){
  586. layout.desktop.message.addUnread(-1);
  587. layout.desktop.message.hide();
  588. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"13"});
  589. });
  590. },
  591. receiveAttendanceAppealAcceptMessage : function(data){
  592. var content = MWF.LP.desktop.messsage.attendanceAppealAccept;
  593. content = content.replace(/{subject}/g, data.subject);
  594. var msg = {
  595. "subject": MWF.LP.desktop.messsage.attendanceAppealAcceptMessage,
  596. "content": content
  597. };
  598. var messageItem = layout.desktop.message.addMessage(msg);
  599. var tooltipItem = layout.desktop.message.addTooltip(msg);
  600. tooltipItem.contentNode.addEvent("click", function(e){
  601. layout.desktop.message.hide();
  602. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  603. });
  604. messageItem.contentNode.addEvent("click", function(e){
  605. layout.desktop.message.addUnread(-1);
  606. layout.desktop.message.hide();
  607. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  608. });
  609. },
  610. receiveAttendanceAppealRejectMessage : function(data){
  611. var content = MWF.LP.desktop.messsage.attendanceAppealReject;
  612. content = content.replace(/{subject}/g, data.subject);
  613. var msg = {
  614. "subject": MWF.LP.desktop.messsage.attendanceAppealRejectMessage,
  615. "content": content
  616. };
  617. var messageItem = layout.desktop.message.addMessage(msg);
  618. var tooltipItem = layout.desktop.message.addTooltip(msg);
  619. tooltipItem.contentNode.addEvent("click", function(e){
  620. layout.desktop.message.hide();
  621. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  622. });
  623. messageItem.contentNode.addEvent("click", function(e){
  624. layout.desktop.message.addUnread(-1);
  625. layout.desktop.message.hide();
  626. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  627. });
  628. },
  629. receiveCalendarAlarmMessage: function(data){
  630. var content = MWF.LP.desktop.messsage.canlendarAlarm;
  631. content = content.replace(/{title}/g, data.title);
  632. var msg = {
  633. "subject": MWF.LP.desktop.messsage.canlendarAlarmMessage,
  634. "content": content
  635. };
  636. var messageItem = layout.desktop.message.addMessage(msg);
  637. var tooltipItem = layout.desktop.message.addTooltip(msg);
  638. tooltipItem.contentNode.addEvent("click", function(e){
  639. layout.desktop.message.hide();
  640. if ( layout.desktop.apps && layout.desktop.apps["Calendar"] ) {
  641. if( layout.desktop.apps["Calendar"].openEvent ){
  642. layout.desktop.apps["Calendar"].setCurrent();
  643. layout.desktop.apps["Calendar"].openEvent( data.body.id );
  644. }else if(layout.desktop.apps["Calendar"].options){
  645. layout.desktop.apps["Calendar"].options.eventId = data.body.id;
  646. layout.desktop.apps["Calendar"].setCurrent();
  647. }else{
  648. layout.desktop.openApplication(e, "Calendar", {"eventId": data.body.id });
  649. }
  650. }else{
  651. layout.desktop.openApplication(e, "Calendar", {"eventId": data.body.id });
  652. }
  653. });
  654. messageItem.contentNode.addEvent("click", function(e){
  655. layout.desktop.message.addUnread(-1);
  656. layout.desktop.message.hide();
  657. if ( layout.desktop.apps && layout.desktop.apps["Calendar"] ) {
  658. if( layout.desktop.apps["Calendar"].openEvent ){
  659. layout.desktop.apps["Calendar"].setCurrent();
  660. layout.desktop.apps["Calendar"].openEvent( data.body.id );
  661. }else if(layout.desktop.apps["Calendar"].options){
  662. layout.desktop.apps["Calendar"].options.eventId = data.body.id;
  663. layout.desktop.apps["Calendar"].setCurrent();
  664. }else{
  665. layout.desktop.openApplication(e, "Calendar", {"eventId": data.body.id });
  666. }
  667. }else{
  668. layout.desktop.openApplication(e, "Calendar", {"eventId": data.body.id });
  669. }
  670. });
  671. },
  672. receiveTeamWorkMessage: function(data){
  673. var task = data.body;
  674. //var content = MWF.LP.desktop.messsage.receiveTask+"《"+task.title+"》, "+MWF.LP.desktop.messsage.activity+": <font style='color: #ea621f'>"+(task.activityName || "")+"</font>";
  675. var content = data.title;
  676. //content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.teamwork.creatorPerson+": </font><font style='color: #ea621f'>"+task.creatorPerson+"</font>; "+
  677. // "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.teamwork.executor+": </font><font style='color: #ea621f'>"+task.executor+"</font>";
  678. var msg = {
  679. "subject": task.name,
  680. "content": content
  681. };
  682. var messageItem = layout.desktop.message.addMessage(msg);
  683. var tooltipItem = layout.desktop.message.addTooltip(msg);
  684. tooltipItem.contentNode.addEvent("click", function(e){
  685. layout.desktop.message.hide();
  686. var options = {"taskId": task.id, "projectId": task.project};
  687. layout.desktop.openApplication(e, "TeamWork.Task", options);
  688. }.bind(this));
  689. messageItem.contentNode.addEvent("click", function(e){
  690. layout.desktop.message.addUnread(-1);
  691. layout.desktop.message.hide();
  692. var options = {"taskId": task.id, "projectId": task.project};
  693. layout.desktop.openApplication(e, "TeamWork.Task", options);
  694. }.bind(this));
  695. },
  696. });