magnum-ui/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.js
Shu Muto afd0cb6c8c Clear selections for table view
Item selections on table view for batch actions does not be cleared
after execution of actions.
This patch ensures to clear item selections by emitting 'hzTable:clearSelection'
event.

Change-Id: Ieb2aad733ef06a16183f9c7c1f05a6e32659d67b
Closes-Bug: #1777545
2018-06-19 10:46:10 +09:00

171 lines
5.7 KiB
JavaScript

/**
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use self 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.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.container-infra.cluster-templates')
.factory('horizon.dashboard.container-infra.cluster-templates.delete.service', deleteService);
deleteService.$inject = [
'$location',
'$q',
'$rootScope',
'horizon.app.core.openstack-service-api.magnum',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.actions.action-result.service',
'horizon.framework.util.i18n.gettext',
'horizon.framework.util.q.extensions',
'horizon.framework.widgets.modal.deleteModalService',
'horizon.framework.widgets.table.events',
'horizon.framework.widgets.toast.service',
'horizon.dashboard.container-infra.cluster-templates.resourceType',
'horizon.dashboard.container-infra.cluster-templates.events'
];
/**
* @ngDoc factory
* @name delete.service
* @param {Object} $location
* @param {Object} $q
* @param {Object} magnum service
* @param {Object} policy
* @param {Object} actionResult
* @param {Object} gettext
* @param {Object} $qExtensions
* @param {Object} deleteModal
* @param {Object} toast
* @param {Object} resourceType
* @param {Object} events
* @returns {Object} delete service
* @description
* Brings up the delete cluster templates confirmation modal dialog.
* On submit, delete selected resources.
* On cancel, do nothing.
*/
function deleteService(
$location, $q, $rootScope, magnum, policy, actionResult, gettext, $qExtensions,
deleteModal, tableEvents, toast, resourceType, events
) {
var scope;
var context = {
labels: null,
deleteEntity: deleteEntity,
successEvent: events.DELETE_SUCCESS
};
var service = {
initAction: initAction,
allowed: allowed,
perform: perform
};
var notAllowedMessage = gettext("You are not allowed to delete cluster templates: %s");
return service;
//////////////
// include this function in your service
// if you plan to emit events to the parent controller
function initAction() {
}
function allowed() {
return $qExtensions.booleanAsPromise(true);
}
// delete selected resource objects
function perform(selected, $scope) {
scope = $scope;
selected = angular.isArray(selected) ? selected : [selected];
context.labels = labelize(selected.length);
return $qExtensions.allSettled(selected.map(checkPermission)).then(afterCheck);
}
function labelize(count) {
return {
title: ngettext('Confirm Delete Cluster Template',
'Confirm Delete Cluster Templates', count),
/* eslint-disable max-len */
message: ngettext('You have selected "%s". Please confirm your selection. Deleted cluster template is not recoverable.',
'You have selected "%s". Please confirm your selection. Deleted cluster templates are not recoverable.', count),
/* eslint-enable max-len */
submit: ngettext('Delete Cluster Template',
'Delete Cluster Templates', count),
success: ngettext('Deleted cluster template: %s.',
'Deleted cluster templates: %s.', count),
error: ngettext('Unable to delete cluster template: %s.',
'Unable to delete cluster templates: %s.', count)
};
}
// for batch delete
function checkPermission(selected) {
return {promise: allowed(selected), context: selected};
}
// for batch delete
function afterCheck(result) {
var outcome = $q.reject(); // Reject the promise by default
if (result.fail.length > 0) {
toast.add('error', getMessage(notAllowedMessage, result.fail));
outcome = $q.reject(result.fail);
}
if (result.pass.length > 0) {
outcome = deleteModal.open(scope, result.pass.map(getEntity), context).then(createResult);
}
return outcome;
}
function createResult(deleteModalResult) {
// To make the result of this action generically useful, reformat the return
// from the deleteModal into a standard form
var result = actionResult.getActionResult();
deleteModalResult.pass.forEach(function markDeleted(item) {
result.deleted(resourceType, getEntity(item).id);
});
deleteModalResult.fail.forEach(function markFailed(item) {
result.failed(resourceType, getEntity(item).id);
});
var indexPath = "/project/cluster_templates";
var currentPath = $location.path();
if (result.result.failed.length === 0 && result.result.deleted.length > 0 &&
currentPath !== indexPath) {
$location.path(indexPath);
} else {
$rootScope.$broadcast(tableEvents.CLEAR_SELECTIONS);
return result.result;
}
}
function getMessage(message, entities) {
return interpolate(message, [entities.map(getName).join(", ")]);
}
function getName(result) {
return getEntity(result).name;
}
// for batch delete
function getEntity(result) {
return result.context;
}
// call delete REST API
function deleteEntity(id) {
return magnum.deleteClusterTemplate(id, true);
}
}
})();