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; });