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) {
|
||||
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,
|
||||
* and one of the keys is being released, show the menu.
|
||||
@@ -125,7 +122,10 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams',
|
||||
keysCurrentlyPressed = {};
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Listen for broadcasted keyup events and fire the appropriate listeners
|
||||
$scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) {
|
||||
delete keysCurrentlyPressed[keysym];
|
||||
});
|
||||
|
||||
|
@@ -480,3 +480,239 @@ p.hint {
|
||||
height: 0;
|
||||
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 -->
|
||||
<tr ng-repeat="parameter in protocols[connection.protocol].parameters">
|
||||
<th>{{'protocol.' + connection.protocol + '.parameters.' + parameter.name + '.label' | translate}}:</th>
|
||||
|
||||
<td ng-show="parameter.type === 'TEXT'">
|
||||
<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>
|
||||
<guac-connection-parameter parameter="parameter" connection="connection" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -110,8 +97,9 @@ THE SOFTWARE.
|
||||
<tr ng-repeat="record in connection.history">
|
||||
<td class="username">{{record.username}}</td>
|
||||
<td class="start">{{record.startDate | date:'short'}}</td>
|
||||
<td ng-show="record.endDate" class="duration">{{record.endDate}}</td>
|
||||
<td ng-hide="record.endDate" class="duration">{{'manage.edit.connection.history.activeNow' | translate}}</td>
|
||||
<td ng-show="record.endDate && !record.active" class="duration">{{record.endDate - record.startDate}}</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>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -52,7 +52,8 @@
|
||||
"username" : "Username",
|
||||
"startTime" : "Start Time",
|
||||
"duration" : "Duration",
|
||||
"activeNow" : "Active Now"
|
||||
"activeNow" : "Active Now",
|
||||
"unknownEnd" : "--"
|
||||
}
|
||||
},
|
||||
"connectionGroup": {
|
||||
|
Reference in New Issue
Block a user