Browse Source

Dashboard - update data

master
vbarkasov 8 years ago
parent
commit
845097a0ca
1 changed files with 376 additions and 156 deletions
  1. +376
    -156
      app.js

+ 376
- 156
app.js View File

@ -1,6 +1,5 @@
define(function(require){
var $ = require('jquery'),
_ = require('underscore'),
monster = require('monster'),
toastr = require('toastr');
@ -32,12 +31,13 @@ var app = {
},
requests: {
/* move here all unstandart request
'google.getUser': {
apiRoot: 'http://api.google.com/',
url: 'users',
verb: 'PUT'
/*'callcenter.agent_in_queue_status.get': {
url: 'accounts/{accountId}/agents/{agentId}/status', // queue_status
verb: 'GET'
},
'callcenter.agent_in_queue_status.set': {
url: 'accounts/{accountId}/agents/{agentId}/status',
verb: 'POST'
}*/
},
@ -50,7 +50,6 @@ var app = {
},
global_timer: false,
current_queue_id: undefined,
hide_logout: false,
map_timers: {
calls_waiting: {},
@ -136,7 +135,8 @@ var app = {
self.callApi({
resource: 'queues.queue_eavesdrop',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (queue_eavesdrop) {
callback(queue_eavesdrop.data);
@ -158,6 +158,8 @@ var app = {
},*/
poll_agents: function (global_data, _container) {
console.log('Poll agents. Data:');
console.log(global_data);
var self = this,
container = _container,
polling_interval = 6,
@ -172,45 +174,48 @@ var app = {
queues: current_global_data.queues
}); //copy without reference;
if (stop_light_polling === false) {
monster.parallel(
{
queues_livestats: function (callback) {
self.get_queues_livestats(function (_data_live_queues) {
callback(null, _data_live_queues);
monster.parallel({
queues_stats: function (callback) {
self.get_queues_stats(function (data) {
callback(null, data);
});
},
agents_livestats: function (callback) {
self.get_agents_livestats(function (_data_live_agents) {
callback(null, _data_live_agents);
agents_stats: function (callback) {
self.get_agents_stats(function (data) {
callback(null, data);
});
},
agents_status: function (callback) {
self.get_agents_status(function (_data_live_status) {
callback(null, _data_live_status);
self.get_agents_status(function (data) {
callback(null, data);
},
function (_data_live_status) {
function (data) {
callback(null, {});
}
);
}
},
function (err, results) {
console.log('Poll agents. Results:');
console.log(results);
data_template = self.format_live_data(data_template, {
agents_live_stats: results.agents_livestats,
queues_live_stats: results.queues_livestats,
agents_live_status: results.agents_status
agents_stats: results.agents_stats,
queues_stats: results.queues_stats,
agents_status: results.agents_status
});
self.dashboardUpdateAllData(null, data_template, self.vars.queue_id);
}
);
}
},
huge_poll = function () {
console.log('huge_poll');
if ($('#dashboard-content').size() === 0) {
self.clean_timers();
}
else {
} else {
if (++cpt % 30 === 0) {
self.fetch_all_data(function (data) {
self.dashboardUpdateAllData(null, data, self.vars.queue_id);
current_global_data = data;
});
}
@ -227,16 +232,17 @@ var app = {
self.global_timer = setInterval(huge_poll, polling_interval * 1000);
},
get_queues_livestats: function (callback) {
get_queues_stats: function (callback) {
var self = this;
self.callApi({
resource: 'queues.queues_livestats',
resource: 'queues.queues_stats',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (queue_livestats) {
callback(queue_livestats.data);
success: function (data) {
callback(data.data);
}
});
},
@ -247,24 +253,13 @@ var app = {
self.callApi({
resource: 'agents.agents_status',
data: {
accountId: self.accountId
},
success: function (agents_status) {
callback(agents_status.data);
}
});
},
get_agents_livestats: function (callback) {
var self = this;
self.callApi({
resource: 'agents.agents_livestats',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (agents_livestats) {
callback(agents_livestats.data);
success: function (data) {
console.log('Agents status response:');
console.log(data);
callback(data.data);
}
});
},
@ -273,12 +268,15 @@ var app = {
var self = this;
self.callApi({
resource: 'agents.agents_status',
resource: 'agents.agents_stats',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (agents_status) {
callback(agents_status.data);
success: function (data) {
console.log('Agents stats response:');
console.log(data);
callback(data.data);
}
});
},
@ -303,7 +301,8 @@ var app = {
self.callApi({
resource: 'queues.queues_list',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (data) {
callback && callback(data.data);
@ -317,7 +316,8 @@ var app = {
self.callApi({
resource: 'agents.agents_list',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (agents) {
callback(agents.data);
@ -338,11 +338,14 @@ var app = {
},*/
get_time_seconds: function (seconds) {
var seconds = Math.floor(seconds),
hours = Math.floor(seconds / 3600),
seconds = Math.floor(seconds);
var hours = Math.floor(seconds / 3600),
minutes = Math.floor(seconds / 60) % 60,
remaining_seconds = seconds % 60,
display_time = (hours < 10 ? '0' + hours : '' + hours) + ':' + (minutes < 10 ? '0' + minutes : '' + minutes) + ':' + (remaining_seconds < 10 ? '0' + remaining_seconds : '' + remaining_seconds);
display_time = (hours < 10 ? '0' + hours : '' + hours)
+ ':' + (minutes < 10 ? '0' + minutes : '' + minutes)
+ ':' + (remaining_seconds < 10 ? '0' + remaining_seconds : ''
+ remaining_seconds);
return seconds >= 0 ? display_time : '00:00:00';
},
@ -352,7 +355,7 @@ var app = {
var self = this,
current_agents_by_queue = {};
formatted_data.current_timestamp = data.queues_live_stats.current_timestamp;
formatted_data.current_timestamp = data.queues_stats.current_timestamp;
formatted_data.calls_waiting = {};
formatted_data.calls_in_progress = {};
formatted_data.agent_status = {
@ -370,8 +373,8 @@ var app = {
queue.total_wait_time = 0;
});
if(data.agents_live_status) {
$.each(data.agents_live_status, function(k, agent_status) {
if(data.agents_status) {
$.each(data.agents_status, function(k, agent_status) {
if(k in formatted_data.agents) {
if(agent_status.status === 'outbound') {
agent_status.status = 'busy';
@ -428,7 +431,7 @@ var app = {
}
});
$.each(data.agents_live_stats, function(k, agent_stats) {
$.each(data.agents_stats, function(k, agent_stats) {
if(k in formatted_data.agents) {
formatted_data.agents[k].missed_calls = agent_stats.missed_calls || 0;
formatted_data.agents[k].total_calls = agent_stats.total_calls || 0;
@ -447,8 +450,8 @@ var app = {
}
});
if('stats' in data.queues_live_stats) {
$.each(data.queues_live_stats.stats, function(index, queue_stats) {
if('stats' in data.queues_stats) {
$.each(data.queues_stats.stats, function(index, queue_stats) {
var k = queue_stats.queue_id,
call_id = queue_stats.call_id;
@ -496,6 +499,7 @@ var app = {
},
format_data: function(data) {
console.log('format data');
var self = this,
formatted_data = {};
/* Formatting Queues */
@ -548,33 +552,160 @@ var app = {
self.accountId = monster.apps.auth.accountId;
self.clean_timers();
self.dashboardRender(_container);
self.initHeaderSubmenu();
},
dashboardRender: function($container) {
console.log('Dashboard - Render');
var self = this;
self.fetch_all_data(function(data) {
self.dashboardUpdateAllData($container, data, self.vars.queue_id, function(data){
self.poll_agents(data, $container);
});
});
},
var queues_html = $(monster.template(self, 'queues_dashboard', {queues: data.queues}));
var agents_html = $(monster.template(self, 'agents_dashboard', {agents: data.agents}));
var calls_html = $(monster.template(self, 'calls_dashboard', {progress: data.calls_in_progress, waits: data.calls_waiting} ));
dashboardUpdateAllData: function($container, data, queueId, callback) {
console.log('Dashboard - Update all data');
console.log('Queue id:');
console.log(queueId);
var self = this;
$container = $container || $('#monster_content');
var html = $(monster.template(self, 'dashboard', {}));
container.empty().append(html);
var queues_html = $(monster.template(self, 'queues_dashboard', {
queues: data.queues
}));
var scroll_value = $('.topbar-right .list_queues_inner', container).scrollLeft() || 0;
container.find('#dashboard-view').empty().append(agents_html);
container.find('.topbar-right').empty().append(queues_html);
container.find('.topbar-right .list_queues_inner').animate({ scrollLeft: scroll_value }, 0);
container.find('#callwaiting-list').append(calls_html);
var agents_html = $(monster.template(self, 'agents_dashboard', {
agents: data.agents
}));
self.poll_agents(data, container);
(container).empty().append(html);
self.bind_live_events(container);
var calls_html = $(monster.template(self, 'calls_dashboard', {
progress: data.calls_in_progress,
waits: data.calls_waiting
}));
if(typeof queue_id != 'undefined') {
self.detail_stat(queue_id, container);
}
var html = $(monster.template(self, 'dashboard', {}));
$container.empty().append(html);
var scroll_value = $('.topbar-right .list_queues_inner', $container).scrollLeft() || 0;
$container.find('#dashboard-view').empty().append(agents_html);
$container.find('.topbar-right').empty().append(queues_html);
$container.find('.topbar-right .list_queues_inner').animate({ scrollLeft: scroll_value }, 0);
$container.find('#callwaiting-list').append(calls_html);
// self.render_callwaiting_list(dashboard_html);
$container.empty().append(html);
self.bind_live_events($container);
self.render_timers(data);
if(typeof(queueId) !== 'undefined') {
self.detail_stat(queueId, $container);
}
self.dashboardBindEvents($container);
if(typeof(callback) === 'function') {
callback(data);
}
},
self.dashboardBindEvents(container);
self.initHeaderSubmenu();
render_timers: function(data) {
var self = this;
$.each(self.map_timers, function(type, list_timers) {
$.each(list_timers, function(k, v) {
clearInterval(v.timer);
});
});
self.map_timers = {
waiting: {},
in_progress: {}
};
if(data.calls_waiting) {
$.each(data.calls_waiting, function(k, v) {
v.duration = data.current_timestamp - v.entered_timestamp;
self.start_timer('waiting', {data: v, id: k});
});
}
if(data.calls_in_progress) {
$.each(data.calls_in_progress, function(k, v) {
v.duration = data.current_timestamp - v.handled_timestamp;
self.start_timer('in_progress', {data: v, id: v.agent_id});
});
}
if(data.agent_status) {
if('busy' in data.agent_status) {
$.each(data.agent_status.busy, function(agent_id, data_status) {
data_status.duration = data.current_timestamp - data_status.timestamp;
self.start_timer('agent_status', {data: data_status, id: agent_id});
});
}
if('wrapup' in data.agent_status) {
$.each(data.agent_status.wrapup, function(agent_id, data_status) {
data_status.duration = data_status.wait_time - (data.current_timestamp - data_status.timestamp);
self.start_timer('agent_status', {data: data_status, id: agent_id}, 'decrement');
});
}
if('paused' in data.agent_status) {
$.each(data.agent_status.paused, function(agent_id, data_status) {
if('pause_time' in data_status) {
data_status.duration = data_status.pause_time - (data.current_timestamp - data_status.timestamp);
self.start_timer('agent_status', {data: data_status, id: agent_id}, 'decrement');
}
else {
data_status.duration = data.current_timestamp - data_status.timestamp;
self.start_timer('agent_status', {data: data_status, id: agent_id});
}
});
}
}
},
start_timer: function(type, _data, _timer_type) {
var self = this,
$target,
id = _data.id,
data = _data.data,
timer_type = _timer_type || 'increment';
if(type === 'in_progress' || type === 'agent_status') {
$target = $('.agent_wrapper#'+id+' .call_time .data_value');
} else if(type === 'waiting') {
$target = $('.call-waiting[data-call_id="'+id+'"] .timer');
}
if(!self.map_timers[type]) {
self.map_timers[type] = {};
}
self.map_timers[type][id] = data;
self.map_timers[type][id].timer = setInterval(function(){
if($target.size() > 0) {
if(timer_type === 'decrement') {
var new_duration = --self.map_timers[type][id].duration;
$target.html(self.get_time_seconds(new_duration > 0 ? new_duration : 0));
}
else {
if(self.map_timers[type]) {
$target.html(self.get_time_seconds(++self.map_timers[type][id].duration));
}
}
} else {
if(self.map_timers[type][id]) {
clearInterval(self.map_timers[type][id].timer);
delete self.map_timers[type][id];
}
}
}, 1000);
},
dashboardBindEvents: function($container) {
@ -689,7 +820,7 @@ var app = {
connection_timeout: '0',
member_timeout: '5',
agent_wrapup_time: '30',
record_caller: true,
record_caller: false,
moh: {},
notifications: {},
max_queue_size: '0'
@ -728,7 +859,8 @@ var app = {
self.callApi({
resource: 'user.list',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (users) {
callback(null, users.data);
@ -739,7 +871,8 @@ var app = {
self.callApi({
resource: 'media.list',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function(media, status) {
callback(null, media.data);
@ -770,6 +903,8 @@ var app = {
}));
self.vars.users = results.users;
console.log('Users:');
console.log(results.users);
$container.empty().append(html);
self.settingsQueueFormBindEvents($container);
@ -1001,7 +1136,8 @@ var app = {
resource: 'queues.queues_delete',
data: {
accountId: self.accountId,
queuesId: queueId
queuesId: queueId,
generateError: false
},
success: function(data, status) {
if(typeof(callback) === 'function') {
@ -1018,6 +1154,7 @@ var app = {
resource: 'agents.agents_update',
data: {
accountId: self.accountId,
generateError: false,
queuesId: queueId,
data: agentsIdList
},
@ -1092,6 +1229,7 @@ var app = {
resource: 'queues.queues_update',
data: {
accountId: self.accountId,
generateError: false,
queuesId: queueId,
data: queueData
},
@ -1115,6 +1253,7 @@ var app = {
resource: 'queues.queues_create',
data: {
accountId: self.accountId,
generateError: false,
data: queueData
},
success: function(data, status) {
@ -1147,7 +1286,8 @@ var app = {
self.callApi({
resource: 'queues.queues_list',
data: {
accountId: self.accountId
accountId: self.accountId,
generateError: false
},
success: function (data, status) {
console.log(data);
@ -1219,6 +1359,7 @@ var app = {
resource: 'queues.queues_get',
data: {
accountId: self.accountId,
generateError: false,
queuesId: queueId
},
success: function(data, status) {
@ -1231,24 +1372,25 @@ var app = {
},
fetch_all_data: function(callback) {
console.log('Fetch all data');
var self = this;
monster.parallel({
queues_livestats: function(callback) {
self.get_queues_livestats(function(_data_live_queues) {
callback(null, _data_live_queues);
queues_stats: function(callback) {
self.get_queues_stats(function(data) {
callback(null, data);
});
},
agents_livestats: function(callback) {
self.get_agents_livestats(function(_data_live_agents) {
callback(null, _data_live_agents);
agents_stats: function(callback) {
self.get_agents_stats(function(data) {
callback(null, data);
});
},
agents_status: function(callback) {
self.get_agents_status(function(_data_live_status) {
callback(null, _data_live_status);
self.get_agents_status(function(data) {
callback(null, data);
},
function(_data_live_status) {
function(data) {
callback(null, {});
}
);
@ -1268,9 +1410,9 @@ var app = {
var _data = {
queues: results.queues,
agents: results.agents,
agents_live_stats: results.agents_livestats,
queues_live_stats: results.queues_livestats,
agents_live_status: results.agents_status
agents_stats: results.agents_stats,
queues_stats: results.queues_stats,
agents_status: results.agents_status
};
_data = self.format_data(_data);
@ -1285,13 +1427,13 @@ var app = {
var self = this;
// list of queues
$('.list_queues_inner > li', container).on('click', function(event) {
$('.list_queues_inner > li', container).on('click', function(e) {
var $queueEl = $(this);
queue_id = this.id;
var $self_queue = $(self);
self.vars.queue_id = $queueEl.attr('id');
if($self_queue.hasClass('active')) {
self.current_queue_id = undefined;
if($queueEl.hasClass('active')) {
self.vars.queue_id = undefined;
$('.agent_wrapper', container).css('display', 'inline-block');
$('.all_data', container).show();
$('.queue_data', container).hide();
@ -1300,17 +1442,78 @@ var app = {
$('.icon.eavesdrop_queue', container).hide();
$('.list_queues_inner > li', container).removeClass('active');
} else {
self.detail_stat(queue_id, container);
self.detail_stat(self.vars.queue_id, container);
}
});
$('.js-login-to-queue', container).click(function(e) {
e.preventDefault();
var agentId = $(this).closest('.agent_wrapper').attr('id');
self.changeAgentInQueueStatus(agentId, 'login', function(data) {
console.log('Agent login to queue');
console.log(data);
});
});
$('.js-logout-from-queue', container).click(function(e) {
e.preventDefault();
var agentId = $(this).closest('.agent_wrapper').attr('id');
self.changeAgentInQueueStatus(agentId, 'logout', function(data) {
console.log('Agent logout from queue');
console.log(data);
});
});
},
changeAgentInQueueStatus: function(agentId, status, callback) {
var self = this;
if(status !== 'login' && status !== 'logout') {
console.log('Unknown agent status: ' + status);
return;
}
monster.request({
resource: 'agents.agents_toggle',
data: {
accountId: self.accountId,
agentId: agentId,
generateError: false,
data: {
status: 'login'
}
},
success: function (data) {
console.log(data);
if(typeof(callback) === 'function') {
callback(data);
}
monster.request({
resource: 'callcenter.agent_in_queue_status.get',
data: {
accountId: self.accountId,
agentId: agentId,
generateError: false
},
success: function (data) {
console.log(data);
}
});
}
});
},
detail_stat: function(queue_id, container) {
console.log('Detail stat');
console.log('Queue id:');
console.log(queue_id);
var self = this,
$self_queue = $('#'+queue_id, container);
$self_queue = $('#' + queue_id, container);
self.current_queue_id = queue_id;
self.vars.queue_id = queue_id;
$('.list_queues_inner > li', container).removeClass('active');
$self_queue.addClass('active');
@ -1324,72 +1527,89 @@ var app = {
$v.show();
}
});
$('.agent_wrapper', container).each(function(k, v) {
var $v = $(v);
if($v.data('queues').indexOf(queue_id) < 0) {
$v.hide();
} else {
if(!self.hide_logout) {
$v.css('display', 'inline-block');
}
$('.all_data', $v).hide();
$('.queue_stat', $v).hide();
$('.queue_stat[data-id=' + queue_id + ']', $v).show();
$('.queue_data', $v).show();
}
});
},
clean_timers: function() {
var self = this;
if(self.global_timer !== false) {
clearInterval(self.global_timer);
self.global_timer = false;
}
if(self.global_timer !== false) {
clearInterval(self.global_timer);
self.global_timer = false;
}
$.each(self.map_timers, function(type, list_timers) {
$.each(list_timers, function(k, v) {
clearInterval(v.timer);
});
$.each(self.map_timers, function(type, list_timers) {
$.each(list_timers, function(k, v) {
clearInterval(v.timer);
});
});
self.map_timers = {};
},
self.map_timers = {};
},
/*activate_queue_stat: function(args) {
//TODO check render global data
var self = this,
container = args.container || $('#monster-content');
container.empty();
self.render(container, function() {
var $self_queue = $('#'+args.id, container);
self.detail_stat(args.id, container);
});
},*/
/*activate: function(_container) {
var self = this,
container = _container || $('#monster-content');
container.empty();
self.current_queue_id = undefined;
self.hide_logout = false;
//TODO check render global data
self.render(container);
},*/
login: function(agent, callback) {
var self = this,
agentId = $(agent).attr('id');
self.callApi({
resource: 'agents.agents_toggle',
data: {
accountId: self.accountId,
agentId: agentId,
data: {status: 'login'}
}
});
},
activate_queue_stat: function(args) {
//TODO check render global data
var self = this,
container = args.container || $('#monster-content');
container.empty();
self.render(container, function() {
var $self_queue = $('#'+args.id, container);
self.detail_stat(args.id, container);
});
},
logout: function(agent, callback) {
var self = this,
agentId = $(agent).attr('id');
self.callApi({
/*activate: function(_container) {
var self = this,
container = _container || $('#monster-content');
container.empty();
self.current_queue_id = undefined;
self.hide_logout = false;
//TODO check render global data
self.render(container);
},*/
login: function(agent, callback) {
var self = this,
agentId = $(agent).attr('id');
self.callApi({
resource: 'agents.agents_toggle',
data: {
accountId: self.accountId,
generateError: false,
agentId: agentId,
data: {status: 'logout'}
data: {status: 'login'}
}
});
}
};
});
},
logout: function(agent, callback) {
var self = this,
agentId = $(agent).attr('id');
self.callApi({
resource: 'agents.agents_toggle',
data: {
accountId: self.accountId,
agentId: agentId,
generateError: false,
data: {status: 'logout'}
}
});
}};
return app;
});

Loading…
Cancel
Save