You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
5.6 KiB

  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. wn.provide('wn.core.pages.messages');
  4. wn.pages.messages.onload = function(wrapper) {
  5. wn.ui.make_app_page({
  6. parent: wrapper,
  7. title: "Messages"
  8. });
  9. $('<div><div class="avatar avatar-large">\
  10. <img id="avatar-image" src="assets/webnotes/images/ui/avatar.png"></div>\
  11. <h3 style="display: inline-block" id="message-title">Everyone</h3>\
  12. </div><hr>\
  13. <div id="post-message">\
  14. <textarea class="form-control" rows=3 style="margin-bottom: 15px;"></textarea>\
  15. <div><button class="btn btn-default">Post</button></div><hr>\
  16. </div>\
  17. <div class="all-messages"></div><br>').appendTo($(wrapper).find('.layout-main-section'));
  18. wrapper.appframe.add_module_icon("Messages");
  19. wn.core.pages.messages = new wn.core.pages.messages(wrapper);
  20. }
  21. $(wn.pages.messages).bind('show', function() {
  22. // remove alerts
  23. $('#alert-container .alert').remove();
  24. wn.core.pages.messages.show();
  25. setTimeout("wn.core.pages.messages.refresh()", 5000);
  26. })
  27. wn.core.pages.messages = Class.extend({
  28. init: function(wrapper) {
  29. this.wrapper = wrapper;
  30. this.show_active_users();
  31. this.make_post_message();
  32. this.make_list();
  33. //this.update_messages('reset'); //Resets notification icons
  34. },
  35. make_post_message: function() {
  36. var me = this;
  37. $('#post-message .btn').click(function() {
  38. var txt = $('#post-message textarea').val();
  39. if(txt) {
  40. return wn.call({
  41. module: 'webnotes.core',
  42. page:'messages',
  43. method:'post',
  44. args: {
  45. txt: txt,
  46. contact: me.contact
  47. },
  48. callback:function(r,rt) {
  49. $('#post-message textarea').val('')
  50. me.list.run();
  51. },
  52. btn: this
  53. });
  54. }
  55. });
  56. },
  57. show: function() {
  58. var contact = this.get_contact() || this.contact || user;
  59. $('#message-title').html(contact===user ? "Everyone" :
  60. wn.user_info(contact).fullname)
  61. $('#avatar-image').attr("src", wn.utils.get_file_link(wn.user_info(contact).image));
  62. $("#show-everyone").toggle(contact!==user);
  63. $("#post-message button").text(contact==user ? wn._("Post Publicly") : wn._("Post to user"))
  64. this.contact = contact;
  65. this.list.opts.args.contact = contact;
  66. this.list.run();
  67. },
  68. // check for updates every 5 seconds if page is active
  69. refresh: function() {
  70. setTimeout("wn.core.pages.messages.refresh()", 5000);
  71. if(wn.container.page.label != 'Messages')
  72. return;
  73. if(!wn.session_alive)
  74. return;
  75. this.show();
  76. },
  77. get_contact: function() {
  78. var route = location.hash;
  79. if(route.indexOf('/')!=-1) {
  80. var name = decodeURIComponent(route.split('/')[1]);
  81. if(name.indexOf('__at__')!=-1) {
  82. name = name.replace('__at__', '@');
  83. }
  84. return name;
  85. }
  86. },
  87. make_list: function() {
  88. this.list = new wn.ui.Listing({
  89. parent: $(this.wrapper).find('.all-messages'),
  90. method: 'webnotes.core.page.messages.messages.get_list',
  91. args: {
  92. contact: null
  93. },
  94. hide_refresh: true,
  95. no_loading: true,
  96. render_row: function(wrapper, data) {
  97. $(wrapper).removeClass('list-row');
  98. data.creation = dateutil.comment_when(data.creation);
  99. data.comment_by_fullname = wn.user_info(data.owner).fullname;
  100. data.image = wn.utils.get_file_link(wn.user_info(data.owner).image);
  101. data.mark_html = "";
  102. data.reply_html = '';
  103. if(data.owner==user) {
  104. data.cls = 'message-self';
  105. data.comment_by_fullname = 'You';
  106. } else {
  107. data.cls = 'message-other';
  108. }
  109. // delete
  110. data.delete_html = "";
  111. if(data.owner==user || data.comment.indexOf("assigned to")!=-1) {
  112. data.delete_html = repl('<a class="close" \
  113. onclick="wn.core.pages.messages.delete(this)"\
  114. data-name="%(name)s">&times;</a>', data);
  115. }
  116. if(data.owner==data.comment_docname && data.parenttype!="Assignment") {
  117. data.mark_html = "<div class='message-mark' title='Public'\
  118. style='background-color: green'></div>"
  119. }
  120. wrapper.innerHTML = repl('<div class="message %(cls)s">%(mark_html)s\
  121. <span class="avatar avatar-small"><img src="%(image)s"></span><b>%(comment)s</b>\
  122. %(delete_html)s\
  123. <div class="help">by %(comment_by_fullname)s, %(creation)s</div>\
  124. </div>\
  125. <div style="clear: both;"></div>', data);
  126. }
  127. });
  128. },
  129. delete: function(ele) {
  130. $(ele).parent().css('opacity', 0.6);
  131. return wn.call({
  132. method: 'webnotes.core.page.messages.messages.delete',
  133. args: {name : $(ele).attr('data-name')},
  134. callback: function() {
  135. $(ele).parent().toggle(false);
  136. }
  137. });
  138. },
  139. show_active_users: function() {
  140. var me = this;
  141. return wn.call({
  142. module:'webnotes.core',
  143. page:'messages',
  144. method:'get_active_users',
  145. callback: function(r,rt) {
  146. var $body = $(me.wrapper).find('.layout-side-section');
  147. $('<h4>Users</h4><hr>\
  148. <div id="show-everyone">\
  149. <a href="#messages/'+user+'" class="btn btn-default">\
  150. Messages from everyone</a><hr></div>\
  151. ').appendTo($body);
  152. $("#show-everyone").toggle(me.contact!==user);
  153. r.message.sort(function(a, b) { return b.has_session - a.has_session; });
  154. for(var i in r.message) {
  155. var p = r.message[i];
  156. if(p.name != user) {
  157. p.fullname = wn.user_info(p.name).fullname;
  158. p.image = wn.utils.get_file_link(wn.user_info(p.name).image);
  159. p.name = p.name.replace('@', '__at__');
  160. p.status_color = p.has_session ? "green" : "#ddd";
  161. p.status = p.has_session ? "Online" : "Offline";
  162. $(repl('<p>\
  163. <span class="avatar avatar-small" \
  164. title="%(status)s"><img src="%(image)s" /></span>\
  165. <a href="#!messages/%(name)s">%(fullname)s</a>\
  166. </p>', p))
  167. .appendTo($body);
  168. }
  169. }
  170. }
  171. });
  172. }
  173. });