diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js b/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js index 17603e209..892c6d244 100644 --- a/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js +++ b/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js @@ -54,6 +54,13 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj */ $scope.wrappers = null; + /** + * The filter search string to use to restrict the displayed active sessions + * + * @type String + */ + $scope.filterSearchString = null; + /** * StableSort instance which maintains the sort order of the visible * connection wrappers. @@ -67,13 +74,6 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj 'name' ]); - /** - * The root connection group of the connection group hierarchy. - * - * @type ConnectionGroup - */ - var rootGroup = null; - /** * All active connections, if known, or null if active connections have not * yet been loaded. @@ -83,11 +83,12 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj var activeConnections = null; /** - * Map of all visible connections by object identifier. + * Map of all visible connections by object identifier, or null if visible + * connections have not yet been loaded. * * @type Object. */ - var connections = {}; + var connections = null; /** * Map of all currently-selected active connection wrappers by identifier. @@ -118,7 +119,7 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj * The connection group whose descendant connections should be added to * the internal set of connections. */ - var addDescendantConnections = function addDescendantConnections(connectionGroup) { + var addDescendantConnections = function addDescendantConnections(connectionGroup) { // Add all child connections if (connectionGroup.childConnections) @@ -168,8 +169,8 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj .success(function connectionGroupReceived(retrievedRootGroup) { // Load connections from retrieved group tree - rootGroup = retrievedRootGroup; - addDescendantConnections(rootGroup); + connections = {}; + addDescendantConnections(retrievedRootGroup); // Attempt to produce wrapped list of active connections wrapActiveConnections(); @@ -351,5 +352,40 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj delete selectedWrappers[wrapper.activeConnection.identifier]; }; + + /** + * A predicate to be used for filtering the active sessions based on a plain + * text search string. A wrapper will be considered a match iff the search string + * appears (case insensitive) in the connection name, username, or remote host. + * + * @param {ActiveConnectionWrapper} wrapper + * The wrapper to match against the search string.. + * + * @returns {Boolean} + * true if the wrapper matches the specified search string, false otherwise. + */ + $scope.globalFilterPredicate = function globalFilterPredicate(wrapper) { + + // If no search term is provided, always consider it a match + if (!$scope.filterSearchString) + return true; + + // Convert to lower case for case insensitive matching + var searchString = $scope.filterSearchString.toLowerCase(); + + // Check to see if the search string matches the connection name + if (wrapper.name.toLowerCase().indexOf(searchString) !== -1) + return true; + + // Check to see if the search string matches the username + if (wrapper.activeConnection.username.toLowerCase().indexOf(searchString) !== -1) + return true; + + // Check to see if the search string matches the remote host + if (wrapper.activeConnection.remoteHost.toLowerCase().indexOf(searchString) !== -1) + return true; + + return false; + }; }]); diff --git a/guacamole/src/main/webapp/app/manage/styles/sessions.css b/guacamole/src/main/webapp/app/manage/styles/sessions.css index 30b486828..0a0fbd8e9 100644 --- a/guacamole/src/main/webapp/app/manage/styles/sessions.css +++ b/guacamole/src/main/webapp/app/manage/styles/sessions.css @@ -76,3 +76,12 @@ .manage table.session-list th.sort-primary.sort-descending:after { background-image: url('images/arrows/up.png'); } + +.manage .sessions .filter{ + background-image: url('images/magnifier.png'); + background-repeat: no-repeat; + background-size: 1.75em; + padding-left: 1.75em; + width: 100%; + max-width: none; +} diff --git a/guacamole/src/main/webapp/app/manage/templates/manageSessions.html b/guacamole/src/main/webapp/app/manage/templates/manageSessions.html index d2b29adc8..f925d6e00 100644 --- a/guacamole/src/main/webapp/app/manage/templates/manageSessions.html +++ b/guacamole/src/main/webapp/app/manage/templates/manageSessions.html @@ -35,6 +35,10 @@ THE SOFTWARE.
+ +
+ +
@@ -78,7 +82,7 @@ THE SOFTWARE.

- + \ No newline at end of file diff --git a/guacamole/src/main/webapp/images/magnifier.png b/guacamole/src/main/webapp/images/magnifier.png new file mode 100644 index 000000000..15261209e Binary files /dev/null and b/guacamole/src/main/webapp/images/magnifier.png differ diff --git a/guacamole/src/main/webapp/translations/en_US.json b/guacamole/src/main/webapp/translations/en_US.json index 7348958d9..46876aa5b 100644 --- a/guacamole/src/main/webapp/translations/en_US.json +++ b/guacamole/src/main/webapp/translations/en_US.json @@ -243,6 +243,8 @@ "DIALOG_HEADER_CONFIRM_DELETE" : "Kill Sessions", "DIALOG_HEADER_ERROR" : "Error", + "FIELD_PLACEHOLDER_FILTER" : "Filter", + "HELP_SESSIONS" : "All currently-active Guacamole sessions are listed here. If you wish to kill one or more sessions, check the box next to those sessions and click \"Kill Sessions\". Killing a session will immediately disconnect the user from the associated connection.", "INFO_NO_SESSIONS" : "No active sessions",