Browse Source

Callcenter submodule:

- save queue
- delete queue
- styling
pull/2/head
vbarkasov 8 years ago
parent
commit
5e80a008b2
4 changed files with 121 additions and 174 deletions
  1. +2
    -0
      src/apps/callflows/i18n/en-US.json
  2. +13
    -3
      src/apps/callflows/submodules/callcenter/callcenter.css
  3. +105
    -170
      src/apps/callflows/submodules/callcenter/callcenter.js
  4. +1
    -1
      src/apps/callflows/submodules/user/user.js

+ 2
- 0
src/apps/callflows/i18n/en-US.json View File

@ -1113,6 +1113,7 @@
"name": "Name",
"namePlaceholder": "Name",
"nameDataContent": "Friendly name for this Queue",
"noName": "no name",
"user": "User",
"actions": "Actions",
"addUser": "Add user to the queue",
@ -1125,6 +1126,7 @@
"memberTimeoutPlaceholder": "Member timeout (s)",
"memberTimeoutDataContent": "How long to ring an agent's phone before moving to the next agent",
"delete": "Delete",
"deleteConfirmMessage": "Are you sure you want to delete this queue?",
"save": "Save",
"thereIsCurrentlyNoUser": "There is currently no user in this queue",
"userLabel": "Users list"


+ 13
- 3
src/apps/callflows/submodules/callcenter/callcenter.css View File

@ -1,8 +1,18 @@
.callflows-port #queue-form .users-table {
max-width: 450px;
.callflows-port #queue-form .users-table,
.callflows-port #queue-form .add-user-panel {
max-width: 400px;
}
.callflows-port #queue-form .users-table tr th:nth-child(2),
.callflows-port #queue-form .users-table tr td:nth-child(2) {
width: 64px;
text-align: center;
}
.callflows-port #queue-form .add-user-panel {
width: 100%;
max-width: 450px;
}
.callflows-port .add-user-panel .callflow-panel_body {
text-align: center;
}

+ 105
- 170
src/apps/callflows/submodules/callcenter/callcenter.js View File

