mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 21:51:23 +00:00
GUACAMOLE-723: Allow connections to be closed/removed directly from the panel.
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
angular.module('client').directive('guacClientPanel', ['$injector', function guacClientPanel($injector) {
|
angular.module('client').directive('guacClientPanel', ['$injector', function guacClientPanel($injector) {
|
||||||
|
|
||||||
// Required services
|
// Required services
|
||||||
|
var guacClientManager = $injector.get('guacClientManager');
|
||||||
var sessionStorageFactory = $injector.get('sessionStorageFactory');
|
var sessionStorageFactory = $injector.get('sessionStorageFactory');
|
||||||
|
|
||||||
// Required types
|
// Required types
|
||||||
@@ -54,7 +55,7 @@ angular.module('client').directive('guacClientPanel', ['$injector', function gua
|
|||||||
* @type ManagedClient[]|Object.<String, ManagedClient>
|
* @type ManagedClient[]|Object.<String, ManagedClient>
|
||||||
*/
|
*/
|
||||||
clients : '='
|
clients : '='
|
||||||
|
|
||||||
},
|
},
|
||||||
templateUrl: 'app/client/templates/guacClientPanel.html',
|
templateUrl: 'app/client/templates/guacClientPanel.html',
|
||||||
controller: ['$scope', '$element', function guacClientPanelController($scope, $element) {
|
controller: ['$scope', '$element', function guacClientPanelController($scope, $element) {
|
||||||
@@ -82,26 +83,28 @@ angular.module('client').directive('guacClientPanel', ['$injector', function gua
|
|||||||
* false otherwise.
|
* false otherwise.
|
||||||
*/
|
*/
|
||||||
$scope.hasClients = function hasClients() {
|
$scope.hasClients = function hasClients() {
|
||||||
return !_.isEmpty($scope.clients);
|
return !!_.find($scope.clients, $scope.isManaged);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the given client has disconnected due to an
|
* Returns whether the status of the given client has changed in a
|
||||||
* error.
|
* way that requires the user's attention. This may be due to an
|
||||||
|
* error, or due to a server-initiated disconnect.
|
||||||
*
|
*
|
||||||
* @param {ManagedClient} client
|
* @param {ManagedClient} client
|
||||||
* The client to test.
|
* The client to test.
|
||||||
*
|
*
|
||||||
* @returns {Boolean}
|
* @returns {Boolean}
|
||||||
* true if the given client has disconnected due to an error,
|
* true if the given client requires the user's attention,
|
||||||
* false otherwise.
|
* false otherwise.
|
||||||
*/
|
*/
|
||||||
$scope.hasError = function hasError(client) {
|
$scope.hasStatusUpdate = function hasStatusUpdate(client) {
|
||||||
|
|
||||||
// Test whether the client has encountered an error
|
// Test whether the client has encountered an error
|
||||||
switch (client.clientState.connectionState) {
|
switch (client.clientState.connectionState) {
|
||||||
case ManagedClientState.ConnectionState.CONNECTION_ERROR:
|
case ManagedClientState.ConnectionState.CONNECTION_ERROR:
|
||||||
case ManagedClientState.ConnectionState.TUNNEL_ERROR:
|
case ManagedClientState.ConnectionState.TUNNEL_ERROR:
|
||||||
|
case ManagedClientState.ConnectionState.DISCONNECTED:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,6 +112,36 @@ angular.module('client').directive('guacClientPanel', ['$injector', function gua
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the given client is currently being managed by
|
||||||
|
* the guacClientManager service.
|
||||||
|
*
|
||||||
|
* @param {ManagedClient} client
|
||||||
|
* The client to test.
|
||||||
|
*
|
||||||
|
* @returns {Boolean}
|
||||||
|
* true if the given client is being managed by the
|
||||||
|
* guacClientManager service, false otherwise.
|
||||||
|
*/
|
||||||
|
$scope.isManaged = function isManaged(client) {
|
||||||
|
return !!guacClientManager.getManagedClients()[client.id];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initiates an orderly disconnect of the given client. The client
|
||||||
|
* is removed from management such that attempting to connect to
|
||||||
|
* the same connection will result in a new connection being
|
||||||
|
* established, rather than displaying a notification that the
|
||||||
|
* connection has ended.
|
||||||
|
*
|
||||||
|
* @param {type} client
|
||||||
|
* @returns {undefined}
|
||||||
|
*/
|
||||||
|
$scope.disconnect = function disconnect(client) {
|
||||||
|
client.client.disconnect();
|
||||||
|
guacClientManager.removeManagedClient(client.id);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggles whether the client panel is currently hidden.
|
* Toggles whether the client panel is currently hidden.
|
||||||
*/
|
*/
|
||||||
|
@@ -100,7 +100,7 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#other-connections .client-panel-connection::before {
|
#other-connections .client-panel-connection a[href]::before {
|
||||||
|
|
||||||
display: block;
|
display: block;
|
||||||
content: ' ';
|
content: ' ';
|
||||||
@@ -110,21 +110,58 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
background: url('images/warning-white.png');
|
background: url('images/warning-white.png');
|
||||||
background-size: 48px;
|
background-size: 48px;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
background-color: black;
|
||||||
|
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.25s;
|
transition: opacity 0.25s;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#other-connections .client-panel-connection.error::before {
|
#other-connections .client-panel-connection.needs-attention a[href]::before {
|
||||||
opacity: 0.75;
|
opacity: 0.75;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#other-connections button.close-other-connection {
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
|
margin: 0;
|
||||||
|
padding: 4px;
|
||||||
|
min-width: 0;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none;
|
||||||
|
|
||||||
|
opacity: 0.5;
|
||||||
|
line-height: 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#other-connections button.close-other-connection:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#other-connections button.close-other-connection img {
|
||||||
|
background: #A43;
|
||||||
|
border-radius: 18px;
|
||||||
|
max-width: 18px;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#other-connections button.close-other-connection:hover img {
|
||||||
|
background: #C54;
|
||||||
|
}
|
||||||
|
|
||||||
#other-connections .client-panel.hidden .client-panel-connection-list {
|
#other-connections .client-panel.hidden .client-panel-connection-list {
|
||||||
/* Hide scrollbar when panel is hidden (will be visible through panel
|
/* Hide scrollbar when panel is hidden (will be visible through panel
|
||||||
* show/hide button otherwise) */
|
* show/hide button otherwise) */
|
||||||
@@ -144,6 +181,7 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: white;
|
color: white;
|
||||||
|
@@ -7,13 +7,25 @@
|
|||||||
<!-- List of connection thumbnails -->
|
<!-- List of connection thumbnails -->
|
||||||
<ul class="client-panel-connection-list">
|
<ul class="client-panel-connection-list">
|
||||||
<li ng-repeat="client in clients | toArray | orderBy: [ '-value.lastUsed', 'value.title' ]"
|
<li ng-repeat="client in clients | toArray | orderBy: [ '-value.lastUsed', 'value.title' ]"
|
||||||
ng-class="{ 'error' : hasError(client.value) }" class="client-panel-connection">
|
ng-class="{ 'needs-attention' : hasStatusUpdate(client.value) }"
|
||||||
|
ng-show="isManaged(client.value)"
|
||||||
|
class="client-panel-connection">
|
||||||
|
|
||||||
|
<!-- Close connection -->
|
||||||
|
<button class="close-other-connection" ng-click="disconnect(client.value)">
|
||||||
|
<img ng-attr-alt="{{ 'CLIENT.ACTION_DISCONNECT' | translate }}"
|
||||||
|
ng-attr-title="{{ 'CLIENT.ACTION_DISCONNECT' | translate }}"
|
||||||
|
src="images/x.png">
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<!-- Thumbnail -->
|
||||||
<a href="#/client/{{client.value.id}}">
|
<a href="#/client/{{client.value.id}}">
|
||||||
<div class="thumbnail">
|
<div class="thumbnail">
|
||||||
<guac-thumbnail client="client.value"></guac-thumbnail>
|
<guac-thumbnail client="client.value"></guac-thumbnail>
|
||||||
</div>
|
</div>
|
||||||
<div class="name">{{ client.value.title }}</div>
|
<div class="name">{{ client.value.title }}</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user