You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1530 lines
44 KiB

define(function(require){
var $ = require('jquery'),
_ = require('lodash'),
monster = require('monster');
var app = {
requests: {},
subscribe: {
'callflows.fetchActions': 'groupsDefineActions',
'callflows.groups.edit': '_groupsEdit',
},
groupsRender: function(data, target, callbacks){
var self = this,
groups_html = $(monster.template(self, 'groups-edit', data)),
groupForm = groups_html.find('#group-form');
monster.ui.validate(groupForm, {
rules: {
'name': {
required: true
}
}
});
self.winkstartTabs(groups_html);
$('#tab_users > .rows', groups_html).sortable({
handle: '.column.first'
});
self.groupsRenderEndpointList(data, groups_html);
$('.group-save', groups_html).click(function(ev) {
ev.preventDefault();
var $this = $(this);
if(!$this.hasClass('disabled')) {
$this.addClass('disabled');
if(monster.ui.valid(groupForm)) {
var form_data = monster.ui.getFormData('group-form');
self.groupsCleanFormData(form_data, data.field_data);
form_data.endpoints = {};
$('.rows .row:not(#row_no_data)', groups_html).each(function(k, v) {
form_data.endpoints[$(v).data('id')] = {
type: $(v).data('type'),
weight: k+1
};
});
delete data.data.resources;
delete data.data.endpoints;
self.groupsSave(form_data, data, callbacks.save_success);
}
else {
$this.removeClass('disabled');
monster.ui.alert(self.i18n.active().callflows.groups.there_were_errors_on_the_form);
}
}
});
$('.group-delete', groups_html).click(function(ev) {
ev.preventDefault();
monster.ui.confirm(self.i18n.active().callflows.groups.are_you_sure_you_want_to_delete, function() {
self.groupsDelete(data, callbacks.delete_success);
});
});
var add_user = function() {
var $user = $('#select_user_id', groups_html);
if($user.val() != 'empty_option_user') {
var user_id = $user.val();
$.each(data.field_data.users, function(k, v) {
if(user_id === v.id) {
var user_data = {
endpoint_id: user_id,
endpoint_type: 'user',
endpoint_name: v.first_name + ' ' + v.last_name,
};
data.data.endpoints.push(user_data);
data.data.endpoints.sort(function(a,b){
return a.endpoint_name.toLowerCase() > b.endpoint_name.toLowerCase();
});
self.groupsRenderEndpointList(data, groups_html);
$user.val('empty_option_user');
}
});
}
},
add_device = function() {
var $device = $('#select_device_id', groups_html);
if($device.val() != 'empty_option_device') {
var device_id = $device.val();
$.each(data.field_data.devices, function(k, v){
if(device_id === v.id) {
var device_data = {
endpoint_id: device_id,
endpoint_type: 'device',
endpoint_name: v.name,
};
data.data.endpoints.push(device_data);
data.data.endpoints.sort(function(a,b){
return a.endpoint_name.toLowerCase() > b.endpoint_name.toLowerCase();
});
self.groupsRenderEndpointList(data, groups_html);
$device.val('empty_option_device');
}
});
}
};
$('#select_user_id', groups_html).change(function() {
add_user();
});
$('#select_device_id', groups_html).change(function() {
add_device();
});
groups_html.find('#group-form').on('click', '.action_endpoint.delete', function() {
var endpoint_id = $(this).data('id');
//removes it from the grid
$('#row_endpoint_'+endpoint_id, groups_html).remove();
//re-add it to the dropdown
$('#option_endpoint_'+endpoint_id, groups_html).show();
//if grid empty, add no data line
if($('.rows .row', groups_html).size() === 0) {
$('.rows', groups_html).append(monster.template(self, 'groups-endpoint_row'));
}
/* TODO For some reason splice doesn't work and I don't have time to make it better for now */
var new_list = [];
$.each(data.data.endpoints, function(k, v) {
if(!(v.endpoint_id === endpoint_id)) {
new_list.push(v);
}
});
data.data.endpoints = new_list;
});
(target)
.empty()
.append(groups_html);
},
// Added for the subscribed event to avoid refactoring mediaEdit
_groupsEdit: function(args) {
var self = this;
self.groupsEdit(args.data, args.parent, args.target, args.callbacks, args.data_defaults);
},
groupsEdit: function(data, _parent, _target, _callbacks, data_defaults){
var self = this,
parent = _parent || $('#groups-content'),
target = _target || $('#groups-view', parent),
callbacks = {
save_success: _callbacks.save_success,
save_error: _callbacks.save_error,
delete_success: _callbacks.delete_success,
delete_error: _callbacks.delete_error,
after_render: _callbacks.after_render
},
defaults = {
data: $.extend(true, {
endpoints: {},
music_on_hold: {}
}, data_defaults || {}),
field_data: {}
};
monster.parallel({
'device_list': function(callback) {
self.getAll({
resource: 'device.list',
data: {
accountId: self.accountId
},
success: function(data) {
defaults.field_data.devices = data.data;
callback(null, data)
}
});
},
'user_list': function(callback) {
self.getAll({
resource: 'user.list',
data: {
accountId: self.accountId
},
success: function(data) {
defaults.field_data.users = data.data;
callback(null, data)
}
});
},
'groups_get': function(callback) {
if(typeof data === 'object' && data.id) {
self.callApi({
resource: 'group.get',
data: {
accountId: self.accountId,
groupId: data.id
},
success: function(data) {
callback(null, data)
}
});
}
else {
callback(null, {});
}
},
},
function(err, results) {
var render_data = defaults;
if(typeof data === 'object' && data.id) {
render_data = $.extend(true, defaults, results.groups_get);
}
render_data = self.groupsFormatData(render_data);
self.groupsRender(render_data, target, callbacks);
}
);
},
groupsRenderEndpointList: function(data, parent) {
var self = this;
$('.rows', parent).empty();
if('endpoints' in data.data && data.data.endpoints.length > 0) {
$.each(data.data.endpoints, function(k, item){
$('.rows', parent).append(monster.template(self, 'groups-endpoint_row', item));
$('#option_endpoint_'+item.endpoint_id, parent).hide();
});
}
else {
$('.rows', parent).empty()
.append(monster.template(self, 'groups-endpoint_row'));
}
},
groupsCleanFormData: function(form_data, field_data) {
delete form_data.extra;
},
groupsFormatData: function(data) {
var user_item,
endpoint_item,
list_endpoint = [];
$.each(data.field_data.users, function(k, v) {
if(v.id in data.data.endpoints) {
endpoint_item = {
endpoint_type: 'user',
endpoint_id: v.id,
endpoint_name: v.first_name + ' ' + v.last_name,
endpoint_weight: data.data.endpoints[v.id].weight || 0
};
list_endpoint.push(endpoint_item);
}
});
$.each(data.field_data.devices, function(k, v) {
if(v.id in data.data.endpoints) {
endpoint_item = {
endpoint_type: 'device',
endpoint_id: v.id,
endpoint_name: v.name,
endpoint_weight: data.data.endpoints[v.id].weight || 0
};
list_endpoint.push(endpoint_item);
}
});
list_endpoint.sort(function(a,b){
return a.endpoint_weight - b.endpoint_weight;
});
data.data.endpoints = list_endpoint;
return data;
},
groupsDefineActions: function(args) {
var self = this,
callflow_nodes = args.actions;
$.extend(callflow_nodes, {
'ring_group[]': {
name: self.i18n.active().oldCallflows.ring_group,
icon: 'users',
category: self.i18n.active().oldCallflows.basic_cat,
module: 'ring_group',
tip: self.i18n.active().oldCallflows.ring_group_tip,
data: {
name: ''
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 20,
caption: function(node, caption_map) {
return node.getMetadata('name') || '';
},
edit: function(node, callback) {
self.groupsEditRingGroup(node, callback);
}
},
'groups': {
name: self.i18n.active().callflows.groups.title,
module: 'groups',
listEntities: function(callback) {
self.callApi({
resource: 'group.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data, status) {
callback && callback(data.data);
}
});
},
editEntity: 'callflows.groups.edit'
},
'page_group[]': {
name: self.i18n.active().oldCallflows.page_group,
icon: 'users',
category: self.i18n.active().oldCallflows.advanced_cat,
module: 'page_group',
tip: self.i18n.active().oldCallflows.page_group_tip,
data: {
name: ''
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 30,
caption: function(node, caption_map) {
return node.getMetadata('name') || '';
},
edit: function(node, callback) {
self.groupsEditPageGroup(node, callback);
}
},
/*'eavesdrop[]': {
name: self.i18n.active().callflows.eavesdrop.name,
icon: 'headset',
category: self.i18n.active().oldCallflows.advanced_cat,
module: 'eavesdrop',
tip: self.i18n.active().callflows.eavesdrop.tip,
data: {},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 48,
caption: function(node) {
return '';
},
edit: function(node, callback) {
self.groupsGetEndpoints(function(formattedData) {
var popup, popup_html;
popup_html = $(monster.template(self, 'misc-eavesdrop', {
fieldData: formattedData,
data: {
'selectedId': node.getMetadata('device_id') || node.getMetadata('user_id') || '',
'approvedId': node.getMetadata('approved_device_id') || node.getMetadata('approved_user_id') || node.getMetadata('approved_group_id') || ''
}
}));
monster.ui.tooltips(popup_html);
$('#add', popup_html).click(function() {
var setData = function(field, value) {
if (value === 'endpoint_empty') {
node.deleteMetadata('user_id');
node.deleteMetadata('device_id');
} else if (value === 'approved_empty') {
node.deleteMetadata('approved_user_id');
node.deleteMetadata('approved_group_id');
node.deleteMetadata('approved_device_id');
} else {
node.setMetadata(field, value);
}
};
var endpointField = $('#endpoint_selector option:selected').data('type') + '_id',
endpointVal = $('#endpoint_selector option:selected').val(),
approvedEndpointField = 'approved_' + $('#approved_endpoint_selector option:selected').data('type') + '_id',
approvedEndpointVal = $('#approved_endpoint_selector option:selected').val();
setData(endpointField, endpointVal);
setData(approvedEndpointField, approvedEndpointVal);
popup.dialog('close');
});
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().callflows.eavesdrop.title,
beforeClose: function() {
if (typeof callback === 'function') {
callback();
}
}
});
});
}
},*/
/*'intercept[]': {
name: self.i18n.active().callflows.intercept.name,
icon: 'uturn_arrow',
category: self.i18n.active().oldCallflows.advanced_cat,
module: 'intercept',
tip: self.i18n.active().callflows.intercept.tip,
data: {},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 48,
caption: function(node) {
return '';
},
edit: function(node, callback) {
self.groupsGetEndpoints(function(formattedData) {
var popup, popup_html;
popup_html = $(monster.template(self, 'misc-intercept', {
fieldData: formattedData,
data: {
'selectedId': node.getMetadata('device_id') || node.getMetadata('user_id') || '',
'approvedId': node.getMetadata('approved_device_id') || node.getMetadata('approved_user_id') || node.getMetadata('approved_group_id') || ''
}
}));
monster.ui.tooltips(popup_html);
$('#add', popup_html).click(function() {
var setData = function(field, value) {
if (value === 'endpoint_empty') {
node.deleteMetadata('user_id');
node.deleteMetadata('device_id');
} else if (value === 'approved_empty') {
node.deleteMetadata('approved_user_id');
node.deleteMetadata('approved_group_id');
node.deleteMetadata('approved_device_id');
} else {
node.setMetadata(field, value);
}
};
var endpointField = $('#endpoint_selector option:selected').data('type') + '_id',
endpointVal = $('#endpoint_selector option:selected').val(),
approvedEndpointField = 'approved_' + $('#approved_endpoint_selector option:selected').data('type') + '_id',
approvedEndpointVal = $('#approved_endpoint_selector option:selected').val();
setData(endpointField, endpointVal);
setData(approvedEndpointField, approvedEndpointVal);
popup.dialog('close');
});
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().callflows.intercept.title,
beforeClose: function() {
if (typeof callback === 'function') {
callback();
}
}
});
});
}
},*/
'ring_group_toggle[action=login]': {
name: self.i18n.active().callflows.ringGroupToggle.loginTitle,
icon: 'users',
category: self.i18n.active().callflows.ringGroupToggle.category,
module: 'ring_group_toggle',
tip: self.i18n.active().callflows.ringGroupToggle.loginTip,
data: {
action: 'login',
callflow_id: 'null'
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 1,
caption: function(node, caption_map) {
var id = node.getMetadata('callflow_id'),
return_value = '';
if (id in caption_map) {
if (caption_map[id].hasOwnProperty('name')) {
return_value = caption_map[id].name;
} else if (caption_map[id].hasOwnProperty('numbers')) {
return_value = caption_map[id].numbers.toString();
}
}
return return_value;
},
edit: function(node, callback) {
self.callApi({
resource: 'callflow.list',
data: {
accountId: self.accountId,
filters: { paginate: false }
},
success: function(data, status) {
var popup, popup_html, _data = [];
$.each(data.data, function() {
if (!this.featurecode && this.id !== self.flow.id) {
this.name = this.name ? this.name : ((this.numbers) ? this.numbers.toString() : self.i18n.active().oldCallflows.no_numbers);
_data.push(this);
}
});
popup_html = $(monster.template(self, 'groups-ring_group_login_dialog', {
objects: {
type: 'callflow',
items: _.sortBy(_data, 'name'),
selected: node.getMetadata('callflow_id') || ''
}
}));
$('#add', popup_html).click(function() {
node.setMetadata('callflow_id', $('#object-selector', popup_html).val());
node.caption = $('#object-selector option:selected', popup_html).text();
popup.dialog('close');
});
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().oldCallflows.callflow_title,
beforeClose: function() {
if (typeof callback === 'function') {
callback();
}
}
});
}
});
}
},
'ring_group_toggle[action=logout]': {
name: self.i18n.active().callflows.ringGroupToggle.logoutTitle,
icon: 'users',
category: self.i18n.active().callflows.ringGroupToggle.category,
module: 'ring_group_toggle',
tip: self.i18n.active().callflows.ringGroupToggle.logoutTip,
data: {
action: 'logout',
callflow_id: 'null'
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 2,
caption: function(node, caption_map) {
var id = node.getMetadata('callflow_id'),
return_value = '';
if (id in caption_map) {
if (caption_map[id].hasOwnProperty('name')) {
return_value = caption_map[id].name;
} else if (caption_map[id].hasOwnProperty('numbers')) {
return_value = caption_map[id].numbers.toString();
}
}
return return_value;
},
edit: function(node, callback) {
self.callApi({
resource: 'callflow.list',
data: {
accountId: self.accountId,
filters: { paginate: false }
},
success: function(data, status) {
var popup, popup_html, _data = [];
$.each(data.data, function() {
if (!this.featurecode && this.id !== self.flow.id) {
this.name = this.name ? this.name : ((this.numbers) ? this.numbers.toString() : self.i18n.active().oldCallflows.no_numbers);
_data.push(this);
}
});
popup_html = $(monster.template(self, 'groups-ring_group_logout_dialog', {
objects: {
type: 'callflow',
items: _.sortBy(_data, 'name'),
selected: node.getMetadata('callflow_id') || ''
}
}));
$('#add', popup_html).click(function() {
node.setMetadata('callflow_id', $('#object-selector', popup_html).val());
node.caption = $('#object-selector option:selected', popup_html).text();
popup.dialog('close');
});
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().oldCallflows.callflow_title,
beforeClose: function() {
if (typeof callback === 'function') {
callback();
}
}
});
}
});
}
}
});
},
groupsGetEndpoints: function(callback) {
var self = this;
monster.parallel({
'group': function(callback) {
self.groupsGroupList(function(data) {
callback(null, data);
});
},
'user': function(callback) {
self.groupsUserList(function(data) {
callback(null, data);
});
},
'device': function(callback) {
self.groupsDeviceList(function(data) {
callback(null, data);
});
}
}, function(err, results) {
var data = self.groupsFormatEndpoints(results);
callback(data);
});
},
groupsFormatEndpoints: function(data) {
_.each(data.user, function(user) {
user.name = user.first_name + ' ' + user.last_name;
});
return data;
},
groupsEditPageGroup: function(node, callback) {
var self = this;
self.groupsDeviceList(function(data) {
var popup, popup_html, index, endpoints,
selected_endpoints = {},
unselected_endpoints = [],
unselected_groups = [],
unselected_devices = [],
unselected_users = [];
if(endpoints = node.getMetadata('endpoints')) {
// We need to translate the endpoints to prevent nasty O(N^2) time complexities,
// we also need to clone to prevent managing of objects
$.each($.extend(true, {}, endpoints), function(i, obj) {
obj.name = 'Undefined Device';
selected_endpoints[obj.id] = obj;
});
}
$.each(data, function(i, obj) {
obj.endpoint_type = 'device';
if(obj.id in selected_endpoints) {
selected_endpoints[obj.id].endpoint_type = 'device';
selected_endpoints[obj.id].owner_id = obj.owner_id;
selected_endpoints[obj.id].name = obj.name;
}
else {
unselected_devices.push(obj);
}
});
unselected_devices = _.sortBy(unselected_devices, 'name');
self.groupsGroupList(function(_data) {
$.each(_data, function(i, obj) {
obj.endpoint_type = 'group';
if(obj.id in selected_endpoints) {
selected_endpoints[obj.id].endpoint_type = 'group',
selected_endpoints[obj.id].name = obj.name;
}
else {
unselected_groups.push(obj);
}
});
unselected_groups = _.sortBy(unselected_groups, 'name');
self.groupsUserList(function(_data) {
$.each(_data, function(i, obj) {
obj.name = obj.first_name + ' ' + obj.last_name;
obj.endpoint_type = 'user';
if(obj.id in selected_endpoints) {
selected_endpoints[obj.id].endpoint_type = 'user',
selected_endpoints[obj.id].name = obj.name;
}
else {
unselected_users.push(obj);
}
});
unselected_users = _.sortBy(unselected_users, 'name');
popup_html = $(monster.template(self, 'groups-page_group_dialog', {
form: {
name: node.getMetadata('name') || '',
audio: node.getMetadata('audio') || 'one-way'
}
}));
$.each(unselected_groups, function() {
$('#groups_pane .connect.left', popup_html).append($(monster.template(self, 'groups-page_group_element', this)));
});
$.each(unselected_devices, function() {
$('#devices_pane .connect.left', popup_html).append($(monster.template(self, 'groups-page_group_element', this)));
});
$.each(unselected_users, function() {
$('#users_pane .connect.left', popup_html).append($(monster.template(self, 'groups-page_group_element', this)));
});
$.each(selected_endpoints, function() {
//Check if user/device exists.
if(this.endpoint_type) {
$('.connect.right', popup_html).append($(monster.template(self, 'groups-page_group_element', this)));
}
});
$('#name', popup_html).bind('keyup blur change', function() {
$('.column.right .title', popup_html).html('Page Group - ' + $(this).val());
});
$('ul.settings1 > li > a', popup_html).click(function(item) {
$('.pane_content', popup_html).hide();
//Reset Search field
$('.searchfield', popup_html).val('');
$('.column.left li', popup_html).show();
$('ul.settings1 > li', popup_html).removeClass('current');
var tab_id = $(this).attr('id');
if(tab_id === 'users_tab_link') {
$('#users_pane', popup_html).show();
}
else if(tab_id === 'devices_tab_link') {
$('#devices_pane', popup_html).show();
}
else if(tab_id === 'groups_tab_link') {
$('#groups_pane', popup_html).show();
}
$(this).parent().addClass('current');
});
$('.searchsubmit2', popup_html).click(function() {
$('.searchfield', popup_html).val('');
$('.column li', popup_html).show();
});
$('#devices_pane .searchfield', popup_html).keyup(function() {
$('#devices_pane .column.left li').each(function() {
if($('.item_name', $(this)).html().toLowerCase().indexOf($('#devices_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$(this).hide();
}
else {
$(this).show();
}
});
});
$('#users_pane .searchfield', popup_html).keyup(function() {
$('#users_pane .column.left li').each(function() {
if($('.item_name', $(this)).html().toLowerCase().indexOf($('#users_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$(this).hide();
}
else {
$(this).show();
}
});
});
$('#groups_pane .searchfield', popup_html).keyup(function() {
$('#groups_pane .column.left li').each(function() {
if($('.item_name', $(this)).html().toLowerCase().indexOf($('#groups_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$(this).hide();
}
else {
$(this).show();
}
});
});
if($.isEmptyObject(selected_endpoints)) {
$('.column.right .connect', popup_html).addClass('no_element');
}
else {
$('.column.right .connect', popup_html).removeClass('no_element');
}
$('.column.left .options', popup_html).hide();
$('.column.left .actions', popup_html).hide();
$('.options .option.delay', popup_html).bind('keyup', function() {
$(this).parents('li').data('delay', $(this).val());
});
$('.options .option.timeout', popup_html).bind('keyup', function() {
$(this).parents('li').data('timeout', $(this).val());
});
$('#save_ring_group', popup_html).click(function() {
var name = $('#name', popup_html).val();
var audio = $('#audio', popup_html).val();
endpoints = [];
$('.right .connect li', popup_html).each(function() {
var item_data = $(this).data();
delete item_data.owner_id;
endpoints.push(item_data);
});
node.setMetadata('endpoints', endpoints);
node.setMetadata('name', name);
node.setMetadata('audio', audio);
node.caption = name;
popup.dialog('close');
});
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().oldCallflows.page_group_title,
beforeClose: function() {
if(typeof callback == 'function') {
callback();
}
}
});
// $('.scrollable', popup).jScrollPane({
// horizontalDragMinWidth: 0,
// horizontalDragMaxWidth: 0
// });
$('.connect', popup).sortable({
connectWith: $('.connect.right', popup),
zIndex: 2000,
helper: 'clone',
appendTo: $('.wrapper', popup),
scroll: false,
tolerance: 'pointer',
receive: function(ev, ui) {
var data = ui.item[0].dataset,
list_li = [],
confirm_text;
if(data.endpoint_type === 'device') {
confirm_text = self.i18n.active().oldCallflows.the_owner_of_this_device_is_already;
$('.connect.right li', popup_html).each(function() {
if($(this).data('id') === data.owner_id) {
list_li.push($(this));
}
});
}
else if(data.endpoint_type === 'user') {
confirm_text = self.i18n.active().oldCallflows.this_user_has_already_some_devices;
$('.connect.right li', popup_html).each(function() {
if($(this).data('owner_id') === data.id) {
list_li.push($(this));
}
});
}
if(list_li.length > 0) {
monster.ui.confirm(confirm_text,
function() {
$.each(list_li, function() {
remove_element(this);
});
},
function() {
remove_element(ui.item);
}
);
}
if($(this).hasClass('right')) {
$('.options', ui.item).show();
$('.actions', ui.item).show();
//$('.item_name', ui.item).addClass('right');
$('.column.right .connect', popup).removeClass('no_element');
}
}
});
$(popup_html).delegate('.trash', 'click', function() {
var $parent_li = $(this).parents('li').first();
remove_element($parent_li);
});
$('.pane_content', popup_html).hide();
$('#users_pane', popup_html).show();
var remove_element = function(li) {
var $parent_li = li;
var data = $parent_li.data();
data.name = jQuery.trim($('.item_name', $parent_li).html());
$('#'+data.endpoint_type+'s_pane .connect.left', popup_html).append($(monster.template(self, 'groups-page_group_element', data)));
$parent_li.remove();
if($('.connect.right li', popup_html).size() == 0) {
$('.column.right .connect', popup).addClass('no_element');
}
if(data.name.toLowerCase().indexOf($('#'+data.endpoint_type+'s_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$('#'+data.id, popup_html).hide();
}
};
});
});
});
},
groupsEditRingGroup: function(node, callback) {
var self = this,
default_timeout = '20',
default_delay = '0';
self.groupsDeviceList(function(data) {
var popup, popup_html, index, endpoints,
selected_endpoints = {},
unselected_endpoints = [],
unselected_groups = [],
unselected_devices = [],
unselected_users = [];
if(endpoints = node.getMetadata('endpoints')) {
// We need to translate the endpoints to prevent nasty O(N^2) time complexities,
// we also need to clone to prevent managing of objects
$.each($.extend(true, {}, endpoints), function(i, obj) {
obj.name = self.i18n.active().oldCallflows.undefined_device;
selected_endpoints[obj.id] = obj;
});
}
$.each(data, function(i, obj) {
obj.endpoint_type = 'device';
if(obj.id in selected_endpoints) {
selected_endpoints[obj.id].endpoint_type = 'device';
selected_endpoints[obj.id].owner_id = obj.owner_id;
selected_endpoints[obj.id].name = obj.name;
}
else {
obj.delay = default_delay;
obj.timeout = default_timeout;
unselected_devices.push(obj);
}
});
unselected_devices = _.sortBy(unselected_devices, 'name');
self.groupsGroupList(function(_data) {
$.each(_data, function(i, obj) {
obj.endpoint_type = 'group';
if(obj.id in selected_endpoints) {
selected_endpoints[obj.id].endpoint_type = 'group',
selected_endpoints[obj.id].name = obj.name;
}
else {
obj.delay = default_delay;
obj.timeout = default_timeout;
unselected_groups.push(obj);
}
});
unselected_groups = _.sortBy(unselected_groups, 'name');
self.groupsUserList(function(_data, status) {
$.each(_data, function(i, obj) {
obj.name = obj.first_name + ' ' + obj.last_name;
obj.endpoint_type = 'user';
if(obj.id in selected_endpoints) {
selected_endpoints[obj.id].endpoint_type = 'user',
selected_endpoints[obj.id].name = obj.name;
}
else {
obj.delay = default_delay;
obj.timeout = default_timeout;
unselected_users.push(obj);
}
});
unselected_users = _.sortBy(unselected_users, 'name');
self.groupsMediaList(function(_data) {
var media_array = _data.sort(function(a, b) {
return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
}),
mediaId = node.getMetadata('ringback') || 'default',
isShoutcast = mediaId.indexOf('://') >= 0 && mediaId !== 'silence_stream://300000';
popup_html = $(monster.template(self, 'groups-ring_group_dialog', {
form: {
name: node.getMetadata('name') || '',
strategy: {
items: [
{
id: 'simultaneous',
name: self.i18n.active().oldCallflows.at_the_same_time
},
{
id: 'single',
name: self.i18n.active().oldCallflows.in_order
}
],
selected: node.getMetadata('strategy') || 'simultaneous'
},
timeout: node.getMetadata('timeout') || '30',
repeats: node.getMetadata('repeats') || 1,
ringback: {
items: $.merge([
{
id: 'default',
name: self.i18n.active().oldCallflows.default,
class: 'uneditable'
},
{
id: 'silence_stream://300000',
name: self.i18n.active().oldCallflows.silence,
class: 'uneditable'
},
{
id: 'shoutcast_url',
name: self.i18n.active().callflows.media.shoutcastURL,
class: 'uneditable'
}
], media_array),
selected: isShoutcast ? 'shoutcast_url' : mediaId,
shoutcastValue: mediaId
}
}
}));
$.each(unselected_groups, function() {
$('#groups_pane .connect.left', popup_html).append($(monster.template(self, 'groups-ring_group_element', this)));
});
$.each(unselected_devices, function() {
$('#devices_pane .connect.left', popup_html).append($(monster.template(self, 'groups-ring_group_element', this)));
});
$.each(unselected_users, function() {
$('#users_pane .connect.left', popup_html).append($(monster.template(self, 'groups-ring_group_element', this)));
});
$.each(selected_endpoints, function() {
//Check if user/device exists.
if(this.endpoint_type) {
$('.connect.right', popup_html).append($(monster.template(self, 'groups-ring_group_element', this)));
}
});
$('#name', popup_html).bind('keyup blur change', function() {
$('.column.right .title', popup_html).html(self.i18n.active().oldCallflows.ring_group_val + $(this).val());
});
$('#ringback', popup_html).change(function(e) {
var val = $(this).val(),
isShoutcast = val === 'shoutcast_url';
popup_html.find('.shoutcast-div').toggleClass('hidden', !isShoutcast).find('input').val('');
if ($(this).find('option:selected').hasClass('uneditable')) {
$('.media_action[data-action="edit"]', popup_html).hide();
} else {
$('.media_action[data-action="edit"]', popup_html).show();
}
});
$('.media_action', popup_html).click(function(e) {
var isCreation = $(this).data('action') === 'create',
mediaData = isCreation ? {} : { id: $('#ringback', popup_html).val() };
monster.pub('callflows.media.editPopup', {
data: mediaData,
callback: function(_mediaData) {
if (_mediaData) {
if (isCreation) {
$('#ringback', popup_html).append('<option value="' + _mediaData.id + '">' + _mediaData.name + '</option>');
} else {
$('#ringback option[value="' + _mediaData.id + '"]', popup_html).text(_mediaData.name);
}
$('#ringback', popup_html).val(_mediaData.id);
}
}
});
});
$('ul.settings1 > li > a', popup_html).click(function(item) {
$('.pane_content', popup_html).hide();
//Reset Search field
$('.searchfield', popup_html).val('');
$('.column.left li', popup_html).show();
$('ul.settings1 > li', popup_html).removeClass('current');
var tab_id = $(this).attr('id');
if(tab_id === 'users_tab_link') {
$('#users_pane', popup_html).show();
}
else if(tab_id === 'devices_tab_link') {
$('#devices_pane', popup_html).show();
}
else if(tab_id === 'groups_tab_link') {
$('#groups_pane', popup_html).show();
}
$(this).parent().addClass('current');
});
$('.searchsubmit2', popup_html).click(function() {
$('.searchfield', popup_html).val('');
$('.column li', popup_html).show();
});
$('#devices_pane .searchfield', popup_html).keyup(function() {
$('#devices_pane .column.left li').each(function() {
if($('.item_name', $(this)).html().toLowerCase().indexOf($('#devices_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$(this).hide();
}
else {
$(this).show();
}
});
});
$('#users_pane .searchfield', popup_html).keyup(function() {
$('#users_pane .column.left li').each(function() {
if($('.item_name', $(this)).html().toLowerCase().indexOf($('#users_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$(this).hide();
}
else {
$(this).show();
}
});
});
$('#groups_pane .searchfield', popup_html).keyup(function() {
$('#groups_pane .column.left li').each(function() {
if($('.item_name', $(this)).html().toLowerCase().indexOf($('#groups_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$(this).hide();
}
else {
$(this).show();
}
});
});
if($.isEmptyObject(selected_endpoints)) {
$('.column.right .connect', popup_html).addClass('no_element');
}
else {
$('.column.right .connect', popup_html).removeClass('no_element');
}
$('.column.left .options', popup_html).hide();
$('.column.left .actions', popup_html).hide();
$('.options .option.delay', popup_html).bind('keyup', function() {
$(this).parents('li').data('delay', $(this).val());
});
$('.options .option.timeout', popup_html).bind('keyup', function() {
$(this).parents('li').data('timeout', $(this).val());
});
$('#save_ring_group', popup_html).click(function() {
var name = $('#name', popup_html).val(),
global_timeout = 0,
strategy = $('#strategy', popup_html).val(),
ringback = $('#ringback', popup_html).val(),
repeats = $('#repeats', popup_html).val(),
shoutcastValue = $('.shoutcast-url-input', popup_html).val();
if (ringback === 'shoutcast_url') {
ringback = shoutcastValue;
}
endpoints = [];
if(strategy === 'simultaneous') {
var computeTimeout = function(delay, local_timeout, global_timeout) {
var duration = delay + local_timeout;
if(duration > global_timeout) {
global_timeout = duration;
}
return global_timeout;
}
}
else {
var computeTimeout = function(delay, local_timeout, global_timeout) {
global_timeout += delay + local_timeout;
return global_timeout;
}
}
$('.right .connect li', popup_html).each(function() {
var item_data = $(this).data();
delete item_data.owner_id;
endpoints.push(item_data);
global_timeout = computeTimeout(parseFloat(item_data.delay), parseFloat(item_data.timeout), global_timeout);
});
if (repeats < 1) {
repeats = 1;
}
node.setMetadata('endpoints', endpoints);
node.setMetadata('name', name);
node.setMetadata('strategy', strategy);
node.setMetadata('timeout', global_timeout);
node.setMetadata('repeats', repeats);
if(ringback === 'default') {
node.deleteMetadata('ringback', ringback);
} else {
node.setMetadata('ringback', ringback);
}
node.caption = name;
popup.dialog('close');
});
monster.ui.tooltips(popup_html);
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().oldCallflows.ring_group,
beforeClose: function() {
if(typeof callback == 'function') {
callback();
}
}
});
// $('.scrollable', popup).jScrollPane({
// horizontalDragMinWidth: 0,
// horizontalDragMaxWidth: 0
// });
$('.connect', popup).sortable({
connectWith: $('.connect.right', popup),
zIndex: 2000,
helper: 'clone',
appendTo: $('.wrapper', popup),
scroll: false,
tolerance: 'pointer',
receive: function(ev, ui) {
var data = ui.item[0].dataset,
list_li = [],
confirm_text;
if(data.endpoint_type === 'device') {
confirm_text = self.i18n.active().oldCallflows.the_owner_of_this_device_is_already;
$('.connect.right li', popup_html).each(function() {
if($(this).data('id') === data.owner_id) {
list_li.push($(this));
}
});
}
else if(data.endpoint_type === 'user') {
confirm_text = self.i18n.active().oldCallflows.this_user_has_already_some_devices;
$('.connect.right li', popup_html).each(function() {
if($(this).data('owner_id') === data.id) {
list_li.push($(this));
}
});
}
if(list_li.length > 0) {
monster.ui.confirm(confirm_text,
function() {
$.each(list_li, function() {
remove_element(this);
});
},
function() {
remove_element(ui.item);
}
);
}
if($(this).hasClass('right')) {
$('.options', ui.item).show();
$('.actions', ui.item).show();
//$('.item_name', ui.item).addClass('right');
$('.column.right .connect', popup).removeClass('no_element');
}
}
});
$(popup_html).delegate('.trash', 'click', function() {
var $parent_li = $(this).parents('li').first();
remove_element($parent_li);
});
$('.pane_content', popup_html).hide();
$('#users_pane', popup_html).show();
if($('#ringback option:selected').hasClass('uneditable')) {
$('.media_action[data-action="edit"]', popup_html).hide();
} else {
$('.media_action[data-action="edit"]', popup_html).show();
}
var remove_element = function(li) {
var $parent_li = li;
var data = $parent_li.data();
data.name = jQuery.trim($('.item_name', $parent_li).html());
$('#'+data.endpoint_type+'s_pane .connect.left', popup_html).append($(monster.template(self, 'groups-ring_group_element', data)));
$parent_li.remove();
if($('.connect.right li', popup_html).size() == 0) {
$('.column.right .connect', popup).addClass('no_element');
}
if(data.name.toLowerCase().indexOf($('#'+data.endpoint_type+'s_pane .searchfield', popup_html).val().toLowerCase()) == -1) {
$('#'+data.id, popup_html).hide();
}
};
});
});
});
});
},
groupsDeviceList: function(callback) {
var self = this;
self.callApi({
resource: 'device.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data, status) {
callback && callback(data.data);
}
});
},
groupsGroupList: function(callback) {
var self = this;
self.callApi({
resource: 'group.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data, status) {
callback && callback(data.data);
}
});
},
groupsUserList: function(callback) {
var self = this;
self.callApi({
resource: 'user.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data, status) {
callback && callback(data.data);
}
});
},
groupsMediaList: function(callback) {
var self = this;
self.callApi({
resource: 'media.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data, status) {
callback && callback(data.data);
}
});
},
groupsNormalizeData: function(form_data) {
delete form_data.users;
return form_data;
},
groupsSave: function(form_data, data, success, error) {
var self = this,
normalized_data = self.groupsNormalizeData($.extend(true, {}, data.data, form_data));
if (typeof data.data === 'object' && data.data.id) {
self.callApi({
resource: 'group.update',
data: {
accountId: self.accountId,
groupId: data.data.id,
data: normalized_data
},
success: function(_data) {
success(_data.data, status, 'update');
}
});
}
else {
self.callApi({
resource: 'group.create',
data: {
accountId: self.accountId,
data: normalized_data
},
success: function(_data) {
success(_data.data, status, 'create');
}
});
}
},
groupsDelete: function(data, callback) {
var self = this;
if(typeof data.data == 'object' && data.data.id) {
self.callApi({
resource: 'group.delete',
data: {
accountId: self.accountId,
groupId: data.data.id
},
success: function(_data) {
callback && callback(_data, status);
}
});
}
}
};
return app;
});