diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index 54a4809743..beb962350a 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -160,7 +160,7 @@ define([ }, { "key": "remove", - "category": "contextual", + "category": "legacy", "implementation": RemoveAction, "cssClass": "icon-trash", "name": "Remove", diff --git a/platform/commonUI/edit/src/actions/RemoveAction.js b/platform/commonUI/edit/src/actions/RemoveAction.js index fc5fbaa86a..4d4b28b370 100644 --- a/platform/commonUI/edit/src/actions/RemoveAction.js +++ b/platform/commonUI/edit/src/actions/RemoveAction.js @@ -23,11 +23,7 @@ /** * Module defining RemoveAction. Created by vwoeltje on 11/17/14. */ -define([ - './RemoveDialog' -], function ( - RemoveDialog -) { +define([], function () { /** * Construct an action which will remove the provided object manifestation. @@ -114,12 +110,7 @@ define([ return parent.useCapability('mutation', doMutate); } - /* - * Pass in the function to remove the domain object so it can be - * associated with an 'OK' button press - */ - dialog = new RemoveDialog(this.openmct, domainObject, removeFromContext); - dialog.show(); + removeFromContext(); }; // Object needs to have a parent for Remove to be applicable diff --git a/platform/commonUI/edit/src/actions/RemoveDialog.js b/platform/commonUI/edit/src/actions/RemoveDialog.js deleted file mode 100644 index 9a45fa1480..0000000000 --- a/platform/commonUI/edit/src/actions/RemoveDialog.js +++ /dev/null @@ -1,72 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2017, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT is 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. - * - * Open MCT includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ - -define([], function () { - - /** - * @callback removeCallback - * @param {DomainObject} domainObject the domain object to be removed - */ - - /** - * Construct a new Remove dialog. - * - * @param {DialogService} dialogService the service that shows the dialog - * @param {DomainObject} domainObject the domain object to be removed - * @param {removeCallback} removeCallback callback that handles removal of the domain object - * @memberof platform/commonUI/edit - * @constructor - */ - function RemoveDialog(openmct, domainObject, removeCallback) { - this.openmct = openmct; - this.domainObject = domainObject; - this.removeCallback = removeCallback; - } - - /** - * Display a dialog to confirm the removal of a domain object. - */ - RemoveDialog.prototype.show = function () { - let dialog = this.openmct.overlays.dialog({ - title: 'Remove ' + this.domainObject.getModel().name, - iconClass: 'alert', - message: 'Warning! This action will permanently remove this object. Are you sure you want to continue?', - buttons: [ - { - label: 'OK', - callback: () => { - this.removeCallback(); - dialog.dismiss(); - } - }, - { - label: 'Cancel', - callback: () => { - dialog.dismiss(); - } - } - ] - }); - }; - - return RemoveDialog; -}); diff --git a/src/MCT.js b/src/MCT.js index 56c7d5cad4..ca0edb60a4 100644 --- a/src/MCT.js +++ b/src/MCT.js @@ -44,6 +44,7 @@ define([ '../platform/core/src/objects/DomainObjectImpl', '../platform/core/src/capabilities/ContextualDomainObject', './ui/preview/plugin', + './plugins/remove/plugin', 'vue' ], function ( EventEmitter, @@ -69,6 +70,7 @@ define([ DomainObjectImpl, ContextualDomainObject, PreviewPlugin, + RemoveActionPlugin, Vue ) { /** @@ -233,6 +235,7 @@ define([ this.install(this.plugins.TelemetryTable()); this.install(this.plugins.DisplayLayout()); this.install(PreviewPlugin.default()); + this.install(RemoveActionPlugin.default()); if (typeof BUILD_CONSTANTS !== 'undefined') { this.install(buildInfoPlugin(BUILD_CONSTANTS)); diff --git a/src/plugins/remove/RemoveAction.js b/src/plugins/remove/RemoveAction.js new file mode 100644 index 0000000000..56c4ecb610 --- /dev/null +++ b/src/plugins/remove/RemoveAction.js @@ -0,0 +1,101 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2019, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is 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. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +export default class RemoveAction { + constructor(openmct) { + this.name = 'Remove'; + this.description = 'Remove this object from its containing object.'; + this.cssClass = "icon-trash"; + + this.openmct = openmct; + } + + invoke(objectPath) { + let object = objectPath[0]; + let parent = objectPath[1]; + this.showConfirmDialog(object).then(() => { + this.removeFromComposition(parent, object); + if (this.inNavigationPath(object)) { + this.navigateTo(objectPath.slice(1)); + } + }).catch(() =>{}); + } + + showConfirmDialog(object) { + return new Promise((resolve, reject) => { + let dialog = this.openmct.overlays.dialog({ + title: `Remove ${object.name}`, + iconClass: 'alert', + message: 'Warning! This action will remove this object. Are you sure you want to continue?', + buttons: [ + { + label: 'OK', + callback: () => { + dialog.dismiss(); + resolve(); + } + }, + { + label: 'Cancel', + callback: () => { + dialog.dismiss(); + reject(); + } + } + ] + }) + }) + } + + inNavigationPath(object) { + return this.openmct.router.path + .some(objectInPath => this.openmct.objects.areIdsEqual(objectInPath.identifier, object.identifier)); + } + + navigateTo(objectPath) { + let urlPath = objectPath.reverse() + .map(object => this.openmct.objects.makeKeyString(object.identifier)) + .join("/"); + + window.location.href = '#/browse/' + urlPath; + } + + removeFromComposition(parent, child) { + let composition = parent.composition.filter(id => + !this.openmct.objects.areIdsEqual(id, child.identifier) + ); + + this.openmct.objects.mutate(parent, 'composition', composition); + } + + appliesTo(objectPath) { + let object = objectPath[0]; + let objectType = object && this.openmct.types.get(object.type); + let parent = objectPath[1]; + let parentType = parent && this.openmct.types.get(parent.type); + + return objectType.definition.creatable && + parentType && + parentType.definition.creatable && + Array.isArray(parent.composition); + } +} diff --git a/src/plugins/remove/plugin.js b/src/plugins/remove/plugin.js new file mode 100644 index 0000000000..f78f861b28 --- /dev/null +++ b/src/plugins/remove/plugin.js @@ -0,0 +1,28 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2019, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is 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. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +import RemoveAction from "./RemoveAction"; + +export default function () { + return function (openmct) { + openmct.contextMenu.registerAction(new RemoveAction(openmct)); + } +}