MeetingView.js 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. MWF.xApplication.Meeting.MeetingView = new Class({
  2. Extends: MWF.widget.Common,
  3. Implements: [Options, Events],
  4. options: {
  5. "style": "default"
  6. },
  7. initialize: function(node, app, options){
  8. this.setOptions(options);
  9. this.path = "/x_component_Meeting/$MeetingView/";
  10. this.cssPath = "/x_component_Meeting/$MeetingView/"+this.options.style+"/css.wcss";
  11. this._loadCss();
  12. this.app = app;
  13. this.container = $(node);
  14. this.days = [];
  15. this.load();
  16. },
  17. load: function(){
  18. this.date = new Date();
  19. this.node = new Element("div#meetingNode", {"styles": this.css.node}).inject(this.container);
  20. this.topNode = new Element("div", {"styles": this.css.topNode}).inject(this.node);
  21. this.todayNode = new Element("div", {"styles": this.css.todayNode}).inject(this.topNode);
  22. this.currentNode = new Element("div", {"styles": this.css.currentNode}).inject(this.topNode);
  23. this.contentNode = new Element("div", {"styles": this.css.contentNode}).inject(this.node);
  24. this.bottomNode = new Element("div", {"styles": this.css.bottomNode}).inject(this.node);
  25. this.dayContentNode = new Element("div", {"styles": this.css.dayContentNode}).inject(this.bottomNode);
  26. this.setContentNodeHeight();
  27. this.app.addEvent("resize", this.setContentNodeHeight.bind(this));
  28. this.loadContent();
  29. this.node.addEvent("mousewheel", this.scrollBottomNode.bind(this));
  30. },
  31. scrollBottomNode: function(e){
  32. var delta = 1-e.event.wheelDelta;
  33. var scrollSize = this.bottomNode.getScrollSize();
  34. var scroll = this.bottomNode.getScroll();
  35. var size = this.bottomNode.getSize();
  36. var step = 0.6*(size.x.toFloat());
  37. delta = (delta/120)*step;
  38. var to = scroll.x+delta;
  39. if (to>scrollSize.x) to = scrollSize.x;
  40. if (to<0) to = 0;
  41. if (!this.bottomScroll) this.bottomScroll = new Fx.Scroll(this.bottomNode);
  42. this.bottomScroll.start(to, 0);
  43. },
  44. setContentNodeHeight: function(){
  45. var size = this.container.getSize();
  46. if (this.app.meetingConfig.hideMenu=="static"){
  47. var y = size.y-110;
  48. this.node.setStyle("height", ""+y+"px");
  49. this.node.setStyle("margin-top", "60px");
  50. }
  51. var size = this.node.getSize();
  52. var topSize = this.topNode.getSize();
  53. var bottomSize = this.bottomNode.getSize();
  54. var y = size.y - topSize.y - bottomSize.y-10;
  55. this.contentNode.setStyle("height", ""+y+"px");
  56. },
  57. loadContent: function(){
  58. var d = this.date.format(this.app.lp.dateFormatMonthDay);
  59. var w = this.app.lp.weeks.arr[this.date.getDay()];
  60. this.todayNode.set("text", d+","+w);
  61. this.app.actions.listMeetingDays(7, function(json){
  62. this.currentNode.set("text", this.app.lp.noMeetingWeek);
  63. for (i=0; i<json.data.length; i++){
  64. var data = json.data[i];
  65. if (data.status == "wait" && !data.myWaitConfirm && !data.myWaitAccept && !data.myReject){
  66. var timeStr = "";
  67. var now = new Date();
  68. var mDate = Date.parse(data.startTime);
  69. var d = now.diff(mDate);
  70. if (d==0){
  71. timeStr = Date.parse(data.startTime).format("%H:%M");
  72. }else if (d==1){
  73. timeStr = this.app.lp.tomorrow+Date.parse(data.startTime).format("%H:%M");
  74. }else if (d==2){
  75. timeStr = this.app.lp.afterTomorrow+Date.parse(data.startTime).format("%H:%M");
  76. }else{
  77. var m = now.diff(mDate, "month");
  78. if (m==0){
  79. var w = this.app.lp.weeks.arr[Date.parse(data.startTime).getDay()];
  80. timeStr = Date.parse(data.startTime).format(this.app.lp.dateFormatDayOnly)+"("+w+")"+Date.parse(data.startTime).format("%H:%M");
  81. }else if (m==1){
  82. timeStr = this.app.lp.nextMonth+Date.parse(data.startTime).format(this.app.lp.dateFormatDayOnly);
  83. }else{
  84. timeStr = Date.parse(data.startTime).format(this.app.lp.dateFormatMonthOnly);
  85. }
  86. }
  87. var text = this.app.lp.newlyMeeting.replace(/{time}/g, timeStr);
  88. text = text.replace(/{name}/g, data.subject);
  89. this.app.actions.getRoom(data.room, function(roomJson){
  90. this.app.actions.getBuilding(roomJson.data.building, function(buildingJson){
  91. var addr = "";
  92. if (roomJson.data.roomNumber){
  93. addr = roomJson.data.name+" ("+buildingJson.data.name+" #"+roomJson.data.roomNumber+") ";
  94. }else{
  95. addr = roomJson.data.name+" ("+buildingJson.data.name+") ";
  96. }
  97. text = text.replace(/{room}/g, addr);
  98. this.currentNode.set("text", text);
  99. }.bind(this));
  100. }.bind(this));
  101. break;
  102. }
  103. }
  104. }.bind(this));
  105. this.loadDays();
  106. },
  107. loadDays: function(){
  108. var date = this.date.clone();
  109. for (var i=1; i<=30; i++){
  110. this.days.push(new MWF.xApplication.Meeting.MeetingView.Day(this, date));
  111. date.increment();
  112. }
  113. //this.checkDayContentWidth();
  114. },
  115. //checkDayContentWidth: function(){
  116. //
  117. //
  118. //},
  119. hide: function(){
  120. var fx = new Fx.Morph(this.node, {
  121. "duration": "300",
  122. "transition": Fx.Transitions.Expo.easeOut
  123. });
  124. if (this.currentDocument) this.currentDocument.closeDocument();
  125. fx.start({
  126. "opacity": 0
  127. }).chain(function(){
  128. this.node.setStyle("display", "none");
  129. }.bind(this));
  130. },
  131. show: function(){
  132. this.node.setStyles(this.css.node);
  133. var fx = new Fx.Morph(this.node, {
  134. "duration": "800",
  135. "transition": Fx.Transitions.Expo.easeOut
  136. });
  137. fx.start({
  138. "opacity": 1,
  139. "left": "0px"
  140. }).chain(function(){
  141. this.node.setStyles({
  142. "position": "static",
  143. "width": "auto"
  144. });
  145. }.bind(this));
  146. },
  147. reload: function(){
  148. debugger;
  149. this.days.each(function(day){
  150. day.destroy();
  151. }.bind(this));
  152. //this.node.destroy();
  153. this.days = [];
  154. this.loadContent();
  155. }
  156. });
  157. MWF.xApplication.Meeting.MeetingView.Day = new Class({
  158. Implements: [Events],
  159. initialize: function(view, date){
  160. this.view = view
  161. this.css = this.view.css;
  162. this.container = this.view.dayContentNode;
  163. this.app = this.view.app;
  164. this.date = date.clone();
  165. this.meetings = [];
  166. this.load();
  167. },
  168. load: function(){
  169. var dateStr = "";
  170. if (this.date.diff((new Date()))==0){
  171. dateStr = this.app.lp.today;
  172. }else{
  173. var d = this.date.format(this.app.lp.dateFormatDay);
  174. var w = this.app.lp.weeks.arr[this.date.getDay()];
  175. dateStr = d+", "+w;
  176. }
  177. this.node = new Element("div", {"styles": this.css.dayNode}).inject(this.container);
  178. this.dateNode = new Element("div", {"styles": this.css.dayDateNode, "text": dateStr}).inject(this.node);
  179. this.dayBodyNode = new Element("div", {"styles": this.css.dayBodyNode}).inject(this.node);
  180. this.dateNode.addEvent("click", function(){
  181. //this.app.addMeeting(this.date);
  182. this.app.toDay(this.date);
  183. }.bind(this));
  184. this.loadMeetings();
  185. },
  186. loadMeetings: function(){
  187. var y = this.date.getFullYear();
  188. var m = this.date.getMonth()+1;
  189. var d = this.date.getDate();
  190. var meetingCount = 0;
  191. var taskCount = 0;
  192. var meetings = [];
  193. this.app.actions.listMeetingDay(y, m, d, function(json){
  194. json.data.each(function(meeting){
  195. if (!meeting.myReject){
  196. if (meeting.myWaitConfirm || meeting.myWaitAccept){
  197. taskCount++;
  198. this.meetings.push(new MWF.xApplication.Meeting.MeetingView.Day.Task(this, meeting));
  199. }else{
  200. meetingCount++;
  201. meetings.unshift(meeting);
  202. }
  203. }
  204. }.bind(this));
  205. meetings.each(function(meeting){
  206. this.meetings.push(new MWF.xApplication.Meeting.MeetingView.Day.Meeting(this, meeting));
  207. }.bind(this));
  208. if (meetingCount>0){
  209. var size = this.container.getSize();
  210. var addWidth = (meetingCount*350);
  211. var w = size.x+addWidth;
  212. this.container.setStyle("width", ""+w+"px");
  213. }
  214. if (taskCount==0){
  215. var node = new Element("div", {
  216. "styles": {
  217. "line-height": "60px",
  218. "font-size": "18px",
  219. "color": "#DDD",
  220. "padding": "0px 20px"
  221. }
  222. }).inject(this.dayBodyNode);
  223. if (meetingCount==0){
  224. node.set("text", this.app.lp.noMeeting);
  225. }else{
  226. node.set("text", this.app.lp.noTask);
  227. }
  228. }
  229. }.bind(this));
  230. },
  231. destroy: function(){
  232. this.meetings.each(function(meeting){
  233. meeting.destroy();
  234. }.bind(this));
  235. this.node.destroy();
  236. MWF.release(this);
  237. }
  238. });
  239. MWF.xApplication.Meeting.MeetingView.Day.Meeting = new Class({
  240. initialize: function(day, data){
  241. this.day = day;
  242. this.data = data;
  243. this.view = this.day.view
  244. this.css = this.view.css;
  245. this.app = this.view.app;
  246. this.load();
  247. },
  248. load: function(){
  249. this.node = new Element("div", {"styles": this.css.dayMeetingNode}).inject(this.day.node, "after");
  250. this.titleNode = new Element("div", {"styles": this.css.dayMeetingTitleNode}).inject(this.node);
  251. this.timeNode = new Element("div", {"styles": this.css.dayMeetingTimeNode}).inject(this.node);
  252. this.descriptionNode = new Element("div", {"styles": this.css.dayMeetingDescriptionNode}).inject(this.node);
  253. var timeStr = Date.parse(this.data.startTime).format("%H:%M")+" - "+Date.parse(this.data.completedTime).format("%H:%M");
  254. this.timeNode.set("text", timeStr);
  255. this.titleNode.set("text", this.data.subject);
  256. this.descriptionNode.set("text", this.data.description);
  257. this.node.addEvent("click", this.openDocument.bind(this));
  258. switch (this.data.status){
  259. case "wait":
  260. //nothing
  261. break;
  262. case "processing":
  263. this.node.setStyles({
  264. "border-left": "10px solid #18da14",
  265. "background-color": "#deffdd"
  266. });
  267. break
  268. case "completed":
  269. //add attachment
  270. this.node.setStyles({
  271. "border-left": "10px solid #333",
  272. "background-color": "#ccc"
  273. });
  274. break;
  275. }
  276. },
  277. openDocument: function(){
  278. if (!this.document){
  279. debugger;
  280. if (this.view.currentDocument) this.view.currentDocument.closeDocument();
  281. this.document = new MWF.xApplication.Meeting.MeetingView.Document(this);
  282. this.view.currentDocument = this.document;
  283. }
  284. },
  285. destroy: function(){
  286. if (this.document) this.document.closeDocument();
  287. this.node.destroy();
  288. MWF.release(this);
  289. }
  290. });
  291. MWF.xApplication.Meeting.MeetingView.Day.Task = new Class({
  292. initialize: function(day, data){
  293. this.day = day;
  294. this.data = data;
  295. this.view = this.day.view
  296. this.css = this.view.css;
  297. this.container = this.day.dayBodyNode;
  298. this.app = this.view.app;
  299. this.load();
  300. },
  301. load: function(){
  302. this.node = new Element("div", {"styles": this.css.dayTaskNode}).inject(this.container);
  303. this.iconNode = new Element("div", {"styles": this.css.dayTaskIconNode}).inject(this.node);
  304. this.timeNode = new Element("div", {"styles": this.css.dayTaskTimeNode}).inject(this.node);
  305. this.titleNode = new Element("div", {"styles": this.css.dayTaskTitleNode}).inject(this.node);
  306. var timeStr = Date.parse(this.data.startTime).format("%H:%M")+" - "+Date.parse(this.data.completedTime).format("%H:%M");
  307. this.timeNode.set("text", timeStr);
  308. var type;
  309. if (this.data.myWaitConfirm) type = this.app.lp.myWaitConfirm;
  310. if (this.data.myWaitAccept) type = this.app.lp.myWaitAccept
  311. this.titleNode.set("text", "["+type+"]"+this.data.subject);
  312. this.node.addEvent("click", this.openDocument.bind(this));
  313. },
  314. openDocument: function(){
  315. if (!this.document){
  316. debugger;
  317. if (this.view.currentDocument) this.view.currentDocument.closeDocument();
  318. this.document = new MWF.xApplication.Meeting.MeetingView.Document(this);
  319. this.view.currentDocument = this.document;
  320. }
  321. },
  322. destroy: function(){
  323. if (this.document) this.document.closeDocument();
  324. this.node.destroy();
  325. MWF.release(this);
  326. }
  327. });
  328. MWF.xApplication.Meeting.MeetingView.Document = new Class({
  329. initialize: function(item){
  330. this.item = item;
  331. this.data = this.item.data;
  332. this.view = this.item.view
  333. this.css = this.item.css;
  334. this.container = this.view.contentNode;
  335. this.app = this.view.app;
  336. this.isEdit = (this.data.applicant == this.app.desktop.session.user.name);
  337. this.load();
  338. },
  339. load: function(){
  340. this.createNode();
  341. this.show();
  342. this.loadContent();
  343. },
  344. show: function(){
  345. var o = this.getNodeCoordinates();
  346. var fx = new Fx.Morph(this.node, {
  347. "duration": "500",
  348. "transition": Fx.Transitions.Expo.easeOut
  349. });
  350. fx.start({
  351. "opacity": 1,
  352. "width": ""+ o.width+"px",
  353. "height": ""+ o.height+"px",
  354. "left": ""+ o.left+"px",
  355. "top": ""+ o.top+"px",
  356. }).chain(function(){
  357. this.setNodeSizeFun = this.setNodeSize.bind(this);
  358. this.view.app.addEvent("resize", this.setNodeSizeFun);
  359. }.bind(this));
  360. },
  361. setNodeSize: function(){
  362. var o = this.getNodeCoordinates();
  363. this.node.setStyles({
  364. "width": ""+ o.width+"px",
  365. "height": ""+ o.height+"px",
  366. "left": ""+ o.left+"px",
  367. "top": ""+ o.top+"px"
  368. });
  369. },
  370. getNodeCoordinates: function(){
  371. var size = this.container.getSize();
  372. var w = size.x*0.7;
  373. if (w<800) w = 800;
  374. var h = size.y*0.8;
  375. if (h<300) h = 300;
  376. var position = this.container.getPosition(this.container.getOffsetParent());
  377. var l = size.x/2-w/2;
  378. if (l<0) l=0;
  379. l = position.x+l;
  380. var t = size.y/2-h/2;
  381. if (t<0) t=0;
  382. t = position.y+t;
  383. return {
  384. "width": w,
  385. "height": h,
  386. "left": l,
  387. "top": t
  388. }
  389. },
  390. createNode: function(){
  391. var size = this.item.node.getSize();
  392. this.node = new Element("div", {
  393. "styles": {
  394. "width": ""+size.x+"px",
  395. "height": ""+size.y+"px",
  396. "background-color": "#FFF",
  397. "opacity": 0,
  398. "z-index": 100,
  399. "border": "1px solid #999",
  400. "position": "absolute"
  401. }
  402. }).inject(this.container);
  403. this.node.position({
  404. relativeTo: this.item.node,
  405. position: 'topLeft',
  406. edge: 'topLeft'
  407. });
  408. },
  409. loadContent: function(){
  410. this.infoNode = new Element("div", {"styles": this.css.documentContentInfoNode}).inject(this.node);
  411. this.contentNode = new Element("div", {"styles": this.css.documentContentNode}).inject(this.node);
  412. this.loadInfos();
  413. this.loadBody();
  414. },
  415. loadBody: function(){
  416. this.loadActions();
  417. this.loadSubject();
  418. this.loadDescription();
  419. this.loadAttachment();
  420. this.setDescriptionNodeSize();
  421. this.setDescriptionNodeSizeFun = this.setDescriptionNodeSize.bind(this);
  422. this.app.addEvent("resize", this.setDescriptionNodeSizeFun);
  423. if (this.isEdit){
  424. this.editDocument();
  425. }
  426. },
  427. editDocument: function(){
  428. switch (this.data.status){
  429. case "wait":
  430. //edit subject, description, attachment, add person
  431. this.addSaveAction();
  432. this.subjectNode.empty();
  433. this.subjectInput = new Element("input", {"styles": this.css.documentContentSubjectInputNode, "type": "text", "value": this.data.subject}).inject(this.subjectNode);
  434. this.descriptionNode.empty();
  435. this.descriptionInput = new Element("textarea", {"styles": this.css.documentContentDescriptionInputNode, "value": this.data.description}).inject(this.descriptionNode);
  436. if (this.attachmentController){
  437. this.attachmentController.setOptions({"readonly": false});
  438. this.attachmentController.checkActions();
  439. }else{
  440. this.isEditAttachment = true;
  441. }
  442. this.loadAddInvite();
  443. break;
  444. case "processing":
  445. //nothing
  446. break
  447. case "completed":
  448. //add attachment
  449. if (this.attachmentController){
  450. this.attachmentController.attachments.each(function(att){
  451. att.isDelete = false;
  452. }.bind(this));
  453. this.attachmentController.setOptions({"readonly": false});
  454. this.attachmentController.checkActions();
  455. }else{
  456. this.isEditCompletedAttachment = true;
  457. }
  458. break;
  459. }
  460. },
  461. addSaveAction: function(){
  462. this.saveNode = new Element("div", {"styles": this.css.documentTopSaveNode}).inject(this.closeNode, "after");
  463. this.saveNode.addEvents({
  464. "mouseover": function(){this.saveNode.setStyles(this.css.documentTopSaveNode_over);}.bind(this),
  465. "mouseout": function(){this.saveNode.setStyles(this.css.documentTopSaveNode);}.bind(this),
  466. "mousedown": function(){this.saveNode.setStyles(this.css.documentTopSaveNode_down);}.bind(this),
  467. "mouseup": function(){this.saveNode.setStyles(this.css.documentTopSaveNode_over);}.bind(this),
  468. "click": function(e){this.saveDocument();}.bind(this)
  469. });
  470. },
  471. saveDocument: function(noNotice, notClose){
  472. if (this.subjectInput && this.descriptionInput){
  473. var subject = this.subjectInput.get("value");
  474. var description = this.descriptionInput.get("value");
  475. if (!subject){
  476. if (!noNotice) this.app.notice(this.app.lp.meeting_input_subject_error, "error", this.node, {"x": "right", "y": "top"});
  477. return false;
  478. }
  479. this.data.subject = subject;
  480. this.data.description = description;
  481. this.app.actions.saveMeeting(this.data, function(){
  482. if (!noNotice) this.app.notice(this.app.lp.meeting_saveSuccess, "success", this.node, {"x": "right", "y": "top"});
  483. if (!notClose){
  484. var view = this.view;
  485. this.closeDocument(function(){
  486. view.reload();
  487. }.bind(this));
  488. }else{
  489. this.view.reload();
  490. }
  491. }.bind(this));
  492. }
  493. },
  494. setDescriptionNodeSize: function(){
  495. var o = this.getNodeCoordinates();
  496. var topSize = this.topNode.getSize();
  497. var subjectSize = this.subjectNode.getSize();
  498. var attachmentSize = this.attachmentNode.getSize();
  499. var y = o.height-topSize.y-subjectSize.y-attachmentSize.y-4;
  500. this.descriptionNode.setStyle("height", ""+y+"px");
  501. },
  502. loadActions: function(){
  503. this.topNode = new Element("div", {"styles": this.css.documentTopNode}).inject(this.contentNode);
  504. this.closeNode = new Element("div", {"styles": this.css.documentTopCloseNode}).inject(this.topNode);
  505. this.closeNode.addEvents({
  506. "mouseover": function(){this.closeNode.setStyles(this.css.documentTopCloseNode_over);}.bind(this),
  507. "mouseout": function(){this.closeNode.setStyles(this.css.documentTopCloseNode);}.bind(this),
  508. "mousedown": function(){this.closeNode.setStyles(this.css.documentTopCloseNode_down);}.bind(this),
  509. "mouseup": function(){this.closeNode.setStyles(this.css.documentTopCloseNode_over);}.bind(this),
  510. "click": function(e){this.closeDocument();}.bind(this)
  511. });
  512. },
  513. closeDocument: function(callback){
  514. //this.saveDocument(true, true);
  515. if (this.setDescriptionNodeSizeFun) this.app.removeEvent("resize", this.setDescriptionNodeSizeFun);
  516. if (this.setNodeSizeFun) this.app.removeEvent("resize", this.setNodeSizeFun);
  517. var size = this.item.node.getSize();
  518. var position = this.item.node.getPosition(this.item.node.getOffsetParent());
  519. var fx = new Fx.Morph(this.node, {
  520. "duration": "500",
  521. "transition": Fx.Transitions.Expo.easeOut
  522. });
  523. this.node.empty();
  524. this.view.currentDocument = null;
  525. fx.start({
  526. "opacity": 0,
  527. "width": ""+ size.x+"px",
  528. "height": ""+ size.y+"px",
  529. "left": ""+ position.x+"px",
  530. "top": ""+ position.y+"px",
  531. }).chain(function(){
  532. this.destroy();
  533. if (callback) callback();
  534. }.bind(this));
  535. },
  536. destroy: function(){
  537. if (this.setDescriptionNodeSizeFun) this.app.removeEvent("resize", this.setDescriptionNodeSizeFun);
  538. if (this.setNodeSizeFun) this.app.removeEvent("resize", this.setNodeSizeFun);
  539. this.node.destroy();
  540. this.item.document = null;
  541. MWF.release(this);
  542. delete this;
  543. },
  544. loadSubject: function(){
  545. this.subjectNode = new Element("div", {"styles": this.css.documentContentSubjectNode}).inject(this.topNode);
  546. this.subjectNode.set("text", this.data.subject);
  547. },
  548. loadDescription: function(){
  549. this.descriptionNode = new Element("div", {"styles": this.css.documentContentDescriptionNode}).inject(this.contentNode);
  550. this.descriptionNode.set("text", this.data.description);
  551. },
  552. loadAttachment: function(){
  553. this.attachmentNode = new Element("div", {"styles": this.css.documentContentAttachmentnNode}).inject(this.contentNode);
  554. MWF.require("MWF.widget.AttachmentController", function(){
  555. var option = {"size": "min", "isSizeChange": false, "isReplace": false, "readonly": true};
  556. if (this.isEditAttachment || this.isEditCompletedAttachment){
  557. option = {"size": "min", "isSizeChange": false, "isReplace": false, "readonly": false};
  558. }
  559. this.attachmentController = new MWF.widget.AttachmentController(this.attachmentNode, this, option);
  560. this.attachmentController.load();
  561. this.data.attachmentList.each(function (att) {
  562. var att = this.attachmentController.addAttachment(att);
  563. if (this.isEditCompletedAttachment){
  564. att.isDelete = false;
  565. }
  566. }.bind(this));
  567. }.bind(this));
  568. },
  569. uploadAttachment: function(e, node){
  570. if (!this.uploadFileAreaNode){
  571. this.createUploadFileNode();
  572. }
  573. this.fileUploadNode.click();
  574. },
  575. createUploadFileNode: function(){
  576. this.uploadFileAreaNode = new Element("div");
  577. var html = "<input name=\"file\" type=\"file\" multiple/>";
  578. this.uploadFileAreaNode.set("html", html);
  579. this.fileUploadNode = this.uploadFileAreaNode.getFirst();
  580. this.fileUploadNode.addEvent("change", function(){
  581. var files = this.fileUploadNode.files;
  582. if (files.length){
  583. for (var i = 0; i < files.length; i++) {
  584. var file = files.item(i);
  585. var formData = new FormData();
  586. formData.append('file', file);
  587. //formData.append('folder', folderId);
  588. this.app.actions.addAttachment(function(o, text){
  589. debugger;
  590. if (o.id){
  591. this.app.actions.getAttachment(o.id, function(json){
  592. if (json.data) this.attachmentController.addAttachment(json.data);
  593. this.attachmentController.checkActions();
  594. }.bind(this))
  595. }
  596. this.attachmentController.checkActions();
  597. }.bind(this), null, formData, this.data.id, file);
  598. }
  599. }
  600. }.bind(this));
  601. },
  602. deleteAttachments: function(e, node, attachments){
  603. var names = [];
  604. attachments.each(function(attachment){
  605. names.push(attachment.data.name);
  606. }.bind(this));
  607. var _self = this;
  608. this.app.confirm("warn", e, this.lp.deleteAttachmentTitle, this.lp.deleteAttachment+"( "+names.join(", ")+" )", 300, 120, function(){
  609. while (attachments.length){
  610. attachment = attachments.shift();
  611. _self.deleteAttachment(attachment);
  612. }
  613. this.close();
  614. }, function(){
  615. this.close();
  616. }, null);
  617. },
  618. deleteAttachment: function(attachment){
  619. this.app.actions.deleteFile(attachment.data.id, function(josn){
  620. this.attachmentController.removeAttachment(attachment);
  621. this.attachmentController.checkActions();
  622. }.bind(this));
  623. },
  624. downloadAttachment: function(e, node, attachments){
  625. attachments.each(function(att){
  626. this.app.actions.getFileDownload(att.data.id);
  627. }.bind(this));
  628. },
  629. openAttachment: function(e, node, attachments){
  630. attachments.each(function(att){
  631. this.app.actions.getFile(att.data.id);
  632. }.bind(this));
  633. },
  634. getAttachmentUrl: function(attachment, callback){
  635. this.app.actions.getFileUrl(attachment.data.id, callback);
  636. },
  637. loadInfos: function(){
  638. //var title = this.app.lp.meetingApply.replace(/{person}/g, this.data.applicant);
  639. var title = this.app.lp.meetingApply.replace(/{person}/g, "<div></div>");
  640. if (this.data.applicant == this.app.desktop.session.user.name){
  641. title = this.app.lp.myMeetingApply;
  642. }
  643. if (this.data.status!="completed" && !this.data.myReject){
  644. if (this.data.myWaitConfirm){
  645. title = title+"<br/>"+this.app.lp.waitConfirm;
  646. }else if (this.data.myWaitAccept){
  647. title = title+"<br/>"+this.app.lp.waitAccept;
  648. }else if (this.data.applicant == this.app.desktop.session.user.name){
  649. title = this.app.lp.myMeetingApply+"<br/>"+this.app.lp.attend;
  650. }else if (this.data.acceptPersonList.indexOf(this.app.desktop.session.user.name)!=-1){
  651. title = title+"<br/>"+this.app.lp.isAccept;
  652. }
  653. }
  654. this.infoTitleNode = new Element("div", {"styles": this.css.documentInfoTitleNode}).inject(this.infoNode);
  655. var infoTitleTextNode = new Element("div", {"styles": this.css.documentInfoTitleTextNode, "html": title}).inject(this.infoTitleNode);
  656. var personNode = infoTitleTextNode.getElement("div");
  657. if (personNode){
  658. var explorer = {
  659. "actions": this.app.personActions,
  660. "app": {
  661. "lp": this.app.lp
  662. }
  663. }
  664. MWF.require("MWF.widget.Identity", function(){
  665. var person = new MWF.widget.Person({"name": this.data.applicant}, personNode, explorer, false, null, {"style": "meetingApply"});;
  666. }.bind(this));
  667. }
  668. if (this.data.myWaitConfirm) this.createConfirmActions();
  669. if (this.data.myWaitAccept) this.createAcceptActions();
  670. if (this.data.status=="wait" && this.isEdit) this.createCancelActions();
  671. this.loadDate();
  672. this.loadTime();
  673. //this.loadEndTime();
  674. this.loadRoom();
  675. this.loadInvite();
  676. },
  677. createConfirmActions: function(){
  678. var infoTitleActionNode = new Element("div", {"styles": this.css.documentInfoTitleActionNode}).inject(this.infoTitleNode);
  679. this.disagreeAction = new Element("div", {"styles": this.css.documentInfoActionNode}).inject(infoTitleActionNode);
  680. this.disagreeActionIcon = new Element("div", {"styles": this.css.documentInfoActionIconRejectNode}).inject(this.disagreeAction);
  681. this.disagreeActionText = new Element("div", {"styles": this.css.documentInfoActionTextNode, "text": this.app.lp.reject}).inject(this.disagreeAction);
  682. this.agreeAction = new Element("div", {"styles": this.css.documentInfoActionNode}).inject(infoTitleActionNode);
  683. this.agreeActionIcon = new Element("div", {"styles": this.css.documentInfoActionIconAcceptNode}).inject(this.agreeAction);
  684. this.agreeActionText = new Element("div", {"styles": this.css.documentInfoActionTextNode, "text": this.app.lp.accept}).inject(this.agreeAction);
  685. this.disagreeAction.addEvents({
  686. "mouseover": function(){
  687. this.disagreeAction.setStyles(this.css.documentInfoActionNode_over);
  688. this.disagreeActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  689. }.bind(this),
  690. "mouseout": function(){
  691. this.disagreeAction.setStyles(this.css.documentInfoActionNode);
  692. this.disagreeActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  693. }.bind(this),
  694. "mousedown": function(){
  695. this.disagreeAction.setStyles(this.css.documentInfoActionNode_down);
  696. this.disagreeActionIcon.setStyles(this.css.documentInfoActionIconRejectNode_down);
  697. }.bind(this),
  698. "mouseup": function(){
  699. this.disagreeAction.setStyles(this.css.documentInfoActionNode_over);
  700. this.disagreeActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  701. }.bind(this),
  702. "click": function(e){this.disagree(e);}.bind(this)
  703. });
  704. this.agreeAction.addEvents({
  705. "mouseover": function(){
  706. this.agreeAction.setStyles(this.css.documentInfoActionNode_over);
  707. this.agreeActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode);
  708. }.bind(this),
  709. "mouseout": function(){
  710. this.agreeAction.setStyles(this.css.documentInfoActionNode);
  711. this.agreeActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode);
  712. }.bind(this),
  713. "mousedown": function(){
  714. this.agreeAction.setStyles(this.css.documentInfoActionNode_down);
  715. this.agreeActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode_down);
  716. }.bind(this),
  717. "mouseup": function(){
  718. this.agreeAction.setStyles(this.css.documentInfoActionNode_over);
  719. this.agreeActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode);
  720. }.bind(this),
  721. "click": function(e){this.agree(e);}.bind(this)
  722. });
  723. },
  724. createAcceptActions: function(){
  725. var infoTitleActionNode = new Element("div", {"styles": this.css.documentInfoTitleActionNode}).inject(this.infoTitleNode);
  726. this.rejectAction = new Element("div", {"styles": this.css.documentInfoActionNode}).inject(infoTitleActionNode);
  727. this.rejectActionIcon = new Element("div", {"styles": this.css.documentInfoActionIconRejectNode}).inject(this.rejectAction);
  728. this.rejectActionText = new Element("div", {"styles": this.css.documentInfoActionTextNode, "text": this.app.lp.reject}).inject(this.rejectAction);
  729. this.acceptAction = new Element("div", {"styles": this.css.documentInfoActionNode}).inject(infoTitleActionNode);
  730. this.acceptActionIcon = new Element("div", {"styles": this.css.documentInfoActionIconAcceptNode}).inject(this.acceptAction);
  731. this.acceptActionText = new Element("div", {"styles": this.css.documentInfoActionTextNode, "text": this.app.lp.accept}).inject(this.acceptAction);
  732. this.rejectAction.addEvents({
  733. "mouseover": function(){
  734. this.rejectAction.setStyles(this.css.documentInfoActionNode_over);
  735. this.rejectActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  736. }.bind(this),
  737. "mouseout": function(){
  738. this.rejectAction.setStyles(this.css.documentInfoActionNode);
  739. this.rejectActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  740. }.bind(this),
  741. "mousedown": function(){
  742. this.rejectAction.setStyles(this.css.documentInfoActionNode_down);
  743. this.rejectActionIcon.setStyles(this.css.documentInfoActionIconRejectNode_down);
  744. }.bind(this),
  745. "mouseup": function(){
  746. this.rejectAction.setStyles(this.css.documentInfoActionNode_over);
  747. this.rejectActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  748. }.bind(this),
  749. "click": function(e){this.reject(e);}.bind(this)
  750. });
  751. this.acceptAction.addEvents({
  752. "mouseover": function(){
  753. this.acceptAction.setStyles(this.css.documentInfoActionNode_over);
  754. this.acceptActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode);
  755. }.bind(this),
  756. "mouseout": function(){
  757. this.acceptAction.setStyles(this.css.documentInfoActionNode);
  758. this.acceptActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode);
  759. }.bind(this),
  760. "mousedown": function(){
  761. this.acceptAction.setStyles(this.css.documentInfoActionNode_down);
  762. this.acceptActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode_down);
  763. }.bind(this),
  764. "mouseup": function(){
  765. this.acceptAction.setStyles(this.css.documentInfoActionNode_over);
  766. this.acceptActionIcon.setStyles(this.css.documentInfoActionIconAcceptNode);
  767. }.bind(this),
  768. "click": function(e){this.accept(e);}.bind(this)
  769. });
  770. },
  771. createCancelActions: function(){
  772. var infoTitleActionNode = new Element("div", {"styles": this.css.documentInfoTitleActionNode}).inject(this.infoTitleNode);
  773. this.cancelAction = new Element("div", {"styles": this.css.documentInfoActionNode}).inject(infoTitleActionNode);
  774. this.cancelActionIcon = new Element("div", {"styles": this.css.documentInfoActionIconAcceptNode}).inject(this.cancelAction);
  775. this.cancelActionText = new Element("div", {"styles": this.css.documentInfoActionTextNode, "text": this.app.lp.cancelMeeting}).inject(this.cancelAction);
  776. this.cancelAction.setStyle("width", "80px");
  777. this.cancelAction.addEvents({
  778. "mouseover": function(){
  779. this.cancelAction.setStyles(this.css.documentInfoActionNode_over);
  780. this.cancelActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  781. }.bind(this),
  782. "mouseout": function(){
  783. this.cancelAction.setStyles(this.css.documentInfoActionNode);
  784. this.cancelAction.setStyle("width", "80px");
  785. this.cancelActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  786. }.bind(this),
  787. "mousedown": function(){
  788. this.cancelAction.setStyles(this.css.documentInfoActionNode_down);
  789. this.cancelActionIcon.setStyles(this.css.documentInfoActionIconRejectNode_down);
  790. }.bind(this),
  791. "mouseup": function(){
  792. this.cancelAction.setStyles(this.css.documentInfoActionNode_over);
  793. this.cancelActionIcon.setStyles(this.css.documentInfoActionIconRejectNode);
  794. }.bind(this),
  795. "click": function(e){this.cancel(e);}.bind(this)
  796. });
  797. },
  798. cancel: function(e){
  799. var _self = this;
  800. var text = this.app.lp.cancel_confirm.replace(/{name}/g, this.data.subject);
  801. this.app.confirm("infor", e, this.app.lp.cancel_confirm_title, text, 380, 150, function(){
  802. _self.cancelMeeting();
  803. this.close();
  804. }, function(){
  805. this.close();
  806. });
  807. },
  808. cancelMeeting: function(){
  809. this.app.actions.deleteMeeting(this.data.id, function(){
  810. var view = this.view;
  811. this.closeDocument(function(){
  812. view.reload();
  813. }.bind(this));
  814. }.bind(this))
  815. },
  816. reject: function(e){
  817. var _self = this;
  818. var text = this.app.lp.reject_confirm.replace(/{name}/g, this.data.subject);
  819. this.app.confirm("infor", e, this.app.lp.reject_confirm_title, text, 300, 120, function(){
  820. _self.rejectMeeting();
  821. this.close();
  822. }, function(){
  823. this.close();
  824. });
  825. },
  826. rejectMeeting: function(){
  827. this.app.actions.rejectMeeting(this.data.id, function(){
  828. var view = this.view;
  829. this.closeDocument(function(){
  830. view.reload();
  831. }.bind(this));
  832. }.bind(this))
  833. },
  834. accept: function(e){
  835. var _self = this;
  836. var text = this.app.lp.accept_confirm.replace(/{name}/g, this.data.subject);
  837. this.app.confirm("infor", e, this.app.lp.accept_confirm_title, text, 300, 120, function(){
  838. _self.acceptMeeting();
  839. this.close();
  840. }, function(){
  841. this.close();
  842. });
  843. },
  844. acceptMeeting: function(){
  845. this.app.actions.acceptMeeting(this.data.id, function(){
  846. var view = this.view;
  847. this.closeDocument(function(){
  848. view.reload();
  849. }.bind(this));
  850. }.bind(this))
  851. },
  852. disagree: function(e){
  853. var _self = this;
  854. var text = this.app.lp.disagree_confirm.replace(/{name}/g, this.data.subject);
  855. this.app.confirm("infor", e, this.app.lp.disagree_confirm_title, text, 300, 120, function(){
  856. _self.disagreeMeeting();
  857. this.close();
  858. }, function(){
  859. this.close();
  860. });
  861. },
  862. disagreeMeeting: function(){
  863. this.app.actions.denyMeeting(this.data.id, function(){
  864. var view = this.view;
  865. this.closeDocument(function(){
  866. view.reload();
  867. }.bind(this));
  868. }.bind(this))
  869. },
  870. agree: function(e){
  871. var _self = this;
  872. var text = this.app.lp.agree_confirm.replace(/{name}/g, this.data.subject);
  873. this.app.confirm("infor", e, this.app.lp.agree_confirm_title, text, 300, 120, function(){
  874. _self.agreeMeeting();
  875. this.close();
  876. }, function(){
  877. this.close();
  878. });
  879. },
  880. agreeMeeting: function(){
  881. this.app.actions.allowMeeting(this.data.id, function(){
  882. var view = this.view;
  883. this.closeDocument(function(){
  884. view.reload();
  885. }.bind(this));
  886. }.bind(this))
  887. },
  888. loadDate: function(){
  889. var lineNode = new Element("div", {"styles": this.css.documentInfoLineNode}).inject(this.infoNode);
  890. var texNode = new Element("div", {"styles": this.css.documentInfoTextNode, "text": this.app.lp.beginDate}).inject(lineNode);
  891. var bodyNode = new Element("div", {"styles": this.css.documentInfoBodyNode}).inject(lineNode);
  892. var date = Date.parse(this.data.startTime).format(this.app.lp.dateFormatDay);
  893. bodyNode.set("text", date);
  894. },
  895. loadTime: function(){
  896. var lineNode = new Element("div", {"styles": this.css.documentInfoLineNode}).inject(this.infoNode);
  897. var texNode = new Element("div", {"styles": this.css.documentInfoTextNode, "text": this.app.lp.time}).inject(lineNode)
  898. var bodyNode = new Element("div", {"styles": this.css.documentInfoBody1Node}).inject(lineNode);
  899. var date = Date.parse(this.data.startTime).format("%H:%M");
  900. bodyNode.set("text", date);
  901. tmpNode = new Element("div", {"styles": this.css.documentInfoBody2Node, "text": "-"}).inject(lineNode);
  902. bodyNode = new Element("div", {"styles": this.css.documentInfoBody1Node}).inject(lineNode);
  903. date = Date.parse(this.data.completedTime).format("%H:%M");
  904. bodyNode.set("text", date);
  905. var m = Date.parse(this.data.startTime).diff(Date.parse(this.data.completedTime), "minute");
  906. var h = (m/60).toInt();
  907. var m = m%60;
  908. var rangeText = "";
  909. if (m==0){
  910. rangeText = this.app.lp.timeRangeHour.replace(/{n}/g, h);
  911. }else{
  912. rangeText = this.app.lp.timeRangeMinute.replace(/{h}/g, h).replace(/{m}/g, m);
  913. }
  914. bodyNode = new Element("div", {"styles": this.css.documentInfoBody3Node, "text": rangeText}).inject(lineNode);
  915. },
  916. loadRoom: function(){
  917. var lineNode = new Element("div", {"styles": this.css.documentInfoLineNode}).inject(this.infoNode);
  918. var texNode = new Element("div", {"styles": this.css.documentInfoTextNode, "text": this.app.lp.selectRoom}).inject(lineNode);
  919. var bodyNode = new Element("div", {"styles": this.css.documentInfoBodyNode}).inject(lineNode);
  920. this.app.actions.getRoom(this.data.room, function(roomJson){
  921. this.app.actions.getBuilding(roomJson.data.building, function(buildingJson){
  922. var text = "";
  923. if (roomJson.data.roomNumber){
  924. text = roomJson.data.name+" ("+buildingJson.data.name+" "+roomJson.data.floor+this.app.lp.floor+" #"+roomJson.data.roomNumber+") ";
  925. }else{
  926. text = roomJson.data.name+" ("+buildingJson.data.name+" "+roomJson.data.floor+this.app.lp.floor+") ";
  927. }
  928. bodyNode.set("text", text);
  929. }.bind(this));
  930. }.bind(this));
  931. },
  932. loadInvite: function(){
  933. this.inviteLineNode = new Element("div", {"styles": this.css.documentInfoLineNode}).inject(this.infoNode);
  934. var texNode = new Element("div", {"styles": this.css.documentInfoTextNode, "text": this.app.lp.invitePerson1}).inject(this.inviteLineNode);
  935. this.inviteBodyNode = new Element("div", {"styles": this.css.documentInfoBodyNode}).inject(this.inviteLineNode);
  936. var explorer = {
  937. "actions": this.app.personActions,
  938. "app": {
  939. "lp": this.app.lp
  940. }
  941. }
  942. MWF.require("MWF.widget.Identity", function(){
  943. this.data.invitePersonList.each(function(personName){
  944. debugger;
  945. var person = new MWF.widget.Person({"name": personName}, this.inviteBodyNode, explorer, false, null, {
  946. "style": "room",
  947. "onLoadedInfor": function(){
  948. if (this.data.acceptPersonList.indexOf(personName)!=-1){
  949. var acceptNode = new Element("div", {"styles": this.css.documentInfoAcceptIconNode}).inject(person.node, "top");
  950. new Element("div", {
  951. "styles": this.css.documentInfoAcceptTextNode,
  952. "text": this.app.lp.accepted
  953. }).inject(person.inforNode);
  954. }
  955. if (this.data.rejectPersonList.indexOf(personName)!=-1){
  956. var rejectNode = new Element("div", {"styles": this.css.documentInfoRejectIconNode}).inject(person.node, "top");
  957. new Element("div", {
  958. "styles": this.css.documentInfoRejectTextNode,
  959. "text": this.app.lp.rejected
  960. }).inject(person.inforNode);
  961. }
  962. }.bind(this)
  963. });
  964. }.bind(this));
  965. }.bind(this));
  966. },
  967. loadAddInvite: function(){
  968. this.addInviteNode = new Element("div", {"styles": this.css.documentAddInviteActionNode}).inject(this.inviteLineNode);
  969. this.addInviteIconNode = new Element("div", {"styles": this.css.documentAddInviteActionIconNode}).inject(this.addInviteNode);
  970. this.addInviteTextNode = new Element("div", {"styles": this.css.documentAddInviteActionTextNode, "text": this.app.lp.addInvitePerson1}).inject(this.addInviteNode);
  971. this.addInviteNode.addEvents({
  972. "mouseover": function(){
  973. this.addInviteNode.setStyles(this.css.documentAddInviteActionNode_over);
  974. this.addInviteIconNode.setStyles(this.css.documentAddInviteActionIconNode);
  975. }.bind(this),
  976. "mouseout": function(){
  977. this.addInviteNode.setStyles(this.css.documentAddInviteActionNode);
  978. this.addInviteIconNode.setStyles(this.css.documentAddInviteActionIconNode);
  979. }.bind(this),
  980. "mousedown": function(){
  981. this.addInviteNode.setStyles(this.css.documentAddInviteActionNode_down);
  982. this.addInviteIconNode.setStyles(this.css.documentAddInviteActionIconNode_down);
  983. }.bind(this),
  984. "mouseup": function(){
  985. this.addInviteNode.setStyles(this.css.documentAddInviteActionNode_over);
  986. this.addInviteIconNode.setStyles(this.css.documentAddInviteActionIconNode);
  987. }.bind(this)
  988. });
  989. var explorer = {
  990. "actions": this.app.personActions,
  991. "app": {
  992. "lp": this.app.lp
  993. }
  994. }
  995. MWF.xDesktop.requireApp("Organization", "Selector.package", function(){
  996. this.addInviteNode.addEvents({
  997. "click": function(){
  998. var options = {
  999. "type": "person",
  1000. "names": [],
  1001. "count": 0,
  1002. "onComplete": function(items){
  1003. MWF.require("MWF.widget.Identity", function(){
  1004. var invitePersonList = [];
  1005. items.each(function(item){
  1006. var _self = this;
  1007. var person = new MWF.widget.Person(item.data, this.inviteBodyNode, explorer, false, null, {"style": "room"});
  1008. invitePersonList.push(item.data.name);
  1009. }.bind(this));
  1010. this.app.actions.addMeetingInvite({"invitePersonList": invitePersonList, "id": this.data.id}, function(json){
  1011. this.app.actions.getMeeting(json.data.id, function(meeting){
  1012. this.data.invitePersonList = meeting.data.invitePersonList;
  1013. this.app.notice(this.app.lp.addedInvitePerson1, "success", this.node, {"x": "left", "y": "top"});
  1014. }.bind(this));
  1015. }.bind(this));
  1016. }.bind(this));
  1017. }.bind(this)
  1018. };
  1019. var selector = new MWF.OrgSelector(this.app.content, options);
  1020. }.bind(this)
  1021. });
  1022. }.bind(this));
  1023. }
  1024. });