|
|
|
@ -1967,87 +1967,94 @@ define(function(require) { |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* @param {Object} data |
|
|
|
* @param {Array} data.callflows |
|
|
|
* @param {Array} data.provisioners |
|
|
|
* @param {Array} data.vmboxes |
|
|
|
* @return {Object} |
|
|
|
*/ |
|
|
|
usersFormatAddUser: function(data) { |
|
|
|
var self = this, |
|
|
|
formattedData = { |
|
|
|
hasProvisioner: self.appFlags.common.hasProvisioner && !_.isEmpty(data.provisioners), |
|
|
|
sendToSameEmail: true, |
|
|
|
nextExtension: '', |
|
|
|
listExtensions: {}, |
|
|
|
createVmbox: true, |
|
|
|
listVMBoxes: {} |
|
|
|
}, |
|
|
|
arrayExtensions = [], |
|
|
|
arrayVMBoxes = [], |
|
|
|
allNumbers = []; |
|
|
|
|
|
|
|
if (_.size(self.appFlags.global.servicePlansRole) > 0) { |
|
|
|
formattedData.licensedUserRoles = self.appFlags.global.servicePlansRole; |
|
|
|
} |
|
|
|
|
|
|
|
_.each(data.callflows, function(callflow) { |
|
|
|
_.each(callflow.numbers, function(number) { |
|
|
|
if (number.length < 7) { |
|
|
|
formattedData.listExtensions[number] = callflow; |
|
|
|
arrayExtensions.push(number); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
_.each(data.vmboxes, function(vmbox) { |
|
|
|
formattedData.listVMBoxes[vmbox.mailbox] = vmbox; |
|
|
|
arrayVMBoxes.push(vmbox.mailbox); |
|
|
|
}); |
|
|
|
|
|
|
|
// We concat both arrays because we want to create users with the same number for the extension # and the vmbox,
|
|
|
|
// If for some reason a vmbox number exist without an extension, we still don't want to let them set their extension number to that number.
|
|
|
|
allNumbers = arrayExtensions.concat(arrayVMBoxes); |
|
|
|
formattedData.nextExtension = parseInt(monster.util.getNextExtension(allNumbers)) + ''; |
|
|
|
formattedData.listProvisioners = _.map(data.provisioners, function(brand) { |
|
|
|
var models = _.flatMap(brand.families, function(family) { |
|
|
|
return _.map(family.models, function(model) { |
|
|
|
model.family = family.name; |
|
|
|
return model; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
return { |
|
|
|
id: brand.id, |
|
|
|
name: brand.name, |
|
|
|
models: models |
|
|
|
}; |
|
|
|
servicePlansRole = self.appFlags.global.servicePlansRole, |
|
|
|
listExtensions = _.flatMap(data.callflows, function(callflow) { |
|
|
|
return _ |
|
|
|
.chain(callflow.numbers) |
|
|
|
.filter(function(number) { |
|
|
|
return _.size(number) < 7; |
|
|
|
}) |
|
|
|
.map(function(number) { |
|
|
|
return { |
|
|
|
callflow: callflow, |
|
|
|
extension: number |
|
|
|
}; |
|
|
|
}) |
|
|
|
.value(); |
|
|
|
}), |
|
|
|
mapVMBoxes = _.keyBy(data.vmboxes, 'mailbox'), |
|
|
|
// We concat both arrays because we want to create users with the same number for the extension # and the vmbox,
|
|
|
|
// If for some reason a vmbox number exist without an extension, we still don't want to let them set their extension number to that number.
|
|
|
|
allNumbers = _ |
|
|
|
.chain([ |
|
|
|
_.map(listExtensions, 'extension'), |
|
|
|
_.keys(mapVMBoxes, 'mailbox') |
|
|
|
]) |
|
|
|
.flatten() |
|
|
|
.uniq() |
|
|
|
.value(); |
|
|
|
|
|
|
|
return _.merge({ |
|
|
|
createVmbox: true, |
|
|
|
hasProvisioner: self.appFlags.common.hasProvisioner && !_.isEmpty(data.provisioners), |
|
|
|
listExtensions: _ |
|
|
|
.chain(listExtensions) |
|
|
|
.keyBy('extension') |
|
|
|
.mapValues('callflow') |
|
|
|
.value(), |
|
|
|
listProvisioners: _ |
|
|
|
.chain(data.provisioners) |
|
|
|
.map(function(brand) { |
|
|
|
return _.merge({ |
|
|
|
models: _.flatMap(brand.families, function(family) { |
|
|
|
return _.map(family.models, function(model) { |
|
|
|
return _.merge({ |
|
|
|
family: family.name |
|
|
|
}, model); |
|
|
|
}); |
|
|
|
}) |
|
|
|
}, _.pick(brand, [ |
|
|
|
'id', |
|
|
|
'name' |
|
|
|
])); |
|
|
|
}) |
|
|
|
.sortBy('name') |
|
|
|
.value(), |
|
|
|
listVMBoxes: mapVMBoxes, |
|
|
|
nextExtension: parseInt(monster.util.getNextExtension(allNumbers)) + '', |
|
|
|
sendToSameEmail: true |
|
|
|
}, !_.isEmpty(servicePlansRole) && { |
|
|
|
licensedUserRoles: servicePlansRole |
|
|
|
}); |
|
|
|
|
|
|
|
return formattedData; |
|
|
|
}, |
|
|
|
|
|
|
|
usersFormatFaxingData: function(data) { |
|
|
|
var tempList = [], |
|
|
|
listNumbers = {}; |
|
|
|
|
|
|
|
_.each(data.numbers, function(val, key) { |
|
|
|
tempList.push(key); |
|
|
|
}); |
|
|
|
|
|
|
|
tempList.sort(function(a, b) { |
|
|
|
return a < b ? -1 : 1; |
|
|
|
}); |
|
|
|
|
|
|
|
if (data.callflows) { |
|
|
|
if (data.callflows.numbers.length > 0) { |
|
|
|
listNumbers[data.callflows.numbers[0]] = data.callflows.numbers[0]; |
|
|
|
return _.merge({}, data, { |
|
|
|
extra: { |
|
|
|
listNumbers: _ |
|
|
|
.chain([ |
|
|
|
_.keys(data.numbers), |
|
|
|
_ |
|
|
|
.chain(data.callflows) |
|
|
|
.get('numbers', []) |
|
|
|
.slice(0, 1) |
|
|
|
.value() |
|
|
|
]) |
|
|
|
.flatten() |
|
|
|
.uniq() |
|
|
|
.keyBy() |
|
|
|
.value() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
_.each(tempList, function(val, key) { |
|
|
|
listNumbers[val] = val; |
|
|
|
}); |
|
|
|
|
|
|
|
data.extra = $.extend(true, {}, data.extra, { |
|
|
|
listNumbers: listNumbers |
|
|
|
}); |
|
|
|
|
|
|
|
return data; |
|
|
|
}, |
|
|
|
|
|
|
|
usersRenderConferencing: function(data) { |
|
|
|
@ -2427,7 +2434,7 @@ define(function(require) { |
|
|
|
usersRenderCallerId: function(currentUser, numberChoices) { |
|
|
|
var self = this, |
|
|
|
allowAnyOwnedNumberAsCallerID = monster.config.whitelabel && monster.config.whitelabel.allowAnyOwnedNumberAsCallerID ? true : false, |
|
|
|
templateUser = $.extend(true, {allowAnyOwnedNumberAsCallerID: allowAnyOwnedNumberAsCallerID}, currentUser), |
|
|
|
templateUser = $.extend(true, { allowAnyOwnedNumberAsCallerID: allowAnyOwnedNumberAsCallerID }, currentUser), |
|
|
|
featureTemplate, |
|
|
|
switchFeature; |
|
|
|
|
|
|
|
@ -2491,28 +2498,25 @@ define(function(require) { |
|
|
|
|
|
|
|
usersFormatCallForwardData: function(user) { |
|
|
|
var self = this, |
|
|
|
cfMode = 'off'; |
|
|
|
|
|
|
|
user.extra = user.extra || {}; |
|
|
|
isCallForwardConfigured = _.has(user, 'call_forward.enabled'), |
|
|
|
isCallForwardEnabled = _.get(user, 'call_forward.enabled', false), |
|
|
|
isFailoverEnabled = _.get(user, 'call_forward.failover', false); |
|
|
|
|
|
|
|
//cfmode is on if call_forward.enabled = true
|
|
|
|
//cfmode is failover if call_forward.enabled = false & call_forward.failover = true
|
|
|
|
//cfmode is off if call_forward.enabled = false & call_forward.failover = false
|
|
|
|
if (user.hasOwnProperty('call_forward') && user.call_forward.hasOwnProperty('enabled')) { |
|
|
|
if (user.call_forward.enabled === true) { |
|
|
|
cfMode = 'on'; |
|
|
|
} else if (user.call_forward.enabled === false) { |
|
|
|
cfMode = user.call_forward.hasOwnProperty('failover') && user.call_forward.failover === true ? 'failover' : 'off'; |
|
|
|
} |
|
|
|
|
|
|
|
if (_.has(user.call_forward, 'number')) { |
|
|
|
user.call_forward.number = monster.util.unformatPhoneNumber(user.call_forward.number); |
|
|
|
return _.merge({}, user, _.merge({ |
|
|
|
extra: { |
|
|
|
callForwardMode: !isCallForwardConfigured ? 'off' |
|
|
|
: isCallForwardEnabled ? 'on' |
|
|
|
: isFailoverEnabled ? 'failover' |
|
|
|
: 'off' |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
user.extra.callForwardMode = cfMode; |
|
|
|
|
|
|
|
return user; |
|
|
|
}, isCallForwardConfigured && { |
|
|
|
call_forward: _.merge({}, _.has(user, 'call_forward.number') && { |
|
|
|
number: monster.util.unformatPhoneNumber(user.call_forward.number) |
|
|
|
}) |
|
|
|
})); |
|
|
|
}, |
|
|
|
|
|
|
|
usersRenderCallForward: function(currentUser) { |
|
|
|
@ -2592,7 +2596,6 @@ define(function(require) { |
|
|
|
args.openedTab = 'name'; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
self.usersUpdateUser(userToSave, function(data) { |
|
|
|
args.userId = data.data.id; |
|
|
|
|
|
|
|
@ -3485,7 +3488,7 @@ define(function(require) { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
timezone.populateDropdown(template.find('#user_timezone'), dataTemplate.timezone || 'inherit', {inherit: self.i18n.active().defaultTimezone}); |
|
|
|
timezone.populateDropdown(template.find('#user_timezone'), dataTemplate.timezone || 'inherit', { inherit: self.i18n.active().defaultTimezone }); |
|
|
|
|
|
|
|
monster.ui.tooltips(template, { |
|
|
|
options: { |
|
|
|
@ -3682,45 +3685,37 @@ define(function(require) { |
|
|
|
callback && callback(template, user); |
|
|
|
}); |
|
|
|
}, |
|
|
|
usersFormatLicensedRolesData: function(user) { |
|
|
|
var self = this, |
|
|
|
formattedData = { |
|
|
|
selectedRole: undefined, |
|
|
|
availableRoles: self.appFlags.global.servicePlansRole |
|
|
|
}; |
|
|
|
|
|
|
|
if (user.hasOwnProperty('service') && user.service.hasOwnProperty('plans') && _.size(user.service.plans) > 0) { |
|
|
|
for (var key in user.service.plans) { |
|
|
|
if (user.service.plans.hasOwnProperty(key)) { |
|
|
|
formattedData.selectedRole = key; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return formattedData; |
|
|
|
}, |
|
|
|
usersFormatDevicesData: function(userId, data) { |
|
|
|
usersFormatLicensedRolesData: function(user) { |
|
|
|
var self = this, |
|
|
|
formattedData = { |
|
|
|
countSpare: 0, |
|
|
|
assignedDevices: {}, |
|
|
|
unassignedDevices: {} |
|
|
|
}; |
|
|
|
userPlanIds = _ |
|
|
|
.chain(user) |
|
|
|
.get('service.plans', {}) |
|
|
|
.keys() |
|
|
|
.value(); |
|
|
|
|
|
|
|
_.each(data, function(device) { |
|
|
|
if (device.owner_id === userId) { |
|
|
|
formattedData.assignedDevices[device.id] = device; |
|
|
|
} else if (device.owner_id === '' || !('owner_id' in device)) { |
|
|
|
formattedData.countSpare++; |
|
|
|
formattedData.unassignedDevices[device.id] = device; |
|
|
|
} |
|
|
|
return _.merge({ |
|
|
|
availableRoles: self.appFlags.global.servicePlansRole |
|
|
|
}, !_.isEmpty(userPlanIds) && { |
|
|
|
selectedRole: _.head(userPlanIds) |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
formattedData.emptyAssigned = _.isEmpty(formattedData.assignedDevices); |
|
|
|
formattedData.emptySpare = _.isEmpty(formattedData.unassignedDevices); |
|
|
|
usersFormatDevicesData: function(userId, devices) { |
|
|
|
var self = this, |
|
|
|
assigned = _.filter(devices, { owner_id: userId }), |
|
|
|
unassigned = _.flatten([ |
|
|
|
_.filter(devices, { owner_id: '' }), |
|
|
|
_.reject(devices, _.partial(_.has, _, 'owner_id')) |
|
|
|
]); |
|
|
|
|
|
|
|
return formattedData; |
|
|
|
return { |
|
|
|
countSpare: _.size(unassigned), |
|
|
|
emptyAssigned: _.isEmpty(assigned), |
|
|
|
emptySpare: _.isEmpty(unassigned), |
|
|
|
assignedDevices: _.keyBy(assigned, 'id'), |
|
|
|
unassignedDevices: _.keyBy(unassigned, 'id') |
|
|
|
}; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
|