Commit dc4e304dec80741bc5dee8d287e2500be8043d00
Committed by
Rodrigo Souto
1 parent
2ec9c789
Exists in
master
and in
27 other branches
Fix group chat
Showing
4 changed files
with
88 additions
and
62 deletions
Show diff stats
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) %> (<span id='friends-online'>0</span>)</h1> | 24 | + |
25 | + <div id="friends"> | ||
26 | + <div id='title-bar'><h1 class='title'><%= _("Online") %> (<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; |