diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js b/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js index 892c6d244..aa81a16ff 100644 --- a/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js +++ b/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js @@ -29,6 +29,7 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj // Required types var ActiveConnectionWrapper = $injector.get('ActiveConnectionWrapper'); var ConnectionGroup = $injector.get('ConnectionGroup'); + var FilterPattern = $injector.get('FilterPattern'); var StableSort = $injector.get('StableSort'); // Required services @@ -61,6 +62,13 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj */ $scope.filterSearchString = null; + /** + * The pattern object to use when filtering active sessions. + * + * @type FilterPattern + */ + $scope.filterPattern = new FilterPattern(); + /** * StableSort instance which maintains the sort order of the visible * connection wrappers. @@ -353,39 +361,9 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj }; - /** - * 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; - }; + // Recompile the filter pattern when changed + $scope.$watch('filterSearchString', function recompilePredicate(searchString) { + $scope.filterPattern.compile(searchString); + }); }]); diff --git a/guacamole/src/main/webapp/app/manage/templates/manageSessions.html b/guacamole/src/main/webapp/app/manage/templates/manageSessions.html index f925d6e00..26fc52b6c 100644 --- a/guacamole/src/main/webapp/app/manage/templates/manageSessions.html +++ b/guacamole/src/main/webapp/app/manage/templates/manageSessions.html @@ -82,7 +82,8 @@ THE SOFTWARE.

- + \ No newline at end of file diff --git a/guacamole/src/main/webapp/app/manage/types/FilterPattern.js b/guacamole/src/main/webapp/app/manage/types/FilterPattern.js new file mode 100644 index 000000000..2aaeddc2e --- /dev/null +++ b/guacamole/src/main/webapp/app/manage/types/FilterPattern.js @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 Glyptodon LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * A service for defining the FilterPattern class. + */ +angular.module('manage').factory('FilterPattern', [ + function defineFilterPattern() { + + /** + * Object which handles compilation of filtering predicates as used by + * the Angular "filter" filter. Predicates are compiled from a user- + * specified search string. + * + * @constructor + */ + var FilterPattern = function FilterPattern() { + + /** + * Reference to this instance. + * + * @type FilterPattern + */ + var filterPattern = this; + + /** + * Filter predicate which simply matches everything. This function + * always returns true. + * + * @returns {Boolean} + * true. + */ + var nullPredicate = function nullPredicate() { + return true; + }; + + /** + * The current filtering predicate. + * + * @type Function + */ + this.predicate = nullPredicate; + + /** + * Compiles the given pattern string, assigning the resulting filter + * predicate. The resulting predicate will accept only objects that + * match the given pattern. + * + * @param {String} pattern + * The pattern to compile. + */ + this.compile = function compile(pattern) { + + // If no pattern provided, everything matches + if (!pattern) { + filterPattern.predicate = nullPredicate; + return; + } + + // Convert to lower case for case insensitive matching + pattern = pattern.toLowerCase(); + + // TODONT: Return predicate specific to a type of object this class should know nothing about + filterPattern.predicate = function oddlySpecificPredicate(wrapper) { + + // Check to see if the search string matches the connection name + if (wrapper.name.toLowerCase().indexOf(pattern) !== -1) + return true; + + // Check to see if the search string matches the username + if (wrapper.activeConnection.username.toLowerCase().indexOf(pattern) !== -1) + return true; + + // Check to see if the search string matches the remote host + if (wrapper.activeConnection.remoteHost.toLowerCase().indexOf(pattern) !== -1) + return true; + + return false; + }; + + }; + + }; + + return FilterPattern; + +}]); \ No newline at end of file