This repository has been archived on 2020-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
quay/static/js/directives/ui/repository-permissions-table.js

177 lines
5.1 KiB
JavaScript
Raw Normal View History

2019-11-12 16:09:47 +00:00
/**
* An element which displays a table of permissions on a repository and allows them to be
* edited.
*/
angular.module('quay').filter('objectFilter', function() {
return function(obj, filterFn) {
if (!obj) { return []; }
var result = [];
angular.forEach(obj, function(value) {
if (filterFn(value)) {
result.push(value);
}
});
return result;
};
});
angular.module('quay').directive('repositoryPermissionsTable', function () {
var directiveDefinitionObject = {
priority: 0,
templateUrl: '/static/directives/repository-permissions-table.html',
replace: false,
transclude: true,
restrict: 'C',
scope: {
'repository': '=repository',
'isEnabled': '=isEnabled'
},
controller: function($scope, $element, ApiService, RolesService, $rootScope, StateService) {
$scope.inReadOnlyMode = StateService.inReadOnlyMode();
$scope.permissionResources = {'team': {}, 'user': {}};
$scope.permissionCache = {};
$scope.permissions = {};
var readRole = RolesService.repoRoles[0].id;
$scope.addPermissionInfo = {
'role': readRole
};
var loadAllPermissions = function() {
if (!$scope.repository || !$scope.isEnabled) { return; }
fetchPermissions('user');
fetchPermissions('team');
};
var fetchPermissions = function(kind) {
if ($scope.permissionResources[kind]['loading'] != null) {
return;
}
var params = {
'repository': $scope.repository.namespace + '/' + $scope.repository.name
};
var Kind = kind[0].toUpperCase() + kind.substring(1);
var r = ApiService['listRepo' + Kind + 'PermissionsAsResource'](params).get(function(resp) {
$scope.permissions[kind] = resp.permissions;
return resp.permissions;
});
$scope.permissionResources[kind] = r;
};
$scope.$watch('repository', loadAllPermissions);
$scope.$watch('isEnabled', loadAllPermissions);
loadAllPermissions();
$scope.buildEntityForPermission = function(permission, kind) {
var key = permission.name + ':' + kind;
if ($scope.permissionCache[key]) {
return $scope.permissionCache[key];
}
return $scope.permissionCache[key] = {
'kind': kind,
'name': permission.name,
'is_robot': permission.is_robot,
'is_org_member': permission.is_org_member,
'avatar': permission.avatar
};
};
$scope.hasPermissions = function(teams, users) {
if (teams && teams.value) {
if (Object.keys(teams.value).length > 0) {
return true;
}
}
if (users && users.value) {
if (Object.keys(users.value).length > 0) {
return true;
}
}
return false;
};
$scope.allEntries = function() {
return true;
};
$scope.onlyRobot = function(permission) {
return permission.is_robot == true;
};
$scope.onlyUser = function(permission) {
return !permission.is_robot;
};
$scope.addPermission = function() {
$scope.addPermissionInfo['working'] = true;
$scope.addNewPermission($scope.addPermissionInfo.entity, $scope.addPermissionInfo.role)
};
$scope.grantPermission = function(entity, callback) {
$scope.addRole(entity.name, 'read', entity.kind, callback);
};
$scope.addNewPermission = function(entity, opt_role) {
// Don't allow duplicates.
if (!entity || !entity.kind || $scope.permissions[entity.kind][entity.name]) {
$scope.addPermissionInfo = {};
return;
}
if (entity.is_org_member === false) {
$scope.grantPermissionInfo = {
'entity': entity
};
return;
}
$scope.addRole(entity.name, opt_role || 'read', entity.kind);
};
$scope.deleteRole = function(entityName, kind) {
RolesService.deleteRepositoryRole($scope.repository, kind, entityName, function(status) {
if (status) {
delete $scope.permissions[kind][entityName];
}
});
};
$scope.addRole = function(entityName, role, kind, opt_callback) {
RolesService.setRepositoryRole($scope.repository, role, kind, entityName, function(status, result) {
$scope.addPermissionInfo = {
'role': readRole
};
if (status) {
$scope.permissions[kind][entityName] = result;
}
opt_callback && opt_callback(status);
});
};
$scope.setRole = function(role, entityName, kind) {
var currentRole = $scope.permissions[kind][entityName].role;
RolesService.setRepositoryRole($scope.repository, role, kind, entityName, function(status) {
if (status) {
$scope.permissions[kind][entityName]['role'] = role;
} else {
$scope.permissions[kind][entityName]['role'] = currentRole;
}
});
};
}
};
return directiveDefinitionObject;
});