Merge pull request #1698 from coreos-inc/delete-namespace

Add support for deleting namespaces (users, organizations)
This commit is contained in:
josephschorr 2016-10-21 16:54:52 -04:00 committed by GitHub
commit edc2bc8b93
23 changed files with 407 additions and 33 deletions

View file

@ -173,6 +173,7 @@ angular.module("core-ui", [])
'dialogTitle': '@dialogTitle',
'dialogActionTitle': '@dialogActionTitle',
'dialogForm': '=dialogForm',
'dialogButtonClass': '@dialogButtonClass',
'dialogContext': '=dialogContext',
'dialogAction': '&dialogAction'
@ -614,6 +615,22 @@ angular.module("core-ui", [])
return directiveDefinitionObject;
})
.directive('corProgressBar', function() {
var directiveDefinitionObject = {
priority: 4,
templateUrl: '/static/directives/cor-progress-bar.html',
replace: true,
transclude: true,
restrict: 'C',
scope: {
'progress': '=progress'
},
controller: function($rootScope, $scope, $element) {
}
};
return directiveDefinitionObject;
})
.directive('corStepBar', function() {
var directiveDefinitionObject = {
priority: 4,

View file

@ -11,7 +11,8 @@ angular.module('quay').directive('billingManagementPanel', function () {
scope: {
'user': '=user',
'organization': '=organization',
'isEnabled': '=isEnabled'
'isEnabled': '=isEnabled',
'subscriptionStatus': '=subscriptionStatus'
},
controller: function($scope, $element, PlanService, ApiService, Features) {
$scope.currentCard = null;
@ -19,6 +20,7 @@ angular.module('quay').directive('billingManagementPanel', function () {
$scope.updating = true;
$scope.changeReceiptsInfo = null;
$scope.context = {};
$scope.subscriptionStatus = 'loading';
var setSubscription = function(sub) {
$scope.subscription = sub;
@ -29,12 +31,14 @@ angular.module('quay').directive('billingManagementPanel', function () {
if (!sub.hasSubscription) {
$scope.updating = false;
$scope.subscriptionStatus = 'none';
return;
}
// Load credit card information.
PlanService.getCardInfo($scope.organization ? $scope.organization.name : null, function(card) {
$scope.currentCard = card;
$scope.subscriptionStatus = 'valid';
$scope.updating = false;
});
});

View file

@ -0,0 +1,34 @@
/**
* An element which displays a settings table row for deleting a namespace (user or organization).
*/
angular.module('quay').directive('deleteNamespaceView', function () {
var directiveDefinitionObject = {
priority: 0,
templateUrl: '/static/directives/delete-namespace-view.html',
replace: false,
transclude: true,
restrict: 'C',
scope: {
'user': '=user',
'organization': '=organization',
'subscriptionStatus': '=subscriptionStatus'
},
controller: function($scope, $element, UserService) {
$scope.context = {};
$scope.showDeleteNamespace = function() {
$scope.deleteNamespaceInfo = {
'user': $scope.user,
'organization': $scope.organization,
'namespace': $scope.user ? $scope.user.username : $scope.organization.name,
'verification': ''
};
};
$scope.deleteNamespace = function(info, callback) {
UserService.deleteNamespace(info, callback);
};
}
};
return directiveDefinitionObject;
});

View file

@ -20,6 +20,7 @@
$scope.showRobotsCounter = 0;
$scope.showTeamsCounter = 0;
$scope.changeEmailInfo = null;
$scope.context = {};
$scope.orgScope = {
'changingOrganization': false,

View file

@ -3,9 +3,9 @@
* about the user.
*/
angular.module('quay')
.factory('UserService', ['ApiService', 'CookieService', '$rootScope', 'Config',
.factory('UserService', ['ApiService', 'CookieService', '$rootScope', 'Config', '$location',
function(ApiService, CookieService, $rootScope, Config) {
function(ApiService, CookieService, $rootScope, Config, $location) {
var userResponse = {
verified: false,
anonymous: true,
@ -169,6 +169,69 @@ function(ApiService, CookieService, $rootScope, Config) {
return externalUsername || userResponse.username;
};
userService.deleteNamespace = function(info, callback) {
var namespace = info.user ? info.user.username : info.organization.name;
var deleteNamespaceItself = function() {
info.progress = 1;
info.progressMessage = 'Deleting namespace...';
if (info.user) {
ApiService.deleteCurrentUser().then(function(resp) {
// Reload the user.
userService.load();
callback(true);
$location.path('/');
}, errorDisplay);
} else {
var delParams = {
'name': info.organization.name
};
ApiService.deleteOrganization(null, delParams).then(function(resp) {
// Reload the user.
userService.load();
callback(true);
$location.path('/');
}, errorDisplay);
}
};
var repoIndex = 0;
var repositories = null;
var deleteAllRepos = function() {
if (repoIndex >= repositories.length) {
deleteNamespaceItself();
return;
}
var repoParams = {
'repository': namespace + '/' + repositories[repoIndex]['name']
};
info.progress = repoIndex / repositories.length;
info.progressMessage = 'Deleting repository ' + repoParams['repository'] + '...';
ApiService.deleteRepository(null, repoParams).then(function() {
repoIndex++;
deleteAllRepos();
}, errorDisplay);
};
// First delete each repo for the namespace, updating the info so it can show a progress bar.
// This is not strictly necessary (as the namespace delete call will do it as well), but it is
// a better user experience.
var params = {
'namespace': namespace,
'public': false
};
var errorDisplay = ApiService.errorDisplay('Could not delete namespace', callback);
ApiService.listRepos(null, params).then(function(resp) {
repositories = resp['repositories'];
deleteAllRepos();
}, errorDisplay);
};
userService.currentUser = function() {
return userResponse;
};