GUACAMOLE-724: Track client focus changes within tiled client directive, not just in changes to overall attached group.

This commit is contained in:
Michael Jumper
2021-06-27 22:33:26 -07:00
parent 7d5b6c6898
commit 5e2e28365c
2 changed files with 48 additions and 34 deletions

View File

@@ -145,12 +145,16 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
/** /**
* Applies any changes to connection parameters made by the user within the * Applies any changes to connection parameters made by the user within the
* Guacamole menu. * Guacamole menu to the given ManagedClient. If no client is supplied,
* this function has no effect.
*
* @param {ManagedClient} client
* The client to apply parameter changes to.
*/ */
$scope.applyParameterChanges = function applyParameterChanges() { $scope.applyParameterChanges = function applyParameterChanges(client) {
angular.forEach($scope.menu.connectionParameters, function sendArgv(value, name) { angular.forEach($scope.menu.connectionParameters, function sendArgv(value, name) {
if ($scope.focusedClient) if (client)
ManagedClient.setArgument($scope.focusedClient, name, value); ManagedClient.setArgument(client, name, value);
}); });
}; };
@@ -292,27 +296,6 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
// reloading the route // reloading the route
$scope.$on('$routeUpdate', updateAttachedClients); $scope.$on('$routeUpdate', updateAttachedClients);
/**
* Returns the currently-focused ManagedClient. If there is no such client,
* or multiple clients are focused, null is returned.
*
* @returns {ManagedClient}
* The currently-focused client, or null if there are no focused
* clients or if multiple clients are focused.
*/
$scope.getFocusedClient = function getFocusedClient() {
var managedClientGroup = $scope.clientGroup;
if (managedClientGroup) {
var focusedClients = _.filter(managedClientGroup.clients, client => client.clientProperties.focused);
if (focusedClients.length === 1)
return focusedClients[0];
}
return null;
};
/** /**
* The root connection groups of the connection hierarchy that should be * The root connection groups of the connection hierarchy that should be
* presented to the user for selecting a different connection, as a map of * presented to the user for selecting a different connection, as a map of
@@ -444,7 +427,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
// Send any argument value data once menu is hidden // Send any argument value data once menu is hidden
if (!menuShown && menuShownPreviousState) if (!menuShown && menuShownPreviousState)
$scope.applyParameterChanges(); $scope.applyParameterChanges($scope.focusedClient);
// Disable client keyboard if the menu is shown // Disable client keyboard if the menu is shown
angular.forEach($scope.clientGroup.clients, function updateKeyboardEnabled(client) { angular.forEach($scope.clientGroup.clients, function updateKeyboardEnabled(client) {
@@ -454,19 +437,19 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
}); });
// Automatically track and cache the currently-focused client // Automatically track and cache the currently-focused client
$scope.$watch('getFocusedClient()', function focusedClientChanged(client) { $scope.$on('guacClientFocused', function focusedClientChanged(event, newFocusedClient) {
// Apply any parameter changes when focus is changing (as var oldFocusedClient = $scope.focusedClient;
// applyParameterChanges() depends on the value of focusedClient, this $scope.focusedClient = newFocusedClient;
// must be called BEFORE updating focusedClient
$scope.applyParameterChanges();
$scope.focusedClient = client; // Apply any parameter changes when focus is changing
if (oldFocusedClient)
$scope.applyParameterChanges(oldFocusedClient);
// Update available connection parameters, if there is a focused // Update available connection parameters, if there is a focused
// client // client
$scope.menu.connectionParameters = $scope.focusedClient ? $scope.menu.connectionParameters = newFocusedClient ?
ManagedClient.getArgumentModel($scope.focusedClient) : {}; ManagedClient.getArgumentModel(newFocusedClient) : {};
}); });

View File

@@ -56,6 +56,33 @@ angular.module('client').directive('guacTiledClients', [function guacTiledClient
var ManagedClient = $injector.get('ManagedClient'); var ManagedClient = $injector.get('ManagedClient');
var ManagedClientGroup = $injector.get('ManagedClientGroup'); var ManagedClientGroup = $injector.get('ManagedClientGroup');
/**
* Returns the currently-focused ManagedClient. If there is no such
* client, or multiple clients are focused, null is returned.
*
* @returns {ManagedClient}
* The currently-focused client, or null if there are no focused
* clients or if multiple clients are focused.
*/
var getFocusedClient = function getFocusedClient() {
var managedClientGroup = $scope.clientGroup;
if (managedClientGroup) {
var focusedClients = _.filter(managedClientGroup.clients, client => client.clientProperties.focused);
if (focusedClients.length === 1)
return focusedClients[0];
}
return null;
};
// Re-initialize the reference to the currently-focused client when a
// new client group is set
$scope.$watch('clientGroup', function clientGroupChanged() {
$scope.$emit('guacClientFocused', getFocusedClient());
});
/** /**
* Returns a callback for guacClick that assigns or updates keyboard * Returns a callback for guacClick that assigns or updates keyboard
* focus to the given client, allowing that client to receive and * focus to the given client, allowing that client to receive and
@@ -110,6 +137,10 @@ angular.module('client').directive('guacTiledClients', [function guacTiledClient
} }
// Update reference to single focused client after focus has
// changed
$scope.$emit('guacClientFocused', getFocusedClient());
}; };
}; };