No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

195 líneas
5.1 KiB

  1. // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. // TODO
  4. // new message popup
  5. frappe.provide('frappe.desk.pages.messages');
  6. frappe.pages.messages.on_page_load = function(parent) {
  7. var page = frappe.ui.make_app_page({
  8. parent: parent,
  9. });
  10. page.set_title('<span class="hidden-xs">' + __("Messages") + '</span>'
  11. + '<span class="hidden-sm hidden-md hidden-lg message-to"></span>');
  12. $(".navbar-center").html(__("Messages"));
  13. frappe.desk.pages.messages = new frappe.desk.pages.Messages(parent);
  14. }
  15. frappe.pages.messages.on_page_show = function() {
  16. // clear title prefix
  17. frappe.utils.set_title_prefix("");
  18. }
  19. frappe.desk.pages.Messages = Class.extend({
  20. init: function(wrapper, page) {
  21. this.wrapper = wrapper;
  22. this.page = wrapper.page;
  23. this.make();
  24. this.page.sidebar.addClass("col-sm-3");
  25. this.page.wrapper.find(".layout-main-section-wrapper").addClass("col-sm-9");
  26. this.page.wrapper.find(".page-title").removeClass("col-xs-6").addClass("col-xs-12");
  27. this.page.wrapper.find(".page-actions").removeClass("col-xs-6").addClass("hidden-xs");
  28. this.setup_realtime();
  29. },
  30. make: function() {
  31. this.make_sidebar();
  32. },
  33. setup_realtime: function() {
  34. frappe.realtime.on('new_message', function(comment) {
  35. if(comment.modified_by !== user) {
  36. frappe.utils.notify(__("Message from {0}", [comment.comment_by_fullname]), comment.comment);
  37. }
  38. if (frappe.get_route()[0] === 'messages') {
  39. var current_contact = $(cur_page.page).find('[data-contact]').data('contact');
  40. var on_broadcast_page = current_contact === user;
  41. if (current_contact == comment.owner || (on_broadcast_page && comment.broadcast)) {
  42. var $row = $('<div class="list-row"/>');
  43. frappe.desk.pages.messages.list.data.unshift(comment);
  44. frappe.desk.pages.messages.list.render_row($row, comment);
  45. frappe.desk.pages.messages.list.parent.prepend($row);
  46. }
  47. }
  48. });
  49. },
  50. make_sidebar: function() {
  51. var me = this;
  52. return frappe.call({
  53. module:'frappe.desk',
  54. page:'messages',
  55. method:'get_active_users',
  56. callback: function(r,rt) {
  57. // sort
  58. r.message.sort(function(a, b) { return cint(b.has_session) - cint(a.has_session); });
  59. // render
  60. me.page.sidebar.html(frappe.render_template("messages_sidebar", {data: r.message}));
  61. // bind click
  62. me.page.sidebar.find("a").on("click", function() {
  63. var li = $(this).parents("li:first");
  64. if (li.hasClass("active"))
  65. return false;
  66. var contact = li.attr("data-user");
  67. // active
  68. me.page.sidebar.find("li.active").removeClass("active");
  69. me.page.sidebar.find('[data-user="'+ contact +'"]').addClass("active");
  70. me.make_messages(contact);
  71. });
  72. $(me.page.sidebar.find("a")[0]).click();
  73. }
  74. });
  75. },
  76. make_messages: function(contact) {
  77. var me = this;
  78. this.page.main.html($(frappe.render_template("messages_main", { "contact": contact })));
  79. this.page.main.find(".messages-textarea").on("focusout", function() {
  80. // on touchscreen devices, scroll to top
  81. // so that static navbar and page head don't overlap the textarea
  82. if (frappe.dom.is_touchscreen()) {
  83. frappe.ui.scroll($(this).parents(".message-box"));
  84. }
  85. });
  86. this.page.main.find(".btn-post").on("click", function() {
  87. var btn = $(this);
  88. var message_box = btn.parents(".message-box");
  89. var textarea = message_box.find("textarea");
  90. var contact = btn.attr("data-contact");
  91. var txt = textarea.val();
  92. var send_email = message_box.find('input[type="checkbox"]:checked').length > 0;
  93. if(txt) {
  94. return frappe.call({
  95. module: 'frappe.desk',
  96. page:'messages',
  97. method:'post',
  98. args: {
  99. txt: txt,
  100. contact: contact,
  101. notify: send_email ? 1 : 0
  102. },
  103. callback:function(r,rt) {
  104. textarea.val('');
  105. me.list.run();
  106. },
  107. btn: this
  108. });
  109. }
  110. });
  111. this.page.wrapper.find(".page-head .message-to").html(frappe.user.full_name(contact));
  112. this.make_message_list(contact);
  113. this.list.run();
  114. scroll(0, 0);
  115. },
  116. make_message_list: function(contact) {
  117. var me = this;
  118. this.list = new frappe.ui.Listing({
  119. parent: this.page.main.find(".message-list"),
  120. page: this.page,
  121. method: 'frappe.desk.page.messages.messages.get_list',
  122. args: {
  123. contact: contact
  124. },
  125. hide_refresh: true,
  126. freeze: false,
  127. render_row: function(wrapper, data) {
  128. if(data.parenttype==="Assignment" || data.comment_type==="Shared") {
  129. data.is_system_message = 1;
  130. }
  131. var row = $(frappe.render_template("messages_row", {
  132. data: data
  133. })).appendTo(wrapper);
  134. row.find(".avatar, .indicator").tooltip();
  135. }
  136. });
  137. },
  138. delete: function(ele) {
  139. $(ele).parent().css('opacity', 0.6);
  140. return frappe.call({
  141. method: 'frappe.desk.page.messages.messages.delete',
  142. args: {name : $(ele).attr('data-name')},
  143. callback: function() {
  144. $(ele).parents(".list-row:first").toggle(false);
  145. }
  146. });
  147. },
  148. refresh: function() {},
  149. get_contact: function() {
  150. var route = location.hash;
  151. if(route.indexOf('/')!=-1) {
  152. var name = decodeURIComponent(route.split('/')[1]);
  153. if(name.indexOf('__at__')!=-1) {
  154. name = name.replace('__at__', '@');
  155. }
  156. return name;
  157. }
  158. },
  159. });