linagora-rse
Version:
171 lines (144 loc) • 5.22 kB
JavaScript
;
angular.module('esn.member', ['esn.session', 'esn.router', 'esn.domain', 'esn.search', 'esn.infinite-list', 'openpaas-logo', 'esn.provider', 'esn.header', 'esn.configuration'])
.run(function(searchProviders, memberSearchProvider, esnConfig) {
esnConfig('core.membersCanBeSearched', true).then(function(membersCanBeSearched) {
if (membersCanBeSearched) {
searchProviders.add(memberSearchProvider);
}
});
})
.constant('memberSearchConfiguration', {
searchLimit: 20
})
.directive('memberDisplay', function() {
return {
restrict: 'E',
scope: {
member: '=member',
query: '=?',
disableProfileLink: '=?'
},
templateUrl: '/views/modules/member/member.html'
};
}).controller('memberscontroller', function($scope, domainAPI, $stateParams, memberSearchConfiguration, usSpinnerService) {
var domain_id = $stateParams.domain_id;
$scope.spinnerKey = 'memberSpinner';
var opts = {
offset: 0,
limit: memberSearchConfiguration.searchLimit,
search: ''
};
$scope.search = {
running: false
};
$scope.members = [];
$scope.restActive = false;
$scope.error = false;
var formatResultsCount = function(count) {
$scope.search.count = count;
if (count < 1000) {
$scope.search.formattedCount = count;
} else {
var len = Math.ceil(Math.log(count + 1) / Math.LN10);
var num = Math.round(count * Math.pow(10, -(len - 3))) * Math.pow(10, len - 3);
$scope.search.formattedCount = num.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1 ');
}
};
var updateMembersList = function() {
$scope.error = false;
if ($scope.restActive) {
return;
} else {
$scope.restActive = true;
$scope.search.running = true;
formatResultsCount(0);
usSpinnerService.spin('memberSpinner');
domainAPI.getMembers(domain_id, opts).then(function(data) {
formatResultsCount(parseInt(data.headers('X-ESN-Items-Count'), 10));
$scope.members = $scope.members.concat(data.data);
}, function() {
$scope.error = true;
}).finally(function() {
$scope.search.running = false;
$scope.restActive = false;
usSpinnerService.stop('memberSpinner');
});
}
};
$scope.init = function() {
//initializes the view with a list of users of the domain
updateMembersList();
};
$scope.doSearch = function() {
$scope.members = [];
opts.offset = 0;
opts.search = $scope.searchInput;
updateMembersList();
};
$scope.loadMoreElements = function() {
if ($scope.members.length === 0 || $scope.members.length < $scope.search.count) {
opts.offset = $scope.members.length;
updateMembersList();
}
};
})
.factory('memberSearchProvider', function($q, esnSearchProvider, domainAPI, session, ELEMENTS_PER_REQUEST) {
var name = 'Members';
return new esnSearchProvider({
uid: 'op.members',
name: name,
fetch: function(query) {
var offset = 0;
return function() {
return domainAPI.getMembers(session.domain._id, {
search: query,
offset: offset,
limit: ELEMENTS_PER_REQUEST
}).then(function(members) {
offset += members.data.length;
return members.data.map(function(member) {
member.type = name;
member.date = new Date();
return member;
});
});
};
},
buildFetchContext: function(options) {
return $q.when(options.query && options.query.text);
},
templateUrl: '/views/modules/member/member-search-item.html'
});
})
.factory('MemberPaginationProvider', function(session, domainAPI, memberSearchConfiguration) {
function MemberPaginationProvider(options) {
this.options = angular.extend({limit: memberSearchConfiguration.searchLimit, offset: 0}, options);
}
MemberPaginationProvider.prototype.loadNextItems = function() {
var self = this;
return domainAPI.getMembers(session.domain._id, self.options).then(function(response) {
var result = {
data: response.data,
lastPage: (response.data.length < self.options.limit)
};
if (!result.lastPage) {
self.options.offset += self.options.limit;
}
return result;
});
};
return MemberPaginationProvider;
})
.factory('MemberScrollBuilder', function(infiniteScrollHelperBuilder, PageAggregatorService, MemberPaginationProvider, _, ELEMENTS_PER_PAGE) {
function build($scope, updateScope, options) {
var aggregator;
function loadNextItems() {
aggregator = aggregator || new PageAggregatorService('members', [new MemberPaginationProvider(options)], {results_per_page: ELEMENTS_PER_PAGE});
return aggregator.loadNextItems().then(_.property('data'), _.constant([]));
}
return infiniteScrollHelperBuilder($scope, loadNextItems, updateScope);
}
return {
build: build
};
});