function HeaderCtrl($scope, UserService) { $scope.$watch( function () { return UserService.currentUser(); }, function (currentUser) { $scope.user = currentUser; }, true); $('#repoSearch').typeahead({ name: 'repositories', remote: { url: '/api/repository/find/%QUERY', filter: function(data) { var datums = []; for (var i = 0; i < data.repositories.length; ++i) { var repo = data.repositories[i]; datums.push({ 'value': repo.name, 'tokens': [repo.name, repo.namespace], 'repo': repo }); } return datums; } }, template: function (datum) { template = '
'; template += '' template += '' + datum.repo.namespace +'/' + datum.repo.name + '' if (datum.repo.description) { template += '' + datum.repo.description + '' } template += '
' return template; }, }); $('#repoSearch').on('typeahead:selected', function (e, datum) { $('#repoSearch').typeahead('setQuery', ''); document.location = '#/repository/' + datum.repo.namespace + '/' + datum.repo.name }); } function RepoListCtrl($scope, Restangular) { var repositoryFetch = Restangular.all('repository/'); repositoryFetch.getList().then(function(resp) { $scope.repositories = resp.repositories; }); } function LandingCtrl($scope) { } function RepoCtrl($scope, Restangular, $routeParams, $rootScope) { var tabs = ['current-image', 'image-history']; $rootScope.title = 'Loading...'; $scope.showTab = function(tabName) { for (var i = 0; i < tabs.length; ++i) { $('#' + tabs[i]).hide(); $('#' + tabs[i] + '-tab').removeClass('active'); } $('#' + tabName).show(); $('#' + tabName + '-tab').addClass('active'); if (tabName == 'image-history') { $scope.listImages(); } }; $scope.editDescription = function() { if (!$scope.repo.can_write) { return; } $('#descriptionEdit')[0].value = $scope.repo.description || ''; $('#editModal').modal({}); }; $scope.saveDescription = function() { $('#editModal').modal('hide'); $scope.repo.description = $('#descriptionEdit')[0].value; $scope.repo.put(); }; $scope.parseDate = function(dateString) { return Date.parse(dateString); }; $scope.listImages = function() { if ($scope.imageHistory) { return; } var imageFetch = Restangular.one('repository/' + namespace + '/' + name + '/tag/' + $scope.currentTag.name + '/images'); imageFetch.get().then(function(resp) { $scope.imageHistory = resp.images; }); }; var namespace = $routeParams.namespace; var name = $routeParams.name; var tag = $routeParams.tag || 'latest'; var repositoryFetch = Restangular.one('repository/' + namespace + '/' + name); repositoryFetch.get().then(function(repo) { $rootScope.title = namespace + '/' + name; $scope.repo = repo; $scope.currentTag = repo.tags[tag] || repo.tags['latest']; var clip = new ZeroClipboard($('#copyClipboard'), { 'moviePath': 'static/js/ZeroClipboard.swf' }); clip.on('complete', function() { // Resets the animation. var elem = $('#clipboardCopied')[0]; elem.style.display = 'none'; // Show the notification. setTimeout(function() { elem.style.display = 'block'; }, 1); }); }, function() { $scope.repo = null; $rootScope.title = 'Unknown Repository'; }); } function RepoAdminCtrl($scope, Restangular, $routeParams, $rootScope) { var namespace = $routeParams.namespace; var name = $routeParams.name; $('#userSearch').typeahead({ name: 'users', remote: { url: '/api/users/%QUERY', filter: function(data) { var datums = []; for (var i = 0; i < data.users.length; ++i) { var user = data.users[i]; datums.push({ 'value': user, 'tokens': [user], 'username': user }); } return datums; } }, template: function (datum) { template = '
'; template += '' template += '' + datum.username + '' template += '
' return template; }, }); $('#userSearch').on('typeahead:selected', function(e, datum) { $('#userSearch').typeahead('setQuery', ''); $scope.addNewPermission(datum.username); }); $scope.addNewPermission = function(username) { // Don't allow duplicates. if ($scope.permissions[username]) { return; } // Need the $scope.apply for both the permission stuff to change and for // the XHR call to be made. $scope.$apply(function() { $scope.addRole(username, 'read') }); }; $scope.deleteRole = function(username) { var permissionDelete = Restangular.one('repository/' + namespace + '/' + name + '/permissions/' + username); permissionDelete.customDELETE().then(function() { delete $scope.permissions[username]; }, function(result) { if (result.status == 409) { $('#onlyadminModal').modal({}); } else { $('#cannotchangeModal').modal({}); } }); }; $scope.addRole = function(username, role) { var permission = { 'role': role }; var permissionPost = Restangular.one('repository/' + namespace + '/' + name + '/permissions/' + username); permissionPost.customPOST(permission).then(function() { $scope.permissions[username] = permission; $scope.permissions = $scope.permissions; }, function(result) { $('#cannotchangeModal').modal({}); }); }; $scope.setRole = function(username, role) { var permission = $scope.permissions[username]; var currentRole = permission.role; permission.role = role; var permissionPut = Restangular.one('repository/' + namespace + '/' + name + '/permissions/' + username); permissionPut.customPUT(permission).then(function() {}, function(result) { if (result.status == 409) { permission.role = currentRole; $('#onlyadminModal').modal({}); } else { $('#cannotchangeModal').modal({}); } }); }; var permissionsFetch = Restangular.one('repository/' + namespace + '/' + name + '/permissions'); permissionsFetch.get().then(function(resp) { $rootScope.title = 'Settings - ' + namespace + '/' + name; $scope.repo = { 'namespace': namespace, 'name': name }; $scope.permissions = resp.permissions; }, function() { $scope.repo = null; $scope.permissions = null; $rootScope.title = 'Unknown Repository'; }); }