GUACAMOLE-338: Automatically expand connections or connection groups which are ancestors of objects for which the user being modified already has READ permission.
Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/commit/970e50d0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/tree/970e50d0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/diff/970e50d0 Branch: refs/heads/master Commit: 970e50d0c6c9a0c4933c959f144681342cf4ac64 Parents: 5c4188e Author: Michael Jumper <[email protected]> Authored: Mon Jul 3 16:57:41 2017 -0700 Committer: Michael Jumper <[email protected]> Committed: Mon Jul 3 16:57:41 2017 -0700 ---------------------------------------------------------------------- .../manage/controllers/manageUserController.js | 77 +++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/970e50d0/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js ---------------------------------------------------------------------- diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js b/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js index 7f50e43..dd69391 100644 --- a/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js +++ b/guacamole/src/main/webapp/app/manage/controllers/manageUserController.js @@ -25,6 +25,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto // Required types var ConnectionGroup = $injector.get('ConnectionGroup'); + var GroupListItem = $injector.get('GroupListItem'); var PageDefinition = $injector.get('PageDefinition'); var PermissionFlagSet = $injector.get('PermissionFlagSet'); var PermissionSet = $injector.get('PermissionSet'); @@ -133,7 +134,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto * thost data sources. As only one data source is applicable to any one * user being edited/created, this will only contain a single key. * - * @type Object.<String, ConnectionGroup> + * @type Object.<String, GroupListItem> */ $scope.rootGroups = null; @@ -607,6 +608,59 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto } + /** + * Expands all items within the tree descending from the given + * GroupListItem which have at least one descendant for which explicit READ + * permission is granted. The expanded state of all other items is left + * untouched. + * + * @param {GroupListItem} item + * The GroupListItem which should be conditionally expanded depending + * on whether READ permission is granted for any of its descendants. + * + * @param {PemissionFlagSet} flags + * The set of permissions which should be used to determine whether the + * given item and its descendants are expanded. + */ + var expandReadable = function expandReadable(item, flags) { + + // If the current item is expandable and has defined children, + // determine whether it should be expanded + if (item.expandable && item.children) { + angular.forEach(item.children, function expandReadableChild(child) { + + // Determine whether the user has READ permission for the + // current child object + var readable = false; + switch (child.type) { + + case GroupListItem.Type.CONNECTION: + readable = flags.connectionPermissions.READ[child.identifier]; + break; + + case GroupListItem.Type.CONNECTION_GROUP: + readable = flags.connectionGroupPermissions.READ[child.identifier]; + break; + + case GroupListItem.Type.SHARING_PROFILE: + readable = flags.sharingProfilePermissions.READ[child.identifier]; + break; + + } + + // The parent should be expanded by default if the child is + // expanded by default OR the user has READ permission on the + // child + item.expanded |= expandReadable(child, flags) || readable; + + }); + } + + return item.expanded; + + }; + + // Retrieve all connections for which we have ADMINISTER permission dataSourceService.apply( connectionGroupService.getConnectionGroupTree, @@ -615,7 +669,13 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto [PermissionSet.ObjectPermissionType.ADMINISTER] ) .then(function connectionGroupReceived(rootGroups) { - $scope.rootGroups = rootGroups; + + // Convert all received ConnectionGroup objects into GroupListItems + $scope.rootGroups = {}; + angular.forEach(rootGroups, function addGroupListItem(rootGroup, dataSource) { + $scope.rootGroups[dataSource] = GroupListItem.fromConnectionGroup(dataSource, rootGroup); + }); + }); // Query the user's permissions for the current user @@ -628,6 +688,19 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto $scope.permissions = permissions; }); + // Update default expanded state whenever connection groups and associated + // permissions change + $scope.$watchGroup(['rootGroups', 'permissionFlags'], function updateDefaultExpandedStates() { + angular.forEach($scope.rootGroups, function updateExpandedStates(rootGroup) { + + // Automatically expand all objects with any descendants for which + // the user has READ permission + if ($scope.permissionFlags) + expandReadable(rootGroup, $scope.permissionFlags); + + }); + }); + /** * Available system permission types, as translation string / internal * value pairs.
