define(function(require){
var $ = require('jquery'),
_ = require('underscore'),
monster = require('monster'),
timezone = require('monster-timezone');
var app = {
requests: {},
subscribe: {
'callflows.fetchActions': 'userDefineActions',
'callflows.user.popupEdit': 'userPopupEdit',
'callflows.user.edit': 'userEdit'
},
random_id: false,
userDefineActions: function(args) {
var self = this,
callflow_nodes= args.actions;
$.extend(callflow_nodes, {
'user[id=*]': {
name: self.i18n.active().callflows.user.user,
icon: 'user',
category: self.i18n.active().oldCallflows.basic_cat,
module: 'user',
tip: self.i18n.active().callflows.user.user_tip,
data: {
id: 'null'
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 40,
caption: function(node, caption_map) {
var id = node.getMetadata('id'),
returned_value = '';
if(id in caption_map) {
returned_value = caption_map[id].name;
}
return returned_value;
},
edit: function(node, callback) {
self.userList(function(users) {
var popup, popup_html;
$.each(users, function() {
this.name = this.first_name + ' ' + this.last_name;
});
popup_html = $(monster.template(self, 'user-callflowEdit' , {
can_call_self: node.getMetadata('can_call_self') || false,
parameter: {
name: 'timeout (s)',
value: node.getMetadata('timeout') || '20'
},
objects: {
items: _.sortBy(users, 'name'),
selected: node.getMetadata('id') || ''
}
}));
if($('#user_selector option:selected', popup_html).val() == undefined) {
$('#edit_link', popup_html).hide();
}
$('.inline_action', popup_html).click(function(ev) {
var _data = ($(this).data('action') == 'edit') ?
{ id: $('#user_selector', popup_html).val() } : {};
ev.preventDefault();
self.userPopupEdit({
data: _data,
callback: function(_data) {
node.setMetadata('id', _data.id || 'null');
node.setMetadata('timeout', $('#parameter_input', popup_html).val());
node.setMetadata('can_call_self', $('#user_can_call_self', popup_html).is(':checked'));
node.caption = (_data.first_name || '') + ' ' + (_data.last_name || '');
popup.dialog('close');
}
});
});
$('#add', popup_html).click(function() {
node.setMetadata('id', $('#user_selector', popup_html).val());
node.setMetadata('timeout', $('#parameter_input', popup_html).val());
node.setMetadata('can_call_self', $('#user_can_call_self', popup_html).is(':checked'));
node.caption = $('#user_selector option:selected', popup_html).text();
popup.dialog('close');
});
popup = monster.ui.dialog(popup_html, {
title: self.i18n.active().callflows.user.select_user,
beforeClose: function() {
if(typeof callback == 'function') {
callback();
}
}
});
});
},
listEntities: function(callback) {
self.callApi({
resource: 'user.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data, status) {
callback && callback(data.data);
}
});
},
editEntity: 'callflows.user.edit'
},
'hotdesk[action=login]': {
name: self.i18n.active().callflows.user.hot_desk_login,
icon: 'sign-in',
category: self.i18n.active().callflows.user.hotdesking_cat,
module: 'hotdesk',
tip: self.i18n.active().callflows.user.hot_desk_login_tip,
data: {
action: 'login'
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 10,
caption: function(node, caption_map) {
return '';
},
edit: function(node, callback) {
if(typeof callback == 'function') {
callback();
}
}
},
'hotdesk[action=logout]': {
name: self.i18n.active().callflows.user.hot_desk_logout,
icon: 'sign-out',
category: self.i18n.active().callflows.user.hotdesking_cat,
module: 'hotdesk',
tip: self.i18n.active().callflows.user.hot_desk_logout_tip,
data: {
action: 'logout'
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 20,
caption: function(node, caption_map) {
return '';
},
edit: function(node, callback) {
if(typeof callback == 'function') {
callback();
}
}
},
'hotdesk[action=toggle]': {
name: self.i18n.active().callflows.user.hot_desk_toggle,
icon: 'toggle-off',
category: self.i18n.active().callflows.user.hotdesking_cat,
module: 'hotdesk',
tip: self.i18n.active().callflows.user.hot_desk_toggle_tip,
data: {
action: 'toggle'
},
rules: [
{
type: 'quantity',
maxSize: '1'
}
],
isUsable: 'true',
weight: 30,
caption: function(node, caption_map) {
return '';
},
edit: function(node, callback) {
if(typeof callback == 'function') {
callback();
}
}
}
});
},
userPopupEdit: function(args) {
var self = this,
popup_html = $('
'),
popup,
data = args.data,
callback = args.callback,
data_defaults = args.data_defaults;
popup_html.css({
height: 500,
'overflow-y': 'scroll'
});
self.userEdit({
data: data,
parent: popup_html,
target: $('.inline_content', popup_html),
callbacks: {
save_success: function(_data) {
popup.dialog('close');
if(typeof callback == 'function') {
callback(_data);
}
},
delete_success: function() {
popup.dialog('close');
if(typeof callback == 'function') {
callback({ data: {} });
}
},
after_render: function() {
popup = monster.ui.dialog(popup_html, {
title: (data.id) ? self.i18n.active().callflows.user.edit_user : self.i18n.active().callflows.user.create_user
});
}
},
data_defaults: data_defaults
});
},
userEdit: function(args) {
var self = this,
data = args.data,
parent = args.parent || $('#user-content'),
target = args.target || $('#user-view', parent),
_callbacks = args.callbacks || {},
callbacks = {
save_success: _callbacks.save_success || function(_data) {
self.userRenderList(parent);
self.userEdit({
data: { id: _data.data.id },
parent: parent,
target: target,
callbacks: callbacks
});
},
save_error: _callbacks.save_error,
delete_success: _callbacks.delete_success || function() {
target.empty();
self.userRenderList(parent);
},
delete_error: _callbacks.delete_error,
after_render: _callbacks.after_render
},
defaults = {
data: $.extend(true, {
apps: {},
call_forward: {
substitute: true
},
call_restriction: {
closed_groups: { action: 'inherit' }
},
caller_id: {
internal: {},
external: {},
emergency: {}
},
hotdesk: {},
contact_list: {
exclude: false
},
priv_level: 'user',
music_on_hold: {},
timezone: 'inherit'
}, args.data_defaults || {}),
field_data: {
device_types: {
sip_device: self.i18n.active().callflows.user.sip_device_type,
cellphone: self.i18n.active().callflows.user.cell_phone_type,
fax: self.i18n.active().callflows.user.fax_type,
smartphone: self.i18n.active().callflows.user.smartphone_type,
landline: self.i18n.active().callflows.user.landline_type,
softphone: self.i18n.active().callflows.user.softphone_type,
sip_uri: self.i18n.active().callflows.user.sip_uri_type
},
call_restriction: {}
}
};
self.random_id = false;
monster.parallel({
list_classifiers: function(callback) {
self.callApi({
resource: 'numbers.listClassifiers',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(_data_classifiers, status) {
if('data' in _data_classifiers) {
$.each(_data_classifiers.data, function(k, v) {
defaults.field_data.call_restriction[k] = {
friendly_name: v.friendly_name
};
defaults.data.call_restriction[k] = { action: 'inherit' };
});
}
callback(null, _data_classifiers);
}
});
},
media_list: function(callback) {
self.callApi({
resource: 'media.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(_data, status) {
if(_data.data) {
_data.data.unshift(
{
id: '',
name: self.i18n.active().callflows.user.default_music
},
{
id: 'silence_stream://300000',
name: self.i18n.active().callflows.user.silence
},
{
id: 'shoutcast',
name: self.i18n.active().callflows.accountSettings.musicOnHold.shoutcastURL
}
);
}
defaults.field_data.media = _data.data;
callback(null, _data);
}
});
},
user_get: function(callback) {
if(typeof data == 'object' && data.id) {
self.userGet(data.id, function(_data, status) {
self.userMigrateData(_data);
callback(null, _data);
});
}
else {
self.random_id = $.md5(monster.util.randomString(10)+new Date().toString());
defaults.field_data.new_user = self.random_id;
callback(null, defaults);
}
},
user_hotdesks: function(callback) {
if(typeof data == 'object' && data.id) {
self.callApi({
resource: 'user.hotdesks',
data: {
accountId: self.accountId,
userId: data.id
},
success: function(_data_devices) {
defaults.field_data.hotdesk_enabled = true;
defaults.field_data.device_list = {};
$.each(_data_devices.data, function(k, v) {
defaults.field_data.device_list[v.device_id] = { name: v.device_name };
});
if($.isEmptyObject(defaults.field_data.device_list)) {
delete defaults.field_data.device_list;
}
callback(null, _data_devices);
},
error: function(_data, status) {
//callback({api_name: 'Hotdesk'}, _data);
callback(null, defaults);
}
})
}
else {
callback(null, defaults);
}
}
},
function(err, results) {
var render_data = defaults;
if(typeof data === 'object' && data.id) {
if(results.user_get.hasOwnProperty('call_restriction')) {
$.each(results.user_get.call_restriction, function(k, v) {
if (defaults.field_data.call_restriction.hasOwnProperty(k)) {
defaults.field_data.call_restriction[k].action = v.action;
}
});
}
render_data = $.extend(true, defaults, { data: results.user_get });
render_data.extra = render_data.extra || {};
render_data.extra.isShoutcast = false;
// if the value is set to a stream, we need to set the value of the media_id to shoutcast so it gets selected by the old select mechanism,
// but we also need to store the value so we can display it
if (render_data.data.hasOwnProperty('music_on_hold') && render_data.data.music_on_hold.hasOwnProperty('media_id')) {
if (render_data.data.music_on_hold.media_id.indexOf('://') >= 0) {
if (render_data.data.music_on_hold.media_id !== 'silence_stream://300000') {
render_data.extra.isShoutcast = true;
render_data.extra.shoutcastValue = render_data.data.music_on_hold.media_id;
render_data.data.music_on_hold.media_id = 'shoutcast';
}
}
}
}
self.userRender(render_data, target, callbacks);
if(typeof callbacks.after_render == 'function') {
callbacks.after_render();
}
});
},
userRender: function(data, target, callbacks) {
var self = this,
user_html = $(monster.template(self, 'user-edit', data)),
user_form = user_html.find('#user-form'),
data_devices,
hotdesk_pin = $('.hotdesk_pin', user_html),
hotdesk_pin_require = $('#hotdesk_require_pin', user_html);
self.userRenderDeviceList(data, user_html);
monster.ui.validate(user_form, {
rules: {
"extra.shoutcastUrl": {
protocol: true
},
username: {
required: true,
minlength: 3,
regex: /^[0-9a-zA-Z+@._-]*$/
},
first_name: {
required: true,
minlength: 1,
maxlength: 256,
regex: /^[0-9a-zA-Z\s\-\']+$/
},
last_name: {
required: true,
minlength: 1,
maxlength: 256,
regex: /^[0-9a-zA-Z\s\-\']+$/
},
email: {
required: true,
email: true
},
pwd_mngt_pwd1: {
required: true,
minlength: 3
},
pwd_mngt_pwd2: {
required: true,
minlength: 3,
equalTo: '#pwd_mngt_pwd1'
},
'hotdesk.pin': { regex: /^[0-9]*$/ },
'hotdesk.id': { regex: /^[0-9\+\#\*]*$/ },
call_forward_number: { regex: /^[\+]?[0-9]*$/ },
'caller_id.internal.name': { regex: /^[0-9A-Za-z ,]{0,30}$/ },
'caller_id.external.name': { regex: /^[0-9A-Za-z ,]{0,30}$/ },
'caller_id.internal.number': { regex: /^[\+]?[0-9\s\-\.\(\)]*$/ },
'caller_id.external.number': { regex: /^[\+]?[0-9\s\-\.\(\)]*$/ },
'caller_id.emergency.name': { regex: /^[0-9A-Za-z ,]{0,30}$/ },
'caller_id.emergency.number': { regex: /^[\+]?[0-9\s\-\.\(\)]*$/ }
},
messages: {
username: { regex: self.i18n.active().callflows.user.validation.username },
first_name: { regex: self.i18n.active().callflows.user.validation.name },
last_name: { regex: self.i18n.active().callflows.user.validation.name },
'hotdesk.pin': { regex: self.i18n.active().callflows.user.validation.hotdesk.pin },
'hotdesk.id': { regex: self.i18n.active().callflows.user.validation.hotdesk.id },
'caller_id.internal.name': { regex: self.i18n.active().callflows.user.validation.caller_id.name },
'caller_id.external.name': { regex: self.i18n.active().callflows.user.validation.caller_id.name },
'caller_id.emergency.name': { regex: self.i18n.active().callflows.user.validation.caller_id.name },
'caller_id.internal.number': { regex: self.i18n.active().callflows.user.validation.caller_id.number },
'caller_id.external.number': { regex: self.i18n.active().callflows.user.validation.caller_id.number },
'caller_id.emergency.number': { regex: self.i18n.active().callflows.user.validation.caller_id.number }
}
});
timezone.populateDropdown($('#timezone', user_html), data.data.timezone||'inherit', {inherit: self.i18n.active().defaultTimezone});
if (data.data.id === monster.apps.auth.userId){
$('.user-delete', user_html).hide();
}
$('*[rel=popover]:not([type="text"])', user_html).popover({
trigger: 'hover'
});
$('*[rel=popover][type="text"]', user_html).popover({
trigger: 'focus'
});
self.winkstartTabs(user_html);
self.winkstartLinkForm(user_html);
hotdesk_pin_require.is(':checked') ? hotdesk_pin.show() : hotdesk_pin.hide();
hotdesk_pin_require.change(function() {
$(this).is(':checked') ? hotdesk_pin.show('blind') : hotdesk_pin.hide('blind');
});
$('.user-save', user_html).click(function(ev) {
ev.preventDefault();
var $this = $(this);
if(!$this.hasClass('disabled')) {
$this.addClass('disabled');
if (monster.ui.valid(user_form)) {
var form_data = monster.ui.getFormData('user-form');
if(form_data.enable_pin === false) {
delete data.data.queue_pin;
delete data.data.record_call;
}
if(form_data.music_on_hold.media_id === 'shoutcast') {
form_data.music_on_hold.media_id = user_html.find('.shoutcast-url-input').val();
}
self.userCleanFormData(form_data);
if('field_data' in data) {
delete data.field_data;
}
self.callApi({
resource: 'account.get',
data: {
accountId: self.accountId
},
success: function(_data, status) {
if(form_data.priv_level == 'admin') {
form_data.apps = form_data.apps || {};
if(!('voip' in form_data.apps) && $.inArray('voip', (_data.data.available_apps || [])) > -1) {
form_data.apps['voip'] = {
label: self.i18n.active().callflows.user.voip_services_label,
icon: 'device',
api_url: monster.config.api.default
}
}
}
else if(form_data.priv_level == 'user' && $.inArray('userportal', (_data.data.available_apps || [])) > -1) {
form_data.apps = form_data.apps || {};
if(!('userportal' in form_data.apps)) {
form_data.apps['userportal'] = {
label: self.i18n.active().callflows.user.user_portal_label,
icon: 'userportal',
api_url: monster.config.api.default
}
}
}
self.userSave(form_data, data, function(data, status, action) {
if(action == 'create') {
self.userAcquireDevice(data, function() {
if(typeof callbacks.save_success == 'function') {
callbacks.save_success(data, status, action);
}
}, function() {
if(typeof callbacks.save_error == 'function') {
callbacks.save_error(data, status, action);
}
});
}
else {
if(typeof callbacks.save_success == 'function') {
callbacks.save_success(data, status, action);
}
}
// }, winkstart.error_message.process_error(callbacks.save_error));
});
}
});
}
else {
$this.removeClass('disabled');
monster.ui.alert(self.i18n.active().callflows.user.there_were_errors_on_the_form);
}
}
});
$('.user-delete', user_html).click(function(ev) {
ev.preventDefault();
monster.ui.confirm(self.i18n.active().callflows.user.are_you_sure_you_want_to_delete, function() {
self.userDelete(data.data.id, callbacks.delete_success, callbacks.delete_error);
});
});
if(!$('#music_on_hold_media_id', user_html).val()) {
$('#edit_link_media', user_html).hide();
}
$('#music_on_hold_media_id', user_html).change(function() {
!$('#music_on_hold_media_id option:selected', user_html).val() ? $('#edit_link_media', user_html).hide() : $('#edit_link_media', user_html).show();
user_html.find('.shoutcast-div').toggleClass('active', $(this).val() === 'shoutcast');
});
$('.inline_action_media', user_html).click(function(ev) {
var _data = ($(this).data('action') == 'edit') ? { id: $('#music_on_hold_media_id', user_html).val() } : {},
_id = _data.id;
ev.preventDefault();
monster.pub('callflows.media.editPopup', {
data: _data,
callback: function(media) {
/* Create */
if(!_id) {
$('#music_on_hold_media_id', user_html).append('')
$('#music_on_hold_media_id', user_html).val(media.id);
$('#edit_link_media', user_html).show();
}
else {
/* Update */
if(media.hasOwnProperty('id')) {
$('#music_on_hold_media_id #'+ media.id, user_html).text(media.name);
}
/* Delete */
else {
$('#music_on_hold_media_id #'+_id, user_html).remove();
$('#edit_link_media', user_html).hide();
}
}
}
});
});
$(user_html).delegate('.enabled_checkbox', 'click', function() {
self.userUpdateSingleDevice($(this), user_html);
});
$(user_html).delegate('.action_device.edit', 'click', function() {
var data_device = {
id: $(this).data('id'),
hide_owner: !data.data.id ? true : false
};
var defaults = {};
if(!data.data.id) {
defaults.new_user = self.random_id;
}
else {
defaults.owner_id = data.data.id;
}
monster.pub('callflows.device.popupEdit', {
data: data_device,
callback: function(_data) {
data_devices = {
data: { },
field_data: {
device_types: data.field_data.device_types
}
};
data_devices.data = _data.data.new_user ? { new_user: true, id: self.random_id } : { id: data.data.id };
self.userRenderDeviceList(data_devices, user_html);
},
data_defaults: defaults
});
});
$(user_html).delegate('.action_device.delete', 'click', function() {
var device_id = $(this).data('id');
monster.ui.confirm(self.i18n.active().callflows.user.do_you_really_want_to_delete, function() {
self.userDeleteDevice(device_id, function() {
data_devices = {
data: { },
field_data: {
device_types: data.field_data.device_types
}
};
data_devices.data = self.random_id ? { new_user: true, id: self.random_id } : { id: data.data.id };
self.userRenderDeviceList(data_devices, user_html);
});
});
});
$('.add_device', user_html).click(function(ev) {
var data_device = {
hide_owner: true
},
defaults = {};
ev.preventDefault();
if(!data.data.id) {
defaults.new_user = self.random_id;
}
else {
defaults.owner_id = data.data.id;
}
monster.pub('callflows.device.popupEdit', {
data: data_device,
callback: function(_data) {
var data_devices = {
data: { },
field_data: {
device_types: data.field_data.device_types
}
};
data_devices.data = self.random_id ? { new_user: true, id: self.random_id } : { id: data.data.id };
self.userRenderDeviceList(data_devices, user_html);
},
data_defaults: defaults
});
});
(target)
.empty()
.append(user_html);
},
userRenderList: function(parent, callback) {
var self = this;
self.userList(function(data, status) {
var map_crossbar_data = function(data) {
var new_list = [];
if(data.length > 0) {
$.each(data, function(key, val) {
new_list.push({
id: val.id,
title: (val.first_name && val.last_name) ?
val.last_name + ', ' + val.first_name :
'(no name)'
});
});
}
new_list.sort(function(a, b) {
return a.title.toLowerCase() < b.title.toLowerCase() ? -1 : 1;
});
return new_list;
};
// $('#user-listpanel', parent)
// .empty()
// .listpanel({
// label: _t('user', 'users_label'),
// identifier: 'user-listview',
// new_entity_label: _t('user', 'add_user_label'),
// data: map_crossbar_data(data.data),
// publisher: monster.pub,
// notifyMethod: 'callflows.user.edit',
// notifyCreateMethod: 'callflows.user.edit',
// notifyParent: parent
// });
callback && callback();
}
);
},
userRenderDeviceList: function(data, parent) {
var self = this,
parent = $('#tab_devices', parent);
if(data.data.id) {
var filter = data.data.new_user ? { filter_new_user: data.data.id } : { filter_owner_id: data.data.id };
self.userListDevice(filter, function(_data, status) {
$('.rows', parent).empty();
if(_data.length > 0) {
$.each(_data, function(k, v) {
v.display_type = data.field_data.device_types[v.device_type];
v.not_enabled = this.enabled === false ? true : false;
$('.rows', parent).append($(monster.template(self, 'user-deviceRow', v)));
});
self.callApi({
resource: 'device.getStatus',
data: {
accountId: self.accountId
},
success: function(_data, status) {
$.each(_data.data, function(key, val) {
$('#' + val.device_id + ' .column.third', parent).addClass('registered');
});
}
});
}
else {
$('.rows', parent).append($(monster.template(self, 'user-deviceRow')));
}
});
}
else {
$('.rows', parent).empty()
.append($(monster.template(self, 'user-deviceRow')));
}
},
userMigrateData: function(data) {
if(!('priv_level' in data)) {
if('apps' in data && 'voip' in data.apps) {
data.priv_level = 'admin';
} else {
data.priv_level = 'user';
}
}
return data;
},
userUpdateSingleDevice: function($checkbox, parent) {
$checkbox.attr('disabled', 'disabled');
var self = this,
device_id = $checkbox.data('device_id'),
enabled = $checkbox.is(':checked');
self.userGetDevice(device_id, function(_data) {
if($.inArray(_data.device_type, ['cellphone', 'smartphone', 'landline']) > -1) {
_data.call_forward.enabled = enabled;
}
_data.enabled = enabled;
self.userUpdateDevice(device_id, _data, function(_data) {
$checkbox.removeAttr('disabled');
if(_data.enabled === true) {
$('#'+ _data.id + ' .column.third', parent).removeClass('disabled');
}
else {
$('#'+ _data.id + ' .column.third', parent).addClass('disabled');
}
},
function() {
$checkbox.removeAttr('disabled');
enabled ? $checkbox.removeAttr('checked') : $checkbox.attr('checked', 'checked');
}
);
},
function() {
$checkbox.removeAttr('disabled');
enabled ? $checkbox.removeAttr('checked') : $checkbox.attr('checked', 'checked');
}
);
},
userAcquireDevice: function(user_data, success, error) {
var self = this,
user_id = user_data.id;
if(self.random_id) {
self.userListDevice({ filter_new_user: self.random_id }, function(_data, status) {
var device_id;
var array_length = _data.length;
if(array_length != 0) {
$.each(_data, function(k, v) {
device_id = this.id;
self.userGetDevice(device_id, function(_data, status) {
_data.owner_id = user_id;
delete _data.new_user;
self.userUpdateDevice(device_id, _data, function(_data, status) {
if(k == array_length - 1) {
success({}, status, 'create');
}
});
});
});
}
else {
success({}, status, 'create');
}
});
}
else {
success({}, status, 'create');
}
},
userCleanFormData: function(form_data){
form_data.caller_id.internal.number = form_data.caller_id.internal.number.replace(/\s|\(|\)|\-|\./g,'');
form_data.caller_id.external.number = form_data.caller_id.external.number.replace(/\s|\(|\)|\-|\./g,'');
form_data.caller_id.emergency.number = form_data.caller_id.emergency.number.replace(/\s|\(|\)|\-|\./g,'');
form_data.call_restriction.closed_groups = { action: form_data.extra.closed_groups ? 'deny' : 'inherit' };
if(!form_data.hotdesk.require_pin) {
delete form_data.hotdesk.pin;
}
if(form_data.pwd_mngt_pwd1 != 'fakePassword') {
form_data.password = form_data.pwd_mngt_pwd1;
}
delete form_data.pwd_mngt_pwd1;
delete form_data.pwd_mngt_pwd2;
delete form_data.extra;
return form_data;
},
userSave: function(form_data, data, success, error) {
var self = this,
normalized_data = self.userNormalizeData($.extend(true, {}, data.data, form_data));
if(typeof data.data == 'object' && data.data.id) {
self.userUpdate(normalized_data, function(_data, status) {
if(typeof success == 'function') {
success(_data, status, 'update');
}
},
function(_data, status) {
if(typeof error == 'function') {
error(_data, status, 'update');
}
}
);
}
else {
self.userCreate(normalized_data, function(_data, status) {
if(typeof success == 'function') {
success(_data, status, 'create');
}
},
function(_data, status) {
if(typeof error == 'function') {
error(_data, status, 'create');
}
}
);
}
},
userNormalizeData: function(data) {
if($.isArray(data.directories)) {
data.directories = {};
}
$.each(data.caller_id, function(key, val) {
$.each(val, function(_key, _val) {
if(_val == '') {
delete val[_key];
}
});
if($.isEmptyObject(val)) {
delete data.caller_id[key];
}
});
if($.isEmptyObject(data.caller_id)) {
delete data.caller_id;
}
if(!data.music_on_hold.media_id) {
delete data.music_on_hold.media_id;
}
if(data.hotdesk.hasOwnProperty("enable")) {
delete data.hotdesk.enable;
}
if(data.hotdesk.hasOwnProperty('log_out')) {
var new_endpoint_ids = [];
$.each(data.hotdesk.endpoint_ids, function(k, v) {
if(data.hotdesk.log_out.indexOf(v) < 0) {
new_endpoint_ids.push(v);
}
});
data.hotdesk.endpoint_ids = new_endpoint_ids;
delete data.hotdesk.log_out;
}
if(data.hotdesk.hasOwnProperty('endpoint_ids') && data.hotdesk.endpoint_ids.length === 0) {
delete data.hotdesk.endpoint_ids;
}
if(data.hasOwnProperty('call_forward') && data.call_forward.number === '') {
delete data.call_forward.number;
}
if(data.hasOwnProperty('presence_id') && data.presence_id === '') {
delete data.presence_id;
}
if(data.timezone && data.timezone === 'inherit') {
delete data.timezone;
}
return data;
},
userList: function(callback) {
var self = this;
self.callApi({
resource: 'user.list',
data: {
accountId: self.accountId,
filters: { paginate:false }
},
success: function(data) {
callback && callback(data.data);
}
});
},
userGet: function(userId, callback) {
var self = this;
self.callApi({
resource: 'user.get',
data: {
accountId: self.accountId,
userId: userId
},
success: function(data) {
callback && callback(data.data);
}
});
},
userCreate: function(data, callback) {
var self = this;
self.callApi({
resource: 'user.create',
data: {
accountId: self.accountId,
data: data
},
success: function(data) {
callback && callback(data.data);
}
});
},
userUpdate: function(data, callback) {
var self = this;
self.callApi({
resource: 'user.update',
data: {
accountId: self.accountId,
userId: data.id,
data: data
},
success: function(data) {
callback && callback(data.data);
}
});
},
userDelete: function(userId, callbackSuccess, callbackError) {
var self = this;
self.callApi({
resource: 'user.delete',
data: {
accountId: self.accountId,
userId: userId
},
success: function(data) {
callbackSuccess && callbackSuccess(data.data);
},
error: function(error) {
callbackError && callbackError();
}
});
},
userListDevice: function(pFilters, callback) {
var self = this,
filters = $.extend(true, pFilters, { paginate: false });
self.callApi({
resource: 'device.list',
data: {
accountId: self.accountId,
filters: filters
},
success: function(data) {
callback && callback(data.data);
}
})
},
userGetDevice: function(deviceId, callbackSuccess, callbackError) {
var self = this;
self.callApi({
resource: 'device.get',
data: {
accountId: self.accountId,
deviceId: deviceId
},
success: function(data) {
callbackSuccess && callbackSuccess(data.data);
},
error: function(data) {
callbackError && callbackError();
}
})
},
userUpdateDevice: function(deviceId, data, callbackSuccess, callbackError) {
var self = this;
self.callApi({
resource: 'device.update',
data: {
accountId: self.accountId,
deviceId: deviceId,
data: data
},
success: function(data) {
callbackSuccess && callbackSuccess(data.data);
},
error: function() {
callbackError && callbackError();
}
});
},
userDeleteDevice: function(deviceId, callback) {
var self = this;
self.callApi({
resource: 'device.delete',
data: {
accountId: self.accountId,
deviceId: deviceId
},
success: function() {
callback && callback();
}
});
}
};
return app;
});