From eb91cd33befd0e4e525ea90287de957141e1839d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 25 Feb 2017 15:05:29 +0200 Subject: [PATCH 1/2] [Copy] Diff between user cancellation and failure --- platform/entanglement/src/actions/AbstractComposeAction.js | 2 ++ platform/entanglement/src/actions/CopyAction.js | 4 ++++ .../entanglement/test/actions/AbstractComposeActionSpec.js | 4 ++-- platform/entanglement/test/actions/CopyActionSpec.js | 4 ++-- platform/entanglement/test/actions/LinkActionSpec.js | 4 ++-- platform/entanglement/test/actions/MoveActionSpec.js | 4 ++-- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/platform/entanglement/src/actions/AbstractComposeAction.js b/platform/entanglement/src/actions/AbstractComposeAction.js index 943c2adb0a..4373fe2ca3 100644 --- a/platform/entanglement/src/actions/AbstractComposeAction.js +++ b/platform/entanglement/src/actions/AbstractComposeAction.js @@ -141,6 +141,8 @@ define( currentParent ).then(function (newParentObj) { return composeService.perform(object, newParentObj); + }, function () { + return Promise.reject({ message: "cancelled" }); }); }; diff --git a/platform/entanglement/src/actions/CopyAction.js b/platform/entanglement/src/actions/CopyAction.js index 6388c25b74..0c2e241be2 100644 --- a/platform/entanglement/src/actions/CopyAction.js +++ b/platform/entanglement/src/actions/CopyAction.js @@ -117,6 +117,10 @@ define( } function error(errorDetails) { + if (errorDetails && (errorDetails.message === "cancelled")) { + 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 80fde42748..1f4b70362e 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 380d5ebd18..918f73d7f4 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 f7930bf0dd..d84b993e24 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 bc5398d599..ff65e3f444 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 () { From 6219fa1d878f4c573c262ed779ccf1c05715a1db Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 5 Apr 2017 15:53:17 -0700 Subject: [PATCH 2/2] [Actions] Add CancelError class https://github.com/nasa/openmct/pull/1457/commits/eb91cd33befd0e4e525ea90287de957141e1839d#r107502561 Fixes #1456 --- .../src/actions/AbstractComposeAction.js | 8 +++-- .../entanglement/src/actions/CancelError.js | 32 +++++++++++++++++++ .../entanglement/src/actions/CopyAction.js | 7 ++-- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 platform/entanglement/src/actions/CancelError.js diff --git a/platform/entanglement/src/actions/AbstractComposeAction.js b/platform/entanglement/src/actions/AbstractComposeAction.js index 4373fe2ca3..0c39cebe49 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, @@ -142,8 +144,8 @@ define( ).then(function (newParentObj) { return composeService.perform(object, newParentObj); }, function () { - return Promise.reject({ message: "cancelled" }); - }); + 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 0c2e241be2..016bbac471 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,7 +117,8 @@ define( } function error(errorDetails) { - if (errorDetails && (errorDetails.message === "cancelled")) { + // No need to notify user of their own cancellation + if (errorDetails instanceof CancelError) { return; }