Commit 10662c2c4334180f4e630ef2a077d2a2f38a0e2d
1 parent
0a1e0419
Exists in
staging
and in
4 other branches
Chat improvement
Showing
4 changed files
with
27 additions
and
38 deletions
Show diff stats
app/controllers/public/chat_controller.rb
| @@ -41,9 +41,14 @@ class ChatController < PublicController | @@ -41,9 +41,14 @@ class ChatController < PublicController | ||
| 41 | 41 | ||
| 42 | def recent_messages | 42 | def recent_messages |
| 43 | other = environment.profiles.find_by_identifier(params[:identifier]) | 43 | other = environment.profiles.find_by_identifier(params[:identifier]) |
| 44 | - messages = ChatMessage.where('(to_id=:other and from_id=:me) or (to_id=:me and from_id=:other)', {:me => user.id, :other => other.id}).order('created_at DESC').includes(:to, :from).limit(20) | 44 | + if other.kind_of?(Organization) |
| 45 | + messages = ChatMessage.where('to_id=:other', :other => other.id) | ||
| 46 | + else | ||
| 47 | + messages = ChatMessage.where('(to_id=:other and from_id=:me) or (to_id=:me and from_id=:other)', {:me => user.id, :other => other.id}) | ||
| 48 | + end | ||
| 45 | 49 | ||
| 46 | - messages = messages.map do |message| | 50 | + messages = messages.order('created_at DESC').includes(:to, :from).limit(20) |
| 51 | + messages_json = messages.map do |message| | ||
| 47 | { | 52 | { |
| 48 | :body => message.body, | 53 | :body => message.body, |
| 49 | :to => {:id => message.to.identifier, :name => message.to.name, :type => message.to.type}, | 54 | :to => {:id => message.to.identifier, :name => message.to.name, :type => message.to.type}, |
| @@ -51,7 +56,7 @@ class ChatController < PublicController | @@ -51,7 +56,7 @@ class ChatController < PublicController | ||
| 51 | :created_at => message.created_at | 56 | :created_at => message.created_at |
| 52 | } | 57 | } |
| 53 | end | 58 | end |
| 54 | - render :json => messages.reverse | 59 | + render :json => messages_json.reverse |
| 55 | end | 60 | end |
| 56 | 61 | ||
| 57 | protected | 62 | protected |
app/views/shared/logged_in/xmpp_chat.html.erb
| @@ -25,7 +25,10 @@ | @@ -25,7 +25,10 @@ | ||
| 25 | 25 | ||
| 26 | <div id="friends"> | 26 | <div id="friends"> |
| 27 | <div id='title-bar'><h1 class='title'><%= _("Online") %> (<span id='friends-online'>0</span>)</h1></div> | 27 | <div id='title-bar'><h1 class='title'><%= _("Online") %> (<span id='friends-online'>0</span>)</h1></div> |
| 28 | - <ul class='buddy-list'></ul> | 28 | + <ul class='buddy-list online'></ul> |
| 29 | + | ||
| 30 | + <div id='title-bar'><h1 class='title'><%= _("Offline") %></h1></div> | ||
| 31 | + <ul class='buddy-list offline'></ul> | ||
| 29 | </div> | 32 | </div> |
| 30 | 33 | ||
| 31 | <div id="rooms"> | 34 | <div id="rooms"> |
public/javascripts/chat.js
| @@ -24,7 +24,6 @@ jQuery(function($) { | @@ -24,7 +24,6 @@ jQuery(function($) { | ||
| 24 | muc_domain: $muc_domain, | 24 | muc_domain: $muc_domain, |
| 25 | muc_supported: false, | 25 | muc_supported: false, |
| 26 | presence_status: '', | 26 | presence_status: '', |
| 27 | - update_presence_status_every: $update_presence_status_every, // time in seconds of how often update presence status to Noosfero DB | ||
| 28 | conversation_prefix: 'conversation-', | 27 | conversation_prefix: 'conversation-', |
| 29 | jids: {}, | 28 | jids: {}, |
| 30 | rooms: {}, | 29 | rooms: {}, |
| @@ -62,11 +61,9 @@ jQuery(function($) { | @@ -62,11 +61,9 @@ jQuery(function($) { | ||
| 62 | .replace(/%{presence_status}/g, presence) | 61 | .replace(/%{presence_status}/g, presence) |
| 63 | .replace('%{avatar}', getAvatar(identifier)) | 62 | .replace('%{avatar}', getAvatar(identifier)) |
| 64 | .replace('%{name}', name); | 63 | .replace('%{name}', name); |
| 65 | - if ($(item).length > 0) { | ||
| 66 | - $(item).parent('li').replaceWith(html); | ||
| 67 | - } else { | ||
| 68 | - $(list).append(html); | ||
| 69 | - } | 64 | + |
| 65 | + $(item).parent().remove(); | ||
| 66 | + $(list).append(html); | ||
| 70 | Jabber.jids[jid_id] = {jid: jid, name: name, type: type, presence: presence}; | 67 | Jabber.jids[jid_id] = {jid: jid, name: name, type: type, presence: presence}; |
| 71 | }, | 68 | }, |
| 72 | insert_or_update_group: function (jid, presence) { | 69 | insert_or_update_group: function (jid, presence) { |
| @@ -82,9 +79,10 @@ jQuery(function($) { | @@ -82,9 +79,10 @@ jQuery(function($) { | ||
| 82 | }, | 79 | }, |
| 83 | insert_or_update_contact: function (jid, name, presence) { | 80 | insert_or_update_contact: function (jid, name, presence) { |
| 84 | var jid_id = Jabber.jid_to_id(jid); | 81 | var jid_id = Jabber.jid_to_id(jid); |
| 85 | - var list = $('#buddy-list #friends .buddy-list'); | ||
| 86 | var item = $('#' + jid_id); | 82 | var item = $('#' + jid_id); |
| 87 | presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline'); | 83 | presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline'); |
| 84 | + var list = $('#buddy-list #friends .buddy-list' + (presence=='offline' ? '.offline' : '.online')); | ||
| 85 | + | ||
| 88 | log('adding or updating contact ' + jid + ' as ' + presence); | 86 | log('adding or updating contact ' + jid + ' as ' + presence); |
| 89 | Jabber.insert_or_update_user(list, item, jid, name, presence, $('#chat #chat-templates .buddy-item').clone().html(), 'chat'); | 87 | Jabber.insert_or_update_user(list, item, jid, name, presence, $('#chat #chat-templates .buddy-item').clone().html(), 'chat'); |
| 90 | $("#chat-window .tab a[href='#"+ Jabber.conversation_prefix + jid_id +"']") | 88 | $("#chat-window .tab a[href='#"+ Jabber.conversation_prefix + jid_id +"']") |
| @@ -182,7 +180,7 @@ jQuery(function($) { | @@ -182,7 +180,7 @@ jQuery(function($) { | ||
| 182 | }, | 180 | }, |
| 183 | 181 | ||
| 184 | update_chat_title: function () { | 182 | update_chat_title: function () { |
| 185 | - var friends_online = $('#buddy-list .buddy-list li:not(.offline)').length; | 183 | + var friends_online = $('#buddy-list .buddy-list.online li').length; |
| 186 | $('#friends-online').text(friends_online); | 184 | $('#friends-online').text(friends_online); |
| 187 | }, | 185 | }, |
| 188 | 186 | ||
| @@ -200,7 +198,6 @@ jQuery(function($) { | @@ -200,7 +198,6 @@ jQuery(function($) { | ||
| 200 | break; | 198 | break; |
| 201 | case Strophe.Status.DISCONNECTED: | 199 | case Strophe.Status.DISCONNECTED: |
| 202 | log('disconnected'); | 200 | log('disconnected'); |
| 203 | - //Jabber.show_status(''); | ||
| 204 | $('#buddy-list ul.buddy-list, .occupant-list ul.occupant-list').html(''); | 201 | $('#buddy-list ul.buddy-list, .occupant-list ul.occupant-list').html(''); |
| 205 | Jabber.update_chat_title(); | 202 | Jabber.update_chat_title(); |
| 206 | $('#buddy-list .toolbar').removeClass('small-loading-dark'); | 203 | $('#buddy-list .toolbar').removeClass('small-loading-dark'); |
| @@ -402,13 +399,6 @@ jQuery(function($) { | @@ -402,13 +399,6 @@ jQuery(function($) { | ||
| 402 | Jabber.on_muc_support | 399 | Jabber.on_muc_support |
| 403 | ); | 400 | ); |
| 404 | 401 | ||
| 405 | - // Timed handle to save presence status to Noosfero DB every (N) seconds | ||
| 406 | - Jabber.connection.addTimedHandler(Jabber.update_presence_status_every * 1000, function() { | ||
| 407 | - log('saving presence status to Noosfero DB'); | ||
| 408 | - $.get('/chat/update_presence_status', { status: {chat_status: Jabber.presence_status} }); | ||
| 409 | - return true; | ||
| 410 | - }); | ||
| 411 | - | ||
| 412 | // uncomment for extra debugging | 402 | // uncomment for extra debugging |
| 413 | //Strophe.log = function (lvl, msg) { log(msg); }; | 403 | //Strophe.log = function (lvl, msg) { log(msg); }; |
| 414 | }, | 404 | }, |
| @@ -467,11 +457,6 @@ jQuery(function($) { | @@ -467,11 +457,6 @@ jQuery(function($) { | ||
| 467 | disconnect(); | 457 | disconnect(); |
| 468 | }); | 458 | }); |
| 469 | 459 | ||
| 470 | - // save presence_status as offline in Noosfero database when close or reload chat window | ||
| 471 | - $(window).unload(function() { | ||
| 472 | - //disconnect(); | ||
| 473 | - }); | ||
| 474 | - | ||
| 475 | $('#chat-busy').click(function() { | 460 | $('#chat-busy').click(function() { |
| 476 | Jabber.presence_status = 'dnd'; | 461 | Jabber.presence_status = 'dnd'; |
| 477 | Jabber.connect(); | 462 | Jabber.connect(); |
| @@ -496,6 +481,7 @@ jQuery(function($) { | @@ -496,6 +481,7 @@ jQuery(function($) { | ||
| 496 | Jabber.enter_room(jid); | 481 | Jabber.enter_room(jid); |
| 497 | var conversation = create_conversation_tab(name, jid_id); | 482 | var conversation = create_conversation_tab(name, jid_id); |
| 498 | conversation.find('.conversation').show(); | 483 | conversation.find('.conversation').show(); |
| 484 | + recent_messages(jid); | ||
| 499 | } | 485 | } |
| 500 | } | 486 | } |
| 501 | else { | 487 | else { |
| @@ -532,6 +518,7 @@ jQuery(function($) { | @@ -532,6 +518,7 @@ jQuery(function($) { | ||
| 532 | 518 | ||
| 533 | conversation.find('.conversation').show(); | 519 | conversation.find('.conversation').show(); |
| 534 | count_unread_messages(jid_id, true); | 520 | count_unread_messages(jid_id, true); |
| 521 | + recent_messages(Jabber.jid_of(jid_id)); | ||
| 535 | conversation.find('.conversation .input-div textarea.input').focus(); | 522 | conversation.find('.conversation .input-div textarea.input').focus(); |
| 536 | }); | 523 | }); |
| 537 | 524 | ||
| @@ -582,8 +569,6 @@ jQuery(function($) { | @@ -582,8 +569,6 @@ jQuery(function($) { | ||
| 582 | } | 569 | } |
| 583 | textarea.attr('data-to', jid); | 570 | textarea.attr('data-to', jid); |
| 584 | 571 | ||
| 585 | - recent_messages(jid); | ||
| 586 | - | ||
| 587 | return panel; | 572 | return panel; |
| 588 | } | 573 | } |
| 589 | 574 | ||
| @@ -596,11 +581,14 @@ jQuery(function($) { | @@ -596,11 +581,14 @@ jQuery(function($) { | ||
| 596 | var from = message['from']; | 581 | var from = message['from']; |
| 597 | var to = message['to']; | 582 | var to = message['to']; |
| 598 | var date = message['created_at']; | 583 | var date = message['created_at']; |
| 584 | + var group = to['type']=='Community' ? 'conference.' : ''; | ||
| 585 | + var domain = '127.0.0.1'; | ||
| 599 | 586 | ||
| 600 | - if(from['id']!=getCurrentIdentifier()) { | ||
| 601 | - Jabber.show_message(from['id']+'@127.0.0.1', from['name'], body, 'other', from['id'], date); | 587 | + if(from['id']==getCurrentIdentifier()) { |
| 588 | + Jabber.show_message(to['id']+'@'+group+domain, $own_name, body, 'self', to['id'], date); | ||
| 602 | } else { | 589 | } else { |
| 603 | - Jabber.show_message(to['id']+'@127.0.0.1', $own_name, body, 'self', to['id'], date); | 590 | + var target = group!='' ? to['id'] : from['id'] |
| 591 | + Jabber.show_message(target+'@'+group+domain, from['name'], body, 'other', from['id'], date); | ||
| 604 | } | 592 | } |
| 605 | }); | 593 | }); |
| 606 | }); | 594 | }); |
| @@ -684,10 +672,3 @@ jQuery(function($) { | @@ -684,10 +672,3 @@ jQuery(function($) { | ||
| 684 | } | 672 | } |
| 685 | $('#chat #buddy-list').perfectScrollbar(); | 673 | $('#chat #buddy-list').perfectScrollbar(); |
| 686 | }); | 674 | }); |
| 687 | - | ||
| 688 | -function checkTime(i) { | ||
| 689 | - if (i<10) { | ||
| 690 | - i="0" + i; | ||
| 691 | - } | ||
| 692 | - return i; | ||
| 693 | -} |
public/stylesheets/chat.css
| @@ -47,7 +47,7 @@ | @@ -47,7 +47,7 @@ | ||
| 47 | max-height: 40px; | 47 | max-height: 40px; |
| 48 | } | 48 | } |
| 49 | #buddy-list .buddy-list li.offline, .occupant-list li.offline { | 49 | #buddy-list .buddy-list li.offline, .occupant-list li.offline { |
| 50 | - display: none; | 50 | +/* display: none;*/ |
| 51 | } | 51 | } |
| 52 | #chat #buddy-list .toolbar { | 52 | #chat #buddy-list .toolbar { |
| 53 | border: 0; | 53 | border: 0; |