Commit 9c5b8242f48b11d77e79423648d68bc55b4853f1
1 parent
09f458cb
Exists in
master
and in
29 other branches
chat: join/leave and room occupants
Showing
3 changed files
with
94 additions
and
22 deletions
Show diff stats
app/views/shared/logged_in/xmpp_chat.html.erb
| @@ -57,6 +57,9 @@ | @@ -57,6 +57,9 @@ | ||
| 57 | </div> | 57 | </div> |
| 58 | </div> | 58 | </div> |
| 59 | 59 | ||
| 60 | + <a class='join room-action'><%= _('Join room') %></a> | ||
| 61 | + <a class='leave room-action' style="display: none"><%= _('Leave room') %></a> | ||
| 62 | + | ||
| 60 | <div class="buddy-item"> | 63 | <div class="buddy-item"> |
| 61 | <li class='%{presence_status}'> | 64 | <li class='%{presence_status}'> |
| 62 | <a id='%{jid_id}' class='icon-menu-%{presence_status}-11' href='#'> | 65 | <a id='%{jid_id}' class='icon-menu-%{presence_status}-11' href='#'> |
| @@ -68,7 +71,7 @@ | @@ -68,7 +71,7 @@ | ||
| 68 | </div> | 71 | </div> |
| 69 | 72 | ||
| 70 | <div class="occupant-list-template"> | 73 | <div class="occupant-list-template"> |
| 71 | - <div class="occupants"> | 74 | + <div class="occupants room-action"> |
| 72 | <a href="#" class="up"><%= _('Online') %> (<span class="occupants-online">0</span>)</a> | 75 | <a href="#" class="up"><%= _('Online') %> (<span class="occupants-online">0</span>)</a> |
| 73 | <ul class='occupant-list'></ul> | 76 | <ul class='occupant-list'></ul> |
| 74 | </div> | 77 | </div> |
public/javascripts/chat.js
| @@ -51,7 +51,7 @@ jQuery(function($) { | @@ -51,7 +51,7 @@ jQuery(function($) { | ||
| 51 | return Jabber.jids[jid_id].unread_messages; | 51 | return Jabber.jids[jid_id].unread_messages; |
| 52 | }, | 52 | }, |
| 53 | 53 | ||
| 54 | - insert_or_update_user: function (list, item, jid, name, presence, template, type) { | 54 | + insert_or_update_user: function (list, item, jid, name, presence, template, type, remove_on_offline) { |
| 55 | var jid_id = Jabber.jid_to_id(jid); | 55 | var jid_id = Jabber.jid_to_id(jid); |
| 56 | var identifier = Strophe.getNodeFromJid(jid); | 56 | var identifier = Strophe.getNodeFromJid(jid); |
| 57 | var html = template | 57 | var html = template |
| @@ -61,12 +61,13 @@ jQuery(function($) { | @@ -61,12 +61,13 @@ jQuery(function($) { | ||
| 61 | .replace('%{name}', name); | 61 | .replace('%{name}', name); |
| 62 | 62 | ||
| 63 | $(item).parent().remove(); | 63 | $(item).parent().remove(); |
| 64 | - $(list).append(html); | 64 | + if(presence != 'offline' || !remove_on_offline) |
| 65 | + $(list).append(html); | ||
| 65 | Jabber.jids[jid_id] = {jid: jid, name: name, type: type, presence: presence}; | 66 | Jabber.jids[jid_id] = {jid: jid, name: name, type: type, presence: presence}; |
| 66 | }, | 67 | }, |
| 67 | insert_or_update_group: function (jid, presence) { | 68 | insert_or_update_group: function (jid, presence) { |
| 68 | var jid_id = Jabber.jid_to_id(jid); | 69 | var jid_id = Jabber.jid_to_id(jid); |
| 69 | - var list = $('#buddy-list .buddies ul.online'); | 70 | + var list = $('#buddy-list .buddies ul.'+presence); |
| 70 | var item = $('#' + jid_id); | 71 | var item = $('#' + jid_id); |
| 71 | presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline'); | 72 | presence = presence || ($(item).length > 0 ? $(item).parent('li').attr('class') : 'offline'); |
| 72 | log('adding or updating contact ' + jid + ' as ' + presence); | 73 | log('adding or updating contact ' + jid + ' as ' + presence); |
| @@ -90,14 +91,22 @@ jQuery(function($) { | @@ -90,14 +91,22 @@ jQuery(function($) { | ||
| 90 | insert_or_update_occupant: function (jid, name, presence, room_jid) { | 91 | insert_or_update_occupant: function (jid, name, presence, room_jid) { |
| 91 | log('adding or updating occupant ' + jid + ' as ' + presence); | 92 | log('adding or updating occupant ' + jid + ' as ' + presence); |
| 92 | var jid_id = Jabber.jid_to_id(jid); | 93 | var jid_id = Jabber.jid_to_id(jid); |
| 93 | - var list = $('#' + Jabber.conversation_prefix + Jabber.jid_to_id(room_jid) + ' .occupants ul'); | 94 | + var room_jid_id = Jabber.jid_to_id(room_jid); |
| 95 | + var list = $('#' + Jabber.conversation_prefix + room_jid_id + ' .occupants ul'); | ||
| 94 | var item = $(list).find('a[data-id='+ jid_id +']'); | 96 | var item = $(list).find('a[data-id='+ jid_id +']'); |
| 95 | - Jabber.insert_or_update_user(list, item, jid, name, presence, Jabber.template('.occupant-item'), 'chat'); | ||
| 96 | - if (Jabber.rooms[Jabber.jid_to_id(room_jid)] === undefined) { | ||
| 97 | - Jabber.rooms[Jabber.jid_to_id(room_jid)] = {}; | 97 | + Jabber.insert_or_update_user(list, item, jid, name, presence, Jabber.template('.occupant-item'), 'chat', true); |
| 98 | + if (Jabber.rooms[room_jid_id] === undefined) | ||
| 99 | + Jabber.rooms[room_jid_id] = {}; | ||
| 100 | + | ||
| 101 | + var room = Jabber.rooms[room_jid_id]; | ||
| 102 | + if(presence == 'offline') { | ||
| 103 | + delete Jabber.rooms[room_jid_id][name]; | ||
| 104 | + } | ||
| 105 | + else { | ||
| 106 | + Jabber.rooms[room_jid_id][name] = jid; | ||
| 98 | } | 107 | } |
| 99 | - Jabber.rooms[Jabber.jid_to_id(room_jid)][name] = jid; | ||
| 100 | - list.parents('.occupants').find('.occupants-online').text(list.find('li').length); | 108 | + |
| 109 | + list.parents('.occupants').find('.occupants-online').text(Object.keys(Jabber.rooms[room_jid_id]).length); | ||
| 101 | }, | 110 | }, |
| 102 | 111 | ||
| 103 | remove_contact: function(jid) { | 112 | remove_contact: function(jid) { |
| @@ -183,6 +192,7 @@ jQuery(function($) { | @@ -183,6 +192,7 @@ jQuery(function($) { | ||
| 183 | 192 | ||
| 184 | leave_room: function(room_jid) { | 193 | leave_room: function(room_jid) { |
| 185 | Jabber.connection.send($pres({from: Jabber.connection.jid, to: room_jid + '/' + $own_name, type: 'unavailable'})) | 194 | Jabber.connection.send($pres({from: Jabber.connection.jid, to: room_jid + '/' + $own_name, type: 'unavailable'})) |
| 195 | + Jabber.insert_or_update_group(room_jid, 'offline'); | ||
| 186 | //FIXME remove group | 196 | //FIXME remove group |
| 187 | }, | 197 | }, |
| 188 | 198 | ||
| @@ -238,10 +248,10 @@ jQuery(function($) { | @@ -238,10 +248,10 @@ jQuery(function($) { | ||
| 238 | dataType: 'json', | 248 | dataType: 'json', |
| 239 | success: function(data){ | 249 | success: function(data){ |
| 240 | data.each(function(room){ | 250 | data.each(function(room){ |
| 241 | - console.log('==> '+room.jid); | ||
| 242 | var jid_id = Jabber.jid_to_id(room.jid); | 251 | var jid_id = Jabber.jid_to_id(room.jid); |
| 243 | Jabber.jids[jid_id] = {jid: room.jid, name: room.name, type: 'groupchat'}; | 252 | Jabber.jids[jid_id] = {jid: room.jid, name: room.name, type: 'groupchat'}; |
| 244 | - Jabber.insert_or_update_group(room.jid, 'online'); | 253 | + //FIXME This must check on session if the user is inside the room... |
| 254 | + Jabber.insert_or_update_group(room.jid, 'offline'); | ||
| 245 | }); | 255 | }); |
| 246 | }, | 256 | }, |
| 247 | error: function(data, textStatus, jqXHR){ | 257 | error: function(data, textStatus, jqXHR){ |
| @@ -599,8 +609,11 @@ jQuery(function($) { | @@ -599,8 +609,11 @@ jQuery(function($) { | ||
| 599 | textarea.attr('name', panel.id); | 609 | textarea.attr('name', panel.id); |
| 600 | 610 | ||
| 601 | if (Jabber.is_a_room(jid_id)) { | 611 | if (Jabber.is_a_room(jid_id)) { |
| 602 | - panel.find('.conversation').append(Jabber.template('.occupant-list-template')); | 612 | + panel.append(Jabber.template('.occupant-list-template')); |
| 603 | panel.find('.history').addClass('room'); | 613 | panel.find('.history').addClass('room'); |
| 614 | + var room_actions = $('#chat-templates .room-action').clone(); | ||
| 615 | + room_actions.data('jid', jid); | ||
| 616 | + panel.find('.history').after(room_actions); | ||
| 604 | $('#chat .occupants .occupant-list').perfectScrollbar(); | 617 | $('#chat .occupants .occupant-list').perfectScrollbar(); |
| 605 | } | 618 | } |
| 606 | textarea.attr('data-to', jid); | 619 | textarea.attr('data-to', jid); |
| @@ -793,4 +806,19 @@ jQuery(function($) { | @@ -793,4 +806,19 @@ jQuery(function($) { | ||
| 793 | $('#chat-label').click(function(){ | 806 | $('#chat-label').click(function(){ |
| 794 | toggle_chat_window(); | 807 | toggle_chat_window(); |
| 795 | }); | 808 | }); |
| 809 | + | ||
| 810 | + $('.room-action.join').live('click', function(){ | ||
| 811 | + Jabber.enter_room($(this).data('jid')); | ||
| 812 | + $(this).hide(); | ||
| 813 | + $(this).siblings('.leave').show(); | ||
| 814 | + sort_conversations(); | ||
| 815 | + }); | ||
| 816 | + | ||
| 817 | + $('.room-action.leave').live('click', function(){ | ||
| 818 | + Jabber.leave_room($(this).data('jid')); | ||
| 819 | + $(this).hide(); | ||
| 820 | + $(this).siblings('.join').show(); | ||
| 821 | + sort_conversations(); | ||
| 822 | + }); | ||
| 823 | + | ||
| 796 | }); | 824 | }); |
public/stylesheets/chat.css
| @@ -68,9 +68,18 @@ | @@ -68,9 +68,18 @@ | ||
| 68 | padding: 0; | 68 | padding: 0; |
| 69 | margin: 0; | 69 | margin: 0; |
| 70 | } | 70 | } |
| 71 | -#buddy-list .buddies a:hover, .occupant-list li a:hover { | ||
| 72 | - background-color: #EEEEEC; | 71 | +#buddy-list .buddies a:hover { |
| 72 | + background-color: #eeeeec; | ||
| 73 | } | 73 | } |
| 74 | + | ||
| 75 | +.occupant-list li a:hover { | ||
| 76 | + background-color: black; | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +.occupant-list .icon-menu-chat-11 { | ||
| 80 | + background-image: none; | ||
| 81 | +} | ||
| 82 | + | ||
| 74 | #buddy-list .buddies li a, .occupant-list li a { | 83 | #buddy-list .buddies li a, .occupant-list li a { |
| 75 | background-position: 0% 50%; | 84 | background-position: 0% 50%; |
| 76 | display: block; | 85 | display: block; |
| @@ -88,6 +97,10 @@ | @@ -88,6 +97,10 @@ | ||
| 88 | max-width: 128px; | 97 | max-width: 128px; |
| 89 | overflow: hidden; | 98 | overflow: hidden; |
| 90 | } | 99 | } |
| 100 | +.occupant-list li a .name { | ||
| 101 | + color: white; | ||
| 102 | +} | ||
| 103 | + | ||
| 91 | #buddy-list .buddies li a img, .occupant-list li a img, #chat .avatar { | 104 | #buddy-list .buddies li a img, .occupant-list li a img, #chat .avatar { |
| 92 | border-radius: 5px; | 105 | border-radius: 5px; |
| 93 | width: 32px; | 106 | width: 32px; |
| @@ -150,9 +163,9 @@ | @@ -150,9 +163,9 @@ | ||
| 150 | position: absolute; | 163 | position: absolute; |
| 151 | right: 0; | 164 | right: 0; |
| 152 | left: 0; | 165 | left: 0; |
| 153 | - bottom: 0; | 166 | + bottom: 33px; |
| 154 | height: 80px; | 167 | height: 80px; |
| 155 | - padding: 20px 15px 31px 7px; | 168 | + padding-left: 7px; |
| 156 | } | 169 | } |
| 157 | .msie7 .conversation .input-div { | 170 | .msie7 .conversation .input-div { |
| 158 | padding-left: 5px; | 171 | padding-left: 5px; |
| @@ -184,6 +197,10 @@ | @@ -184,6 +197,10 @@ | ||
| 184 | bottom: 100px; | 197 | bottom: 100px; |
| 185 | } | 198 | } |
| 186 | 199 | ||
| 200 | +#conversations .history.room { | ||
| 201 | + bottom: 132px; | ||
| 202 | +} | ||
| 203 | + | ||
| 187 | #chat .unread-messages { | 204 | #chat .unread-messages { |
| 188 | height: 32px; | 205 | height: 32px; |
| 189 | line-height: 32px; | 206 | line-height: 32px; |
| @@ -266,12 +283,11 @@ | @@ -266,12 +283,11 @@ | ||
| 266 | transition: 0.2s; | 283 | transition: 0.2s; |
| 267 | } | 284 | } |
| 268 | 285 | ||
| 269 | -div.occupants { | ||
| 270 | - position: absolute; | ||
| 271 | - width: 100%; | ||
| 272 | - bottom: 98px; | ||
| 273 | - background-color: rgba(0, 0, 0, 0.7); | 286 | +.conversation div.occupants { |
| 287 | + bottom: 118px; | ||
| 288 | + background-color: #2e3436; | ||
| 274 | } | 289 | } |
| 290 | + | ||
| 275 | div.occupants ul.occupant-list { | 291 | div.occupants ul.occupant-list { |
| 276 | padding: 0; | 292 | padding: 0; |
| 277 | margin: 0; | 293 | margin: 0; |
| @@ -281,6 +297,10 @@ div.occupants ul.occupant-list { | @@ -281,6 +297,10 @@ div.occupants ul.occupant-list { | ||
| 281 | display: none; | 297 | display: none; |
| 282 | border-top: 1px solid rgb(37, 37, 37); | 298 | border-top: 1px solid rgb(37, 37, 37); |
| 283 | } | 299 | } |
| 300 | +div.occupants ul.occupant-list { | ||
| 301 | + text-align: left; | ||
| 302 | +} | ||
| 303 | + | ||
| 284 | div.occupants > a { | 304 | div.occupants > a { |
| 285 | color: rgb(168, 168, 168); | 305 | color: rgb(168, 168, 168); |
| 286 | text-align: center; | 306 | text-align: center; |
| @@ -561,3 +581,24 @@ div.occupants > a.up { | @@ -561,3 +581,24 @@ div.occupants > a.up { | ||
| 561 | #chat-label.opened div { | 581 | #chat-label.opened div { |
| 562 | display: inline-block; | 582 | display: inline-block; |
| 563 | } | 583 | } |
| 584 | + | ||
| 585 | +.conversation .room-action { | ||
| 586 | + position: absolute; | ||
| 587 | + bottom: 100px; | ||
| 588 | + left: 7px; | ||
| 589 | + right: 79px; | ||
| 590 | + text-align: center; | ||
| 591 | + cursor: pointer; | ||
| 592 | + z-index: 1; | ||
| 593 | + color: white; | ||
| 594 | + border-radius: 3px; | ||
| 595 | + font-size: 14px; | ||
| 596 | +} | ||
| 597 | + | ||
| 598 | +.conversation .join { | ||
| 599 | + background-color: #4E9A06; | ||
| 600 | +} | ||
| 601 | + | ||
| 602 | +.conversation .leave { | ||
| 603 | + background-color: #A40000; | ||
| 604 | +} |