From 82fe62b9636287f7f9df1612b1b82dc41133e7a4 Mon Sep 17 00:00:00 2001 From: Joris Tirado Date: Thu, 20 Apr 2017 17:28:15 -0700 Subject: [PATCH] UI-2689: Handle combo key behavior, add `line` action (#23) * OOB: Enforce ESLint rules * UI-2689: Allow combo keys to be defined as line keys * UI-2689: Show warning message on first combo key --- i18n/en-US.json | 3 + submodules/devices/devices.css | 14 ++ submodules/devices/devices.js | 386 ++++++++++++++++----------------- views/devices-sip_device.html | 26 ++- 4 files changed, 231 insertions(+), 198 deletions(-) diff --git a/i18n/en-US.json b/i18n/en-US.json index 8112e70..6de8f30 100644 --- a/i18n/en-US.json +++ b/i18n/en-US.json @@ -261,6 +261,7 @@ "__comment": "UI-1351: Add ability to configure feature keys for SIP devices in SmartPBX", "__version": "v3.20_s4", "keys": { + "alertMessage": "By default, this key will be used as a Line Key and we recommend you not to change it.", "featureKeys": { "title": "Feature Keys", "label": "Feature key" @@ -280,6 +281,7 @@ "hideInfo": "Hide Info" }, "types": { + "line": "Use as a line key.", "presence": "Indicate when a user has an incoming call or is on the phone. The indicator can be used to pick up ringing calls or speed dial that user.", "parking": "Indicate when a call is placed on a parking slot available to the entire company. The indicator can be used to transfer a call to the parking slot or retrieve a parked call.", "personal_parking": "Indicate when a call is placed on a parking slot dedicated to the selected user. The indicator can be used to transfer a call to the parking slot or retrieve a parked call.", @@ -287,6 +289,7 @@ } }, "types": { + "line": "Line", "none": "None", "presence": "Presence", "parking": "Parking", diff --git a/submodules/devices/devices.css b/submodules/devices/devices.css index 26f81cd..86c7506 100644 --- a/submodules/devices/devices.css +++ b/submodules/devices/devices.css @@ -275,6 +275,20 @@ margin-right: 15px; } +.voip-edit-device-popup .edit-device .content .tabs-section.keys { + padding: 0 20px; +} + +.voip-edit-device-popup .edit-device .content .tabs-section.keys .control-group.error { + padding: 10px 0; + border: 1px dashed red; + border-radius: 2px; +} + +.voip-edit-device-popup .edit-device .content .tabs-section.keys .control-group.error .alert { + margin: 0 10px 10px; +} + .voip-edit-device-popup .edit-device .content .tabs-section .title { color: #22a5ff; font-size: 24px; diff --git a/submodules/devices/devices.js b/submodules/devices/devices.js index 6d784d0..2fb87f4 100644 --- a/submodules/devices/devices.js +++ b/submodules/devices/devices.js @@ -1,4 +1,4 @@ -define(function(require){ +define(function(require) { var $ = require('jquery'), _ = require('underscore'), monster = require('monster'), @@ -52,7 +52,7 @@ define(function(require){ .empty() .append(template); - if(_deviceId) { + if (_deviceId) { var row = parent.find('.grid-row[data-id=' + _deviceId + ']'); monster.ui.highlight(row, { @@ -60,7 +60,7 @@ define(function(require){ }); } - if ( dataTemplate.devices.length === 0 ) { + if (dataTemplate.devices.length === 0) { parent.find('.no-devices-row').css('display', 'block'); } else { parent.find('.no-devices-row').css('display', 'none'); @@ -86,7 +86,7 @@ define(function(require){ row.data('search').toLowerCase().indexOf(searchString) < 0 ? row.hide() : row.show(); }); - if(rows.size() > 0) { + if (rows.size() > 0) { rows.is(':visible') ? emptySearch.hide() : emptySearch.show(); } }); @@ -105,12 +105,12 @@ define(function(require){ var classStatus = 'disabled'; - if(dataDevice.enabled === true) { + if (dataDevice.enabled === true) { classStatus = 'unregistered'; _.each(data.devices, function(device) { - if(device.id === dataDevice.id) { - if(device.registered === true) { + if (device.id === dataDevice.id) { + if (device.registered === true) { classStatus = 'registered'; } @@ -138,9 +138,12 @@ define(function(require){ isRegistered: $this.parents('.grid-row').data('registered') === true }; - self.devicesRenderEdit({ data: dataDevice, callbackSave: function(dataDevice) { - self.devicesRender({ deviceId: dataDevice.id }); - }}); + self.devicesRenderEdit({ + data: dataDevice, + callbackSave: function(dataDevice) { + self.devicesRender({ deviceId: dataDevice.id }); + } + }); }); template.find('.create-device').on('click', function() { @@ -185,7 +188,7 @@ define(function(require){ if (keyTypes) { self.devicesListUsers({ success: function(users) { - _.each(keyTypes, function(type, idx) { + _.each(keyTypes, function(type) { if (!dataDevice.provision.hasOwnProperty(type)) { dataDevice.provision[type] = {}; } @@ -196,7 +199,7 @@ define(function(require){ if (!dataDevice.provision[type].hasOwnProperty(i)) { dataDevice.provision[type][i] = { type: 'none' - } + }; } } }); @@ -233,7 +236,7 @@ define(function(require){ } }; - _.each(keyTypes, function(key, idx) { + _.each(keyTypes, function(key) { var camelCaseKey = self.devicesSnakeToCamel(key); extra.provision.keys.push({ @@ -250,15 +253,13 @@ define(function(require){ self.devicesRenderDevice(dataDevice, callbackSave, callbackDelete); } }); - } - else { + } else { self.devicesRenderDevice(dataDevice, callbackSave, callbackDelete); } }, function() { self.devicesRenderDevice(dataDevice, callbackSave, callbackDelete); }); - } - else { + } else { self.devicesRenderDevice(dataDevice, callbackSave, callbackDelete); } }); @@ -272,7 +273,7 @@ define(function(require){ device_type: type }; - if(type === 'sip_device' && monster.config.api.provisioner) { + if (type === 'sip_device' && monster.config.api.provisioner) { monster.pub('common.chooseModel.render', { callback: function(dataModel, callbackCommonSuccess) { self.callApi({ @@ -289,16 +290,21 @@ define(function(require){ }); }, callbackMissingBrand: function() { - self.devicesRenderEdit({ data: data, callbackSave: function(dataDevice) { - callback && callback(dataDevice); - }}); + self.devicesRenderEdit({ + data: data, + callbackSave: function(dataDevice) { + callback && callback(dataDevice); + } + }); + } + }); + } else { + self.devicesRenderEdit({ + data: data, + callbackSave: function(dataDevice) { + callback && callback(dataDevice); } }); - } - else { - self.devicesRenderEdit({ data: data, callbackSave: function(dataDevice) { - callback && callback(dataDevice); - }}); } }, @@ -307,14 +313,14 @@ define(function(require){ mode = data.id ? 'edit' : 'add', type = data.device_type, popupTitle = mode === 'edit' ? monster.template(self, '!' + self.i18n.active().devices[type].editTitle, { name: data.name }) : self.i18n.active().devices[type].addTitle, - templateDevice = $(monster.template(self, 'devices-'+type, $.extend(true, {}, data, { + templateDevice = $(monster.template(self, 'devices-' + type, $.extend(true, {}, data, { isProvisionerConfigured: monster.config.api.hasOwnProperty('provisioner'), showEmergencyCnam: monster.util.isNumberFeatureEnabled('cnam') && monster.util.isNumberFeatureEnabled('e911') }))), deviceForm = templateDevice.find('#form_device'); if (data.extra.hasOwnProperty('provision') && data.extra.provision.hasOwnProperty('keys')) { - _.each(data.extra.provision.keys, function(value, idx) { + _.each(data.extra.provision.keys, function(value) { var section = '.tabs-section[data-section="' + value.type + '"] '; _.each(value.data, function(val, key) { @@ -337,10 +343,10 @@ define(function(require){ }); } - if ( data.extra.hasE911Numbers ) { + if (data.extra.hasE911Numbers) { var currentNumber; - if(data.caller_id && data.caller_id.emergency && data.caller_id.emergency.number) { + if (data.caller_id && data.caller_id.emergency && data.caller_id.emergency.number) { currentNumber = data.caller_id.emergency.number; self.devicesGetE911NumberAddress(data.caller_id.emergency.number, function(address) { templateDevice @@ -392,11 +398,11 @@ define(function(require){ ignore: '' // Do not ignore hidden fields }); - if($.inArray(type, ['sip_device', 'smartphone', 'mobile', 'softphone', 'fax', 'ata']) > -1) { + if ($.inArray(type, ['sip_device', 'smartphone', 'mobile', 'softphone', 'fax', 'ata']) > -1) { var audioCodecs = monster.ui.codecSelector('audio', templateDevice.find('#audio_codec_selector'), data.media.audio.codecs); } - if($.inArray(type, ['sip_device', 'smartphone', 'mobile', 'softphone']) > -1) { + if ($.inArray(type, ['sip_device', 'smartphone', 'mobile', 'softphone']) > -1) { var videoCodecs = monster.ui.codecSelector('video', templateDevice.find('#video_codec_selector'), data.media.video.codecs); } @@ -408,7 +414,7 @@ define(function(require){ monster.ui.mask(templateDevice.find('[name="call_forward.number"]'), 'phoneNumber'); templateDevice.find('.chosen-feature-key-user').chosen({ search_contains: true, width: 'inherit' }); - if(!(data.media.encryption.enforce_security)) { + if (!(data.media.encryption.enforce_security)) { templateDevice.find('#rtp_method').hide(); } @@ -417,7 +423,7 @@ define(function(require){ }); templateDevice.find('#restart_device').on('click', function() { - if(!$(this).hasClass('disabled')) { + if (!$(this).hasClass('disabled')) { self.devicesRestart(data.id, function() { toastr.success(self.i18n.active().devices.popupSettings.miscellaneous.restart.success); }); @@ -425,13 +431,13 @@ define(function(require){ }); templateDevice.find('#unlock_device').on('click', function() { - self.devicesUnlock(data.mac_address.replace(/\:/g, ''), function() { + self.devicesUnlock(data.mac_address.replace(/:/g, ''), function() { toastr.success(self.i18n.active().devices.popupSettings.miscellaneous.unlock.success); }); }); templateDevice.find('.actions .save').on('click', function() { - if(monster.ui.valid(deviceForm)) { + if (monster.ui.valid(deviceForm)) { templateDevice.find('.feature-key-value:not(.active)').remove(); var dataToSave = self.devicesMergeData(data, templateDevice, audioCodecs, videoCodecs); @@ -479,8 +485,7 @@ define(function(require){ }); divAddress.slideDown(); - } - else { + } else { divAddress.slideUp(); } }); @@ -492,10 +497,9 @@ define(function(require){ templateDevice.find('.restriction-matcher-button').on('click', function(e) { e.preventDefault(); - var number = templateDevice.find('.restriction-matcher-input').val(), - matched = false; + var number = templateDevice.find('.restriction-matcher-input').val(); - if(number) { + if (number) { self.callApi({ resource: 'numbers.matchClassifier', data: { @@ -503,35 +507,35 @@ define(function(require){ phoneNumber: encodeURIComponent(number) }, success: function(data, status) { - var matchedLine = templateDevice.find('.restriction-line[data-restriction="'+data.data.name+'"]'), + var matchedLine = templateDevice.find('.restriction-line[data-restriction="' + data.data.name + '"]'), matchedSign = matchedLine.find('.restriction-matcher-sign'), matchedMsg = templateDevice.find('.restriction-message'); templateDevice.find('.restriction-matcher-sign').hide(); - if(matchedLine.find('.restrictions-switch').prop('checked')) { - matchedSign.removeClass('monster-red fa-times') - .addClass('monster-green fa-check') - .css('display', 'inline-block'); - - matchedMsg.removeClass('red-box') - .addClass('green-box') - .css('display', 'inline-block') - .empty() - .text( - monster.template(self, '!' + self.i18n.active().devices.popupSettings.restrictions.matcher.allowMessage, { phoneNumber: monster.util.formatPhoneNumber(number) }) - ); + if (matchedLine.find('.restrictions-switch').prop('checked')) { + matchedSign + .removeClass('monster-red fa-times') + .addClass('monster-green fa-check') + .css('display', 'inline-block'); + + matchedMsg + .removeClass('red-box') + .addClass('green-box') + .css('display', 'inline-block') + .empty() + .text(monster.template(self, '!' + self.i18n.active().devices.popupSettings.restrictions.matcher.allowMessage, { phoneNumber: monster.util.formatPhoneNumber(number) })); } else { - matchedSign.removeClass('monster-green fa-check') - .addClass('monster-red fa-times') - .css('display', 'inline-block'); - - matchedMsg.removeClass('green-box') - .addClass('red-box') - .css('display', 'inline-block') - .empty() - .text( - monster.template(self, '!' + self.i18n.active().devices.popupSettings.restrictions.matcher.denyMessage, { phoneNumber: monster.util.formatPhoneNumber(number) }) - ); + matchedSign + .removeClass('monster-green fa-check') + .addClass('monster-red fa-times') + .css('display', 'inline-block'); + + matchedMsg + .removeClass('green-box') + .addClass('red-box') + .css('display', 'inline-block') + .empty() + .text(monster.template(self, '!' + self.i18n.active().devices.popupSettings.restrictions.matcher.denyMessage, { phoneNumber: monster.util.formatPhoneNumber(number) })); } } }); @@ -603,11 +607,11 @@ define(function(require){ hasRTP = $.inArray(originalData.device_type, ['sip_device', 'mobile', 'softphone']) > -1, formData = monster.ui.getFormData('form_device'); - if('mac_address' in formData) { + if ('mac_address' in formData) { formData.mac_address = monster.util.formatMacAddress(formData.mac_address); } - if(hasCallForward) { + if (hasCallForward) { formData.call_forward = $.extend(true, { enabled: true, require_keypress: true, @@ -618,12 +622,12 @@ define(function(require){ formData.call_forward.failover = true; } - if(formData.hasOwnProperty('extra') && formData.extra.allowVMCellphone) { + if (formData.hasOwnProperty('extra') && formData.extra.allowVMCellphone) { formData.call_forward.require_keypress = !formData.extra.allowVMCellphone; } } - if(hasCodecs) { + if (hasCodecs) { formData.media = $.extend(true, { audio: { codecs: [] @@ -634,7 +638,7 @@ define(function(require){ }, formData.media); } - if(hasSIP) { + if (hasSIP) { formData.sip = $.extend(true, { expire_seconds: 360, invite_format: 'username', @@ -642,10 +646,10 @@ define(function(require){ }, formData.sip); } - if('call_restriction' in formData) { + if ('call_restriction' in formData) { _.each(formData.call_restriction, function(restriction, key) { - if(key in originalData.extra.restrictions && originalData.extra.restrictions[key].disabled) { - restriction.action = originalData.extra.restrictions[key].action + if (key in originalData.extra.restrictions && originalData.extra.restrictions[key].disabled) { + restriction.action = originalData.extra.restrictions[key].action; } else { restriction.action = restriction.action === true ? 'inherit' : 'deny'; } @@ -668,8 +672,7 @@ define(function(require){ if (_.isEmpty(keys)) { delete originalData.provision[key]; - } - else { + } else { originalData.provision[key] = keys; } }); @@ -680,42 +683,42 @@ define(function(require){ var mergedData = $.extend(true, {}, originalData, formData); /* The extend doesn't override an array if the new array is empty, so we need to run these snippet after the merge */ - if(hasRTP) { + if (hasRTP) { mergedData.media.encryption.methods = []; - if(mergedData.media.encryption.enforce_security) { + if (mergedData.media.encryption.enforce_security) { mergedData.media.encryption.methods.push(formData.extra.rtpMethod); } } - if(mergedData.extra.hasOwnProperty('notify_unregister')) { + if (mergedData.extra.hasOwnProperty('notify_unregister')) { mergedData.suppress_unregister_notifications = !mergedData.extra.notify_unregister; } - if(hasCodecs) { - if(audioCodecs) { + if (hasCodecs) { + if (audioCodecs) { mergedData.media.audio.codecs = audioCodecs.getSelectedItems(); } - - if(videoCodecs) { + + if (videoCodecs) { mergedData.media.video.codecs = videoCodecs.getSelectedItems(); } } // If the key is set to "auto" we remove the key, we don't support this anymore - if(mergedData.hasOwnProperty('media') && mergedData.media.hasOwnProperty('fax_option') && mergedData.media.fax_option === 'auto') { + if (mergedData.hasOwnProperty('media') && mergedData.media.hasOwnProperty('fax_option') && mergedData.media.fax_option === 'auto') { delete mergedData.media.fax_option; } // The UI mistakenly created this key, so we clean it up - if(mergedData.hasOwnProperty('media') && mergedData.media.hasOwnProperty('fax') && mergedData.media.fax.hasOwnProperty('option')) { + if (mergedData.hasOwnProperty('media') && mergedData.media.hasOwnProperty('fax') && mergedData.media.fax.hasOwnProperty('option')) { delete mergedData.media.fax.option; } - if(mergedData.hasOwnProperty('caller_id') && mergedData.caller_id.hasOwnProperty('emergency') && mergedData.caller_id.emergency.hasOwnProperty('number') && mergedData.caller_id.emergency.number === '') { + if (mergedData.hasOwnProperty('caller_id') && mergedData.caller_id.hasOwnProperty('emergency') && mergedData.caller_id.emergency.hasOwnProperty('number') && mergedData.caller_id.emergency.number === '') { delete mergedData.caller_id.emergency.number; - if(_.isEmpty(mergedData.caller_id.emergency)) { + if (_.isEmpty(mergedData.caller_id.emergency)) { delete mergedData.caller_id.emergency; } } @@ -749,7 +752,7 @@ define(function(require){ enabled: true, media: { encryption: { - enforce_security: false, + enforce_security: false }, audio: { codecs: ['PCMU', 'PCMA'] @@ -784,7 +787,7 @@ define(function(require){ }, contact_list: { exclude: true - }, + } }, ata: { sip: { @@ -842,25 +845,24 @@ define(function(require){ } } }; - + _.each(data.listClassifiers, function(restriction, name) { - if(name in self.i18n.active().devices.classifiers) { + if (name in self.i18n.active().devices.classifiers) { defaults.extra.restrictions[name].friendly_name = self.i18n.active().devices.classifiers[name].name; - if('help' in self.i18n.active().devices.classifiers[name]) { + if ('help' in self.i18n.active().devices.classifiers[name]) { defaults.extra.restrictions[name].help = self.i18n.active().devices.classifiers[name].help; } } - if('call_restriction' in data.accountLimits && name in data.accountLimits.call_restriction && data.accountLimits.call_restriction[name].action === 'deny') { + if ('call_restriction' in data.accountLimits && name in data.accountLimits.call_restriction && data.accountLimits.call_restriction[name].action === 'deny') { defaults.extra.restrictions[name].disabled = true; defaults.extra.hasDisabledRestrictions = true; } - if('call_restriction' in data.device && name in data.device.call_restriction) { + if ('call_restriction' in data.device && name in data.device.call_restriction) { defaults.extra.restrictions[name].action = data.device.call_restriction[name].action; - } - else { + } else { defaults.extra.restrictions[name].action = 'inherit'; } }); @@ -869,18 +871,18 @@ define(function(require){ /* Audio Codecs*/ /* extend doesn't replace the array so we need to do it manually */ - if(data.device.media && data.device.media.audio && data.device.media.audio.codecs) { + if (data.device.media && data.device.media.audio && data.device.media.audio.codecs) { formattedData.media.audio.codecs = data.device.media.audio.codecs; } /* Video codecs */ - if(data.device.media && data.device.media.video && data.device.media.video.codecs) { + if (data.device.media && data.device.media.video && data.device.media.video.codecs) { formattedData.media.video.codecs = data.device.media.video.codecs; } formattedData.extra.isRegistered = dataList.isRegistered; - if(formattedData.hasOwnProperty('call_forward') && formattedData.call_forward.hasOwnProperty('require_keypress')) { + if (formattedData.hasOwnProperty('call_forward') && formattedData.call_forward.hasOwnProperty('require_keypress')) { formattedData.extra.allowVMCellphone = !formattedData.call_forward.require_keypress; } @@ -931,17 +933,17 @@ define(function(require){ classStatus: device.enabled ? 'unregistered' : 'disabled' /* Display a device in black if it's disabled, otherwise, until we know whether it's registered or not, we set the color to red */, isRegistered: false, sipUserName: device.username - } + }; }); _.each(data.status, function(status) { - if(status.registered === true && status.device_id in formattedData.devices) { + if (status.registered === true && status.device_id in formattedData.devices) { var device = formattedData.devices[status.device_id]; device.registered = true; /* Now that we know if it's registered, we set the color to green */ - if(device.enabled) { + if (device.enabled) { device.classStatus = 'registered'; device.isRegistered = true; } @@ -956,21 +958,18 @@ define(function(require){ arrayToSort.sort(function(a, b) { /* If owner is the same, order by device name */ - if(a.userName === b.userName) { + if (a.userName === b.userName) { var aName = a.name.toLowerCase(), bName = b.name.toLowerCase(); return (aName > bName) ? 1 : (aName < bName) ? -1 : 0; - } - else { + } else { /* Otherwise, push the unassigned devices to the bottom of the list, and show the assigned devices ordered by user name */ - if(a.userName === unassignedString) { + if (a.userName === unassignedString) { return 1; - } - else if(b.userName === unassignedString) { + } else if (b.userName === unassignedString) { return -1; - } - else { + } else { var aSortName = a.sortableUserName.toLowerCase(), bSortName = b.sortableUserName.toLowerCase(); @@ -985,7 +984,7 @@ define(function(require){ }, devicesSnakeToCamel: function(string) { - return string.replace(/(\_\w)/g, function (match) { return match[1].toUpperCase(); }); + return string.replace(/(_\w)/g, function(match) { return match[1].toUpperCase(); }); }, /* Utils */ @@ -1034,7 +1033,7 @@ define(function(require){ var e911Numbers = {}; _.each(data.data.numbers, function(val, key) { - if(val.features.indexOf('e911') >= 0) { + if (val.features.indexOf('e911') >= 0) { e911Numbers[key] = self.devicesFormatNumber(val); } }); @@ -1047,7 +1046,7 @@ define(function(require){ devicesFormatNumber: function(value) { var self = this; - if('locality' in value) { + if ('locality' in value) { value.isoCountry = value.locality.country || ''; value.friendlyLocality = 'city' in value.locality ? value.locality.city + ('state' in value.locality ? ', ' + value.locality.state : '') : ''; } @@ -1057,46 +1056,43 @@ define(function(require){ devicesGetEditData: function(dataDevice, callback) { var self = this; - + monster.parallel({ - listClassifiers: function(callback) { - self.devicesListClassifiers(function(dataClassifiers) { - callback(null, dataClassifiers); - }); - }, - device: function(callback) { - if(dataDevice.id) { - self.devicesGetDevice(dataDevice.id, function(dataDevice) { - callback(null, dataDevice); - }); - } - else { + listClassifiers: function(callback) { + self.devicesListClassifiers(function(dataClassifiers) { + callback(null, dataClassifiers); + }); + }, + device: function(callback) { + if (dataDevice.id) { + self.devicesGetDevice(dataDevice.id, function(dataDevice) { callback(null, dataDevice); - } - }, - e911Numbers: function(callback) { - self.devicesGetE911Numbers(function(e911Numbers) { - callback(null, e911Numbers); - }); - }, - accountLimits: function(callback) { - self.callApi({ - resource: 'limits.get', - data: { - accountId: self.accountId - }, - success: function(data, status) { - callback(null, data.data); - } }); + } else { + callback(null, dataDevice); } }, - function(error, results) { - var formattedData = self.devicesFormatData(results, dataDevice); - - callback && callback(formattedData); + e911Numbers: function(callback) { + self.devicesGetE911Numbers(function(e911Numbers) { + callback(null, e911Numbers); + }); + }, + accountLimits: function(callback) { + self.callApi({ + resource: 'limits.get', + data: { + accountId: self.accountId + }, + success: function(data, status) { + callback(null, data.data); + } + }); } - ); + }, function(error, results) { + var formattedData = self.devicesFormatData(results, dataDevice); + + callback && callback(formattedData); + }); }, devicesGetDevice: function(deviceId, callbackSuccess, callbackError) { @@ -1120,10 +1116,9 @@ define(function(require){ devicesSaveDevice: function(deviceData, callback) { var self = this; - if(deviceData.id) { + if (deviceData.id) { self.devicesUpdateDevice(deviceData, callback); - } - else { + } else { self.devicesCreateDevice(deviceData, callback); } }, @@ -1166,53 +1161,51 @@ define(function(require){ var self = this; monster.parallel({ - users: function(callback) { - self.callApi({ - resource: 'user.list', - data: { - accountId: self.accountId, - filters: { - paginate: 'false' - } - }, - success: function(dataUsers) { - callback && callback(null, dataUsers.data); - } - }); - }, - status: function(callback) { - self.callApi({ - resource: 'device.getStatus', - data: { - accountId: self.accountId, - filters: { - paginate: 'false' - } - }, - success: function(dataStatus) { - callback && callback(null, dataStatus.data); + users: function(callback) { + self.callApi({ + resource: 'user.list', + data: { + accountId: self.accountId, + filters: { + paginate: 'false' } - }); - }, - devices: function(callback) { - self.callApi({ - resource: 'device.list', - data: { - accountId: self.accountId, - filters: { - paginate: 'false' - } - }, - success: function(dataDevices) { - callback(null, dataDevices.data); + }, + success: function(dataUsers) { + callback && callback(null, dataUsers.data); + } + }); + }, + status: function(callback) { + self.callApi({ + resource: 'device.getStatus', + data: { + accountId: self.accountId, + filters: { + paginate: 'false' } - }); - } + }, + success: function(dataStatus) { + callback && callback(null, dataStatus.data); + } + }); }, - function(err, results) { - callback && callback(results); + devices: function(callback) { + self.callApi({ + resource: 'device.list', + data: { + accountId: self.accountId, + filters: { + paginate: 'false' + } + }, + success: function(dataDevices) { + callback(null, dataDevices.data); + } + }); } - ); + }, function(err, results) { + callback && callback(results); + }); }, devicesGetE911NumberAddress: function(number, callback) { @@ -1230,7 +1223,7 @@ define(function(require){ postal_code = _data.data.e911.postal_code, region = _data.data.e911.region; - if ( typeof _data.data.e911.extended_address !== 'undefined' ) { + if (typeof _data.data.e911.extended_address !== 'undefined') { callback(street_address + ', ' + _data.data.e911.extended_address + '
' + locality + ', ' + region + ' ' + postal_code); } else { callback(street_address + ', ' + '
' + locality + ', ' + region + ' ' + postal_code); @@ -1242,7 +1235,7 @@ define(function(require){ devicesGetIterator: function(args, callbackSuccess, callbackError) { var self = this; - if(args.hasOwnProperty('endpoint_brand') && args.hasOwnProperty('endpoint_family') && args.hasOwnProperty('endpoint_model')) { + if (args.hasOwnProperty('endpoint_brand') && args.hasOwnProperty('endpoint_family') && args.hasOwnProperty('endpoint_model')) { monster.request({ resource: 'provisioner.ui.getModel', data: { @@ -1254,11 +1247,10 @@ define(function(require){ callbackSuccess && callbackSuccess(data.data.template); }, error: function(data, status) { - + callbackError && callbackError(); } }); - } - else { + } else { callbackError && callbackError(); } }, diff --git a/views/devices-sip_device.html b/views/devices-sip_device.html index e9eef14..17c8787 100644 --- a/views/devices-sip_device.html +++ b/views/devices-sip_device.html @@ -286,10 +286,25 @@

{{/if}} {{/each}} + {{#compare id '===' 'combo_keys'}} +

+ + {{@root.i18n.devices.popupSettings.keys.types.line}} + + : {{@root.i18n.devices.popupSettings.keys.info.types.line}} +

+ {{/compare}} {{#each data}} -
+
+ {{#compare ../id '===' 'combo_keys'}} + {{#compare @key '===' '0'}} +
+ {{@root.i18n.devices.popupSettings.keys.alertMessage}} +
+ {{/compare}} + {{/compare}} @@ -299,6 +314,9 @@ {{#each @root.extra.provision.keyActions}} {{/each}} + {{#compare ../id '===' 'combo_keys'}} + + {{/compare}} {{/select}}
@@ -329,6 +347,12 @@
+ {{#compare id '===' 'combo_keys'}} + {{#compare @key '===' '0'}} + {{#if @root.extra.firstComboKeyUnset}} + {{/if}} + {{/compare}} + {{/compare}}
{{/each}}