Github user necouchman commented on a diff in the pull request:
https://github.com/apache/guacamole-client/pull/282#discussion_r185634576
--- Diff:
guacamole/src/main/webapp/app/manage/directives/managementButtons.js ---
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Directive which displays a set of object management buttons (save,
delete,
+ * clone, etc.) representing the actions available to the current user in
+ * context of the object being edited/created.
+ */
+angular.module('manage').directive('managementButtons', ['$injector',
+ function managementButtons($injector) {
+
+ // Required services
+ var guacNotification = $injector.get('guacNotification');
+
+ var directive = {
+
+ restrict : 'E',
+ replace : true,
+ templateUrl : 'app/manage/templates/managementButtons.html',
+
+ scope : {
+
+ /**
+ * The translation namespace associated with all applicable
+ * translation strings. This directive requires at least the
+ * following translation strings within the given namespace:
+ *
+ * - ACTION_CANCEL
+ * - ACTION_CLONE
+ * - ACTION_DELETE
+ * - ACTION_SAVE
+ * - DIALOG_HEADER_CONFIRM_DELETE
+ * - TEXT_CONFIRM_DELETE
+ *
+ * @type String
+ */
+ namespace : '=',
+
+ /**
+ * The permissions which dictate the management actions
available
+ * to the current user.
+ *
+ * @type ManagementPermissions
+ */
+ permissions : '=',
+
+ /**
+ * The function to invoke to save the arbitrary object being
edited
+ * if the current user has permission to do so. The provided
+ * function MUST return a promise which is resolved if the save
+ * operation succeeds and is rejected with an {@link Error} if
the
+ * save operation fails.
+ *
+ * @type Function
+ */
+ save : '&',
+
+ /**
+ * The function to invoke when the current user chooses to
clone
+ * the object being edited. The provided function MUST perform
the
+ * actions necessary to produce an interface which will clone
the
+ * object.
+ *
+ * @type Function
+ */
+ clone : '&',
+
+ /**
+ * The function to invoke to delete the arbitrary object being
edited
+ * if the current user has permission to do so. The provided
+ * function MUST return a promise which is resolved if the
delete
+ * operation succeeds and is rejected with an {@link Error} if
the
+ * delete operation fails.
+ *
+ * @type Function
+ */
+ delete : '&',
+
+ /**
+ * The function to invoke when the current user chooses to
cancel
+ * the edit in progress, or when a save/delete operation has
+ * succeeded. The provided function MUST perform the actions
+ * necessary to return the user to a reasonable starting point.
+ *
+ * @type Function
+ */
+ return : '&'
+
+ }
+
+ };
+
+ directive.controller = ['$scope', function
managementButtonsController($scope) {
+
+ /**
+ * An action to be provided along with the object sent to
showStatus which
+ * immediately deletes the current connection.
+ */
+ var DELETE_ACTION = {
+ name : $scope.namespace + '.ACTION_DELETE',
+ className : 'danger',
+ callback : function deleteCallback() {
+ deleteObjectImmediately();
+ guacNotification.showStatus(false);
+ }
+ };
+
+ /**
+ * An action to be provided along with the object sent to
showStatus which
+ * closes the currently-shown status dialog.
+ */
+ var CANCEL_ACTION = {
+ name : $scope.namespace + '.ACTION_CANCEL',
+ callback : function cancelCallback() {
+ guacNotification.showStatus(false);
+ }
+ };
+
+ /**
+ * Invokes the provided return function to navigate the user back
to
+ * the page they started from.
+ */
+ var navigateBack = function navigateBack() {
+ $scope['return']($scope.$parent);
+ };
+
+ /**
+ * Invokes the provided delete function, immediately deleting the
+ * current object without prompting the user for confirmation. If
+ * deletion is successful, the user is navigated back to the page
they
+ * started from. If the deletion fails, an error notification is
+ * displayed.
+ */
+ var deleteObjectImmediately = function deleteObjectImmediately() {
+ $scope['delete']($scope.$parent).then(navigateBack,
guacNotification.SHOW_REQUEST_ERROR);
+ };
+
+ /**
+ * Cancels all pending edits, returning to the page the user
started
+ * from.
+ */
+ $scope.cancel = navigateBack;
+
+ /**
+ * Cancels all pending edits, invoking the provided clone function
to
+ * open an edit page for a new object which is prepopulated with
the
+ * data from the current object.
+ */
+ $scope.cloneObject = function cloneObject () {
+ $scope.clone($scope.$parent);
+ };
+
+ /**
+ * Invokes the provided save function to saves the current object.
If
--- End diff --
to *save* the
---