blob: a83b82c2260f554bfc65e57f408a31e1248b7b6b [file] [log] [blame]
/*
* 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
* saving is successful, the user is navigated back to the page they
* started from. If saving fails, an error notification is displayed.
*/
$scope.saveObject = function saveObject() {
$scope.save($scope.$parent).then(navigateBack, guacNotification.SHOW_REQUEST_ERROR);
};
/**
* Deletes the current object, prompting the user first to confirm that
* deletion is desired. If the user confirms that deletion is desired,
* the object is deleted through invoking the provided delete function.
* The user is automatically navigated back to the page they started
* from or given an error notification depending on whether deletion
* succeeds.
*/
$scope.deleteObject = function deleteObject() {
// Confirm deletion request
guacNotification.showStatus({
title : $scope.namespace + '.DIALOG_HEADER_CONFIRM_DELETE',
text : { key : $scope.namespace + '.TEXT_CONFIRM_DELETE' },
actions : [ DELETE_ACTION, CANCEL_ACTION]
});
};
}];
return directive;
}]);