Skip to content

Commit

Permalink
GUACAMOLE-1866: Add capability for users to configure recent connecti…
Browse files Browse the repository at this point in the history
…ons.
  • Loading branch information
necouchman committed Oct 13, 2023
1 parent d1faaa9 commit a5c673b
Show file tree
Hide file tree
Showing 11 changed files with 77 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ angular.module('history').factory('guacHistory', ['$injector',

// Required services
var localStorageService = $injector.get('localStorageService');
var preferenceService = $injector.get('preferenceService');

var service = {};

Expand All @@ -38,7 +39,7 @@ angular.module('history').factory('guacHistory', ['$injector',
* The number of entries to allow before removing old entries based on the
* cutoff.
*/
var IDEAL_LENGTH = 6;
var IDEAL_LENGTH = preferenceService.preferences.numberOfRecentConnections || 6;

/**
* The top few recent connections, sorted in order of most recent access.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ angular.module('home').controller('homeController', ['$scope', '$injector',
var authenticationService = $injector.get('authenticationService');
var connectionGroupService = $injector.get('connectionGroupService');
var dataSourceService = $injector.get('dataSourceService');
var preferenceService = $injector.get('preferenceService');
var requestService = $injector.get('requestService');

/**
Expand Down Expand Up @@ -59,6 +60,10 @@ angular.module('home').controller('homeController', ['$scope', '$injector',
$scope.filteredConnectionGroupProperties = [
'name'
];

$scope.showRecentConnections = function() {
return preferenceService.preferences.showRecentConnections;
};

/**
* Returns whether critical data has completed being loaded.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,24 @@ angular.module('home').directive('guacRecentConnections', [function guacRecentCo

// Required services
var guacHistory = $injector.get('guacHistory');
var preferenceService = $injector.get('preferenceService');

/**
* Array of all known and visible recently-used connections.
*
* @type RecentConnection[]
*/
$scope.recentConnections = [];

/**
* Returns whether or not recent connections should be displayed.
*
* @returns {Boolean}
* true if recent connections should be displayed, otherwise false.
*/
$scope.showRecentConnections = function showRecentConnections() {
return preferenceService.preferences.showRecentConnections;
};

/**
* Returns whether recent connections are available for display.
Expand Down
5 changes: 5 additions & 0 deletions guacamole/src/main/frontend/src/app/home/styles/home.css
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,8 @@ a.home-connection, .empty.balancer a.home-connection-group {
.all-connections .connection-group.empty.balancer > .caption .icon.expand {
display: none;
}

.header-app-name {
font-size: 0.85em;
box-shadow: none;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<div class="recent-connections">
<div class="recent-connections" ng-show="showRecentConnections()">

<!-- Text displayed if no recent connections exist -->
<p class="placeholder" ng-hide="hasRecentConnections()">{{'HOME.INFO_NO_RECENT_CONNECTIONS' | translate}}</p>
Expand Down
10 changes: 7 additions & 3 deletions guacamole/src/main/frontend/src/app/home/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

<div class="connection-list-ui">

<div class="header header-app-name">
<h2 id="section-header-app-name">{{'APP.NAME' | translate}}</h2>
<guac-user-menu></guac-user-menu>
</div>

<!-- The recent connections for this user -->
<div class="header">
<div class="header" ng-show="showRecentConnections()">
<h2 id="section-header-recent-connections">{{'HOME.SECTION_HEADER_RECENT_CONNECTIONS' | translate}}</h2>
<guac-user-menu></guac-user-menu>
</div>
<guac-recent-connections root-groups="rootConnectionGroups"></guac-recent-connections>
<guac-recent-connections root-groups="rootConnectionGroups" ng-show="showRecentConnections()"></guac-recent-connections>

<!-- All connections for this user -->
<div class="header">
Expand Down
4 changes: 2 additions & 2 deletions guacamole/src/main/frontend/src/app/index/styles/headers.css
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ h2 {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.125);
background: rgba(0, 0, 0, 0.04);

margin-bottom: 1em;
margin-bottom: 0;
margin-top: 0;
border-top: none;
width: 100%;
Expand Down Expand Up @@ -80,7 +80,7 @@ h2 {

.header ~ * .header,
.header ~ .header {
margin-top: 1em;
margin-top: 0;
border-top: 1px solid rgba(0, 0, 0, 0.125);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ angular.module('settings').directive('guacSettingsPreferences', [function guacSe
// Fetch the user record
userService.getUser(dataSource, username).then(function saveUserData(user) {
$scope.user = user;
})
});

// Fetch all user preference attribute forms defined
schemaService.getUserPreferenceAttributes(dataSource).then(function saveAttributes(attributes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,20 @@ angular.module('settings').provider('preferenceService', ['$injector',
*/
language : getDefaultLanguageKey(),

/**
* The number of recent connections to display.
*
* @type Integer
*/
numberOfRecentConnections: 6,

/**
* Whether or not to show the "Recent Connections" section.
*
* @type Boolean
*/
showRecentConnections : true,

/**
* The timezone set by the user, in IANA zone key format (Olson time
* zone database).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,24 @@ <h2 class="header">{{'SETTINGS_PREFERENCES.SECTION_HEADER_DEFAULT_MOUSE_MODE' |

</div>
</div>

<!-- Recent connections -->
<h2 class="header">{{'SETTINGS_PREFERENCES.SECTION_HEADER_RECENT_CONNECTIONS' | translate}}</h2>
<div class="settings section recent">
<p>{{'SETTINGS_PREFERENCES.HELP_RECENT_CONNECTIONS' | translate}}</p>
<div class='form'>
<table class='fields'>
<tr>
<th>{{'SETTINGS_PREFERENCES.FIELD_HEADER_SHOW_RECENT_CONNECTIONS' | translate}}</th>
<td><input ng-model="preferences.showRecentConnections" type="checkbox"/></td>
</tr>
<tr>
<th>{{'SETTINGS_PREFERENCES.FIELD_HEADER_NUMBER_RECENT_CONNECTIONS' | translate}}</th>
<td><input ng-model="preferences.numberRecentConnections" type="number" min="1" max="20"/></td>
</tr>
</table>
</div>
</div>

<!-- User attributes section -->
<div class="attributes" ng-show="canUpdateSelf && attributes.length">
Expand Down
18 changes: 11 additions & 7 deletions guacamole/src/main/frontend/src/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1021,13 +1021,15 @@
"ERROR_PASSWORD_BLANK" : "@:APP.ERROR_PASSWORD_BLANK",
"ERROR_PASSWORD_MISMATCH" : "@:APP.ERROR_PASSWORD_MISMATCH",

"FIELD_HEADER_LANGUAGE" : "Display language:",
"FIELD_HEADER_PASSWORD" : "Password:",
"FIELD_HEADER_PASSWORD_OLD" : "Current Password:",
"FIELD_HEADER_PASSWORD_NEW" : "New Password:",
"FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirm New Password:",
"FIELD_HEADER_TIMEZONE" : "Timezone:",
"FIELD_HEADER_USERNAME" : "Username:",
"FIELD_HEADER_LANGUAGE" : "Display language:",
"FIELD_HEADER_NUMBER_RECENT_CONNECTIONS" : "Number of Recent Connections to show:",
"FIELD_HEADER_PASSWORD" : "Password:",
"FIELD_HEADER_PASSWORD_OLD" : "Current Password:",
"FIELD_HEADER_PASSWORD_NEW" : "New Password:",
"FIELD_HEADER_PASSWORD_NEW_AGAIN" : "Confirm New Password:",
"FIELD_HEADER_SHOW_RECENT_CONNECTIONS" : "Display Recent Connections:",
"FIELD_HEADER_TIMEZONE" : "Timezone:",
"FIELD_HEADER_USERNAME" : "Username:",

"HELP_DEFAULT_INPUT_METHOD" : "The default input method determines how keyboard events are received by Guacamole. Changing this setting may be necessary when using a mobile device, or when typing through an IME. This setting can be overridden on a per-connection basis within the Guacamole menu.",
"HELP_DEFAULT_MOUSE_MODE" : "The default mouse emulation mode determines how the remote mouse will behave in new connections with respect to touches. This setting can be overridden on a per-connection basis within the Guacamole menu.",
Expand All @@ -1037,6 +1039,7 @@
"HELP_LOCALE" : "Options below are related to the locale of the user and will impact how various parts of the interface are displayed.",
"HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE",
"HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE",
"HELP_RECENT_CONNECTIONS" : "Here you can enable or disable recent conections in the Guacamole Home Page, and adjust the number of recent connections that will be displayed.",
"HELP_UPDATE_PASSWORD" : "If you wish to change your password, enter your current password and the desired new password below, and click \"Update Password\". The change will take effect immediately.",

"INFO_PASSWORD_CHANGED" : "Password changed.",
Expand All @@ -1048,6 +1051,7 @@

"SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Default Input Method",
"SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Default Mouse Emulation Mode",
"SECTION_HEADER_RECENT_CONNECTIONS" : "Recent Connections Preferences",
"SECTION_HEADER_UPDATE_PASSWORD" : "Change Password"

},
Expand Down

0 comments on commit a5c673b

Please sign in to comment.