mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	GUACAMOLE-1904: Merge enhancements to available events/hooks related to client args and menu.
This commit is contained in:
		| @@ -468,8 +468,21 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams | |||||||
|         else if (menuShownPreviousState) |         else if (menuShownPreviousState) | ||||||
|             $scope.applyParameterChanges($scope.focusedClient); |             $scope.applyParameterChanges($scope.focusedClient); | ||||||
|  |  | ||||||
|  |         /* Broadcast changes to the menu display state */ | ||||||
|  |         $scope.$broadcast('guacMenuShown', menuShown); | ||||||
|  |  | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     // Toggle the menu when the guacClientToggleMenu event is received | ||||||
|  |     $scope.$on('guacToggleMenu', | ||||||
|  |             () => $scope.menu.shown = !$scope.menu.shown); | ||||||
|  |  | ||||||
|  |     // Show the menu when the guacClientShowMenu event is received | ||||||
|  |     $scope.$on('guacShowMenu', () => $scope.menu.shown = true); | ||||||
|  |  | ||||||
|  |     // Hide the menu when the guacClientHideMenu event is received | ||||||
|  |     $scope.$on('guacHideMenu', () => $scope.menu.shown = false); | ||||||
|  |  | ||||||
|     // Automatically track and cache the currently-focused client |     // Automatically track and cache the currently-focused client | ||||||
|     $scope.$on('guacClientFocused', function focusedClientChanged(event, newFocusedClient) { |     $scope.$on('guacClientFocused', function focusedClientChanged(event, newFocusedClient) { | ||||||
|  |  | ||||||
| @@ -489,10 +502,9 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams | |||||||
|  |  | ||||||
|     // Automatically update connection parameters that have been modified |     // Automatically update connection parameters that have been modified | ||||||
|     // for the current focused client |     // for the current focused client | ||||||
|     $scope.$on('guacClientArgumentsUpdated', function focusedClientChanged(event, focusedClient) { |     $scope.$on('guacClientArgumentsUpdated', function argumentsChanged(event, focusedClient) { | ||||||
|  |  | ||||||
|         // Update available connection parameters, if the updated arguments are |         // Ignore any updated arguments not for the current focused client | ||||||
|         // for the current focused client - otherwise ignore them |  | ||||||
|         if ($scope.focusedClient && $scope.focusedClient === focusedClient) |         if ($scope.focusedClient && $scope.focusedClient === focusedClient) | ||||||
|             $scope.menu.connectionParameters = ManagedClient.getArgumentModel(focusedClient); |             $scope.menu.connectionParameters = ManagedClient.getArgumentModel(focusedClient); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -62,6 +62,9 @@ angular.module('client').directive('guacTiledClients', [function guacTiledClient | |||||||
|     directive.controller = ['$scope', '$injector', '$element', |     directive.controller = ['$scope', '$injector', '$element', | ||||||
|             function guacTiledClientsController($scope, $injector, $element) { |             function guacTiledClientsController($scope, $injector, $element) { | ||||||
|  |  | ||||||
|  |         // Required services | ||||||
|  |         const $rootScope = $injector.get('$rootScope'); | ||||||
|  |  | ||||||
|         // Required types |         // Required types | ||||||
|         const ManagedClient      = $injector.get('ManagedClient'); |         const ManagedClient      = $injector.get('ManagedClient'); | ||||||
|         const ManagedClientGroup = $injector.get('ManagedClientGroup'); |         const ManagedClientGroup = $injector.get('ManagedClientGroup'); | ||||||
| @@ -89,12 +92,17 @@ angular.module('client').directive('guacTiledClients', [function guacTiledClient | |||||||
|  |  | ||||||
|         // Notify whenever identify of currently-focused client changes |         // Notify whenever identify of currently-focused client changes | ||||||
|         $scope.$watch('getFocusedClient()', function focusedClientChanged(focusedClient) { |         $scope.$watch('getFocusedClient()', function focusedClientChanged(focusedClient) { | ||||||
|             $scope.$emit('guacClientFocused', focusedClient); |             $rootScope.$broadcast('guacClientFocused', focusedClient); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         // Notify whenever arguments of currently-focused client changes |         // Notify whenever arguments of currently-focused client changes | ||||||
|         $scope.$watch('getFocusedClient().arguments', function focusedClientParametersChanged() { |         $scope.$watch('getFocusedClient().arguments', function focusedClientParametersChanged() { | ||||||
|             $scope.$emit('guacClientArgumentsUpdated', $scope.getFocusedClient()); |             $rootScope.$broadcast('guacClientArgumentsUpdated', $scope.getFocusedClient()); | ||||||
|  |         }, true); | ||||||
|  |  | ||||||
|  |         // Notify whenever protocol of currently-focused client changes | ||||||
|  |         $scope.$watch('getFocusedClient().protocol', function focusedClientParametersChanged() { | ||||||
|  |             $rootScope.$broadcast('guacClientProtocolUpdated', $scope.getFocusedClient()); | ||||||
|         }, true); |         }, true); | ||||||
|  |  | ||||||
|         /** |         /** | ||||||
|   | |||||||
| @@ -124,6 +124,7 @@ | |||||||
|                     <guac-form namespace="getProtocolNamespace(focusedClient.protocol)" |                     <guac-form namespace="getProtocolNamespace(focusedClient.protocol)" | ||||||
|                                content="focusedClient.forms" |                                content="focusedClient.forms" | ||||||
|                                model="menu.connectionParameters" |                                model="menu.connectionParameters" | ||||||
|  |                                client="focusedClient" | ||||||
|                                model-only="true"></guac-form> |                                model-only="true"></guac-form> | ||||||
|                 </div> |                 </div> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -58,6 +58,16 @@ angular.module('client').factory('ManagedArgument', ['$q', function defineManage | |||||||
|          */ |          */ | ||||||
|         this.stream = template.stream; |         this.stream = template.stream; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * True if this argument has been modified in the webapp, but yet to | ||||||
|  |          * be confirmed by guacd, or false in any other case. A pending | ||||||
|  |          * argument cannot be modified again, and must be recreated before | ||||||
|  |          * editing is enabled again. | ||||||
|  |          * | ||||||
|  |          * @type {boolean} | ||||||
|  |          */ | ||||||
|  |         this.pending = false; | ||||||
|  |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -110,9 +120,9 @@ angular.module('client').factory('ManagedArgument', ['$q', function defineManage | |||||||
|      * Sets the given editable argument (connection parameter) to the given |      * Sets the given editable argument (connection parameter) to the given | ||||||
|      * value, updating the behavior of the associated connection in real-time. |      * value, updating the behavior of the associated connection in real-time. | ||||||
|      * If successful, the ManagedArgument provided cannot be used for future |      * If successful, the ManagedArgument provided cannot be used for future | ||||||
|      * calls to setValue() and must be replaced with a new instance. This |      * calls to setValue() and will be read-only until replaced with a new | ||||||
|      * function only has an effect if the new parameter value is different from |      * instance. This function only has an effect if the new parameter value | ||||||
|      * the current value. |      * is different from the current value. | ||||||
|      * |      * | ||||||
|      * @param {ManagedArgument} managedArgument |      * @param {ManagedArgument} managedArgument | ||||||
|      *     The ManagedArgument instance associated with the connection |      *     The ManagedArgument instance associated with the connection | ||||||
| @@ -120,31 +130,22 @@ angular.module('client').factory('ManagedArgument', ['$q', function defineManage | |||||||
|      * |      * | ||||||
|      * @param {String} value |      * @param {String} value | ||||||
|      *     The new value to assign to the connection parameter. |      *     The new value to assign to the connection parameter. | ||||||
|      * |  | ||||||
|      * @returns {Boolean} |  | ||||||
|      *     true if the connection parameter was sent and the provided |  | ||||||
|      *     ManagedArgument instance may no longer be used for future setValue() |  | ||||||
|      *     calls, false if the connection parameter was NOT sent as it has not |  | ||||||
|      *     changed. |  | ||||||
|      */ |      */ | ||||||
|     ManagedArgument.setValue = function setValue(managedArgument, value) { |     ManagedArgument.setValue = function setValue(managedArgument, value) { | ||||||
|  |  | ||||||
|         // Stream new value only if value has changed |         // Stream new value only if value has changed and a change is not | ||||||
|         if (value !== managedArgument.value) { |         // already pending | ||||||
|  |         if (!managedArgument.pending && value !== managedArgument.value) { | ||||||
|  |  | ||||||
|             var writer = new Guacamole.StringWriter(managedArgument.stream); |             var writer = new Guacamole.StringWriter(managedArgument.stream); | ||||||
|             writer.sendText(value); |             writer.sendText(value); | ||||||
|             writer.sendEnd(); |             writer.sendEnd(); | ||||||
|  |  | ||||||
|             // ManagedArgument instance is no longer usable |             // ManagedArgument instance is no longer usable | ||||||
|             return true; |             managedArgument.pending = true; | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // No parameter value change was attempted and the ManagedArgument |  | ||||||
|         // instance may be reused |  | ||||||
|         return false; |  | ||||||
|  |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     return ManagedArgument; |     return ManagedArgument; | ||||||
|   | |||||||
| @@ -836,8 +836,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', | |||||||
|      */ |      */ | ||||||
|     ManagedClient.setArgument = function setArgument(managedClient, name, value) { |     ManagedClient.setArgument = function setArgument(managedClient, name, value) { | ||||||
|         var managedArgument = managedClient.arguments[name]; |         var managedArgument = managedClient.arguments[name]; | ||||||
|         if (managedArgument && ManagedArgument.setValue(managedArgument, value)) |         managedArgument && ManagedArgument.setValue(managedArgument, value); | ||||||
|             delete managedClient.arguments[name]; |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
|  * under the License. |  * under the License. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | /* global _ */ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * A directive that allows editing of a collection of fields. |  * A directive that allows editing of a collection of fields. | ||||||
| @@ -79,7 +80,19 @@ angular.module('form').directive('guacForm', [function form() { | |||||||
|              * |              * | ||||||
|              * @type String |              * @type String | ||||||
|              */ |              */ | ||||||
|             focused : '=' |             focused : '=', | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The client associated with this form, if any. | ||||||
|  |              * | ||||||
|  |              * NOTE: If the provided client has any managed arguments in the | ||||||
|  |              * pending state, any fields with the same name rendered by this | ||||||
|  |              * form will be disabled. The fields will be re-enabled when guacd | ||||||
|  |              * sends an updated argument with a the same name. | ||||||
|  |              * | ||||||
|  |              * @type ManagedClient | ||||||
|  |              */ | ||||||
|  |             client: '=' | ||||||
|  |  | ||||||
|         }, |         }, | ||||||
|         templateUrl: 'app/form/templates/form.html', |         templateUrl: 'app/form/templates/form.html', | ||||||
| @@ -240,6 +253,28 @@ angular.module('form').directive('guacForm', [function form() { | |||||||
|  |  | ||||||
|             }; |             }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns whether the given field should be disabled (read-only) | ||||||
|  |              * when presented to the current user. | ||||||
|  |              * | ||||||
|  |              * @param {Field} field | ||||||
|  |              *     The field to check. | ||||||
|  |              * | ||||||
|  |              * @returns {Boolean} | ||||||
|  |              *     true if the given field should be disabled, false otherwise. | ||||||
|  |              */ | ||||||
|  |             $scope.isDisabled = function isDisabled(field) { | ||||||
|  |  | ||||||
|  |                 /* | ||||||
|  |                  * The field is disabled if either the form as a whole is disabled, | ||||||
|  |                  * or if a client is provided to the directive, and the field is | ||||||
|  |                  * marked as pending. | ||||||
|  |                  */ | ||||||
|  |                 return $scope.disabled || | ||||||
|  |                         _.get($scope.client, ['arguments', field.name, 'pending']); | ||||||
|  |             }; | ||||||
|  |  | ||||||
|             /** |             /** | ||||||
|              * Returns whether at least one of the given fields should be |              * Returns whether at least one of the given fields should be | ||||||
|              * displayed to the current user. |              * displayed to the current user. | ||||||
|   | |||||||
| @@ -68,7 +68,14 @@ angular.module('form').directive('guacFormField', [function formField() { | |||||||
|              * |              * | ||||||
|              * @type Boolean |              * @type Boolean | ||||||
|              */ |              */ | ||||||
|             focused : '=' |             focused : '=', | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The client associated with this form field, if any. | ||||||
|  |              * | ||||||
|  |              * @type ManagedClient | ||||||
|  |              */ | ||||||
|  |             client: '=' | ||||||
|  |  | ||||||
|         }, |         }, | ||||||
|         templateUrl: 'app/form/templates/formField.html', |         templateUrl: 'app/form/templates/formField.html', | ||||||
|   | |||||||
| @@ -10,9 +10,10 @@ | |||||||
|         <div class="fields"> |         <div class="fields"> | ||||||
|             <guac-form-field ng-repeat="field in form.fields" namespace="namespace" |             <guac-form-field ng-repeat="field in form.fields" namespace="namespace" | ||||||
|                              ng-if="isVisible(field)" |                              ng-if="isVisible(field)" | ||||||
|                              data-disabled="disabled" |                              data-disabled="isDisabled(field)" | ||||||
|                              focused="isFocused(field)" |                              focused="isFocused(field)" | ||||||
|                              field="field" |                              field="field" | ||||||
|  |                              client="client" | ||||||
|                              model="values[field.name]"></guac-form-field> |                              model="values[field.name]"></guac-form-field> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user