@ -77,10 +77,9 @@ define(function(require){
},
subscribe: {
//'callflows.queue.activate': 'activate', // TODO
'callflows.queue.edit': 'queueEdit',
'callflows.fetchActions': 'callcenterDefineActions',
'callflows.queue.popupEdit': 'queuePopupEdit'
'callflows.queue.editPopup': 'queuePopupEdit',
'callflows.queue.edit': 'queueEdit'
},
@ -367,7 +366,7 @@ define(function(require){
_callbacks = args.callbacks || {},
callbacks = {
save_success: _callbacks.save_success || function(_data) {
// self.queueRenderList(parent);
self.queueRenderList(parent);
self.queueEdit({
data: {
@ -384,7 +383,7 @@ define(function(require){
delete_success: _callbacks.delete_success || function() {
target.empty();
//self.queueRenderList(parent);
self.queueRenderList(parent);
},
delete_error: _callbacks.delete_error,
@ -409,31 +408,23 @@ define(function(require){
defaults.field_data.users = users;
if(typeof data == 'object' && data.id) {
self.queueGet(data.id, function (queueData) {
var render_data = $.extend(true, defaults, queueData);
monster.request({
resource: 'callcenter.queues.get',
data: {
accountId: self.accountId,
queuesId: data.id,
generateError: false
},
success: function (_data) {
var render_data = $.extend(true, defaults, _data);
render_data.field_data.old_list = [];
if('agents' in _data.data) {
render_data.field_data.old_list = _data.data.agents;
}
self.queueRender(render_data, target, callbacks);
render_data.field_data.old_list = [];
if('agents' in queueData.data) {
render_data.field_data.old_list = queueData.data.agents;
}
self.queueRender(render_data, target, callbacks);
if(typeof callbacks.after_render == 'function') {
callbacks.after_render();
}
if(typeof(callbacks.after_render) === 'function') {
callbacks.after_render();
}
});
} else {
self.queueRender(defaults, target, callbacks);
if(typeof callbacks.after_render == 'function') {
if(typeof(callbacks.after_render) === 'function') {
callbacks.after_render();
}
}
@ -457,7 +448,7 @@ define(function(require){
});
},
queueRenderList: function(_parent){
queueRenderList: function(_parent, callback){
var self = this,
parent = _parent || $('#queue-content'),
i18nApp = self.i18n.active().callflows.callcenter;
@ -470,7 +461,7 @@ define(function(require){
$.each(data, function(key, val) {
new_list.push({
id: val.id,
title: val.name || _t('voip_queue', 'no_name')
title: val.name || i18nApp.noName
});
});
}
@ -482,20 +473,7 @@ define(function(require){
return new_list;
};
// TODO!
/*$('#queue-listpanel', parent)
.empty()
.listpanel({
label: i18nApp.queues_label,
identifier: 'queue-listview',
new_entity_label: i18nApp.add_queue_label,
data: map_crossbar_data(data.data),
publisher: winkstart.publish,
notifyMethod: 'queue.edit',
notifyCreateMethod: 'queue.edit',
notifyParent: parent
});*/
callback && callback();
});
},
@ -514,17 +492,23 @@ define(function(require){
});
},
// TODO
/*activate: function(parent) {
var self = this,
queue_html = $(monster.template(self, 'callcenter-queue'));
(parent || $('#monster_content'))
.empty()
.append(queue_html);
queueGet: function(queueId, callback) {
var self = this;
monster.request({
resource: 'callcenter.queues.get',
data: {
accountId: self.accountId,
queuesId: queueId,
generateError: false
},
success: function (_data) {
if(typeof(callback) === 'function') {
callback(_data);
}
}
});
},
self.queueRenderList(queue_html);
},*/
queueRender: function(data, target, callbacks) {
var self = this;
@ -547,20 +531,21 @@ define(function(require){
ev.preventDefault();
if(monster.ui.valid($form)) {
var form_data = monster.ui.getFormData($form);
var form_data = monster.ui.getFormData($form[0]);
var new_list = [];
var agentsList = [];
$('.rows .row:not(#row_no_data)', queue_html).each(function() {
new_list.push($(this).dataset('id'));
$('.js-user-table-item:not(#row_no_data)', queue_html).each(function() {
agentsList.push($(this).data('id'));
});
data.field_data.user_list = {
old_list: data.data.agents || [],
new_list: new_list
new_list: agentsList
};
self.queueSave(form_data, data, callbacks.save_success, callbacks.save_error);
} else {
toastr.error(self.i18n.active().callflows.callcenter.formHasErrorsMessage);
}
@ -630,11 +615,30 @@ define(function(require){
target.empty().append(queue_html);
},
agentsSave: function(queueId, agentsIdList, callback) {
var self = this;
monster.request({
resource: 'callcenter.agents.update',
data: {
accountId: self.accountId,
generateError: false,
queuesId: queueId,
data: agentsIdList
},
success: function(data) {
if(typeof(callback) === 'function' && data.data) {
callback(data.data);
}
}
});
},
queueDelete: function(data, success, error) {
var self = this;
if(typeof data.data == 'object' && data.data.id) {
self.callApi({
monster.request({
resource: 'callcenter.queues.delete',
data: {
accountId: self.accountId,
@ -686,146 +690,77 @@ define(function(require){
var self = this,
normalized_data = self.normalizeData($.extend(true, {}, data.data, form_data));
if (typeof data.data == 'object' && data.data.id) {
monster.request({
resource: 'callcenter.queues.update',
data: {
accountId: self.accountId,
queuesId: data.id,
generateError: false,
data: normalized_data
},
success: function (_data, status) {
if(typeof success == 'function') {
self.usersUpdate(data.field_data.user_list, _data.data.id, function() {
success(_data, status, 'update');
});
}
},
error: function(_data, status) {
if(typeof error == 'function') {
error(_data, status, 'update');
if(typeof data.data == 'object' && data.data.id) {
var queueId = data.data.id;
self.queueUpdate(queueId, normalized_data, function(queueData) {
self.agentsSave(queueId, data.field_data.user_list.new_list, function(agentsData) {
queueData.agents = agentsData.agents;
if(typeof(success) === 'function') {
success(queueData);
}
}
});
});
} else {
monster.request({
resource: 'callcenter.queues.create',
data: {
accountId: self.accountId,
generateError: false,
data: normalized_data
},
success: function (_data, status) {
if(typeof success == 'function') {
self.usersUpdate(data.field_data.user_list, _data.data.id, function() {
success(_data, status, 'create');
});
self.queueCreate(normalized_data, function(queueData){
self.agentsSave(queueData.id, data.field_data.user_list.new_list, function(agentsData) {
queueData.agents = agentsData.agents;
if(typeof(success) === 'function') {
success(queueData);
}
},
error: function(_data, status) {
if(typeof error == 'function') {
error(_data, status, 'update');
}
}
});
});
}
},
usersUpdate: function(data, queue_id, success) {
var old_queue_user_list = data.old_list,
new_queue_user_list = data.new_list,
self = this,
users_updated_count = 0,
users_count = 0,
callback = function() {
users_updated_count++;
if(users_updated_count >= users_count) {
success();
}
};
queueUpdate: function(queueId, data, success, error){
var self = this;
if(old_queue_user_list) {
$.each(old_queue_user_list, function(k, v) {
if(new_queue_user_list.indexOf(v) === -1) {
//Request to update user without this queue.
users_count++;
self.singleUserUpdate(v, queue_id, 'remove', callback);
monster.request({
resource: 'callcenter.queues.update',
data: {
accountId: self.accountId,
queuesId: queueId,
generateError: false,
data: data
},
success: function (data) {
if(typeof(success) === 'function' && data.data) {
success(data.data);
}
});
$.each(new_queue_user_list, function(k, v) {
if(old_queue_user_list.indexOf(v) === -1) {
users_count++;
self.singleUserUpdate(v, queue_id, 'add', callback);
},
error: function(data) {
if(typeof(error) === 'function') {
error(data);
}
});
} else {
if(new_queue_user_list) {
$.each(new_queue_user_list, function(k, v) {
users_count++;
self.singleUserUpdate(v, queue_id, 'add', callback);
});
}
}
/* If no users has been updated, we still need to refresh the view for the other attributes */
if(users_count == 0) {
success();
}
});
},
singleUserUpdate: function(user_id, queue_id, action, callback) {
queueCreate: function(data, success, error){
var self = this;
self.callApi({
resource: 'user.get',
monster.request({
resource: 'callcenter.queues.create',
data: {
accountId: self.accountId,
userId: user_id,
generateError: false
generateError: false,
data: data
},
success: function(_data, status) {
if(action =='add') {
if(!_data.data.queues || typeof _data.data.queues != 'object') {
_data.data.queues = [];
}
_data.data.queues.push(queue_id);
/* If a user is added to a queue, but is not enabled as an agent, we enable this user automatically */
if(!('queue_pin' in _data.data)) {
_data.data.queue_pin = '';
}
} else { //remove
_data.data.queues.splice(_data.data.queues.indexOf(queue_id), 1);
success: function (_data) {
if(typeof(success) === 'function') {
success(_data.data);
}
},
error: function(_data) {
if(typeof(error) === 'function') {
error(_data);
}
self.callApi({
resource: 'user.update',
data: {
accountId: self.accountId,
userId: user_id,
data: _data.data,
generateError: false
},
success: function(_data, status) {
if(typeof callback === 'function') {
callback(status);
}
},
error: function(_data, status) {
if(typeof callback === 'function') {
callback(status);
}
}
});
}
});
},
normalizeData: function(form_data) {
delete form_data.users;
delete form_data.user_id;
return form_data;
}
};


+ 1
- 1
src/apps/callflows/submodules/user/user.js View File

@ -294,7 +294,7 @@ define(function(require){
},
hotdesk: {},
contact_list: {
exclude: false,
exclude: false
},
priv_level: 'user',
music_on_hold: {},


Loading…
Cancel
Save