mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 13:41: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
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