Browse Source

UI-1109: Added the new Main Extension thing to set the presence id field

4.3
Jean-Roch Maitre 11 years ago
parent
commit
5b3bfc5dca
7 changed files with 236 additions and 23 deletions
  1. +12
    -1
      i18n/en-US.json
  2. +12
    -1
      i18n/fr-FR.json
  3. +0
    -2
      submodules/devices/devices.js
  4. +37
    -1
      submodules/users/users.css
  5. +142
    -18
      submodules/users/users.js
  6. +21
    -0
      views/users-changePresenceIDPopup.html
  7. +12
    -0
      views/users-name.html

+ 12
- 1
i18n/en-US.json View File

@ -365,7 +365,11 @@
"timeoutSec": "Sec",
"timeoutEdit": "Edit in Find-Me-Follow-Me feature",
"timeoutEditHint": "The ringing timeout is overriden by the Find-Me-Follow-Me feature. Click on the link below to edit it.",
"disabledTimeoutHint": "You need at least one number or extension to set up the ringing timeout."
"disabledTimeoutHint": "You need at least one number or extension to set up the ringing timeout.",
"__comment": "UI-1109: Adding the Presence ID setting on the User document",
"__version": "3.19",
"presenceId": "Main Extension",
"noPresenceID": "- Not Set -"
},
"delete": "Delete User",
"errorCallerId": "Before configuring the Caller-ID of this user, you need to assign him a number",
@ -503,6 +507,13 @@
"migration": {
"confirmMigration": "We found an existing callflow with the number you're trying to add, it appears we can migrate this callflow to the SmartPBX. Before we proceed, we want to make sure you understand that you won't be allowed to update this Callflow in Kazoo-UI or in the Monster-UI Callflows app after this change. Do you want to continue?",
"tooManyCallflows": "It appears the numbers you're trying to add belong to multiple Kazoo-UI Callflows. There is no way to properly migrate these callflows in Monster-UI please contact your support to fix it."
},
"__commment": "UI-1109: Adding popup for Presence ID change",
"__version": "3.19",
"presenceIDPopup": {
"title": "Select your new Main Extension",
"header": "It appears that you want to remove the number you had set as your Main Extension. Please select your new Main Extension from the choices below:",
"none": "I don't want to set a new Main Extension"
}
},


+ 12
- 1
i18n/fr-FR.json View File

@ -340,7 +340,11 @@
"timeoutSec": "Sec",
"timeoutEdit": "Editer dans \"Find-Me-Follow-Me\"",
"timeoutEditHint": "La durée de sonnerie est redéfinie dans la fonctionnalité \"Find-Me-Follow-Me\". Cliquez sur le lien ci-dessous pour la modifier.",
"disabledTimeoutHint": "Au moins un numéro ou extension est requis avant de pouvoir définir la durée de sonnerie."
"disabledTimeoutHint": "Au moins un numéro ou extension est requis avant de pouvoir définir la durée de sonnerie.",
"__comment": "UI-1109: Adding the Presence ID setting on the User document",
"__version": "3.19",
"presenceId": "Extension Principale",
"noPresenceID": "- Aucune -"
},
"delete": "Supprimer Utilisateur",
"errorCallerId": "Avant de configurer le Caller-ID de l'utilisateur, vous devez d'abord lui attribuer un numéro.",
@ -479,6 +483,13 @@
"migration": {
"confirmMigration": "Un des numéros que vous souhaitez rajouter existe déjà dans Kazoo-UI, nous pouvons migrer le callflow vers SmartPBX pour vous permettre de l'utiliser. Vous ne pourrez plus modifier ce callflow dans Kazoo-UI ou dans l'application Callflows de Monster-UI. Continuez quand même?",
"tooManyCallflows": "Vous essayez de rajouter des numéros existant déjà sur plusieurs callflows, nous ne pouvons continuer notre opération automatique de migration. Veuillez contacter votre support pour résoudre ce problème."
},
"__commment": "UI-1109: Adding popup for Presence ID change",
"__version": "3.19",
"presenceIDPopup": {
"title": "Sélectionnez votre Extension Principale",
"header": "Vous êtes en train de supprimer l'Extension Principale de cet utilisateur, veuillez en sélectionner une nouvelle dans les options ci-dessous:",
"none": "Je ne veux pas d'Extension Principale'"
}
},


+ 0
- 2
submodules/devices/devices.js View File

