8ea3977140
Also extracts out some common testing infrastructure to make testing APIs easier now using pytest
289 lines
No EOL
8.2 KiB
JavaScript
289 lines
No EOL
8.2 KiB
JavaScript
(function() {
|
|
/**
|
|
* Page to view the members of a team and add/remove them.
|
|
*/
|
|
angular.module('quayPages').config(['pages', function(pages) {
|
|
pages.create('team-view', 'team-view.html', TeamViewCtrl, {
|
|
'newLayout': true,
|
|
'title': 'Team {{ teamname }}',
|
|
'description': 'Team {{ teamname }}'
|
|
})
|
|
}]);
|
|
|
|
function TeamViewCtrl($rootScope, $scope, $timeout, Features, Restangular, ApiService, $routeParams) {
|
|
var teamname = $routeParams.teamname;
|
|
var orgname = $routeParams.orgname;
|
|
|
|
$scope.context = {};
|
|
$scope.orgname = orgname;
|
|
$scope.teamname = teamname;
|
|
$scope.addingMember = false;
|
|
$scope.memberMap = null;
|
|
$scope.allowEmail = Features.MAILING;
|
|
$scope.feedback = null;
|
|
$scope.allowedEntities = ['user', 'robot'];
|
|
|
|
$rootScope.title = 'Loading...';
|
|
|
|
$scope.filterFunction = function(invited, robots) {
|
|
return function(item) {
|
|
// Note: The !! is needed because is_robot will be undefined for invites.
|
|
var robot_check = (!!item.is_robot == robots);
|
|
return robot_check && item.invited == invited;
|
|
};
|
|
};
|
|
|
|
$scope.inviteEmail = function(email) {
|
|
if (!email || $scope.memberMap[email]) { return; }
|
|
|
|
$scope.addingMember = true;
|
|
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname,
|
|
'email': email
|
|
};
|
|
|
|
var errorHandler = ApiService.errorDisplay('Cannot invite team member', function() {
|
|
$scope.addingMember = false;
|
|
});
|
|
|
|
ApiService.inviteTeamMemberEmail(null, params).then(function(resp) {
|
|
$scope.members.push(resp);
|
|
$scope.memberMap[resp.email] = resp;
|
|
$scope.addingMember = false;
|
|
|
|
$scope.feedback = {
|
|
'kind': 'success',
|
|
'message': 'E-mail address {email} was invited to join the team',
|
|
'data': {
|
|
'email': email
|
|
}
|
|
};
|
|
}, errorHandler);
|
|
};
|
|
|
|
$scope.addNewMember = function(member) {
|
|
if (!member || $scope.memberMap[member.name]) { return; }
|
|
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname,
|
|
'membername': member.name
|
|
};
|
|
|
|
var errorHandler = ApiService.errorDisplay('Cannot add team member', function() {
|
|
$scope.addingMember = false;
|
|
});
|
|
|
|
$scope.addingMember = true;
|
|
ApiService.updateOrganizationTeamMember(null, params).then(function(resp) {
|
|
$scope.members.push(resp);
|
|
$scope.memberMap[resp.name] = resp;
|
|
$scope.addingMember = false;
|
|
|
|
$scope.feedback = {
|
|
'kind': 'success',
|
|
'message': 'User {username} was added to the team',
|
|
'data': {
|
|
'username': member.name
|
|
}
|
|
};
|
|
}, errorHandler);
|
|
};
|
|
|
|
$scope.revokeInvite = function(inviteInfo) {
|
|
if (inviteInfo.kind == 'invite') {
|
|
// E-mail invite.
|
|
$scope.revokeEmailInvite(inviteInfo.email);
|
|
} else {
|
|
// User invite.
|
|
$scope.removeMember(inviteInfo.name);
|
|
}
|
|
};
|
|
|
|
$scope.revokeEmailInvite = function(email) {
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname,
|
|
'email': email
|
|
};
|
|
|
|
ApiService.deleteTeamMemberEmailInvite(null, params).then(function(resp) {
|
|
if (!$scope.memberMap[email]) { return; }
|
|
var index = $.inArray($scope.memberMap[email], $scope.members);
|
|
$scope.members.splice(index, 1);
|
|
delete $scope.memberMap[email];
|
|
|
|
$scope.feedback = {
|
|
'kind': 'success',
|
|
'message': 'Invitation to e-amil address {email} was revoked',
|
|
'data': {
|
|
'email': email
|
|
}
|
|
};
|
|
}, ApiService.errorDisplay('Cannot revoke team invite'));
|
|
};
|
|
|
|
$scope.removeMember = function(username) {
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname,
|
|
'membername': username
|
|
};
|
|
|
|
ApiService.deleteOrganizationTeamMember(null, params).then(function(resp) {
|
|
if (!$scope.memberMap[username]) { return; }
|
|
var index = $.inArray($scope.memberMap[username], $scope.members);
|
|
$scope.members.splice(index, 1);
|
|
delete $scope.memberMap[username];
|
|
|
|
$scope.feedback = {
|
|
'kind': 'success',
|
|
'message': 'User {username} was removed from the team',
|
|
'data': {
|
|
'username': username
|
|
}
|
|
};
|
|
}, ApiService.errorDisplay('Cannot remove team member'));
|
|
};
|
|
|
|
$scope.getServiceName = function(service) {
|
|
switch (service) {
|
|
case 'ldap':
|
|
return 'LDAP';
|
|
|
|
case 'keystone':
|
|
return 'Keystone Auth';
|
|
|
|
case 'jwtauthn':
|
|
return 'External JWT Auth';
|
|
|
|
default:
|
|
return synced.service;
|
|
}
|
|
};
|
|
|
|
$scope.getAddPlaceholder = function(email, synced) {
|
|
var kinds = [];
|
|
|
|
if (!synced) {
|
|
kinds.push('registered user');
|
|
}
|
|
|
|
kinds.push('robot');
|
|
|
|
if (email && !synced) {
|
|
kinds.push('email address');
|
|
}
|
|
|
|
kind_string = kinds.join(', ')
|
|
return 'Add a ' + kind_string + ' to the team';
|
|
};
|
|
|
|
$scope.updateForDescription = function(content) {
|
|
$scope.organization.teams[teamname].description = content;
|
|
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname
|
|
};
|
|
|
|
var teaminfo = $scope.organization.teams[teamname];
|
|
ApiService.updateOrganizationTeam(teaminfo, params).then(function(resp) {
|
|
$scope.feedback = {
|
|
'kind': 'success',
|
|
'message': 'Team description changed',
|
|
'data': {}
|
|
};
|
|
}, function() {
|
|
$('#cannotChangeTeamModal').modal({});
|
|
});
|
|
};
|
|
|
|
$scope.showEnableSyncing = function() {
|
|
$scope.enableSyncingInfo = {
|
|
'service_info': $scope.canSync,
|
|
'config': {}
|
|
};
|
|
};
|
|
|
|
$scope.showDisableSyncing = function() {
|
|
msg = 'Are you sure you want to disable group syncing on this team? ' +
|
|
'The team will once again become editable.';
|
|
bootbox.confirm(msg, function(result) {
|
|
if (result) {
|
|
$scope.disableSyncing();
|
|
}
|
|
});
|
|
};
|
|
|
|
$scope.disableSyncing = function() {
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname
|
|
};
|
|
|
|
var errorHandler = ApiService.errorDisplay('Could not disable team syncing');
|
|
ApiService.disableOrganizationTeamSync(null, params).then(function(resp) {
|
|
loadMembers();
|
|
}, errorHandler);
|
|
};
|
|
|
|
$scope.enableSyncing = function(config, callback) {
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname
|
|
};
|
|
|
|
var errorHandler = ApiService.errorDisplay('Cannot enable team syncing', callback);
|
|
ApiService.enableOrganizationTeamSync(config, params).then(function(resp) {
|
|
loadMembers();
|
|
callback(true);
|
|
}, errorHandler);
|
|
};
|
|
|
|
var loadOrganization = function() {
|
|
$scope.orgResource = ApiService.getOrganizationAsResource({'orgname': orgname}).get(function(org) {
|
|
$scope.organization = org;
|
|
$scope.team = $scope.organization.teams[teamname];
|
|
$rootScope.title = teamname + ' (' + $scope.orgname + ')';
|
|
$rootScope.description = 'Team management page for team ' + teamname + ' under organization ' + $scope.orgname;
|
|
loadMembers();
|
|
return org;
|
|
});
|
|
};
|
|
|
|
var loadMembers = function() {
|
|
var params = {
|
|
'orgname': orgname,
|
|
'teamname': teamname,
|
|
'includePending': true
|
|
};
|
|
|
|
$scope.membersResource = ApiService.getOrganizationTeamMembersAsResource(params).get(function(resp) {
|
|
$scope.members = resp.members;
|
|
$scope.canEditMembers = resp.can_edit;
|
|
$scope.canSync = resp.can_sync;
|
|
$scope.syncInfo = resp.synced;
|
|
$scope.allowedEntities = resp.synced ? ['robot'] : ['user', 'robot'];
|
|
|
|
$('.info-icon').popover({
|
|
'trigger': 'hover',
|
|
'html': true
|
|
});
|
|
|
|
$scope.memberMap = {};
|
|
for (var i = 0; i < $scope.members.length; ++i) {
|
|
var current = $scope.members[i];
|
|
$scope.memberMap[current.name || current.email] = current;
|
|
}
|
|
|
|
return resp.members;
|
|
});
|
|
};
|
|
|
|
// Load the organization.
|
|
loadOrganization();
|
|
}
|
|
})(); |