Added popover infos to chat header/badges about all chats and available agents.
This commit is contained in:
parent
a6e0ba301c
commit
4803fa9383
6 changed files with 136 additions and 24 deletions
|
@ -22,8 +22,11 @@ class App.CustomerChat extends App.Controller
|
||||||
@meta =
|
@meta =
|
||||||
active: false
|
active: false
|
||||||
waiting_chat_count: 0
|
waiting_chat_count: 0
|
||||||
|
waiting_chat_session_list: []
|
||||||
running_chat_count: 0
|
running_chat_count: 0
|
||||||
active_agents: 0
|
running_chat_session_list: []
|
||||||
|
active_agent_count: 0
|
||||||
|
active_agent_ids: []
|
||||||
|
|
||||||
@render()
|
@render()
|
||||||
@on 'layout-has-changed', @propagateLayoutChange
|
@on 'layout-has-changed', @propagateLayoutChange
|
||||||
|
@ -86,7 +89,65 @@ class App.CustomerChat extends App.Controller
|
||||||
|
|
||||||
@html App.view('customer_chat/index')()
|
@html App.view('customer_chat/index')()
|
||||||
|
|
||||||
|
chatSessionList = (list) ->
|
||||||
|
for chat_session in list
|
||||||
|
chat = App.Chat.find(chat_session.chat_id)
|
||||||
|
chat_session.name = "#{chat.displayName()} [##{chat_session.id}]"
|
||||||
|
chat_session.geo_data = ''
|
||||||
|
if chat_session.preferences && chat_session.preferences.geo_ip
|
||||||
|
if chat_session.preferences.geo_ip.country_name
|
||||||
|
chat_session.geo_data += chat_session.preferences.geo_ip.country_name
|
||||||
|
if chat_session.preferences.geo_ip.city_name
|
||||||
|
chat_session.geo_data += " #{chat_session.preferences.geo_ip.city_name}"
|
||||||
|
if chat_session.user_id
|
||||||
|
chat_session.user = App.User.find(chat_session.user_id)
|
||||||
|
App.view('customer_chat/chat_list')(
|
||||||
|
chat_sessions: list
|
||||||
|
)
|
||||||
|
|
||||||
|
@el.find('.js-waitingCustomers').popover(
|
||||||
|
trigger: 'hover'
|
||||||
|
container: 'body'
|
||||||
|
html: true
|
||||||
|
animation: false
|
||||||
|
delay: 100
|
||||||
|
title: ->
|
||||||
|
App.i18n.translateContent('Waiting Customers')
|
||||||
|
content: =>
|
||||||
|
chatSessionList(@meta.waiting_chat_session_list)
|
||||||
|
)
|
||||||
|
|
||||||
|
@el.find('.js-chattingCustomers').popover(
|
||||||
|
trigger: 'hover'
|
||||||
|
container: 'body'
|
||||||
|
html: true
|
||||||
|
animation: false
|
||||||
|
delay: 100
|
||||||
|
title: ->
|
||||||
|
App.i18n.translateContent('Chatting Customers')
|
||||||
|
content: =>
|
||||||
|
chatSessionList(@meta.running_chat_session_list)
|
||||||
|
)
|
||||||
|
|
||||||
|
@el.find('.js-activeAgents').popover(
|
||||||
|
trigger: 'hover'
|
||||||
|
container: 'body'
|
||||||
|
html: true
|
||||||
|
animation: false
|
||||||
|
delay: 100
|
||||||
|
title: ->
|
||||||
|
App.i18n.translateContent('Active Agents')
|
||||||
|
content: =>
|
||||||
|
users = []
|
||||||
|
for user_id in @meta.active_agent_ids
|
||||||
|
users.push App.User.find(user_id)
|
||||||
|
App.view('customer_chat/user_list')(
|
||||||
|
users: users
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
show: (params) =>
|
show: (params) =>
|
||||||
|
@title 'Customer Chat', true
|
||||||
@navupdate '#customer_chat'
|
@navupdate '#customer_chat'
|
||||||
|
|
||||||
counter: =>
|
counter: =>
|
||||||
|
@ -168,7 +229,7 @@ class App.CustomerChat extends App.Controller
|
||||||
@$('.js-acceptChat').removeClass('is-clickable is-blinking')
|
@$('.js-acceptChat').removeClass('is-clickable is-blinking')
|
||||||
@$('.js-badgeWaitingCustomers').text(@meta.waiting_chat_count)
|
@$('.js-badgeWaitingCustomers').text(@meta.waiting_chat_count)
|
||||||
@$('.js-badgeChattingCustomers').text(@meta.running_chat_count)
|
@$('.js-badgeChattingCustomers').text(@meta.running_chat_count)
|
||||||
@$('.js-badgeActiveAgents').text(@meta.active_agents)
|
@$('.js-badgeActiveAgents').text(@meta.active_agent_count)
|
||||||
|
|
||||||
# reopen chats
|
# reopen chats
|
||||||
if @meta.active_sessions
|
if @meta.active_sessions
|
||||||
|
@ -265,11 +326,12 @@ class ChatWindow extends App.Controller
|
||||||
|
|
||||||
chat = App.Chat.find(@session.chat_id)
|
chat = App.Chat.find(@session.chat_id)
|
||||||
@name = "#{chat.displayName()} [##{@session.id}]"
|
@name = "#{chat.displayName()} [##{@session.id}]"
|
||||||
|
@title = ''
|
||||||
if @session && @session.preferences && @session.preferences.geo_ip
|
if @session && @session.preferences && @session.preferences.geo_ip
|
||||||
if @session.preferences.geo_ip.country_name
|
if @session.preferences.geo_ip.country_name
|
||||||
@name += " #{@session.preferences.geo_ip.country_name}"
|
@title += @session.preferences.geo_ip.country_name
|
||||||
if @session.preferences.geo_ip.city_name
|
if @session.preferences.geo_ip.city_name
|
||||||
@name += " #{@session.preferences.geo_ip.city_name}"
|
@title += " #{@session.preferences.geo_ip.city_name}"
|
||||||
|
|
||||||
@on 'layout-change', @scrollToBottom
|
@on 'layout-change', @scrollToBottom
|
||||||
|
|
||||||
|
@ -303,6 +365,7 @@ class ChatWindow extends App.Controller
|
||||||
render: ->
|
render: ->
|
||||||
@html App.view('customer_chat/chat_window')
|
@html App.view('customer_chat/chat_window')
|
||||||
name: @name
|
name: @name
|
||||||
|
title: @title
|
||||||
|
|
||||||
@el.one 'transitionend', @onTransitionend
|
@el.one 'transitionend', @onTransitionend
|
||||||
|
|
||||||
|
@ -412,6 +475,7 @@ class ChatWindow extends App.Controller
|
||||||
sendMessage: (delay) =>
|
sendMessage: (delay) =>
|
||||||
content = @input.html()
|
content = @input.html()
|
||||||
return if !content
|
return if !content
|
||||||
|
return if @el.hasClass('is-offline')
|
||||||
|
|
||||||
send = =>
|
send = =>
|
||||||
App.WebSocket.send(
|
App.WebSocket.send(
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<% if _.isEmpty(@chat_sessions): %>
|
||||||
|
<%- @T('none') %>
|
||||||
|
<% else: %>
|
||||||
|
<ul>
|
||||||
|
<% for chat_session in @chat_sessions: %>
|
||||||
|
<li><%= chat_session.name %> <% if chat_session.geo_data: %>- <%= chat_session.geo_data %><% end %> - <% if chat_session.user_id: %><%= chat_session.user.displayName() %> -<% end %> <small class=""><%- @humanTime(chat_session.created_at) %></small>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
|
@ -6,7 +6,7 @@
|
||||||
<%- @Icon('status-modified-inner-circle') %>
|
<%- @Icon('status-modified-inner-circle') %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-name"><%- @name %></div>
|
<div class="chat-name" title="<%= @title %>"><%= @name %></div>
|
||||||
<div class="chat-close js-close">
|
<div class="chat-close js-close">
|
||||||
<%- @Icon('diagonal-cross') %>
|
<%- @Icon('diagonal-cross') %>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,13 +5,13 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="page-header-center">
|
<div class="page-header-center">
|
||||||
<div class="status-fields">
|
<div class="status-fields">
|
||||||
<div class="status-field js-acceptChat">
|
<div class="status-field js-acceptChat js-waitingCustomers">
|
||||||
<span class="badge js-badgeWaitingCustomers"></span> <%- @T('Waiting Customers') %>
|
<span class="badge js-badgeWaitingCustomers"></span> <%- @T('Waiting Customers') %>
|
||||||
</div>
|
</div>
|
||||||
<div class="status-field">
|
<div class="status-field js-chattingCustomers">
|
||||||
<span class="badge js-badgeChattingCustomers"></span> <%- @T('Chatting Customers') %>
|
<span class="badge js-badgeChattingCustomers"></span> <%- @T('Chatting Customers') %>
|
||||||
</div>
|
</div>
|
||||||
<div class="status-field">
|
<div class="status-field js-activeAgents">
|
||||||
<span class="badge js-badgeActiveAgents"></span> <%- @T('Active Agents') %>
|
<span class="badge js-badgeActiveAgents"></span> <%- @T('Active Agents') %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<% if _.isEmpty(@users): %>
|
||||||
|
<%- @T('none') %>
|
||||||
|
<% else: %>
|
||||||
|
<ul>
|
||||||
|
<% for user in @users: %>
|
||||||
|
<li><%= user.displayName() %>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
|
@ -68,10 +68,25 @@ class Chat < ApplicationModel
|
||||||
Chat.where(active: true).each {|chat|
|
Chat.where(active: true).each {|chat|
|
||||||
assets = chat.assets(assets)
|
assets = chat.assets(assets)
|
||||||
}
|
}
|
||||||
|
active_agent_ids = []
|
||||||
|
active_agents.each {|user|
|
||||||
|
active_agent_ids.push user.id
|
||||||
|
assets = user.assets(assets)
|
||||||
|
}
|
||||||
|
runningchat_session_list_local = running_chat_session_list
|
||||||
|
runningchat_session_list_local.each {|session|
|
||||||
|
next if !session['user_id']
|
||||||
|
user = User.lookup(id: session['user_id'])
|
||||||
|
next if !user
|
||||||
|
assets = user.assets(assets)
|
||||||
|
}
|
||||||
{
|
{
|
||||||
waiting_chat_count: waiting_chat_count,
|
waiting_chat_count: waiting_chat_count,
|
||||||
|
waiting_chat_session_list: waiting_chat_session_list,
|
||||||
running_chat_count: running_chat_count,
|
running_chat_count: running_chat_count,
|
||||||
active_agents: active_agents,
|
running_chat_session_list: runningchat_session_list_local,
|
||||||
|
active_agent_count: active_agent_count,
|
||||||
|
active_agent_ids: active_agent_ids,
|
||||||
seads_available: seads_available,
|
seads_available: seads_available,
|
||||||
seads_total: seads_total,
|
seads_total: seads_total,
|
||||||
active: Chat::Agent.state(user_id),
|
active: Chat::Agent.state(user_id),
|
||||||
|
@ -81,30 +96,35 @@ class Chat < ApplicationModel
|
||||||
|
|
||||||
def self.agent_state_with_sessions(user_id)
|
def self.agent_state_with_sessions(user_id)
|
||||||
return { state: 'chat_disabled' } if !Setting.get('chat')
|
return { state: 'chat_disabled' } if !Setting.get('chat')
|
||||||
assets = {}
|
result = agent_state(user_id)
|
||||||
Chat.where(active: true).each {|chat|
|
result[:active_sessions] = Chat::Session.active_chats_by_user_id(user_id)
|
||||||
assets = chat.assets(assets)
|
result
|
||||||
}
|
|
||||||
{
|
|
||||||
waiting_chat_count: waiting_chat_count,
|
|
||||||
running_chat_count: running_chat_count,
|
|
||||||
active_sessions: Chat::Session.active_chats_by_user_id(user_id),
|
|
||||||
active_agents: active_agents,
|
|
||||||
seads_available: seads_available,
|
|
||||||
seads_total: seads_total,
|
|
||||||
active: Chat::Agent.state(user_id),
|
|
||||||
assets: assets,
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.waiting_chat_count
|
def self.waiting_chat_count
|
||||||
Chat::Session.where(state: ['waiting']).count
|
Chat::Session.where(state: ['waiting']).count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.waiting_chat_session_list
|
||||||
|
sessions = []
|
||||||
|
Chat::Session.where(state: ['waiting']).each {|session|
|
||||||
|
sessions.push session.attributes
|
||||||
|
}
|
||||||
|
sessions
|
||||||
|
end
|
||||||
|
|
||||||
def self.running_chat_count
|
def self.running_chat_count
|
||||||
Chat::Session.where(state: ['running']).count
|
Chat::Session.where(state: ['running']).count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.running_chat_session_list
|
||||||
|
sessions = []
|
||||||
|
Chat::Session.where(state: ['running']).each {|session|
|
||||||
|
sessions.push session.attributes
|
||||||
|
}
|
||||||
|
sessions
|
||||||
|
end
|
||||||
|
|
||||||
def self.active_chat_count
|
def self.active_chat_count
|
||||||
Chat::Session.where(state: %w(waiting running)).count
|
Chat::Session.where(state: %w(waiting running)).count
|
||||||
end
|
end
|
||||||
|
@ -117,10 +137,20 @@ class Chat < ApplicationModel
|
||||||
agents
|
agents
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.active_agents(diff = 2.minutes)
|
def self.active_agent_count(diff = 2.minutes)
|
||||||
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).count
|
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.active_agents(diff = 2.minutes)
|
||||||
|
users = []
|
||||||
|
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).each {|record|
|
||||||
|
user = User.lookup(id: record.updated_by_id)
|
||||||
|
next if !user
|
||||||
|
users.push user
|
||||||
|
}
|
||||||
|
users
|
||||||
|
end
|
||||||
|
|
||||||
def self.seads_total(diff = 2.minutes)
|
def self.seads_total(diff = 2.minutes)
|
||||||
total = 0
|
total = 0
|
||||||
available_agents(diff).each {|_user_id, concurrent|
|
available_agents(diff).each {|_user_id, concurrent|
|
||||||
|
|
Loading…
Reference in a new issue