From ab020234c207b11e0048ed1ee098acad22c4b100 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 25 Aug 2024 00:23:21 -0700 Subject: [PATCH] GUACAMOLE-1740: Do not require multiple clicks to begin editing the clipboard. --- .../app/clipboard/directives/guacClipboard.js | 25 ++++++----- .../src/app/clipboard/styles/clipboard.css | 43 +++++++++++++++++-- .../clipboard/templates/guacClipboard.html | 14 ++++-- .../main/frontend/src/translations/ca.json | 2 +- .../main/frontend/src/translations/cs.json | 2 +- .../main/frontend/src/translations/de.json | 2 +- .../main/frontend/src/translations/en.json | 2 +- .../main/frontend/src/translations/fr.json | 2 +- .../main/frontend/src/translations/ja.json | 4 +- .../main/frontend/src/translations/zh.json | 2 +- 10 files changed, 74 insertions(+), 24 deletions(-) diff --git a/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js b/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js index 789756bd8..315b08b5f 100644 --- a/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js +++ b/guacamole/src/main/frontend/src/app/clipboard/directives/guacClipboard.js @@ -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); }; /** diff --git a/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css b/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css index 3bb602c7f..cec0c2650 100644 --- a/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css +++ b/guacamole/src/main/frontend/src/app/clipboard/styles/clipboard.css @@ -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; } diff --git a/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html b/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html index 4e1ebda8e..159ee356a 100644 --- a/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html +++ b/guacamole/src/main/frontend/src/app/clipboard/templates/guacClipboard.html @@ -1,4 +1,12 @@ -
- - +
+ +
+

{{ 'CLIENT.ACTION_SHOW_CLIPBOARD' | translate }}

+
diff --git a/guacamole/src/main/frontend/src/translations/ca.json b/guacamole/src/main/frontend/src/translations/ca.json index 658c9232f..42829cc9f 100644 --- a/guacamole/src/main/frontend/src/translations/ca.json +++ b/guacamole/src/main/frontend/src/translations/ca.json @@ -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ó.", diff --git a/guacamole/src/main/frontend/src/translations/cs.json b/guacamole/src/main/frontend/src/translations/cs.json index fd52edb64..9120cc81e 100644 --- a/guacamole/src/main/frontend/src/translations/cs.json +++ b/guacamole/src/main/frontend/src/translations/cs.json @@ -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" diff --git a/guacamole/src/main/frontend/src/translations/de.json b/guacamole/src/main/frontend/src/translations/de.json index e9bcab55d..bcffc6b13 100644 --- a/guacamole/src/main/frontend/src/translations/de.json +++ b/guacamole/src/main/frontend/src/translations/de.json @@ -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" diff --git a/guacamole/src/main/frontend/src/translations/en.json b/guacamole/src/main/frontend/src/translations/en.json index 0cd0cc9cf..5069f7b14 100644 --- a/guacamole/src/main/frontend/src/translations/en.json +++ b/guacamole/src/main/frontend/src/translations/en.json @@ -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" diff --git a/guacamole/src/main/frontend/src/translations/fr.json b/guacamole/src/main/frontend/src/translations/fr.json index f6477400d..b4deafa55 100644 --- a/guacamole/src/main/frontend/src/translations/fr.json +++ b/guacamole/src/main/frontend/src/translations/fr.json @@ -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" diff --git a/guacamole/src/main/frontend/src/translations/ja.json b/guacamole/src/main/frontend/src/translations/ja.json index 2750d38fd..45a079cc9 100644 --- a/guacamole/src/main/frontend/src/translations/ja.json +++ b/guacamole/src/main/frontend/src/translations/ja.json @@ -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}}..." }, diff --git a/guacamole/src/main/frontend/src/translations/zh.json b/guacamole/src/main/frontend/src/translations/zh.json index 76e9a2a81..b16934c64 100644 --- a/guacamole/src/main/frontend/src/translations/zh.json +++ b/guacamole/src/main/frontend/src/translations/zh.json @@ -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"