horizon/openstack_dashboard/static/app/core/metadata/modal/modal.controller.js

94 lines
2.9 KiB
JavaScript

/*
* Copyright 2015, Intel Corp.
* (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
*
* Licensed 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.
*/
(function () {
'use strict';
angular
.module('horizon.app.core.metadata.modal')
.controller('MetadataModalController', MetadataModalController);
MetadataModalController.$inject = [
'$uibModalInstance',
'horizon.app.core.metadata.service',
'horizon.framework.widgets.metadata.tree.service',
'horizon.framework.widgets.toast.service',
// Dependencies injected with resolve by $uibModal.open
'available',
'existing',
'params'
];
/**
* @ngdoc controller
* @name MetadataModalController
* @description
* Controller used by `ModalService`
*/
function MetadataModalController(
$uibModalInstance, metadataService, metadataTreeService,
toastService, available, existing, params
) {
var ctrl = this;
ctrl.cancel = cancel;
ctrl.resourceType = params.resource;
ctrl.save = save;
ctrl.saving = false;
ctrl.tree = new metadataTreeService.Tree(available.data.items, existing.data);
function save() {
ctrl.saving = true;
var updated = ctrl.tree.getExisting();
var removed = angular.copy(existing.data);
// Glance v1 changes metadata property casing in the get request
// but to remove you still need to send back in using the proper original case.
// See https://bugs.launchpad.net/horizon/+bug/1606988
angular.forEach(removed, function bug1606988(value, removedKey) {
angular.forEach(ctrl.tree.flatTree, function compareToDefinitions(item) {
if (item.leaf && removedKey.toLocaleLowerCase() === item.leaf.name.toLocaleLowerCase()) {
delete removed[removedKey];
removed[item.leaf.name] = value;
}
});
});
angular.forEach(updated, function(value, key) {
delete removed[key];
});
metadataService
.editMetadata(params.resource, params.id, updated, Object.keys(removed))
.then(onEditSuccess, onEditFailure);
}
function cancel() {
$uibModalInstance.dismiss('cancel');
}
function onEditSuccess() {
toastService.add('success', gettext('Metadata was successfully updated.'));
$uibModalInstance.close();
}
function onEditFailure() {
toastService.add('error', gettext('Unable to update metadata.'));
ctrl.saving = false;
}
}
})();