Merge patch branch changes to main.

This commit is contained in:
Virtually Nick
2024-08-25 08:36:43 -04:00
18 changed files with 123 additions and 77 deletions

View File

@@ -30,6 +30,7 @@ angular.module('clipboard').directive('guacClipboard', ['$injector',
const ClipboardData = $injector.get('ClipboardData');
// Required services
const $window = $injector.get('$window');
const clipboardService = $injector.get('clipboardService');
/**
@@ -53,24 +54,28 @@ angular.module('clipboard').directive('guacClipboard', ['$injector',
* editor via this DOM element rather than updating a model so that we
* are prepared for future support of rich text contents.
*
* @type Element
* @type {!Element}
*/
var element = $element[0].querySelectorAll('.clipboard.active')[0];
var element = $element[0].querySelectorAll('.clipboard')[0];
/**
* When isActive is set to true then the Clipboard data will be
* displayed in the Clipboard Editor. When false, the Clipboard Editor
* will not be displayed with Clipboard data.
* Whether clipboard contents should be displayed in the clipboard
* editor. If false, clipboard contents will not be displayed until
* the user manually reveals them.
*
* @type Boolean
* @type {!boolean}
*/
$scope.isActive = false;
$scope.contentsShown = false;
/**
* Updates clipboard editor to be active.
* Reveals the contents of the clipboard editor, automatically
* assigning input focus to the editor if possible.
*/
$scope.setActive = function setActive() {
$scope.isActive = true;
$scope.showContents = function showContents() {
$scope.contentsShown = true;
$window.setTimeout(function setFocus() {
element.focus();
}, 0);
};
/**

View File

@@ -58,13 +58,50 @@
overflow: hidden;
}
#clipboard-settings .clipboard.active {
.clipboard-editor {
position: relative;
}
.clipboard-editor .clipboard {
overflow: auto;
font-size: 1em;
}
#clipboard-settings .clipboard.inactive {
.clipboard-editor .clipboard.clipboard-contents-hidden {
color: transparent;
overflow: hidden;
}
.clipboard-editor .clipboard-contents-hidden-hint {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
cursor: pointer;
display: flex;
align-items: center;
}
.clipboard-editor .clipboard-contents-hidden-hint .clipboard-contents-hidden-hint-text {
flex: 1;
background: rgba(0, 0, 0, 0.125);
color: #888;
padding: 0.5em;
overflow: hidden;
font-size: 0.9em;
opacity: 0.5;
text-align: center;
font-style: italic;
}
.clipboard-editor .clipboard-contents-hidden-hint:hover .clipboard-contents-hidden-hint-text {
text-decoration: underline;
}

View File

@@ -1,4 +1,12 @@
<div>
<textarea ng-show="isActive" class="clipboard active"></textarea>
<textarea ng-show="!isActive" class="clipboard inactive" ng-focus="setActive()">{{'CLIENT.TEXT_CLIPBOARD_AWAITING_FOCUS' | translate}}</textarea>
<div class="clipboard-editor">
<textarea class="clipboard"
ng-class="{
'clipboard-contents-hidden' : !contentsShown
}"
ng-disabled="!contentsShown"></textarea>
<div class="clipboard-contents-hidden-hint"
ng-click="showContents()"
ng-show="!contentsShown">
<p class="clipboard-contents-hidden-hint-text">{{ 'CLIENT.ACTION_SHOW_CLIPBOARD' | translate }}</p>
</div>
</div>

View File

@@ -62,12 +62,14 @@ angular.module('home').controller('homeController', ['$scope', '$injector',
];
/**
* Returns true if recent connections should be displayed on the Guacamole
* home page, otherwise false.
* Returns whether the "Recent Connections" section should be displayed on
* the home screen.
*
* @returns {!boolean}
* true if recent connections should be displayed on the home screen,
* false otherwise.
*/
$scope.willShowRecentConnections = function willShowRecentConnections() {
$scope.isRecentConnectionsVisible = function isRecentConnectionsVisible() {
return preferenceService.preferences.showRecentConnections;
};

View File

@@ -74,16 +74,6 @@ angular.module('home').directive('guacRecentConnections', [function guacRecentCo
&& guacHistory.removeEntry(recentConnection.entry.id));
};
/**
* Returns whether or not recent connections should be displayed.
*
* @returns {!boolean}
* true if recent connections should be displayed, otherwise false.
*/
$scope.willShowRecentConnections = function willShowRecentConnections() {
return preferenceService.preferences.showRecentConnections;
};
/**
* Returns whether recent connections are available for display.
*

View File

@@ -77,9 +77,12 @@ a.home-connection, .empty.balancer a.home-connection-group {
display: none;
}
.header-app-name {
font-size: 0.85em;
box-shadow: none;
.recent-connections .connection .remove-recent {
visibility: hidden;
}
.recent-connections .connection:hover .remove-recent {
visibility: visible;
}
.recent-connections .connection .remove-recent::after {
@@ -90,11 +93,10 @@ a.home-connection, .empty.balancer a.home-connection-group {
background-repeat: no-repeat;
background-size: contain;
background-position: center center;
background-image: url('images/x.svg');
background-image: url('images/x-black.svg');
}
.recent-connections .connection .remove-recent {
background-color: red;
height: 1em;
width: 1em;
position: absolute;

View File

@@ -1,4 +1,4 @@
<div class="recent-connections" ng-show="willShowRecentConnections()">
<div class="recent-connections">
<!-- Text displayed if no recent connections exist -->
<p class="placeholder" ng-hide="hasRecentConnections()">{{'HOME.INFO_NO_RECENT_CONNECTIONS' | translate}}</p>

View File

@@ -2,16 +2,14 @@
<div class="connection-list-ui">
<div class="header header-app-name">
<h2 id="section-header-app-name">{{'APP.NAME' | translate}}</h2>
<!-- The recent connections for this user -->
<div class="header" ng-show="isRecentConnectionsVisible()">
<h2 id="section-header-recent-connections">{{'HOME.SECTION_HEADER_RECENT_CONNECTIONS' | translate}}</h2>
<guac-user-menu></guac-user-menu>
</div>
<!-- The recent connections for this user -->
<div class="header" ng-show="willShowRecentConnections()">
<h2 id="section-header-recent-connections">{{'HOME.SECTION_HEADER_RECENT_CONNECTIONS' | translate}}</h2>
</div>
<guac-recent-connections root-groups="rootConnectionGroups" ng-show="willShowRecentConnections()"></guac-recent-connections>
<guac-recent-connections
root-groups="rootConnectionGroups"
ng-show="isRecentConnectionsVisible()"></guac-recent-connections>
<!-- All connections for this user -->
<div class="header">
@@ -21,6 +19,7 @@
placeholder="'HOME.FIELD_PLACEHOLDER_FILTER' | translate"
connection-properties="filteredConnectionProperties"
connection-group-properties="filteredConnectionGroupProperties"></guac-group-list-filter>
<guac-user-menu></guac-user-menu>
</div>
<div class="all-connections">
<guac-group-list

View File

@@ -78,9 +78,8 @@ h2 {
margin-bottom: 0;
}
.header ~ * .header,
.header ~ .header {
margin-top: 0;
.header:not(.ng-hide) ~ * .header,
.header:not(.ng-hide) ~ .header {
border-top: 1px solid rgba(0, 0, 0, 0.125);
}
@@ -106,3 +105,7 @@ h2 {
border-left: 1px solid rgba(0, 0, 0, 0.125);
background-color: transparent;
}
.header:not(.ng-hide) ~ .header .user-menu {
display: none;
}

View File

@@ -6,6 +6,24 @@
<guac-form content="localeFields" model="preferences" namespace="'SETTINGS_PREFERENCES'"></guac-form>
</div>
<!-- Appearance -->
<h2 class="header">{{'SETTINGS_PREFERENCES.SECTION_HEADER_APPEARANCE' | translate}}</h2>
<div class="settings section appearance">
<p>{{'SETTINGS_PREFERENCES.HELP_APPEARANCE' | 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.numberOfRecentConnections" type="number" min="1" max="20"/></td>
</tr>
</table>
</div>
</div>
<!-- Password update -->
<h2 class="header" ng-show="canUpdateSelf">{{'SETTINGS_PREFERENCES.SECTION_HEADER_UPDATE_PASSWORD' | translate}}</h2>
<div class="settings section update-password" ng-show="canUpdateSelf">
@@ -89,24 +107,6 @@
</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.numberOfRecentConnections" type="number" min="1" max="20"/></td>
</tr>
</table>
</div>
</div>
<!-- User attributes section -->
<div class="attributes" ng-show="canUpdateSelf && attributes.length">
<guac-form namespace="'USER_ATTRIBUTES'" content="attributes"

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><g style="fill:#000;fill-opacity:1"><path d="M-203.492 487.824h325.537v71.505h-325.537z" style="fill:#000;stroke:none;fill-opacity:1" transform="rotate(-45 -70.224 18.065)scale(.19138)"/><path d="M-686.345 4.971h325.537v71.505h-325.537z" style="fill:#000;stroke:none;fill-opacity:1" transform="scale(-.19138 .19138)rotate(-45 -192.713 -326.21)"/></g></svg>

After

Width:  |  Height:  |  Size: 419 B

View File

@@ -59,6 +59,7 @@
"ACTION_DISCONNECT" : "Desconnecta",
"ACTION_RECONNECT" : "Torneu a connectar",
"ACTION_SHOW_CLIPBOARD" : "Feu clic per veure les dades del porta-retalls.",
"ACTION_UPLOAD_FILES" : "Carregueu fitxers",
"DIALOG_HEADER_CONNECTING" : "Connectant",
@@ -143,7 +144,6 @@
"TEXT_CLIENT_STATUS_DISCONNECTED" : "Heu estat desconnectats.",
"TEXT_CLIENT_STATUS_UNSTABLE" : "La connexió de xarxa al servidor Guacamole sembla inestable.",
"TEXT_CLIENT_STATUS_WAITING" : "Connectat a Guacamole. Esperant resposta ...",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "Feu clic per veure les dades del porta-retalls...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
"TEXT_RECONNECT_COUNTDOWN" : "Re-conectant en {REMAINING} {REMAINING, plural, one{segon} other{segons}}...",
"TEXT_USER_JOINED" : "{USERNAME} s'ha afegit a la connexió.",

View File

@@ -71,6 +71,7 @@
"ACTION_RECONNECT" : "Znovu připojit",
"ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE",
"ACTION_SHARE" : "@:APP.ACTION_SHARE",
"ACTION_SHOW_CLIPBOARD" : "Kliknutím zobrazíte obsah schránky.",
"ACTION_UPLOAD_FILES" : "Nahrát soubory",
"DIALOG_HEADER_CONNECTING" : "Připojování",
@@ -163,7 +164,6 @@
"TEXT_USER_LEFT" : "{USERNAME} opustil spojení.",
"TEXT_RECONNECT_COUNTDOWN" : "Znovu připojuji {REMAINING} {REMAINING, plural, one{sekundu} other{sekund}}...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "Kliknutím zobrazíte obsah schránky...",
"URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json"

View File

@@ -71,6 +71,7 @@
"ACTION_RECONNECT" : "Neu verbinden",
"ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE",
"ACTION_SHARE" : "@:APP.ACTION_SHARE",
"ACTION_SHOW_CLIPBOARD" : "Klicken um Zwischenablage anzuzeigen.",
"ACTION_UPLOAD_FILES" : "Dateien hochladen",
"DIALOG_HEADER_CONNECTING" : "Verbinden",
@@ -163,7 +164,6 @@
"TEXT_USER_LEFT" : "{USERNAME} hat die Verbindung verlassen.",
"TEXT_RECONNECT_COUNTDOWN" : "Neuverbindung in {REMAINING} {REMAINING, plural, one{Sekunde} other{Sekunden}}...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "Klicken um Zwischenablage anzuzeigen...",
"URL_OSK_LAYOUT" : "layouts/de-de-qwertz.json"

View File

@@ -76,6 +76,7 @@
"ACTION_RECONNECT" : "Reconnect",
"ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE",
"ACTION_SHARE" : "@:APP.ACTION_SHARE",
"ACTION_SHOW_CLIPBOARD" : "Click to view clipboard contents.",
"ACTION_UPLOAD_FILES" : "Upload Files",
"DIALOG_HEADER_CONNECTING" : "Connecting",
@@ -168,7 +169,6 @@
"TEXT_USER_LEFT" : "{USERNAME} has left the connection.",
"TEXT_RECONNECT_COUNTDOWN" : "Reconnecting in {REMAINING} {REMAINING, plural, one{second} other{seconds}}...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "Click to view clipboard data...",
"URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json"
@@ -1075,6 +1075,7 @@
"FIELD_HEADER_TIMEZONE" : "Timezone:",
"FIELD_HEADER_USERNAME" : "Username:",
"HELP_APPEARANCE" : "Here you can enable or disable whether the \"Recent Connections\" section is shown on the home screen, and adjust the number of recent connections included.",
"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.",
"HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE",
@@ -1083,7 +1084,6 @@
"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.",
@@ -1093,9 +1093,9 @@
"NAME_INPUT_METHOD_OSK" : "@:CLIENT.NAME_INPUT_METHOD_OSK",
"NAME_INPUT_METHOD_TEXT" : "@:CLIENT.NAME_INPUT_METHOD_TEXT",
"SECTION_HEADER_APPEARANCE" : "Appearance",
"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"
},

View File

@@ -64,6 +64,7 @@
"ACTION_CANCEL" : "@:APP.ACTION_CANCEL",
"ACTION_CLEAR_CLIENT_MESSAGES" : "@:APP.ACTION_CLEAR",
"ACTION_CLEAR_COMPLETED_TRANSFERS" : "@:APP.ACTION_CLEAR",
"ACTION_SHOW_CLIPBOARD" : "Cliquez pour afficher le contenu du presse-papiers.",
"ACTION_CONTINUE" : "@:APP.ACTION_CONTINUE",
"ACTION_DISCONNECT" : "Déconnecter",
"ACTION_FULLSCREEN" : "Plein écran",
@@ -165,7 +166,6 @@
"TEXT_USER_LEFT" : "{USERNAME} a quitté la connexion.",
"TEXT_RECONNECT_COUNTDOWN" : "Reconnexion dans {REMAINING} {REMAINING, plural, one{seconde} other{secondes}}...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "Cliquez pour afficher le contenu du presse-papiers...",
"URL_OSK_LAYOUT" : "layouts/fr-fr-azerty.json"
@@ -1045,6 +1045,7 @@
"FIELD_HEADER_TIMEZONE" : "Fuseau horaire:",
"FIELD_HEADER_USERNAME" : "Identifiant:",
"HELP_APPEARANCE" : "Vous pouvez ici activer ou désactiver les connexions récentes sur la page d'accueil de Guacamole, et ajuster le nombre de connexions récentes qui seront affichées.",
"HELP_DEFAULT_INPUT_METHOD" : "La méthode de saisie par défaut détermine comment les événements clavier sont reçus par Guacamole. Modifier ce paramètre peut être nécessaire lors de l'utilisation d'un appareil mobile. Ce paramètre peut être remplacé pour chaque connexion dans le menu de Guacamole.",
"HELP_DEFAULT_MOUSE_MODE" : "Le mode d'émulation de la souris par défaut détermine le comportement de la souris distante dans de nouvelles connexions par rapport aux touches. Ce paramètre peut être remplacé pour chaque connexion dans le menu Guacamole.",
"HELP_INPUT_METHOD_NONE" : "@:CLIENT.HELP_INPUT_METHOD_NONE",
@@ -1053,7 +1054,6 @@
"HELP_LOCALE" : "Les options ci-dessous sont liées à la localisation de l'utilisateur et auront un impact sur l'affichage de différentes parties de l'interface.",
"HELP_MOUSE_MODE_ABSOLUTE" : "@:CLIENT.HELP_MOUSE_MODE_ABSOLUTE",
"HELP_MOUSE_MODE_RELATIVE" : "@:CLIENT.HELP_MOUSE_MODE_RELATIVE",
"HELP_RECENT_CONNECTIONS" : "Vous pouvez ici activer ou désactiver les connexions récentes sur la page d'accueil de Guacamole, et ajuster le nombre de connexions récentes qui seront affichées.",
"HELP_UPDATE_PASSWORD" : "Si vous souhaitez changer votre mot de passe, saisissez votre mot de passe actuel ainsi que le nouveau mot de passe souhaité ci-dessous, puis cliquez sur \"Mettre à jour Mot de passe\". Le changement prendra effet immédiatement.",
"INFO_PASSWORD_CHANGED" : "Mot de passe modifié.",
@@ -1065,7 +1065,6 @@
"SECTION_HEADER_DEFAULT_INPUT_METHOD" : "Méthode de saisie par défaut",
"SECTION_HEADER_DEFAULT_MOUSE_MODE" : "Mode d'émulation de la souris par défaut",
"SECTION_HEADER_RECENT_CONNECTIONS" : "Préférences des connexions récentes",
"SECTION_HEADER_UPDATE_PASSWORD" : "Modifier Mot de passe"
},

View File

@@ -55,6 +55,7 @@
"ACTION_RECONNECT" : "再接続",
"ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE",
"ACTION_SHARE" : "@:APP.ACTION_SHARE",
"ACTION_SHOW_CLIPBOARD" : "クリックをしてコピー/カットされたテキストが表示されます。",
"ACTION_UPLOAD_FILES" : "ファイルアップロード",
"DIALOG_HEADER_CONNECTING" : "接続",
@@ -132,8 +133,7 @@
"TEXT_CLIENT_STATUS_DISCONNECTED" : "切断されました。",
"TEXT_CLIENT_STATUS_UNSTABLE" : "Guacamoleサーバへのネットワーク接続が不安定です。",
"TEXT_CLIENT_STATUS_WAITING" : "Guacamoleサーバに接続しました。応答を待っています",
"TEXT_RECONNECT_COUNTDOWN" : "再接続しています... {REMAINING} {REMAINING, plural, one{second} other{seconds}}...",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "クリックをしてコピー/カットされたテキストが表示されます..."
"TEXT_RECONNECT_COUNTDOWN" : "再接続しています... {REMAINING} {REMAINING, plural, one{second} other{seconds}}..."
},

View File

@@ -72,6 +72,7 @@
"ACTION_RECONNECT" : "重新连接",
"ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE",
"ACTION_SHARE" : "@:APP.ACTION_SHARE",
"ACTION_SHOW_CLIPBOARD" : "点击以查看剪贴板内容。",
"ACTION_UPLOAD_FILES" : "上传文件",
"DIALOG_HEADER_CONNECTING" : "正在连接",
@@ -164,7 +165,6 @@
"TEXT_USER_LEFT" : "用户 {USERNAME} 断开了连接。",
"TEXT_RECONNECT_COUNTDOWN" : "在 {REMAINING} 秒后重连...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
"TEXT_CLIPBOARD_AWAITING_FOCUS" : "点击以查看剪贴板内容...",
"URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json"