Commit dc4e304dec80741bc5dee8d287e2500be8043d00

Authored by Victor Costa
Committed by Rodrigo Souto
1 parent 2ec9c789

Fix group chat

app/views/shared/logged_in/xmpp_chat.html.erb
@@ -21,12 +21,18 @@ @@ -21,12 +21,18 @@
21 </div> 21 </div>
22 <div class='dialog-error' style='display: none'></div> 22 <div class='dialog-error' style='display: none'></div>
23 </div> 23 </div>
24 - <div id='title-bar'>  
25 - <h1 class='title'><%= _("Online") % h(page_title) %>&nbsp;(<span id='friends-online'>0</span>)</h1> 24 +
  25 + <div id="friends">
  26 + <div id='title-bar'><h1 class='title'><%= _("Online") %>&nbsp;(<span id='friends-online'>0</span>)</h1></div>
  27 + <ul class='buddy-list'></ul>
  28 + </div>
  29 +
  30 + <div id="rooms">
  31 + <div id='title-bar'><h1 class='title'><%= _("Groups") %></h1></div>
  32 + <ul class="buddy-list room-list"></ul>
26 </div> 33 </div>
27 - <ul class='buddy-list'>  
28 - </ul>  
29 </div> 34 </div>
  35 +
30 <div id='chat-window'> 36 <div id='chat-window'>
31 <div id='conversations'></div> 37 <div id='conversations'></div>
32 </div> 38 </div>
public/javascripts/application.js
@@ -569,7 +569,12 @@ function display_notice(message) { @@ -569,7 +569,12 @@ function display_notice(message) {
569 } 569 }
570 570
571 function open_chat_window(self_link, anchor) { 571 function open_chat_window(self_link, anchor) {
572 - jQuery('#chat').toggle('fast'); 572 + if(anchor) {
  573 + jQuery('#chat').show('fast');
  574 + jQuery("#chat" ).trigger('opengroup', anchor);
  575 + } else {
  576 + jQuery('#chat').toggle('fast');
  577 + }
573 return false; 578 return false;
574 } 579 }
575 580
public/javascripts/chat.js
@@ -54,7 +54,7 @@ jQuery(function($) { @@ -54,7 +54,7 @@ jQuery(function($) {
54 return Jabber.jids[jid_id].unread_messages; 54 return Jabber.jids[jid_id].unread_messages;
55 }, 55 },
56 56
57 - insert_or_update_user: function (list, item, jid, name, presence, template) { 57 + insert_or_update_user: function (list, item, jid, name, presence, template, type) {
58 var jid_id = Jabber.jid_to_id(jid); 58 var jid_id = Jabber.jid_to_id(jid);
59 var identifier = Strophe.getNodeFromJid(jid); 59 var identifier = Strophe.getNodeFromJid(jid);
60 var html = template 60 var html = template
@@ -67,15 +67,26 @@ jQuery(function($) { @@ -67,15 +67,26 @@ jQuery(function($) {
67 } else { 67 } else {
68 $(list).append(html); 68 $(list).append(html);
69 } 69 }
70 - Jabber.jids[jid_id] = {jid: jid, name: name, type: 'chat', presence: presence}; 70 + Jabber.jids[jid_id] = {jid: jid, name: name, type: type, presence: presence};
  71 + },
  72 + insert_or_update_group: function (jid, presence) {
  73 + var jid_id = Jabber.jid_to_id(jid);
  74 + var list = $('#buddy-list #rooms .room-list');
  75 + var item = $('#' + jid_id);
  76 + presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline');
  77 + log('adding or updating contact ' + jid + ' as ' + presence);
  78 + Jabber.insert_or_update_user(list, item, jid, Jabber.name_of(jid_id), presence, $('#chat #chat-templates .buddy-item').clone().html(), 'groupchat');
  79 + $("#chat-window .tab a[href='#"+ Jabber.conversation_prefix + jid_id +"']")
  80 + .removeClass()
  81 + .addClass('icon-menu-' + presence + '-11');
71 }, 82 },
72 insert_or_update_contact: function (jid, name, presence) { 83 insert_or_update_contact: function (jid, name, presence) {
73 var jid_id = Jabber.jid_to_id(jid); 84 var jid_id = Jabber.jid_to_id(jid);
74 - var list = $('#buddy-list .buddy-list'); 85 + var list = $('#buddy-list #friends .buddy-list');
75 var item = $('#' + jid_id); 86 var item = $('#' + jid_id);
76 presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline'); 87 presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline');
77 log('adding or updating contact ' + jid + ' as ' + presence); 88 log('adding or updating contact ' + jid + ' as ' + presence);
78 - Jabber.insert_or_update_user(list, item, jid, name, presence, $('#chat #chat-templates .buddy-item').clone().html()); 89 + Jabber.insert_or_update_user(list, item, jid, name, presence, $('#chat #chat-templates .buddy-item').clone().html(), 'chat');
79 $("#chat-window .tab a[href='#"+ Jabber.conversation_prefix + jid_id +"']") 90 $("#chat-window .tab a[href='#"+ Jabber.conversation_prefix + jid_id +"']")
80 .removeClass() 91 .removeClass()
81 .addClass('icon-menu-' + presence + '-11'); 92 .addClass('icon-menu-' + presence + '-11');
@@ -85,7 +96,7 @@ jQuery(function($) { @@ -85,7 +96,7 @@ jQuery(function($) {
85 var jid_id = Jabber.jid_to_id(jid); 96 var jid_id = Jabber.jid_to_id(jid);
86 var list = $('#' + Jabber.conversation_prefix + Jabber.jid_to_id(room_jid) + ' .occupant-list ul'); 97 var list = $('#' + Jabber.conversation_prefix + Jabber.jid_to_id(room_jid) + ' .occupant-list ul');
87 var item = $(list).find('a[data-id='+ jid_id +']'); 98 var item = $(list).find('a[data-id='+ jid_id +']');
88 - Jabber.insert_or_update_user(list, item, jid, name, presence, Jabber.templates.occupant_item); 99 + Jabber.insert_or_update_user(list, item, jid, name, presence, Jabber.templates.occupant_item, 'chat');
89 if (Jabber.rooms[Jabber.jid_to_id(room_jid)] === undefined) { 100 if (Jabber.rooms[Jabber.jid_to_id(room_jid)] === undefined) {
90 Jabber.rooms[Jabber.jid_to_id(room_jid)] = {}; 101 Jabber.rooms[Jabber.jid_to_id(room_jid)] = {};
91 } 102 }
@@ -159,10 +170,13 @@ jQuery(function($) { @@ -159,10 +170,13 @@ jQuery(function($) {
159 Jabber.connection.send( 170 Jabber.connection.send(
160 $pres({to: room_jid + '/' + $own_name}).c('x', {xmlns: Strophe.NS.MUC}).c('history', {maxchars: 0}) 171 $pres({to: room_jid + '/' + $own_name}).c('x', {xmlns: Strophe.NS.MUC}).c('history', {maxchars: 0})
161 ); 172 );
  173 + //FIXME list group
  174 + Jabber.insert_or_update_group(room_jid, 'group');
162 }, 175 },
163 176
164 leave_room: function(room_jid) { 177 leave_room: function(room_jid) {
165 Jabber.connection.send($pres({from: Jabber.connection.jid, to: room_jid + '/' + $own_name, type: 'unavailable'})) 178 Jabber.connection.send($pres({from: Jabber.connection.jid, to: room_jid + '/' + $own_name, type: 'unavailable'}))
  179 + //FIXME remove group
166 }, 180 },
167 181
168 update_chat_title: function () { 182 update_chat_title: function () {
@@ -211,8 +225,6 @@ jQuery(function($) { @@ -211,8 +225,6 @@ jQuery(function($) {
211 // set up presence handler and send initial presence 225 // set up presence handler and send initial presence
212 Jabber.connection.addHandler(Jabber.on_presence, null, "presence"); 226 Jabber.connection.addHandler(Jabber.on_presence, null, "presence");
213 Jabber.send_availability_status(Jabber.presence_status); 227 Jabber.send_availability_status(Jabber.presence_status);
214 - // detect if chat was opened with anchor like #community@conference.jabber.colivre  
215 - $(window).trigger('hashchange');  
216 }, 228 },
217 229
218 // NOTE: cause Noosfero store's rosters in database based on friendship relation between people 230 // NOTE: cause Noosfero store's rosters in database based on friendship relation between people
@@ -468,29 +480,26 @@ jQuery(function($) { @@ -468,29 +480,26 @@ jQuery(function($) {
468 Jabber.connect(); 480 Jabber.connect();
469 }); 481 });
470 482
471 - // FIXME  
472 // detect when click in chat with a community or person in main window of Noosfero environment 483 // detect when click in chat with a community or person in main window of Noosfero environment
473 - $(window).bind('hashchange', function() {  
474 - if (window.location.hash) {  
475 - var full_jid = window.location.hash.replace('#', '');  
476 - var jid = Strophe.getBareJidFromJid(full_jid);  
477 - var name = Strophe.getResourceFromJid(full_jid);  
478 - var jid_id = Jabber.jid_to_id(full_jid);  
479 - window.location.hash = '#';  
480 - if (full_jid) {  
481 - if (Strophe.getDomainFromJid(jid) == Jabber.muc_domain) {  
482 - if (Jabber.muc_supported) {  
483 - log('opening groupchat with ' + jid);  
484 - Jabber.jids[jid_id] = {jid: jid, name: name, type: 'groupchat'};  
485 - Jabber.enter_room(jid);  
486 - create_conversation_tab(name, jid_id);  
487 - }  
488 - }  
489 - else {  
490 - log('opening chat with ' + jid);  
491 - create_conversation_tab(name, jid_id); 484 + $('#chat').bind('opengroup', function(ev, anchor) {
  485 + var full_jid = anchor.replace('#', '');
  486 + var jid = Strophe.getBareJidFromJid(full_jid);
  487 + var name = Strophe.getResourceFromJid(full_jid);
  488 + var jid_id = Jabber.jid_to_id(full_jid);
  489 + if (full_jid) {
  490 + if (Strophe.getDomainFromJid(jid) == Jabber.muc_domain) {
  491 + if (Jabber.muc_supported) {
  492 + log('opening groupchat with ' + jid);
  493 + Jabber.jids[jid_id] = {jid: jid, name: name, type: 'groupchat'};
  494 + Jabber.enter_room(jid);
  495 + var conversation = create_conversation_tab(name, jid_id);
  496 + conversation.find('.conversation').show();
492 } 497 }
493 } 498 }
  499 + else {
  500 + log('opening chat with ' + jid);
  501 + create_conversation_tab(name, jid_id);
  502 + }
494 } 503 }
495 }); 504 });
496 505
@@ -509,15 +518,15 @@ jQuery(function($) { @@ -509,15 +518,15 @@ jQuery(function($) {
509 $('#buddy-list .buddy-list li a').live('click', function() { 518 $('#buddy-list .buddy-list li a').live('click', function() {
510 var jid_id = $(this).attr('id'); 519 var jid_id = $(this).attr('id');
511 var name = Jabber.name_of(jid_id); 520 var name = Jabber.name_of(jid_id);
512 - create_conversation_tab(name, jid_id); 521 + var conversation = create_conversation_tab(name, jid_id);
513 522
514 - var conversation_id = Jabber.conversation_prefix + jid_id;  
515 - $('#' + conversation_id).find('.conversation').show(); 523 + conversation.find('.conversation').show();
516 count_unread_messages(jid_id, true); 524 count_unread_messages(jid_id, true);
517 - $('#' + conversation_id).find('.conversation .input-div textarea.input').focus(); 525 + conversation.find('.conversation .input-div textarea.input').focus();
518 }); 526 });
519 527
520 // put name into text area when click in one occupant 528 // put name into text area when click in one occupant
  529 + // FIXME
521 $('.occupant-list .occupant-list li a').live('click', function() { 530 $('.occupant-list .occupant-list li a').live('click', function() {
522 var jid_id = $(this).attr('data-id'); 531 var jid_id = $(this).attr('data-id');
523 var name = Jabber.name_of(jid_id); 532 var name = Jabber.name_of(jid_id);
@@ -535,26 +544,30 @@ jQuery(function($) { @@ -535,26 +544,30 @@ jQuery(function($) {
535 544
536 function create_conversation_tab(title, jid_id) { 545 function create_conversation_tab(title, jid_id) {
537 var conversation_id = Jabber.conversation_prefix + jid_id; 546 var conversation_id = Jabber.conversation_prefix + jid_id;
538 - if (! $('#' + conversation_id).length > 0) {  
539 - var jid = Jabber.jid_of(jid_id);  
540 - var identifier = getIdentifier(jid);  
541 -  
542 - // opening chat with selected online friend  
543 - var panel = $('<div id="'+conversation_id +'"></div>').appendTo($conversations);  
544 - panel.append($('#chat #chat-templates .conversation').clone());  
545 - panel.find('.chat-target .avatar').replaceWith(getAvatar(identifier));  
546 - panel.find('.chat-target .other-name').html(title);  
547 - $('#chat .history').perfectScrollbar();  
548 -  
549 - var textarea = panel.find('textarea');  
550 - textarea.attr('name', panel.id);  
551 -  
552 - if (Jabber.is_a_room(jid_id)) {  
553 - panel.append(Jabber.templates.occupant_list);  
554 - panel.find('.history').addClass('room');  
555 - }  
556 - textarea.attr('data-to', jid); 547 + var conversation = $('#' + conversation_id);
  548 + if (conversation.length > 0) {
  549 + return conversation;
557 } 550 }
  551 +
  552 + var jid = Jabber.jid_of(jid_id);
  553 + var identifier = getIdentifier(jid);
  554 +
  555 + // opening chat with selected online friend
  556 + var panel = $('<div id="'+conversation_id +'"></div>').appendTo($conversations);
  557 + panel.append($('#chat #chat-templates .conversation').clone());
  558 + panel.find('.chat-target .avatar').replaceWith(getAvatar(identifier));
  559 + panel.find('.chat-target .other-name').html(title);
  560 + $('#chat .history').perfectScrollbar();
  561 +
  562 + var textarea = panel.find('textarea');
  563 + textarea.attr('name', panel.id);
  564 +
  565 + if (Jabber.is_a_room(jid_id)) {
  566 + panel.append(Jabber.templates.occupant_list);
  567 + panel.find('.history').addClass('room');
  568 + }
  569 + textarea.attr('data-to', jid);
  570 + return panel;
558 } 571 }
559 572
560 function count_unread_messages(jid_id, hide) { 573 function count_unread_messages(jid_id, hide) {
@@ -633,7 +646,7 @@ jQuery(function($) { @@ -633,7 +646,7 @@ jQuery(function($) {
633 } else if($presence == 'dnd') { 646 } else if($presence == 'dnd') {
634 $('#chat-busy').trigger('click'); 647 $('#chat-busy').trigger('click');
635 } 648 }
636 - 649 + $('#chat #buddy-list').perfectScrollbar();
637 }); 650 });
638 651
639 function checkTime(i) { 652 function checkTime(i) {
public/stylesheets/chat.css
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 width: 250px; 13 width: 250px;
14 height: 100%; 14 height: 100%;
15 overflow: hidden; 15 overflow: hidden;
  16 + position: absolute;
16 } 17 }
17 #buddy-list .buddy-list { 18 #buddy-list .buddy-list {
18 list-style-type: none; 19 list-style-type: none;
@@ -72,7 +73,12 @@ @@ -72,7 +73,12 @@
72 background: white; 73 background: white;
73 } 74 }
74 .conversation { 75 .conversation {
75 - margin: 15px; 76 + background-color: #303030;
  77 + height: 100%;
  78 + position: absolute;
  79 + width: 100%;
  80 + top: 0;
  81 + right: 0;
76 } 82 }
77 .conversation .input-div { 83 .conversation .input-div {
78 position: absolute; 84 position: absolute;
@@ -106,7 +112,6 @@ @@ -106,7 +112,6 @@
106 bottom: 100px; 112 bottom: 100px;
107 overflow: hidden; 113 overflow: hidden;
108 width: 100%; 114 width: 100%;
109 - background-color: #303030;  
110 } 115 }
111 .msie7 #chat-window .conversation .history { 116 .msie7 #chat-window .conversation .history {
112 overflow-x: hidden; 117 overflow-x: hidden;
@@ -175,9 +180,6 @@ @@ -175,9 +180,6 @@
175 list-style: none; 180 list-style: none;
176 font-size: 12px; 181 font-size: 12px;
177 } 182 }
178 -#chat-window .history.room {  
179 - right: 200px  
180 -}  
181 #chat-window .comment-balloon-content { 183 #chat-window .comment-balloon-content {
182 min-height: 50px; 184 min-height: 50px;
183 padding: 5px 0 5px 25px; 185 padding: 5px 0 5px 25px;
@@ -230,7 +232,7 @@ @@ -230,7 +232,7 @@
230 font-weight: bold; 232 font-weight: bold;
231 color: white; 233 color: white;
232 } 234 }
233 -#chat #chat-window .other-name, #chat #chat-window .history .self-name { 235 +#chat #chat-window .other-name, #chat #chat-window .history .self-name, #chat #chat-window .history h5 {
234 color: #257CAD; 236 color: #257CAD;
235 height: 23px; 237 height: 23px;
236 overflow: hidden; 238 overflow: hidden;