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; |