/** * Element for managing the robots owned by an organization or a user. */ angular.module('quay').directive('robotsManager', function () { var directiveDefinitionObject = { priority: 0, templateUrl: '/static/directives/robots-manager.html', replace: false, transclude: false, restrict: 'C', scope: { 'organization': '=organization', 'user': '=user', 'isEnabled': '=isEnabled' }, controller: function($scope, $element, ApiService, $routeParams, $location, Config, $rootScope) { $scope.robots = null; $scope.loading = false; $scope.Config = Config; $scope.feedback = null; $scope.robotDisplayInfo = null; $scope.createRobotInfo = null; // Listen for route changes and update the tabs accordingly. var locationListener = $rootScope.$on('$routeUpdate', function(){ if ($location.search()['showRobot']) { $scope.filterToRobot($location.search()['showRobot']); } }); $scope.$on('$destroy', function() { locationListener && locationListener(); }); $scope.filterToRobot = function(robotName) { if ($scope.robotFilter == robotName) { return; } var index = $scope.findRobotIndexByName(robotName); if (index < 0) { // Robot doesn't exist. Reload the list to see if we can find it. update(); } $scope.robotFilter = robotName; }; $scope.showRobot = function(info) { $scope.robotDisplayInfo = { 'name': info.name }; }; $scope.findRobotIndexByName = function(name) { if (!$scope.robots) { return -1; } for (var i = 0; i < $scope.robots.length; ++i) { if ($scope.robots[i].name == name) { return i; } } return -1; }; $scope.getShortenedRobotName = function(info) { return $scope.getShortenedName(info.name); }; $scope.getShortenedName = function(name) { var plus = name.indexOf('+'); return name.substr(plus + 1); }; $scope.getPrefix = function(name) { var plus = name.indexOf('+'); return name.substr(0, plus); }; $scope.askCreateRobot = function() { $scope.createRobotInfo = { 'namespace': $scope.organization ? $scope.organization.name : $scope.user.username }; }; $scope.deleteRobot = function(info) { var shortName = $scope.getShortenedName(info.name); ApiService.deleteRobot($scope.organization, null, {'robot_shortname': shortName}).then(function(resp) { var index = $scope.findRobotIndexByName(info.name); if (index >= 0) { $scope.robots.splice(index, 1); $scope.feedback = { 'kind': 'success', 'message': 'Robot account {robot} was deleted', 'data': { 'robot': info.name } }; } }, ApiService.errorDisplay('Cannot delete robot account')); }; $scope.askDeleteRobot = function(info) { bootbox.confirm('Are you sure you want to delete robot ' + info.name + '?', function(resp) { if (resp) { $scope.deleteRobot(info); } }); }; $scope.setPermissions = function(info) { var namespace = $scope.organization ? $scope.organization.name : $scope.user.username; $scope.setRepoPermissionsInfo = { 'namespace': namespace, 'entityName': info.name, 'entityKind': 'robot', 'entityIcon': 'ci-robot' }; }; $scope.handlePermissionsSet = function(info, repositories) { var index = $scope.findRobotIndexByName(info.entityName); $scope.robots[index]['repositories'] = repositories; }; $scope.robotCreated = function() { update(); }; var update = function() { if (!$scope.user && !$scope.organization) { return; } if ($scope.loading || !$scope.isEnabled) { return; } var params = { 'permissions': true }; $scope.loading = true; ApiService.getRobots($scope.organization, null, params).then(function(resp) { $scope.robots = resp.robots; $scope.loading = false; if ($routeParams.showRobot) { $scope.filterToRobot($routeParams.showRobot); } }); }; $scope.$watch('isEnabled', update); $scope.$watch('organization', update); $scope.$watch('user', update); } }; return directiveDefinitionObject; });