linagora-rse
Version:
158 lines (131 loc) • 4.76 kB
JavaScript
;
angular.module('esn.user', ['esn.http', 'esn.object-type', 'esn.lodash-wrapper', 'esn.session'])
.run(function(objectTypeResolver, userAPI, userUtils, esnRestangular) {
objectTypeResolver.register('user', userAPI.user);
esnRestangular.extendModel('users', function(model) {
model.url = function(user) {
return '/#/profile/' + user._id || user;
};
model.avatarUrl = function(user) {
return '/api/avatars?objectType=user&email=' + user.emails[0] || user;
};
model.displayName = function(user) {
return userUtils.displayNameOf(user);
};
model.__id = function(user) {
return user._id || user;
};
return model;
});
})
.factory('userAPI', function(esnRestangular, session) {
function currentUser() {
return esnRestangular.one('user').get({_: Date.now()});
}
function user(uuid) {
return esnRestangular.one('users', uuid).get();
}
function getUsersByEmail(email) {
return esnRestangular.all('users').getList({ email: email });
}
function getCommunities() {
return esnRestangular.one('user').all('communities').getList();
}
function getActivityStreams(options) {
options = options || {};
return esnRestangular.one('user').all('activitystreams').getList(options);
}
function setUserStates(userId, states, domainId) {
return esnRestangular.one('users', userId).customPUT(states, 'states', { domain_id: domainId || session.domain._id });
}
return {
currentUser: currentUser,
user: user,
getCommunities: getCommunities,
getActivityStreams: getActivityStreams,
getUsersByEmail: getUsersByEmail,
setUserStates: setUserStates
};
})
.factory('userUtils', function() {
function displayNameOf(user) {
if (!user.firstname && !user.lastname) {
return user.preferredEmail;
}
return (user.firstname && user.lastname) ? user.firstname + ' ' + user.lastname : (user.firstname || user.lastname);
}
return {
displayNameOf: displayNameOf
};
})
.constant('USER_AUTO_COMPLETE_TEMPLATE_URL', '/views/modules/auto-complete/user-auto-complete')
.directive('usersAutocompleteInput', function($q, _, session, $log, domainAPI, userUtils, naturalService, AUTOCOMPLETE_MAX_RESULTS, USER_AUTO_COMPLETE_TEMPLATE_URL) {
function link(scope) {
function filterUsers(users) {
var userIds = _.map(users, '_id');
return function(user) {
return !_.contains(userIds, user._id);
};
}
function filterConnectedUser(user) {
return !(user.preferredEmail in session.user.emailMap);
}
scope.getUsers = function(query) {
var memberQuery = {search: query, limit: AUTOCOMPLETE_MAX_RESULTS * 2};
return domainAPI.getMembers(session.domain._id, memberQuery).then(function(response) {
response.data.forEach(function(user) {
user.displayName = userUtils.displayNameOf(user);
});
return response.data;
}, function(error) {
$log.error('Error while searching users:', error);
return $q.when([]);
}).then(function(users) {
var duplicateUsers = scope.mutableUsers.concat(scope.originalUsers || []);
var ignoredUsers = scope.ignoredUsers || [];
users = users.map(function(user) {
return angular.extend(user, { templateUrl: USER_AUTO_COMPLETE_TEMPLATE_URL });
});
users = users
.filter(filterConnectedUser)
.filter(filterUsers(duplicateUsers))
.filter(filterUsers(ignoredUsers));
users.sort(function(a, b) {
return naturalService.naturalSort(a.displayName, b.displayName);
});
return users.slice(0, AUTOCOMPLETE_MAX_RESULTS);
});
};
}
return {
restrict: 'E',
templateUrl: '/views/modules/user/users-autocomplete-input.html',
link: link,
scope: {
originalUsers: '=?',
mutableUsers: '=',
ignoredUsers: '=?',
onAddingUser: '=?',
onUserAdded: '=?',
onUserRemoved: '=?',
addFromAutocompleteOnly: '=?',
propagateEnterEvent: '=?'
}
};
})
.factory('usernameService', function(Cache, userAPI, userUtils) {
var cache = new Cache({
loader: _userNameLoader
});
return {
getFromId: getFromId
};
function _userNameLoader(userId) {
return userAPI.user(userId).then(function(response) {
return userUtils.displayNameOf(response.data);
});
}
function getFromId(userId) {
return cache.get(userId);
}
});