Browse Source

Merge branch 'master' into 4.3

4.3
Joris Tirado 7 years ago
parent
commit
68d8ce242a
13 changed files with 946 additions and 780 deletions
  1. +2
    -23
      i18n/de-DE.json
  2. +8
    -24
      i18n/en-US.json
  3. +3
    -7
      i18n/es-ES.json
  4. +2
    -6
      i18n/fr-FR.json
  5. +2
    -19
      i18n/ru-RU.json
  6. +14
    -3
      submodules/groups/groups.js
  7. +163
    -224
      submodules/strategy/strategy.js
  8. +662
    -388
      submodules/users/users.js
  9. +33
    -8
      submodules/users/users.scss
  10. +0
    -34
      submodules/users/views/deleteDialog.html
  11. +0
    -42
      submodules/users/views/feature-vm_to_email.html
  12. +55
    -0
      submodules/users/views/feature-vmbox.html
  13. +2
    -2
      submodules/users/views/row.html

+ 2
- 23
i18n/de-DE.json View File

@ -687,12 +687,8 @@
}
}
},
"vm_to_email": {
"deleteAfterNotify": "Nach dem Senden der Benachrichtigung Nachrichten aus Datenbank löschen.",
"headline": "Voicemail-zu-E-Mail-Einstellungen",
"help": "Wenn Sie das Sendeziel von E-Mail-Benachrichtigungen ändern möchten, bearbeiten Sie die E-Mail-Adresse des Benutzers im Abschnitt „Benutzeradministration“",
"label": "Für jede neue Voicemail wird eine E-Mail an {{variable}} gesendet",
"title": "Voicemails"
"vmbox": {
"deleteAfterNotify": "Nach dem Senden der Benachrichtigung Nachrichten aus Datenbank löschen."
},
"find_me_follow_me": {
"title": "Find Me/Follow Me",
@ -767,23 +763,6 @@
"__version": "4.0",
"confirmMobileUnAssignment": "Sie versuchen gerade, die Zuweisung eines mobilen Geräts aufzuheben. Beachten Sie, dass dadurch auch die Verknüpfung der zu diesem Gerät ({{variable}}) zugehörigen Telefonnummer mit diesem Benutzer aufgehoben wird. Möchten Sie den Vorgang fortsetzen?",
"__comment": "UI-2138: Neues Dialogfeld: Benutzer löschen",
"__version": "3.22",
"deleteDialog": {
"title": "Löschen von {{ name }} aus dem System",
"headerAdmin": "Sie versuchen gerade, einen ADMIN zu löschen! Wenn man einen Admin löscht, werden sein Benutzer und seine Voicemailbox gelöscht, und seine Geräte sind ihm nicht länger zugewiesen. Außerdem wird dieser Admin dann nicht mehr in der Lage sein, diese UI zu verwalten. Möchten Sie den Vorgang wirklich fortsetzen?",
"headerUser": "Durch das Löschen eines Benutzers werden dieser Benutzer und seine Voicemailboxen gelöscht. Seine Geräte und Nummern sind ihm nicht länger zugewiesen. Möchten Sie den Vorgang fortsetzen?",
"deleteUser": "Löschen",
"deleteUserName": "„{{variable}}“ löschen",
"proceed": "Fortfahren",
"deleteDevices": "Die Geräte dieses Benutzers ebenfalls entfernen",
"deleteDevicesHelp": "Wenn Sie diese Option nicht aktivieren, verlieren diese Geräte ihre Zuweisung und tauchen in der Liste freier Geräte auf.",
"__comment": "UI-2467: Beim Löschen eines Benutzers in Smart PBX werden auch Konferenzen entfernt",
"__version": "4.0",
"deleteConferences": "Die Konferenzen dieses Benutzers ebenfalls entfernen",
"deleteConferencesHelp": "Wenn Sie diese Option deaktiviert lassen, werden Sie die Konferenznummer des Benutzers nirgends anders verwenden können, da sie weiterhin von dieser Konferenz belegt sein wird."
},
"__comment": "UI-2921: Neues Dialogfeld: Benutzer löschen",
"__version": "4.2",
"impersonate": "Identität annehmen",


+ 8
- 24
i18n/en-US.json View File

@ -150,8 +150,8 @@
"__comment": "UI-2104: Adding a warning when adding a group with no endpoints",
"__version": "3.22",
"emptyEndpointsWarning": "You need to select at least one member to create a group",
"ringGroup": "{{name}} Ring Group",
"baseGroup": "{{name}} Base Group"
"ringGroup": "{{{name}}} Ring Group",
"baseGroup": "{{{name}}} Base Group"
},
"devices": {
@ -684,12 +684,13 @@
}
}
},
"vm_to_email": {
"vmbox": {
"deleteAfterNotify": "Delete messages from database after sending the notification.",
"headline": "Voicemail-to-Email Settings",
"help": "If you want to change where email notifications go to, please edit the user's email address in the User Administration section",
"label": "An e-mail will be sent to {{variable}} for every new voicemail",
"title": "Voicemails"
"headline": "User Voicemail Box",
"label": "A voicemail box will be available for this user.",
"sendVmToEmail": "Send an e-mail to {{variable}} for every new voicemail.",
"title": "Voicemail Box",
"vmToEmailHelp": "An e-mail will be sent to {{variable}} for every new voicemail. If you want to change where email notifications go to, please edit the user's email address in the User Administration section."
},
"find_me_follow_me": {
"title": "Find me, Follow me",
@ -764,23 +765,6 @@
"__version": "4.0",
"confirmMobileUnAssignment": "You are about to un-assign a Mobile device. Be aware the phone number associated with this device ({{variable}}) will also be un-assigned from this user. Are you sure?",
"__comment": "UI-2138: Delete User new Dialog",
"__version": "3.22",
"deleteDialog": {
"title": "Remove {{ name }} from the system",
"headerAdmin": "You're about to delete an ADMIN! Deleting an admin will delete his user, voicemail boxes and unassign his devices. It will also prevent them from managing this UI. Do you want to continue?",
"headerUser": "Deleting a user will delete this user and his Voicemail Box, and unassign the devices and numbers that were assigned to this user. Do you want to continue?",
"deleteUser": "Delete",
"deleteUserName": "Delete \"{{variable}}\"",
"proceed": "Proceed",
"deleteDevices": "Also remove this user's devices from the system",
"deleteDevicesHelp": "If you leave this option unchecked, we'll just unassign these devices and they will show up in the list of Spare Devices",
"__comment": "UI-2467: also remove conferences when deleting a user from smartpbx",
"__version": "4.0",
"deleteConferences": "Also remove this user's conferences from the system",
"deleteConferencesHelp": "If you leave this option unchecked, you won't be able to use the user's conference number anywhere else, as it will still be used by that conference."
},
"__comment": "UI-2921: Delete User new Dialog",
"__version": "4.2",
"impersonate": "Impersonate",


+ 3
- 7
i18n/es-ES.json View File

@ -569,12 +569,8 @@
}
}
},
"vm_to_email": {
"deleteAfterNotify": "Eliminar los mensajes de la base de datos después de enviar la notificación.",
"headline": "Configuración de correo de voz a correo electrónico",
"help": "Si quiere cambiar a donde las notificaciones del correo electrónico van, por favor corrija la dirección de correo electrónico del usuario en la sección de la Administración del Usuario",
"label": "Se enviará un mensaje de correo electrónico a {{variable}} para cada nuevo mensaje de correo de voz",
"title": "correos de voz"
"vmbox": {
"deleteAfterNotify": "Eliminar los mensajes de la base de datos después de enviar la notificación."
},
"find_me_follow_me": {
"title": "Búscame, Sígueme ",
@ -1078,4 +1074,4 @@
"__comment": "UI-1153: Show warning icon next to numbers being transfered",
"__version": "v3.20_s3",
"portIconHelp": "Este número está en proceso de ser portado y serán eliminados si el puerto falla. Sólo aparece para el establecimiento de objetivos y no está configurado para manejar las llamadas"
}
}

