diff --git a/platform/entanglement/src/actions/AbstractComposeAction.js b/platform/entanglement/src/actions/AbstractComposeAction.js index 02e19f2955..ccd1695949 100644 --- a/platform/entanglement/src/actions/AbstractComposeAction.js +++ b/platform/entanglement/src/actions/AbstractComposeAction.js @@ -21,7 +21,9 @@ *****************************************************************************/ define( - function () { + ['./CancelError'], + function (CancelError) { + var CANCEL_MESSAGE = "User cancelled location selection."; /** * Common interface exposed by services which support move, copy, @@ -141,7 +143,9 @@ define( currentParent ).then(function (newParentObj) { return composeService.perform(object, newParentObj); - }); + }, function () { + return Promise.reject(new CancelError(CANCEL_MESSAGE)); + }.bind(this)); }; AbstractComposeAction.appliesTo = function (context) { diff --git a/platform/entanglement/src/actions/CancelError.js b/platform/entanglement/src/actions/CancelError.js new file mode 100644 index 0000000000..3c72302d91 --- /dev/null +++ b/platform/entanglement/src/actions/CancelError.js @@ -0,0 +1,32 @@ +/***************************************************************************** + * 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 () { + function CancelError() { + Error.apply(this, arguments); + this.name = CancelError; + } + + CancelError.prototype = Object.create(Error.prototype); + + return CancelError; +}); diff --git a/platform/entanglement/src/actions/CopyAction.js b/platform/entanglement/src/actions/CopyAction.js index 7699b6a163..d670ea27b3 100644 --- a/platform/entanglement/src/actions/CopyAction.js +++ b/platform/entanglement/src/actions/CopyAction.js @@ -21,8 +21,8 @@ *****************************************************************************/ define( - ['./AbstractComposeAction'], - function (AbstractComposeAction) { + ['./AbstractComposeAction', './CancelError'], + function (AbstractComposeAction, CancelError) { /** * The CopyAction is available from context menus and allows a user to @@ -117,6 +117,11 @@ define( } function error(errorDetails) { + // No need to notify user of their own cancellation + if (errorDetails instanceof CancelError) { + return; + } + var errorDialog, errorMessage = { title: "Error copying objects.", diff --git a/platform/entanglement/test/actions/AbstractComposeActionSpec.js b/platform/entanglement/test/actions/AbstractComposeActionSpec.js index 4c3109be8a..5d58529e73 100644 --- a/platform/entanglement/test/actions/AbstractComposeActionSpec.js +++ b/platform/entanglement/test/actions/AbstractComposeActionSpec.js @@ -157,9 +157,9 @@ define( ); }); - it("waits for location from user", function () { + it("waits for location and handles cancellation by user", function () { expect(locationServicePromise.then) - .toHaveBeenCalledWith(jasmine.any(Function)); + .toHaveBeenCalledWith(jasmine.any(Function), jasmine.any(Function)); }); it("copies object to selected location", function () { diff --git a/platform/entanglement/test/actions/CopyActionSpec.js b/platform/entanglement/test/actions/CopyActionSpec.js index 6357fe25aa..d8443019cf 100644 --- a/platform/entanglement/test/actions/CopyActionSpec.js +++ b/platform/entanglement/test/actions/CopyActionSpec.js @@ -180,9 +180,9 @@ define( ); }); - it("waits for location from user", function () { + it("waits for location and handles cancellation by user", function () { expect(locationServicePromise.then) - .toHaveBeenCalledWith(jasmine.any(Function)); + .toHaveBeenCalledWith(jasmine.any(Function), jasmine.any(Function)); }); it("copies object to selected location", function () { diff --git a/platform/entanglement/test/actions/LinkActionSpec.js b/platform/entanglement/test/actions/LinkActionSpec.js index dfed9d73c0..329919483c 100644 --- a/platform/entanglement/test/actions/LinkActionSpec.js +++ b/platform/entanglement/test/actions/LinkActionSpec.js @@ -133,9 +133,9 @@ define( ); }); - it("waits for location from user", function () { + it("waits for location and handles cancellation by user", function () { expect(locationServicePromise.then) - .toHaveBeenCalledWith(jasmine.any(Function)); + .toHaveBeenCalledWith(jasmine.any(Function), jasmine.any(Function)); }); it("links object to selected location", function () { diff --git a/platform/entanglement/test/actions/MoveActionSpec.js b/platform/entanglement/test/actions/MoveActionSpec.js index 6eb1ae8ae4..c4a58fcf4d 100644 --- a/platform/entanglement/test/actions/MoveActionSpec.js +++ b/platform/entanglement/test/actions/MoveActionSpec.js @@ -133,9 +133,9 @@ define( ); }); - it("waits for location from user", function () { + it("waits for location and handles cancellation by user", function () { expect(locationServicePromise.then) - .toHaveBeenCalledWith(jasmine.any(Function)); + .toHaveBeenCalledWith(jasmine.any(Function), jasmine.any(Function)); }); it("moves object to selected location", function () {