From 2dcff00fa7386e9c9d028cc138352751a96a2763 Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Fri, 23 Nov 2018 11:52:13 -0800 Subject: [PATCH] Added legacy action layer --- src/adapter/actions/LegacyActionAdapter.js | 40 ++++++++++++++++++++++ src/adapter/bundle.js | 13 +++++-- src/api/contextMenu/ContextMenuRegistry.js | 30 ++++++++++++++-- src/ui/components/controls/ContextMenu.vue | 4 +-- src/ui/components/controls/ObjectLabel.vue | 2 +- src/ui/components/inspector/Elements.vue | 5 +-- 6 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 src/adapter/actions/LegacyActionAdapter.js diff --git a/src/adapter/actions/LegacyActionAdapter.js b/src/adapter/actions/LegacyActionAdapter.js new file mode 100644 index 0000000000..e3b5d69696 --- /dev/null +++ b/src/adapter/actions/LegacyActionAdapter.js @@ -0,0 +1,40 @@ +export default function LegacyActionAdapter(openmct, legacyActions) { + legacyActions + .filter(contextCategoryOnly) + .map(createContextMenuAction) + .forEach(openmct.contextMenu.registerAction); + + function createContextMenuAction(LegacyAction) { + return { + name: LegacyAction.definition.name, + description: LegacyAction.definition.description, + cssClass: LegacyAction.definition.cssClass, + appliesTo(objectPath) { + let legacyObject = openmct.legacyObject(objectPath); + return LegacyAction.appliesTo({ + domainObject: legacyObject + }); + }, + invoke(objectPath) { + let context = { + category: 'contextual', + domainObject: openmct.legacyObject(objectPath) + } + let legacyAction = new LegacyAction(context); + + if (!legacyAction.getMetadata) { + let metadata = Object.create(LegacyAction.definition); + metadata.context = context; + legacyAction.getMetadata = function () { + return metadata; + }.bind(legacyAction); + } + legacyAction.perform(); + } + } + } + + function contextCategoryOnly(action) { + return action.category === 'contextual'; + } +} diff --git a/src/adapter/bundle.js b/src/adapter/bundle.js index 9e17e268e3..44e2863c59 100644 --- a/src/adapter/bundle.js +++ b/src/adapter/bundle.js @@ -36,7 +36,8 @@ define([ './runs/RegisterLegacyTypes', './services/LegacyObjectAPIInterceptor', './views/installLegacyViews', - './policies/legacyCompositionPolicyAdapter' + './policies/legacyCompositionPolicyAdapter', + './actions/LegacyActionAdapter' ], function ( legacyRegistry, ActionDialogDecorator, @@ -53,7 +54,8 @@ define([ RegisterLegacyTypes, LegacyObjectAPIInterceptor, installLegacyViews, - legacyCompositionPolicyAdapter + legacyCompositionPolicyAdapter, + LegacyActionAdapter ) { legacyRegistry.register('src/adapter', { "extensions": { @@ -169,6 +171,13 @@ define([ depends: [ "openmct" ] + }, + { + implementation: LegacyActionAdapter.default, + depends: [ + "openmct", + "actions[]" + ] } ], licenses: [ diff --git a/src/api/contextMenu/ContextMenuRegistry.js b/src/api/contextMenu/ContextMenuRegistry.js index 27321d9e55..a0f5f8ba7a 100644 --- a/src/api/contextMenu/ContextMenuRegistry.js +++ b/src/api/contextMenu/ContextMenuRegistry.js @@ -1,3 +1,25 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2018, 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 ContextMenuComponent from '../../ui/components/controls/ContextMenu.vue'; import Vue from 'vue'; @@ -7,6 +29,7 @@ class ContextMenuRegistry { this._activeContextMenu = undefined; this._hideActiveContextMenu = this._hideActiveContextMenu.bind(this); + this.registerAction = this.registerAction.bind(this); } registerAction(actionDefinition) { @@ -44,7 +67,7 @@ class ContextMenuRegistry { this._hideActiveContextMenu(); } - this._activeContextMenu = this._createContextMenuFromActions(applicableActions); + this._activeContextMenu = this._createContextMenuForObject(objectPath, applicableActions); this._activeContextMenu.$mount(); this._activeContextMenu.$el.style.left = `${event.clientX}px`; this._activeContextMenu.$el.style.top = `${event.clientY}px`; @@ -66,13 +89,14 @@ class ContextMenuRegistry { /** * @private */ - _createContextMenuFromActions(actions) { + _createContextMenuForObject(objectPath, actions) { return new Vue({ components: { ContextMenu: ContextMenuComponent }, provide: { - actions: actions + actions: actions, + objectPath: objectPath }, template: '' }); diff --git a/src/ui/components/controls/ContextMenu.vue b/src/ui/components/controls/ContextMenu.vue index aabc02f488..93ecb9ead3 100644 --- a/src/ui/components/controls/ContextMenu.vue +++ b/src/ui/components/controls/ContextMenu.vue @@ -5,7 +5,7 @@ :key="action.name" :class="action.cssClass" :title="action.description" - @click="action.invoke"> + @click="action.invoke(objectPath)"> {{ action.name }}
  • No actions defined.
  • @@ -15,6 +15,6 @@ \ No newline at end of file diff --git a/src/ui/components/controls/ObjectLabel.vue b/src/ui/components/controls/ObjectLabel.vue index edf7e834bc..1f793fe165 100644 --- a/src/ui/components/controls/ObjectLabel.vue +++ b/src/ui/components/controls/ObjectLabel.vue @@ -31,7 +31,7 @@ export default { }); this.$once('hook:destroyed', removeListener); } - let detachContextMenu = this.openmct.contextMenu.attachTo(this.$el); + let detachContextMenu = this.openmct.contextMenu.attachTo(this.$el, this.objectPath); this.$once('hook:destroyed', detachContextMenu); }, computed: { diff --git a/src/ui/components/inspector/Elements.vue b/src/ui/components/inspector/Elements.vue index 951992f74c..6283c46408 100644 --- a/src/ui/components/inspector/Elements.vue +++ b/src/ui/components/inspector/Elements.vue @@ -11,7 +11,7 @@ draggable="true" @dragstart="moveFrom(index)"> - +
  • @@ -47,7 +47,8 @@ export default { data() { return { elements: [], - isEditing: this.openmct.editor.isEditing() + isEditing: this.openmct.editor.isEditing(), + parentObject: undefined } }, mounted() {