diff --git a/i18n/en-US.json b/i18n/en-US.json index 2bc4b74..783218c 100644 --- a/i18n/en-US.json +++ b/i18n/en-US.json @@ -427,7 +427,11 @@ "password": "Password", "passwordPlaceholder": "Password (Min. 6 characters)", "title": "Update Email and password", - "username": "User's Email address" + "username": "User's Email address", + "resetPassword": { + "linkTitle": "here", + "text": "If you want the system to send an e-mail to this user with instructions on how to reset his password, click " + } }, "dialogChangePin": { "help": "You can use this popup to set a temporary PIN for a user that lost his PIN for example.", @@ -525,7 +529,10 @@ "pinUpdated": "You successfully updated the PIN of {{ name }}.", "__comment": "UI-1033: Now properly remove the Caller-ID Feature if we remove a number that was set as that Caller-ID Number", "__version": "3.20", - "callerIDDeleted": "The Caller-ID Number of this user was set to a number that was no longer assigned to him, so we disabled the Caller-ID Feature." + "callerIDDeleted": "The Caller-ID Number of this user was set to a number that was no longer assigned to him, so we disabled the Caller-ID Feature.", + "__comment": ": Now offer admin the option to send an email to reset the password of a user", + "__version": "4.0", + "successResetPassword": "Success! {{ name }} will be receiving an e-mail with instructions on how to reset his password shortly." }, "uploadPicture": "Upload a Picture", "user": "User", diff --git a/submodules/devices/devices.js b/submodules/devices/devices.js index 1b5f48e..6d6a469 100644 --- a/submodules/devices/devices.js +++ b/submodules/devices/devices.js @@ -985,7 +985,8 @@ define(function(require){ friendlyType: self.i18n.active().devices.types[device.device_type], registered: false, 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 + isRegistered: false, + sipUserName: device.username } }); diff --git a/submodules/groups/groups.js b/submodules/groups/groups.js index 717202c..e61bdb2 100644 --- a/submodules/groups/groups.js +++ b/submodules/groups/groups.js @@ -1191,9 +1191,10 @@ define(function(require){ number.viewFeatures = $.extend(true, {}, features); number.phoneNumber = number.id; + monster.util.populateBooleansNumberFeatures(number); + number.extra.hasFeatures = number.extra.hasE911 || number.extra.hasPrepend || number.extra.hasCnam; + var rowTemplate = $(monster.template(self, 'groups-numbersItemRow', { - isCnamEnabled: monster.util.isNumberFeatureEnabled('cnam'), - isE911Enabled: monster.util.isNumberFeatureEnabled('e911'), number: number })); @@ -1493,6 +1494,9 @@ define(function(require){ } }); + monster.util.populateBooleansNumberFeatures(number); + number.extra.hasFeatures = number.extra.hasE911 || number.extra.hasPrepend || number.extra.hasCnam; + if(!number.hasOwnProperty('used_by') || number.used_by === '') { response.unassignedNumbers[id] = number; response.countSpare++; diff --git a/submodules/strategy/strategy.js b/submodules/strategy/strategy.js index 0b50b1d..bc56276 100644 --- a/submodules/strategy/strategy.js +++ b/submodules/strategy/strategy.js @@ -394,7 +394,9 @@ define(function(require){ numbers: $.map(numbers, function(val, key) { if(val!=="0") { var ret = { - number: val, + number: { + id: val + }, features: $.extend(true, {}, strategyData.numberFeatures) }; @@ -402,14 +404,15 @@ define(function(require){ _.each(accountNumbers[val].features, function(feature) { ret.features[feature].active = 'active'; }); - ret.isLocal = accountNumbers[val].features.indexOf('local') > -1; + ret.number = $.extend(true, accountNumbers[val], ret.number); } + monster.util.populateBooleansNumberFeatures(ret.number); + ret.number.extra.hasFeatures = ret.number.extra.hasE911 || ret.number.extra.hasPrepend || ret.number.extra.hasCnam; + return ret; } }), - isCnamEnabled: monster.util.isNumberFeatureEnabled('cnam'), - isE911Enabled: monster.util.isNumberFeatureEnabled('e911'), spareLinkEnabled: (_.countBy(accountNumbers, function(number) {return number.used_by ? 'assigned' : 'spare';})['spare'] > 0) }, template = $(monster.template(self, 'strategy-'+templateName, templateData)); diff --git a/submodules/users/users.js b/submodules/users/users.js index d993d4b..e662ee8 100644 --- a/submodules/users/users.js +++ b/submodules/users/users.js @@ -70,7 +70,7 @@ define(function(require){ monster.ui.highlight(cells); } - if ( dataTemplate.users.length == 0) { + if ( dataTemplate.users.length === 0) { parent.find('.grid-row.title').css('display', 'none'); parent.find('.no-users-row').css('display', 'block'); } else { @@ -908,6 +908,19 @@ define(function(require){ } }); + passwordTemplate.find('.reset-password').on('click', function() { + var dataReset = { + username: currentUser.username, + account_name: monster.apps.auth.currentAccount.name + }; + + self.usersResetPassword(dataReset, function() { + popup.dialog('close').remove(); + + toastr.success(monster.template(self, '!' + toastrMessages.successResetPassword, { name: dataReset.username })); + }); + }); + passwordTemplate.find('.save-new-username').on('click', function() { var formData = monster.ui.getFormData('form_new_username'), userToSave = $.extend(true, {}, currentUser, formData); @@ -1108,8 +1121,6 @@ define(function(require){ template .find('.list-assigned-items') .append($(monster.template(self, 'users-numbersItemRow', { - isCnamEnabled: monster.util.isNumberFeatureEnabled('cnam'), - isE911Enabled: monster.util.isNumberFeatureEnabled('e911'), number: val }))); @@ -1139,9 +1150,10 @@ define(function(require){ number.viewFeatures = $.extend(true, {}, features); number.phoneNumber = number.id; + monster.util.populateBooleansNumberFeatures(number); + number.extra.hasFeatures = number.extra.hasE911 || number.extra.hasPrepend || number.extra.hasCnam; + var rowTemplate = $(monster.template(self, 'users-numbersItemRow', { - isCnamEnabled: monster.util.isNumberFeatureEnabled('cnam'), - isE911Enabled: monster.util.isNumberFeatureEnabled('e911'), number: number })); @@ -2711,32 +2723,33 @@ define(function(require){ }, usersGetNumbersTemplate: function(userId, callback) { - var self = this; + var self = this, + template; self.usersGetNumbersData(userId, function(results) { self.usersFormatNumbersData(userId, results, function(results) { - template = $(monster.template(self, 'users-numbers', $.extend(true, {}, results, { - isCnamEnabled: monster.util.isNumberFeatureEnabled('cnam'), - isE911Enabled: monster.util.isNumberFeatureEnabled('e911') - }))); + template = $(monster.template(self, 'users-numbers', results)); callback && callback(template, results); }); }, true); }, usersGetDevicesTemplate: function(userId, callback) { - var self = this; + var self = this, + template; self.usersGetDevicesData(function(results) { - var results = self.usersFormatDevicesData(userId, results); + var formattedResults = self.usersFormatDevicesData(userId, results); - template = $(monster.template(self, 'users-devices', results)); + template = $(monster.template(self, 'users-devices', formattedResults)); callback && callback(template, results); }); }, usersGetExtensionsTemplate: function(userId, callback) { - var self = this; + var self = this, + template; + self.usersGetNumbersData(userId, function(results) { self.usersFormatNumbersData(userId, results, function(results) { template = $(monster.template(self, 'users-extensions', results)); @@ -2809,6 +2822,9 @@ define(function(require){ } }); + monster.util.populateBooleansNumberFeatures(number); + number.extra.hasFeatures = number.extra.hasE911 || number.extra.hasPrepend || number.extra.hasCnam; + /* Adding to spare numbers */ if(!number.hasOwnProperty('used_by') || number.used_by === '') { response.countSpare++; @@ -4468,6 +4484,25 @@ define(function(require){ usersRemoveOverlay: function() { $('body').find('#users_container_overlay').remove(); + }, + + usersResetPassword: function(data, callback) { + var self = this, + dataPassword = { + username: data.username, + account_name: data.account_name, + ui_url: window.location.href.split('#')[0] + }; + + self.callApi({ + resource: 'auth.recovery', + data: { + data: dataPassword + }, + success: function(data) { + callback && callback(data.data); + } + }); } }; diff --git a/views/devices-layout.html b/views/devices-layout.html index 196c8a5..8c6d8a1 100644 --- a/views/devices-layout.html +++ b/views/devices-layout.html @@ -24,7 +24,7 @@ - + diff --git a/views/devices-row.html b/views/devices-row.html index 62e9493..50001ad 100644 --- a/views/devices-row.html +++ b/views/devices-row.html @@ -1,4 +1,4 @@ -