/** * An element which displays a dialog for setting up a build trigger. */ angular.module('quay').directive('setupTriggerDialog', function () { var directiveDefinitionObject = { templateUrl: '/static/directives/setup-trigger-dialog.html', replace: false, transclude: false, restrict: 'C', scope: { 'repository': '=repository', 'trigger': '=trigger', 'counter': '=counter', 'canceled': '&canceled', 'activated': '&activated', 'triggerRunner': '&triggerRunner' }, controller: function($scope, $element, ApiService, UserService, TriggerService) { var modalSetup = false; $scope.state = {}; $scope.nextStepCounter = -1; $scope.currentView = 'config'; $scope.TriggerService = TriggerService $scope.show = function() { if (!$scope.trigger || !$scope.repository) { return; } $scope.currentView = 'config'; $('#setupTriggerModal').modal({}); if (!modalSetup) { $('#setupTriggerModal').on('hidden.bs.modal', function () { if (!$scope.trigger || $scope.trigger['is_active']) { return; } $scope.nextStepCounter = -1; $scope.$apply(function() { $scope.cancelSetupTrigger(); }); }); modalSetup = true; $scope.nextStepCounter = 0; } }; $scope.isNamespaceAdmin = function(namespace) { return UserService.isNamespaceAdmin(namespace); }; $scope.cancelSetupTrigger = function() { $scope.canceled({'trigger': $scope.trigger}); }; $scope.hide = function() { $('#setupTriggerModal').modal('hide'); }; $scope.runTriggerNow = function() { $('#setupTriggerModal').modal('hide'); $scope.triggerRunner({'trigger': $scope.trigger}); }; $scope.checkAnalyze = function(isValid) { $scope.currentView = 'analyzing'; $scope.pullInfo = { 'is_public': true }; if (!isValid) { $scope.currentView = 'analyzed'; return; } var params = { 'repository': $scope.repository.namespace + '/' + $scope.repository.name, 'trigger_uuid': $scope.trigger.id }; var data = { 'config': $scope.trigger.config }; ApiService.analyzeBuildTrigger(data, params).then(function(resp) { $scope.currentView = 'analyzed'; if (resp['status'] == 'analyzed') { if (resp['robots'] && resp['robots'].length > 0) { $scope.pullInfo['pull_entity'] = resp['robots'][0]; } else { $scope.pullInfo['pull_entity'] = null; } $scope.pullInfo['is_public'] = false; } $scope.pullInfo['analysis'] = resp; }, ApiService.errorDisplay('Cannot load Dockerfile information')); }; $scope.activate = function() { if (!$scope.trigger) { return; } var params = { 'repository': $scope.repository.namespace + '/' + $scope.repository.name, 'trigger_uuid': $scope.trigger.id }; var data = { 'config': $scope.trigger['config'] }; if ($scope.pullInfo['pull_entity']) { data['pull_robot'] = $scope.pullInfo['pull_entity']['name']; } $scope.currentView = 'activating'; var errorHandler = ApiService.errorDisplay('Cannot activate build trigger', function(resp) { $scope.hide(); $scope.canceled({'trigger': $scope.trigger}); return ApiService.getErrorMessage(resp) + '\n\nNote: Errors can occur if you do not have admin access on the repository.'; }); ApiService.activateBuildTrigger(data, params).then(function(resp) { if (!$scope.trigger) { return; } $scope.trigger['is_active'] = true; $scope.trigger['config'] = resp['config']; $scope.trigger['pull_robot'] = resp['pull_robot']; $scope.trigger['repository_url'] = resp['repository_url']; $scope.activated({'trigger': $scope.trigger}); $scope.currentView = 'postActivation'; }, errorHandler); }; var check = function() { if ($scope.counter && $scope.trigger && $scope.repository) { $scope.show(); } }; $scope.$watch('trigger', check); $scope.$watch('counter', check); $scope.$watch('repository', check); } }; return directiveDefinitionObject; });