@ -443,8 +443,6 @@ define(function(require){
delete mergedData.media.secure_rtp;
delete mergedData.extra;
console.log(mergedData);
return mergedData;
},


+ 37
- 1
submodules/users/users.css View File

@ -283,7 +283,6 @@
#users_container .detail-user .row-fields {
margin-bottom: 10px;
height: 40px;
line-height: 40px;
}
@ -302,6 +301,10 @@
cursor: default !important;
}
#users_container .detail-user .row-fields .presence-id-select {
margin-left: 10px;
}
#users_container .detail-user .row-fields .timeout-edit {
margin-left: 50px;
}
@ -793,4 +796,37 @@
.device-popover-icon {
margin-right: 10px;
vertical-align: text-bottom;
}
/**** CSS For Changing the Presence ID settings *****/
.presence-id-change-wrapper {
padding: 15px;
width: 400px;
}
.presence-id-change-wrapper .list-choices {
margin-bottom: 20px;
margin-top: 20px;
}
.presence-id-change-wrapper .list-choices .presence-id-option {
background: #EEE;
padding: 20px;
border: 1px solid #CCC;
margin-bottom: 5px;
}
.presence-id-change-wrapper .list-choices .presence-id-option:hover {
background: #FFF;
cursor: pointer;
}
.presence-id-change-wrapper .list-choices .presence-id-option.active {
background: #FFF;
border: 1px solid #22CCFF;
}
.presence-id-change-wrapper .actions {
margin-top: 10px;
}

+ 142
- 18
submodules/users/users.js View File

