From 399b74508406818a22df6bd0cb3d6da66647889b Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 23 Mar 2017 17:18:00 -0700 Subject: [PATCH] [Persistence] Prevent editing of objects that cannot be saved. Fixes #1483 --- platform/commonUI/edit/bundle.js | 7 +++ .../policies/EditPersistableObjectsPolicy.js | 59 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 platform/commonUI/edit/src/policies/EditPersistableObjectsPolicy.js diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index d4e63e063b..24948b97e3 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -34,6 +34,7 @@ define([ "./src/actions/SaveAsAction", "./src/actions/CancelAction", "./src/policies/EditActionPolicy", + "./src/policies/EditPersistableObjectsPolicy", "./src/policies/EditableLinkPolicy", "./src/policies/EditableMovePolicy", "./src/policies/EditContextualActionPolicy", @@ -72,6 +73,7 @@ define([ SaveAsAction, CancelAction, EditActionPolicy, + EditPersistableObjectsPolicy, EditableLinkPolicy, EditableMovePolicy, EditContextualActionPolicy, @@ -247,6 +249,11 @@ define([ "category": "action", "implementation": EditActionPolicy }, + { + "category": "action", + "implementation": EditPersistableObjectsPolicy, + "depends": ["openmct"] + }, { "category": "action", "implementation": EditContextualActionPolicy, diff --git a/platform/commonUI/edit/src/policies/EditPersistableObjectsPolicy.js b/platform/commonUI/edit/src/policies/EditPersistableObjectsPolicy.js new file mode 100644 index 0000000000..7377aab47b --- /dev/null +++ b/platform/commonUI/edit/src/policies/EditPersistableObjectsPolicy.js @@ -0,0 +1,59 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2016, 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( + ['../../../../../src/api/objects/object-utils'], + function (objectUtils) { + + /** + * Policy that prevents editing of any object from a provider that does not + * support persistence (ie. the 'save' operation). Editing is prevented + * as a subsequent save would fail, causing the loss of a user's changes. + * @param openmct + * @constructor + */ + function EditPersistableObjectsPolicy(openmct) { + this.openmct = openmct; + } + + EditPersistableObjectsPolicy.prototype.allow = function (action, context) { + var identifier; + var provider; + var domainObject = context.domainObject; + var key = action.getMetadata().key; + var category = (context || {}).category; + + // Use category to selectively block edit from the view. Edit action + // is also invoked during the create process which should be allowed, + // because it may be saved elsewhere + if ((key === 'edit' && category === 'view-control') || key === 'properties') { + identifier = objectUtils.parseKeyString(domainObject.getId()); + provider = this.openmct.objects.getProvider(identifier); + return provider.save !== undefined; + } + + return true; + }; + + return EditPersistableObjectsPolicy; + } +);