diff --git a/guacamole/src/main/webapp/app/client/controllers/clientController.js b/guacamole/src/main/webapp/app/client/controllers/clientController.js index d90c56c5c..1d386d8dd 100644 --- a/guacamole/src/main/webapp/app/client/controllers/clientController.js +++ b/guacamole/src/main/webapp/app/client/controllers/clientController.js @@ -95,11 +95,8 @@ 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) { + keysCurrentlyPressed[keysym] = true; + /* * 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]; }); diff --git a/guacamole/src/main/webapp/app/client/styles/client.css b/guacamole/src/main/webapp/app/client/styles/client.css index 2ae327d24..e45a41133 100644 --- a/guacamole/src/main/webapp/app/client/styles/client.css +++ b/guacamole/src/main/webapp/app/client/styles/client.css @@ -479,4 +479,240 @@ p.hint { width: 0; height: 0; overflow: hidden; -} \ No newline at end of file +} + +/* 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; +} + diff --git a/guacamole/src/main/webapp/app/manage/directives/connectionParameter.js b/guacamole/src/main/webapp/app/manage/directives/connectionParameter.js new file mode 100644 index 000000000..fcbd64cc1 --- /dev/null +++ b/guacamole/src/main/webapp/app/manage/directives/connectionParameter.js @@ -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'; + } + }] + }; + +}]); \ No newline at end of file diff --git a/guacamole/src/main/webapp/app/manage/templates/connectionParameter.html b/guacamole/src/main/webapp/app/manage/templates/connectionParameter.html new file mode 100644 index 000000000..aeffce6cb --- /dev/null +++ b/guacamole/src/main/webapp/app/manage/templates/connectionParameter.html @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/guacamole/src/main/webapp/app/manage/templates/editableConnection.html b/guacamole/src/main/webapp/app/manage/templates/editableConnection.html index b89e437a4..4a3755faa 100644 --- a/guacamole/src/main/webapp/app/manage/templates/editableConnection.html +++ b/guacamole/src/main/webapp/app/manage/templates/editableConnection.html @@ -71,21 +71,8 @@ THE SOFTWARE.