Added legacy action layer

This commit is contained in:
Andrew Henry 2018-11-23 11:52:13 -08:00
parent 94cdce3551
commit 2dcff00fa7
6 changed files with 84 additions and 10 deletions

View File

@ -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';
}
}

View File

@ -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: [

View File

@ -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: '<ContextMenu></ContextMenu>'
});

View File

@ -5,7 +5,7 @@
:key="action.name"
:class="action.cssClass"
:title="action.description"
@click="action.invoke">
@click="action.invoke(objectPath)">
{{ action.name }}
</li>
<li v-if="actions.length === 0">No actions defined.</li>
@ -15,6 +15,6 @@
<script>
export default {
inject: ['actions']
inject: ['actions', 'objectPath']
}
</script>

View File

@ -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: {

View File

@ -11,7 +11,7 @@
draggable="true"
@dragstart="moveFrom(index)">
</span>
<object-label :domainObject="element"></object-label>
<object-label :domainObject="element" :objectPath="[element, parentObject]"></object-label>
</span>
</li>
<li class="js-last-place" @drop="moveToIndex(elements.length)"></li>
@ -47,7 +47,8 @@ export default {
data() {
return {
elements: [],
isEditing: this.openmct.editor.isEditing()
isEditing: this.openmct.editor.isEditing(),
parentObject: undefined
}
},
mounted() {