mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 09:03:21 +00:00 
			
		
		
		
	GUAC-807: Fixed connection parameter editing and made menu show on keydown instead of keyup.
This commit is contained in:
		
				
					committed by
					
						 Michael Jumper
						Michael Jumper
					
				
			
			
				
	
			
			
			
						parent
						
							1b121ba665
						
					
				
				
					commit
					72c82aea8b
				
			| @@ -96,10 +96,7 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams', | |||||||
|      |      | ||||||
|     $scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) { |     $scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) { | ||||||
|         keysCurrentlyPressed[keysym] = true;    |         keysCurrentlyPressed[keysym] = true;    | ||||||
|     }); |  | ||||||
|          |          | ||||||
|     // Listen for broadcasted keyup events and fire the appropriate listeners |  | ||||||
|     $scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) { |  | ||||||
|         /*  |         /*  | ||||||
|          * If only menu keys are pressed, and we have one keysym from each group, |          * If only menu keys are pressed, and we have one keysym from each group, | ||||||
|          * and one of the keys is being released, show the menu.  |          * and one of the keys is being released, show the menu.  | ||||||
| @@ -125,7 +122,10 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams', | |||||||
|                 keysCurrentlyPressed = {}; |                 keysCurrentlyPressed = {}; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     // Listen for broadcasted keyup events and fire the appropriate listeners | ||||||
|  |     $scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) { | ||||||
|         delete keysCurrentlyPressed[keysym]; |         delete keysCurrentlyPressed[keysym]; | ||||||
|     }); |     }); | ||||||
|      |      | ||||||
|   | |||||||
| @@ -480,3 +480,239 @@ p.hint { | |||||||
|     height: 0; |     height: 0; | ||||||
|     overflow: hidden; |     overflow: hidden; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* Menu */ | ||||||
|  |  | ||||||
|  | #menu { | ||||||
|  |     overflow: auto; | ||||||
|  |     position: fixed; | ||||||
|  |     top: 0; | ||||||
|  |     bottom: 0; | ||||||
|  |     max-width: 100%; | ||||||
|  |     width: 480px; | ||||||
|  |     background: #EEE; | ||||||
|  |     box-shadow: inset -1px 0 2px white, 1px 0 2px black; | ||||||
|  |     z-index: 10; | ||||||
|  |     -webkit-transition: left 0.125s, opacity 0.125s; | ||||||
|  |     -moz-transition: left 0.125s, opacity 0.125s; | ||||||
|  |     -ms-transition: left 0.125s, opacity 0.125s; | ||||||
|  |     -o-transition: left 0.125s, opacity 0.125s; | ||||||
|  |     transition: left 0.125s, opacity 0.125s; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #menu .content { | ||||||
|  |     padding: 1em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #menu .content > * { | ||||||
|  |     margin: 1em 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #menu, #menu.closed { | ||||||
|  |     left: -480px; | ||||||
|  |     opacity: 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #menu.open { | ||||||
|  |     left: 0px; | ||||||
|  |     opacity: 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #clipboard-settings textarea { | ||||||
|  |     width: 100%; | ||||||
|  |     border: 1px solid #AAA; | ||||||
|  |     -moz-border-radius: 0.25em; | ||||||
|  |     -webkit-border-radius: 0.25em; | ||||||
|  |     -khtml-border-radius: 0.25em; | ||||||
|  |     border-radius: 0.25em; | ||||||
|  |     white-space: pre; | ||||||
|  |     display: block; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #mouse-settings .choice { | ||||||
|  |     text-align: center; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #mouse-settings .choice .figure { | ||||||
|  |     display: inline-block; | ||||||
|  |     vertical-align: middle; | ||||||
|  |     max-width: 80%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #keyboard-settings .caption { | ||||||
|  |     font-size: 0.9em; | ||||||
|  |     margin-left: 2em; | ||||||
|  |     margin-right: 2em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #mouse-settings .figure .caption { | ||||||
|  |     text-align: center; | ||||||
|  |     font-size: 0.9em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #mouse-settings .figure img { | ||||||
|  |     display: block; | ||||||
|  |     max-width: 100%; | ||||||
|  |     margin: 1em auto; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #menu h3 { | ||||||
|  |  | ||||||
|  |     background: rgba(0, 0, 0, 0.4); | ||||||
|  |  | ||||||
|  |     padding: 0.25em 0.5em; | ||||||
|  |     margin: 0; | ||||||
|  |     font-size: 1em; | ||||||
|  |  | ||||||
|  |     color: white; | ||||||
|  |     font-weight: bold; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #keyboard-settings .figure { | ||||||
|  |     float: right; | ||||||
|  |     max-width: 30%; | ||||||
|  |     margin: 1em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #keyboard-settings .figure img { | ||||||
|  |     max-width: 100%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-settings { | ||||||
|  |     text-align: center; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-out, #zoom-in, #zoom-state { | ||||||
|  |     display: inline-block; | ||||||
|  |     vertical-align: middle; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-out, #zoom-in { | ||||||
|  |     max-width: 3em; | ||||||
|  |     border: 1px solid rgba(0, 0, 0, 0.5); | ||||||
|  |     background: rgba(0, 0, 0, 0.1); | ||||||
|  |     border-radius: 2em; | ||||||
|  |     margin: 0.5em; | ||||||
|  |     cursor: pointer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-out img, #zoom-in img { | ||||||
|  |     max-width: 100%; | ||||||
|  |     opacity: 0.5; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-out:hover, #zoom-in:hover { | ||||||
|  |     border: 1px solid rgba(0, 0, 0, 1); | ||||||
|  |     background: #CDA; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-out:hover img, #zoom-in:hover img { | ||||||
|  |     opacity: 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #zoom-state { | ||||||
|  |     font-size: 2em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input { | ||||||
|  |     display: none; | ||||||
|  |     position: absolute; | ||||||
|  |  | ||||||
|  |     border-top: 1px solid rgba(0, 0, 0, 0.5); | ||||||
|  |     background: #CDA; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input-field, | ||||||
|  | #text-input-buttons { | ||||||
|  |     display: inline-block; | ||||||
|  |     vertical-align: middle; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input-field { | ||||||
|  |     width: 30%; | ||||||
|  |     overflow: hidden; | ||||||
|  |     white-space: nowrap; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input-buttons { | ||||||
|  |     width: 70%; | ||||||
|  |     text-align: right; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #target { | ||||||
|  |  | ||||||
|  |     border: none; | ||||||
|  |     border-radius: 0; | ||||||
|  |  | ||||||
|  |     display: inline-block; | ||||||
|  |     vertical-align: middle; | ||||||
|  |     font-size: 12pt; | ||||||
|  |     width: 100%; | ||||||
|  |     height: auto; | ||||||
|  |     resize: none; | ||||||
|  |     outline: none; | ||||||
|  |  | ||||||
|  |     margin: 0; | ||||||
|  |     padding: 0.25em; | ||||||
|  |     padding-left: 0; | ||||||
|  |     background: #CDA; | ||||||
|  |     overflow: hidden; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input.open { | ||||||
|  |     display: block; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #sent-history { | ||||||
|  |     display: inline-block; | ||||||
|  |     vertical-align: middle; | ||||||
|  |     padding: 0.25em; | ||||||
|  |     padding-right: 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #sent-history .sent-text { | ||||||
|  |     display: inline-block; | ||||||
|  |     vertical-align: baseline; | ||||||
|  |     white-space: pre; | ||||||
|  |     font-size: 12pt; | ||||||
|  |  | ||||||
|  |     animation: fadeout 1s linear; | ||||||
|  |     -webkit-animation: fadeout 1s linear; | ||||||
|  |     opacity: 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input-buttons button { | ||||||
|  |     border: 1px solid rgba(0, 0, 0, 0.5); | ||||||
|  |     background: none; | ||||||
|  |     color: black; | ||||||
|  |     box-shadow: none; | ||||||
|  |     text-shadow: none; | ||||||
|  |     padding: 0.25em; | ||||||
|  |     max-width: 20%; | ||||||
|  |     margin: 0.1em; | ||||||
|  |     min-width: 3em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #text-input-buttons button:active, | ||||||
|  | #text-input-buttons button.pressed { | ||||||
|  |     border: 1px solid rgba(255, 255, 255, 0.5); | ||||||
|  |     background: rgba(0, 0, 0, 0.75); | ||||||
|  |     color: white; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .notification.message { | ||||||
|  |     background: #DFD; | ||||||
|  |     animation: fadein 0.125s linear, fadeout 2s 3s linear; | ||||||
|  |     -webkit-animation: fadein 0.125s linear, fadeout 2s 3s linear; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .notification.message .caption { | ||||||
|  |     vertical-align: middle; | ||||||
|  |     white-space: normal; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow: ellipsis; | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,55 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2014 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 directive that allows editing of a connection parameter. | ||||||
|  |  */ | ||||||
|  | angular.module('manage').directive('guacConnectionParameter', [function locationChooser() { | ||||||
|  |      | ||||||
|  |     return { | ||||||
|  |         // Element only | ||||||
|  |         restrict: 'E', | ||||||
|  |         replace: true, | ||||||
|  |         scope: { | ||||||
|  |             parameter: '=parameter', | ||||||
|  |             connection: '=connection', | ||||||
|  |         }, | ||||||
|  |         templateUrl: 'app/manage/templates/connectionParameter.html', | ||||||
|  |         controller: ['$scope', function connectionParameterController($scope) { | ||||||
|  |             $scope.connectionParameters    = $scope.connection.parameters; | ||||||
|  |             $scope.parameterType           = $scope.parameter.type; | ||||||
|  |             $scope.parameterName           = $scope.parameter.name; | ||||||
|  |                  | ||||||
|  |             // Coerce numeric strings to numbers | ||||||
|  |             if($scope.parameterType === 'NUMERIC') { | ||||||
|  |                 $scope.connectionParameters[$scope.parameterName] =  | ||||||
|  |                         Number($scope.connectionParameters[$scope.parameterName]) || 0; | ||||||
|  |             // Coerce boolean strings to boolean values | ||||||
|  |             } else if($scope.parameterType === 'BOOLEAN') { | ||||||
|  |                 $scope.connectionParameters[$scope.parameterName] =  | ||||||
|  |                         $scope.connectionParameters[$scope.parameterName] === 'true'; | ||||||
|  |             } | ||||||
|  |         }] | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  | }]); | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | <span class="connectionParameter"> | ||||||
|  |     <!-- | ||||||
|  |         Copyright 2014 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. | ||||||
|  |     --> | ||||||
|  |     <input ng-show="parameterType === 'TEXT'" type="text" ng-model="connectionParameters[parameterName]"/> | ||||||
|  |     <input ng-show="parameterType === 'NUMERIC'" type="number" ng-model="connectionParameters[parameterName]"/> | ||||||
|  |     <input ng-show="parameterType === 'PASSWORD'" type="password" ng-model="connectionParameters[parameterName]"/> | ||||||
|  |     <input ng-show="parameterType === 'BOOLEAN'" type="checkbox" ng-model="connectionParameters[parameterName]"/> | ||||||
|  |     <select ng-show="parameterType === 'ENUM'" ng-model="connectionParameters[parameterName]" ng-options="option.value as 'protocol.' + connection.protocol + '.parameters.' + parameter.name + '.options.' + (option.value || 'empty') | translate for option in parameter.options | orderBy: value"></select> | ||||||
|  | </span> | ||||||
| @@ -71,21 +71,8 @@ THE SOFTWARE. | |||||||
|                 <!-- All the different possible editable field types --> |                 <!-- All the different possible editable field types --> | ||||||
|                 <tr ng-repeat="parameter in protocols[connection.protocol].parameters"> |                 <tr ng-repeat="parameter in protocols[connection.protocol].parameters"> | ||||||
|                   <th>{{'protocol.' + connection.protocol + '.parameters.' + parameter.name + '.label' | translate}}:</th> |                   <th>{{'protocol.' + connection.protocol + '.parameters.' + parameter.name + '.label' | translate}}:</th> | ||||||
|  |                   <td> | ||||||
|                   <td ng-show="parameter.type === 'TEXT'"> |                       <guac-connection-parameter parameter="parameter" connection="connection" /> | ||||||
|                       <input type="text" ng-model="connection.parameters[parameter.name]"/> |  | ||||||
|                   </td> |  | ||||||
|                   <td ng-show="parameter.type === 'NUMERIC'"> |  | ||||||
|                       <input type="number" ng-model="connection.parameters[parameter.name]"/> |  | ||||||
|                   </td> |  | ||||||
|                   <td ng-show="parameter.type === 'PASSWORD'"> |  | ||||||
|                       <input type="password" ng-model="connection.parameters[parameter.name]"/> |  | ||||||
|                   </td> |  | ||||||
|                   <td ng-show="parameter.type === 'BOOLEAN'"> |  | ||||||
|                       <input type="checkbox" ng-model="connection.parameters[parameter.name]"/> |  | ||||||
|                   </td> |  | ||||||
|                   <td ng-show="parameter.type === 'ENUM'"> |  | ||||||
|                       <select ng-model="connection.parameters[parameter.name]" ng-options="option.value as 'protocol.' + connection.protocol + '.parameters.' + parameter.name + '.options.' + (option.value || 'empty') | translate for option in parameter.options | orderBy: value"></select> |  | ||||||
|                   </td> |                   </td> | ||||||
|                 </tr> |                 </tr> | ||||||
|               </table> |               </table> | ||||||
| @@ -110,8 +97,9 @@ THE SOFTWARE. | |||||||
|                         <tr ng-repeat="record in connection.history"> |                         <tr ng-repeat="record in connection.history"> | ||||||
|                             <td class="username">{{record.username}}</td> |                             <td class="username">{{record.username}}</td> | ||||||
|                             <td class="start">{{record.startDate | date:'short'}}</td> |                             <td class="start">{{record.startDate | date:'short'}}</td> | ||||||
|                             <td ng-show="record.endDate" class="duration">{{record.endDate}}</td> |                             <td ng-show="record.endDate && !record.active" class="duration">{{record.endDate - record.startDate}}</td> | ||||||
|                             <td ng-hide="record.endDate" class="duration">{{'manage.edit.connection.history.activeNow' | translate}}</td> |                             <td ng-show="!record.endDate && !record.active" class="duration">{{'manage.edit.connection.history.unknownEnd' | translate}}</td> | ||||||
|  |                             <td ng-show="record.active" class="duration">{{'manage.edit.connection.history.activeNow' | translate}}</td> | ||||||
|                         </tr> |                         </tr> | ||||||
|                     </tbody> |                     </tbody> | ||||||
|                 </table> |                 </table> | ||||||
|   | |||||||
| @@ -52,7 +52,8 @@ | |||||||
|                     "username"          : "Username", |                     "username"          : "Username", | ||||||
|                     "startTime"         : "Start Time", |                     "startTime"         : "Start Time", | ||||||
|                     "duration"          : "Duration", |                     "duration"          : "Duration", | ||||||
|                     "activeNow"         : "Active Now" |                     "activeNow"         : "Active Now", | ||||||
|  |                     "unknownEnd"        : "--" | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             "connectionGroup": { |             "connectionGroup": { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user