+ 2
- 6
i18n/fr-FR.json View File

@ -543,12 +543,8 @@
}
}
},
"vm_to_email": {
"deleteAfterNotify": "Supprimer les messages vocaux de la base de données après l'envoi de la notification.",
"headline": "Messages vocaux vers Email",
"help": "Si vous souhaitez changer l'email qui recevra les notifications, vous pouvez mettre à jour l'adresse e-mail dans les réglages utilisateurs",
"label": "Un email sera envoyé à {{variable}} à chaque nouveau message vocal",
"title": "Messages vocaux"
"vmbox": {
"deleteAfterNotify": "Supprimer les messages vocaux de la base de données après l'envoi de la notification."
},
"find_me_follow_me": {
"title": "Ordre d'appel",


+ 2
- 19
i18n/ru-RU.json View File

@ -554,12 +554,8 @@
}
}
},
"vm_to_email": {
"deleteAfterNotify": "Удалите сообщения из базы данных после отправки уведомления.",
"headline": "Настройка отправки голосовых сообщений на электроную почту",
"help": "Если вы собираетесь изменить адрес электронной почты, куда должны приходить уведомления, пожалуйста отредактируйте адрес электронной почты пользователя в меню администрирования пользователей",
"label": "Собщения будут отправлены на адрес {{variable}} электронной почты для всех новых голосовых сообщений",
"title": "Голосовая почта"
"vmbox": {
"deleteAfterNotify": "Удалите сообщения из базы данных после отправки уведомления."
},
"find_me_follow_me": {
"title": "Найди-меня-Следуй-за-мной",
@ -618,19 +614,6 @@
}
},
"confirmMobileUnAssignment": "Вы собираетесь открепить мобильное устройство. Для информации, номер телефона ассоциированный с устройством ({{variable}}) также будет откреплен от данного пользователя. Вы уверены?",
"deleteDialog": {
"title": "Удалить {{ name }} из системы",
"headerAdmin": "Вы собираетесь удалить АДМИНИСТРАТОРА! Удаление администратора также удалит его голосовой почтовый ящик и открепит устройства и номера ранее закрепленные за пользователем. Также в дальнейшем он не сможет управлять через данный пользовательский интерфейс. Хотите продолжить?",
"headerUser": "Удаление пользователя также удалит его голосовой почтовый ящик и открепит устройства и номера ранее закрепленные за пользователем. Хотите продолжить?",
"deleteUser": "Удалить",
"deleteUserName": "Удалить \"{{variable}}\"",
"proceed": "Выполняем",
"deleteDevices": "Также удалить устройства пользователя из системы",
"deleteDevicesHelp": "Если оставите эту опцию не выделенной, мы просто открепим его устройства и они будут отображаться в списке Доступных Устройств",
"deleteConferences": "Также удалить конференц-комнаты пользователя из системы",
"deleteConferencesHelp": "Если оставите эту опцию не выделенной, Вы не сможете использовать номер конференции пользователя где-либо еще, так как он будет использоваться данной конференцией."
}
},
"strategy": {


+ 14
- 3
submodules/groups/groups.js View File

@ -350,7 +350,8 @@ define(function(require) {
},
groupsCreationMergeData: function(data, template) {
var formData = monster.ui.getFormData('form_group_creation'),
var self = this,
formData = monster.ui.getFormData('form_group_creation'),
fixedTimeout = '20',
fixedDelay = '0',
settings = {
@ -376,7 +377,12 @@ define(function(require) {
},
baseCallflow: {
numbers: [ monster.util.randomString(25) ],
name: formData.name + ' Base Group',
name: self.getTemplate({
name: '!' + self.i18n.active().groups.baseGroup,
data: {
name: formData.name
}
}),
flow: {
module: 'ring_group',
children: {},
@ -390,7 +396,12 @@ define(function(require) {
},
callflow: {
numbers: [ formData.extra.extension ],
name: formData.name + ' Ring Group',
name: self.getTemplate({
name: '!' + self.i18n.active().groups.ringGroup,
data: {
name: formData.name
}
}),
flow: {
module: 'callflow',
children: {


+ 163
- 224
submodules/strategy/strategy.js View File

@ -2397,26 +2397,22 @@ define(function(require) {
monster.ui.confirm(self.i18n.active().strategy.confirmMessages.resetCalls, function() {
monster.waterfall([
function(callback) {
self.strategyDeleteCalls({
success: function() {
callback(null);
},
error: function() {
callback(true);
}
});
self.strategyGetSubCallflows(callback);
},
function(callback) {
self.strategyGetMainCallflows(function(callflows) {
strategyData.callflows = callflows;
callback(null, callflows);
function(mainSubCallflows, callback) {
self.strategyResetSubCallStrategies({
mainSubCallflows: mainSubCallflows,
callback: callback
});
}
], function(err, result) {
], function(err, callflows) {
if (err) {
return;
}
// Update modified callflows on strategyData
_.assign(strategyData.callflows, callflows);
container.hide();
container.parents('.element-container').removeClass('open');
monster.ui.toast({
@ -3100,18 +3096,7 @@ define(function(require) {
function(innerCallback) {
self.strategyCreateMenu({
data: {
data: {
name: menuName,
record_pin: monster.util.randomString(4, '1234567890'),
media: {
exit_media: true,
invalid_media: true,
transfer_media: true
},
retries: 3,
max_extension_length: 4,
type: 'main'
}
data: self.strategyGetDefaultMainSubMenu(menuName)
},
success: function(menuData) {
innerCallback(null, menuData);
@ -3124,20 +3109,7 @@ define(function(require) {
function(menuData, innerCallback) {
self.strategyCreateCallflow({
data: {
data: {
contact_list: {
exclude: false
},
numbers: [menuName],
type: 'main',
flow: {
children: {},
data: {
id: menuData.id
},
module: 'menu'
}
}
data: self.strategyGetDefaultMainSubMenuCallflow(menuData)
},
success: function(data) {
innerCallback(null, data);
@ -3162,20 +3134,10 @@ define(function(require) {
parallelRequests[val] = function(callback) {
self.strategyCreateCallflow({
data: {
data: {
contact_list: {
exclude: false
},
numbers: [val],
type: 'main',
flow: {
children: {},
data: {
id: mainCallflows[val + 'Menu'].id
},
module: 'callflow'
}
}
data: self.strategyGetDefaultMainSubCallflow({
label: val,
subMenuCallflowId: mainCallflows[val + 'Menu'].id
})
},
success: function(data) {
callback(null, data);
@ -3192,12 +3154,12 @@ define(function(require) {
self.strategyUpdateCallflow(results.MainCallflow, function(updatedCallflow) {
results.MainCallflow = updatedCallflow;
waterfallCallback(null, $.extend(true, mainCallflows, results));
waterfallCallback(null, _.merge(mainCallflows, results));
});
return;
}
waterfallCallback(null, $.extend(true, mainCallflows, results));
waterfallCallback(null, _.merge(mainCallflows, results));
return;
}
@ -3971,200 +3933,177 @@ define(function(require) {
});
},
strategyDeleteCalls: function(args) {
/**
* Request the creation of a menu to the API
* @param {Object} args
* @param {Object} args.data
* @param {Object} args.data.data Menu object to be created
* @param {Function} [args.success] Success callback
* @param {Function} [args.error] Error callback
*/
strategyCreateMenu: function(args) {
var self = this;
monster.waterfall([
// Get main callflows created via SmartPBX
function(callback) {
self.strategyListCallflows({
filters: {
'paginate': false,
'has_value': 'type',
'filter_type': 'main',
'key_missing': [
'owner_id',
'group_id'
],
'filter_ui_metadata.origin': [
'voip'
]
},
success: function(data) {
// Convert callflows array to map object, then send to next step
callback(null,
_.reduce(data, function(obj, callflow) {
var label = callflow.name || callflow.numbers[0];
obj[label] = callflow;
return obj;
}, {}));
},
error: function(parsedError) {
callback(parsedError);
}
});
self.callApi({
resource: 'menu.create',
data: _.merge({
accountId: self.accountId
}, args.data),
success: function(data) {
args.hasOwnProperty('success') && args.success(data.data);
},
// Delete menus and callflows
function(mainCallflows, callback) {
monster.parallel(
_.reduce(self.subCallflowsLabel, function(parallelCalls, label) {
var deleteSequence = self.strategyCreateSingleCallStrategyDeleteSequence(label, mainCallflows);
if (_.isEmpty(deleteSequence)) {
return parallelCalls;
}
parallelCalls.push(function(callback) {
monster.waterfall(deleteSequence, function(err, results) {
callback(null);
});
});
return parallelCalls;
}, []),
function(err, results) {
if (err) {
callback(err);
return;
}
callback(null);
});
}
], function(err, results) {
if (err) {
args.hasOwnProperty('error') && args.error(err);
return;
error: function(parsedError) {
args.hasOwnProperty('error') && args.error(parsedError);
}
args.hasOwnProperty('success') && args.success(results);
});
},
strategyCreateSingleCallStrategyDeleteSequence: function(label, mainCallflows) {
var self = this,
deleteSequence = [],
strategyCallflow = mainCallflows[label],
menuCallflow = mainCallflows[label + 'Menu'];
if (strategyCallflow) {
// Add function to delete call strategy callflow
deleteSequence.push(function(callback) {
self.strategyDeleteCallflow({
data: {
id: strategyCallflow.id
},
success: function() {
callback(null);
},
error: function() {
callback(true);
}
});
});
}
if (!menuCallflow) {
return deleteSequence;
}
// There is a menu callflow, so create functions to...
// ...get callflow details (to get menu ID),...
deleteSequence.push(function(callback) {
self.strategyGetCallflow({
data: {
id: menuCallflow.id
},
success: function(menuCallflowDetails) {
callback(null, menuCallflowDetails);
},
error: function() {
callback(true);
}
});
});
// ...then delete menu callflow
deleteSequence.push(function(menuCallflowDetails, callback) {
self.strategyDeleteCallflow({
data: {
id: menuCallflow.id
},
success: function() {
callback(null, menuCallflowDetails);
},
error: function() {
callback(true);
}
});
});
/**
* Gets a main sub menu for call handling strategies, with the default structure
* @param {String} menuName Menu name
*/
strategyGetDefaultMainSubMenu: function(menuName) {
return {
name: menuName,
record_pin: monster.util.randomString(4, '1234567890'),
media: {
exit_media: true,
invalid_media: true,
transfer_media: true
},
retries: 3,
max_extension_length: 4,
type: 'main'
};
},
// ...and finally delete menu
deleteSequence.push(function(menuCallflowDetails, callback) {
self.strategyDeleteMenu({
/**
* Gets a main callflow for a call handling strategy menu, with the default structure
* and values
* @param {Object} menuData
* @param {String} menuData.name Menu name
* @param {String} menuData.id Menu ID
* @returns {Object} Sub menu callflow
*/
strategyGetDefaultMainSubMenuCallflow: function(menuData) {
return {
contact_list: {
exclude: false
},
numbers: [ menuData.name ],
type: 'main',
flow: {
children: {},
data: {
id: menuCallflowDetails.flow.data.id
},
success: function() {
callback(null);
id: menuData.id
},
error: function() {
callback(true);
}
});
});
return deleteSequence;
module: 'menu'
}
};
},
strategyCreateMenu: function(args) {
var self = this;
self.callApi({
resource: 'menu.create',
data: {
accountId: self.accountId,
data: args.data.data
},
success: function(data, status) {
args.hasOwnProperty('success') && args.success(data.data);
/**
* Gets a main callflow for call handling strategies, with the default structure and
* values
* @param {Object} args
* @param {String} args.label Callflow label, to be set as number
* @param {String} args.subMenuCallflowId ID of the sub menu callflow
* @returns {Object} Callflow for call handling strategy
*/
strategyGetDefaultMainSubCallflow: function(args) {
return {
contact_list: {
exclude: false
},
error: function(parsedError) {
args.hasOwnProperty('error') && args.error(parsedError);
numbers: [ args.label ],
type: 'main',
flow: {
children: {},
data: {
id: args.subMenuCallflowId
},
module: 'callflow'
}
});
};
},
strategyDeleteMenu: function(args) {
/**
* Get main callflows for call handling strategies
* @param {Function} callback Callback function for monster async tasks
*/
strategyGetSubCallflows: function(callback) {
var self = this;
self.callApi({
resource: 'menu.delete',
data: {
accountId: self.accountId,
menuId: args.data.id
self.strategyListCallflows({
filters: {
paginate: false,
has_value: 'type',
filter_type: 'main',
key_missing: [
'owner_id',
'group_id'
],
'filter_ui_metadata.origin': [
'voip'
]
},
success: function(data, status) {
args.hasOwnProperty('success') && args.success(data.data);
success: function(data) {
// Convert callflows array to map object, then send to next step
callback(null,
_.reduce(data, function(obj, callflow) {
var label = callflow.name || callflow.numbers[0];
obj[label] = callflow;
return obj;
}, {}));
},
error: function(parsedError) {
args.hasOwnProperty('error') && args.error(parsedError);
callback(parsedError);
}
});
},
strategyDeleteCallflow: function(args) {
/**
* Reset call handling strategies
* @param {Object} args.mainSubCallflows Account main callflows
* @param {Function} args.callback Callback function for monster async tasks
*/
strategyResetSubCallStrategies: function(args) {
var self = this;
self.callApi({
resource: 'callflow.delete',
data: {
accountId: self.accountId,
callflowId: args.data.id
},
success: function(data, status) {
args.hasOwnProperty('success') && args.success(data.data);
},
error: function(parsedError) {
args.hasOwnProperty('error') && args.error(parsedError);
}
});
monster.parallel(
_.reduce(self.subCallflowsLabel, function(callflowRequests, label) {
callflowRequests[label] = function(callback) {
var mainSubCallflows = args.mainSubCallflows,
callflow = self.strategyGetDefaultMainSubCallflow({
label: label,
subMenuCallflowId: mainSubCallflows[label + 'Menu'].id
}),
callflowArgs = {
data: {
data: callflow
},
success: function(savedCallflow) {
callback(null, savedCallflow);
},
error: function(parsedError) {
callback(parsedError);
}
};
if (!mainSubCallflows.hasOwnProperty(label)) {
self.strategyCreateCallflow(callflowArgs);
return;
}
var callflowToUpdate = mainSubCallflows[label];
callflow.id = callflowToUpdate.id;
self.strategyUpdateCallflow(callflow, function(savedCallflow) {
callback(null, savedCallflow);
});
};
return callflowRequests;
}, {}), args.callback);
}
};


+ 662
- 388
submodules/users/users.js
File diff suppressed because it is too large
View File


+ 33
- 8
submodules/users/users.scss View File

@ -759,11 +759,6 @@
margin-top: 10px;
}
/**** CSS for delete user dialog ****/
.delete-user-wrapper .dialog-text {
margin-top: 10px;
}
.monster-feature-popup-container {
.feature-popup-title {
display: flex;
@ -960,9 +955,11 @@
}
}
&[data-feature="vm_to_email"] {
#email {
margin-top: 8px;
&[data-feature="vmbox"] .content {
padding-bottom: 0px;
form {
margin-bottom: 0px;
}
.main-line {
@ -970,5 +967,33 @@
line-height: 20px;
margin: 10px 0 30px 0;
}
.control-group {
&.main{
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
padding-bottom: 15px;
label.title {
font-size: 1em;
padding-right: 1em;
margin-bottom: 0px;
}
}
&.extra {
margin-bottom: 40px;
}
}
.extra-content {
padding-bottom: 15px;
&.disabled {
display: none;
}
}
}
}

+ 0
- 34
submodules/users/views/deleteDialog.html View File

@ -1,34 +0,0 @@
<div class="delete-user-wrapper">
<div class="alert-dialog">
<div class="dialog-content">
<div class="dialog-header">{{ replaceVar i18n.users.deleteDialog.deleteUserName user.name }}</div>
<div>
{{#monsterCheckbox i18n.users.deleteDialog.deleteDevices }}
<input id="delete_devices" type="checkbox"></input>
{{/monsterCheckbox}}
<i class="help-popover fa fa-question-circle fa-lg" data-original-title="{{ i18n.users.deleteDialog.deleteDevicesHelp }}" data-placement="left" data-toggle="tooltip"></i>
</div>
<div>
{{#monsterCheckbox i18n.users.deleteDialog.deleteConferences }}
<input id="delete_conferences" type="checkbox"></input>
{{/monsterCheckbox}}
<i class="help-popover fa fa-question-circle fa-lg" data-original-title="{{ i18n.users.deleteDialog.deleteConferencesHelp }}" data-placement="left" data-toggle="tooltip"></i>
</div>
<div class="dialog-text">
{{#compare user.priv_level "===" "admin"}}
{{ i18n.users.deleteDialog.headerAdmin }}
{{else}}
{{ i18n.users.deleteDialog.headerUser }}
{{/compare}}
</div>
</div>
<div class="alert-buttons-wrapper clearfix">
<button class="monster-button" id="cancel_button">{{ i18n.cancel }}</button>
<button class="monster-button-success" id="confirm_button">{{ i18n.users.deleteDialog.proceed }}</button>
</div>
</div>
</div>

+ 0
- 42
submodules/users/views/feature-vm_to_email.html View File

@ -1,42 +0,0 @@
<div class="monster-feature-popup-container" data-feature="vm_to_email">
<div class="feature-popup-title">
<div class="popup-title">
<div class="feature-fa-wrapper">
<i class="{{extra.mapFeatures.vm_to_email.icon}}"></i>
</div>
<div class="feature-title">
{{ i18n.users.vm_to_email.headline }}
</div>
</div>
<div class="switch popup-action">
{{#monsterSwitch}}
<input class="switch-state" type="checkbox" id="checkbox_vm_to_email" data-on="{{i18n.enabled}}" data-off="{{i18n.disabled}}"{{#if extra.mapFeatures.vm_to_email.active}} checked="checked"{{/if}}></input>
{{/monsterSwitch}}
</div>
</div>
<div class="content{{#unless extra.mapFeatures.vm_to_email.active}} disabled{{/unless}}">
<form id="vm_to_email_form">
<div class="main-line">
{{replaceVar i18n.users.vm_to_email.label email}}
</div>
<label class="fix-left">
{{#monsterCheckbox i18n.users.vm_to_email.deleteAfterNotify}}
<input type="checkbox" name="delete_after_notify"{{#if extra.deleteAfterNotify}} checked{{/if}}></input>
{{/monsterCheckbox}}
</label>
</form>
{{#monsterText}}
{{i18n.users.vm_to_email.help}}
{{/monsterText}}
</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="monster-button monster-button-success save">{{ i18n.saveChanges }}</button>
</div>
</div>
</div>

+ 55
- 0
submodules/users/views/feature-vmbox.html View File

@ -0,0 +1,55 @@
<div class="monster-feature-popup-container" data-feature="vmbox">
<div class="feature-popup-title">
<div class="popup-title">
<div class="feature-fa-wrapper">
<i class="{{extra.mapFeatures.vmbox.icon}}"></i>
</div>
<div class="feature-title">
{{ i18n.users.vmbox.headline }}
</div>
</div>
<div class="switch popup-action">
{{#monsterSwitch}}
<input class="switch-state" type="checkbox" id="checkbox_vmbox" data-on="{{i18n.enabled}}" data-off="{{i18n.disabled}}"{{#if extra.mapFeatures.vmbox.active}} checked="checked"{{/if}}></input>
{{/monsterSwitch}}
</div>
</div>
<div class="content{{#unless extra.mapFeatures.vmbox.active}} disabled{{/unless}}">
<form id="vmbox_form">
<div class="main-line">
{{i18n.users.vmbox.label}}
</div>
<div class="control-group main">
<label class="title">Voicemail to e-mail:</label>
{{#monsterSwitch}}
<input type="checkbox" name="vm_to_email_enabled" id="vm_to_email_enabled" data-on="{{i18n.enabled}}" data-off="{{i18n.disabled}}"{{#if vm_to_email_enabled}} checked="checked"{{/if}}></input>
{{/monsterSwitch}}
</div>
<div class="extra-content{{#unless vm_to_email_enabled}} disabled{{/unless}}">
<div class="control-group extra">
<label class="fix-left">
{{#monsterCheckbox i18n.users.vmbox.deleteAfterNotify}}
<input type="checkbox" name="delete_after_notify"{{#if extra.deleteAfterNotify}} checked{{/if}}></input>
{{/monsterCheckbox}}
</label>
</div>
{{#monsterText}}
{{replaceVar i18n.users.vmbox.vmToEmailHelp email}}
{{/monsterText}}
</div>
</form>
</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="monster-button monster-button-success save">{{ i18n.saveChanges }}</button>
</div>
</div>
</div>

+ 2
- 2
submodules/users/views/row.html View File

@ -1,6 +1,6 @@
<div class="grid-row" data-id="{{id}}" data-priv_level="{{priv_level}}" data-name="{{first_name}} {{last_name}}" data-search="{{first_name}} {{last_name}}{{#each extra.listCallerId}} {{formatPhoneNumber this}} {{this}}{{/each}}">
<div class="grid-row" data-id="{{id}}" data-priv_level="{{priv_level}}" data-name="{{extra.fullName}}" data-search="{{extra.fullName}}{{#each extra.listCallerId}} {{formatPhoneNumber this}} {{this}}{{/each}}">
<div class="user-cells">
<div class="name grid-cell" data-type="name"><i class="{{#if extra.isAdmin}}icon-telicon-moderator monster-primary-color{{else}}icon-telicon-user monster-lightgrey{{/if}}"></i> {{ first_name }} {{ last_name }}</div>
<div class="name grid-cell" data-type="name"><i class="{{#if extra.isAdmin}}icon-telicon-moderator monster-primary-color{{else}}icon-telicon-user monster-lightgrey{{/if}}"></i> {{ extra.fullName }}</div>
{{#if extra.showLicensedUserRoles}}
<div class="licensed-user-role grid-cell" data-type="licensed-user-role">


Loading…
Cancel
Save