@ -203,6 +203,26 @@ define(function(require){
dataUser.extra.adminId = self.userId;
dataUser.extra.presenceIdOptions = [{ key: 'unset', value: self.i18n.active().users.editionForm.noPresenceID }];
var temp,
addNumberToPresenceOptions = function(number) {
temp = {
key: number,
value: monster.util.formatPhoneNumber(number)
};
dataUser.extra.presenceIdOptions.push(temp);
};
_.each(dataUser.extra.listExtensions, function(extension) {
addNumberToPresenceOptions(extension);
})
_.each(dataUser.extra.listNumbers, function(number) {
addNumberToPresenceOptions(number);
});
return dataUser;
},
@ -405,6 +425,7 @@ define(function(require){
else if(type === 'extensions') {
existingExtensions = data.allExtensions;
currentCallflow = data.callflow;
currentUser = data.user;
numbersToSave = [];
_.each(data.assignedNumbers, function(v) {
@ -526,8 +547,6 @@ define(function(require){
template.find('.grid-cell.active').removeClass('active');
});
});
/* Events for Extensions details */
@ -546,10 +565,29 @@ define(function(require){
numbers.push(number);
});
self.usersUpdateCallflowNumbers(userId, (currentCallflow || {}).id, numbers, function(callflowData) {
toastr.success(monster.template(self, '!' + toastrMessages.numbersUpdated, { name: name }));
self.usersRender({ userId: callflowData.owner_id });
});
if(numbers.length > 0) {
var updateCallflow = function() {
self.usersUpdateCallflowNumbers(userId, (currentCallflow || {}).id, numbers, function(callflowData) {
toastr.success(monster.template(self, '!' + toastrMessages.numbersUpdated, { name: name }));
self.usersRender({ userId: callflowData.owner_id });
});
};
if(self.usersHasProperPresenceId(numbers, currentUser)) {
updateCallflow();
}
else {
self.usersUpdatePresenceIDPopup(numbers, currentUser, function(user) {
self.usersUpdateUser(user, function() {
updateCallflow();
});
});
}
}
else {
monster.ui.alert('warning', self.i18n.active().users.noNumberCallflow);
}
});
template.on('click', '#add_extensions', function() {
@ -903,7 +941,7 @@ define(function(require){
/* Events for Numbers in Users */
template.on('click', '.detail-numbers .list-assigned-items .remove-number', function() {
var $this = $(this),
userName = currentUser.name,
userName = currentUser.first_name + ' ' + currentUser.last_name,
dataNumbers = $.extend(true, [], extensionsToSave),
userId = currentUser.id,
row = $this.parents('.item-row');
@ -919,27 +957,49 @@ define(function(require){
dataNumbers.push($(elem).data('id'));
});
self.usersUpdateCallflowNumbers(userId, (currentCallflow || {}).id, dataNumbers, function(callflowData) {
var successCallback = function() {
toastr.success(monster.template(self, '!' + toastrMessages.numbersUpdated, { name: userName }));
self.usersRender({ userId: userId });
};
if(dataNumbers.length > 0) {
var updateCallflow = function() {
self.usersUpdateCallflowNumbers(userId, (currentCallflow || {}).id, dataNumbers, function(callflowData) {
toastr.success(monster.template(self, '!' + toastrMessages.numbersUpdated, { name: userName }));
self.usersRender({ userId: userId });
});
},
updateUserAndCallflow = function(user) {
self.usersUpdateUser(user, function() {
updateCallflow();
});
};
// If we deleted a number that was used as the Caller-ID , disable the Caller-ID feature.
var changedCallerID = false;
var needUpdateUser = false;
if(currentUser.caller_id.hasOwnProperty('internal') && dataNumbers.indexOf(currentUser.caller_id.internal.number) < 0) {
delete currentUser.caller_id.internal.number;
changedCallerID = true;
needUpdateUser = true;
}
if(currentUser.caller_id.hasOwnProperty('external') && dataNumbers.indexOf(currentUser.caller_id.external.number) < 0) {
delete currentUser.caller_id.external.number;
changedCallerID = true;
needUpdateUser = true;
}
// If Caller ID change, update the user and then run the successfull callback, otherwise just skip the user update and run the successful callback
changedCallerID ? self.usersUpdateUser(currentUser, successCallback) : successCallback();
});
if(!self.usersHasProperPresenceId(dataNumbers, currentUser)) {
self.usersUpdatePresenceIDPopup(dataNumbers, currentUser, function(user) {
updateUserAndCallflow(user);
});
}
else {
if(needUpdateUser) {
updateUserAndCallflow(currentUser);
}
else {
updateCallflow();
}
}
}
else {
monster.ui.alert('warning', self.i18n.active().users.noNumberCallflow);
self.usersRender({ userId: userId });
}
});
});
@ -1247,6 +1307,65 @@ define(function(require){
});
},
usersUpdatePresenceIDPopup: function(numbers, user, callback) {
var self = this,
dataTemplate = {
numbers: numbers
},
template = $(monster.template(self, 'users-changePresenceIDPopup', dataTemplate)),
$options = template.find('.presence-id-option');
$options.on('click', function() {
$options.removeClass('active');
$(this).addClass('active');
});
template.find('.save-presence-id').on('click', function() {
var newPresenceID = template.find('.presence-id-option.active').data('number');
if(newPresenceID !== 'none') {
user.presence_id = newPresenceID;
}
else {
delete user.presence_id;
}
popup.dialog('close').remove();
callback && callback(user);
});
template.find('.cancel-link').on('click', function() {
popup.dialog('close').remove();
});
var popup = monster.ui.dialog(template, {
title: self.i18n.active().users.presenceIDPopup.title,
position: ['center', 20]
});
},
usersHasProperPresenceId: function(listNumbers, user) {
var self = this;
if(user.presence_id) {
var found = false,
formattedPresenceID = '' + user.presence_id;
_.each(listNumbers, function(number) {
if(number === formattedPresenceID) {
found = true;
}
});
return found;
}
else {
return true;
}
},
/* Helper function that takes an array of number in parameter, sorts it, and returns the first number not in the array, greater than the minVal */
usersGetNextInt: function(listNumbers) {
var orderedArray = listNumbers,
@ -2260,6 +2379,10 @@ define(function(require){
}
}
if(userData.presence_id === 'unset') {
delete userData.presence_id;
}
delete userData.include_directory;
delete userData.features;
delete userData.extra;
@ -2626,6 +2749,7 @@ define(function(require){
name: callerIdName
}
},
presence_id: data.callflow.extension,
email: data.extra.differentEmail ? data.extra.email : data.user.username,
priv_level: 'user',
timezone: defaultTimezone


+ 21
- 0
views/users-changePresenceIDPopup.html View File

@ -0,0 +1,21 @@
<div class="presence-id-change-wrapper">
<div class="header">
{{ i18n.users.presenceIDPopup.header }}
</div>
<div class="list-choices">
{{#each numbers}}
<div class="presence-id-option" data-number="{{this}}">{{ formatPhoneNumber this }}</div>
{{/each}}
<div class="presence-id-option" data-number="none">
{{ i18n.users.presenceIDPopup.none}}
</div>
</div>
<div class="actions clearfix">
<div class="pull-right">
<a class="cancel-link monster-link blue" href="javascript:void(0);">{{ i18n.cancel }}</a>
<button type="button" class="btn btn-success save-presence-id">{{ i18n.saveChanges }}</button>
</div>
</div>
</div>

+ 12
- 0
views/users-name.html View File

@ -96,6 +96,18 @@
</div>
{{/if}}
</div>
<div class="row-fields">
<div class="icon-wrapper"><i class="icon-telicon-extension"></i></div>
<label>{{ i18n.users.editionForm.presenceId }}</label>
<select name="presence_id" class="input-medium presence-id-select">
{{#select presence_id}}
{{#each extra.presenceIdOptions}}
<option value="{{ this.key }}">{{ this.value }}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
<!--<div class="advanced-fields content-centered span3">
<a id="resend_instructions" href="javascript:void(0)">{{ i18n.users.resendInstructions }}</a>


Loading…
Cancel
Save