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', './runs/RegisterLegacyTypes',
'./services/LegacyObjectAPIInterceptor', './services/LegacyObjectAPIInterceptor',
'./views/installLegacyViews', './views/installLegacyViews',
'./policies/legacyCompositionPolicyAdapter' './policies/legacyCompositionPolicyAdapter',
'./actions/LegacyActionAdapter'
], function ( ], function (
legacyRegistry, legacyRegistry,
ActionDialogDecorator, ActionDialogDecorator,
@ -53,7 +54,8 @@ define([
RegisterLegacyTypes, RegisterLegacyTypes,
LegacyObjectAPIInterceptor, LegacyObjectAPIInterceptor,
installLegacyViews, installLegacyViews,
legacyCompositionPolicyAdapter legacyCompositionPolicyAdapter,
LegacyActionAdapter
) { ) {
legacyRegistry.register('src/adapter', { legacyRegistry.register('src/adapter', {
"extensions": { "extensions": {
@ -169,6 +171,13 @@ define([
depends: [ depends: [
"openmct" "openmct"
] ]
},
{
implementation: LegacyActionAdapter.default,
depends: [
"openmct",
"actions[]"
]
} }
], ],
licenses: [ 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 ContextMenuComponent from '../../ui/components/controls/ContextMenu.vue';
import Vue from 'vue'; import Vue from 'vue';
@ -7,6 +29,7 @@ class ContextMenuRegistry {
this._activeContextMenu = undefined; this._activeContextMenu = undefined;
this._hideActiveContextMenu = this._hideActiveContextMenu.bind(this); this._hideActiveContextMenu = this._hideActiveContextMenu.bind(this);
this.registerAction = this.registerAction.bind(this);
} }
registerAction(actionDefinition) { registerAction(actionDefinition) {
@ -44,7 +67,7 @@ class ContextMenuRegistry {
this._hideActiveContextMenu(); this._hideActiveContextMenu();
} }
this._activeContextMenu = this._createContextMenuFromActions(applicableActions); this._activeContextMenu = this._createContextMenuForObject(objectPath, applicableActions);
this._activeContextMenu.$mount(); this._activeContextMenu.$mount();
this._activeContextMenu.$el.style.left = `${event.clientX}px`; this._activeContextMenu.$el.style.left = `${event.clientX}px`;
this._activeContextMenu.$el.style.top = `${event.clientY}px`; this._activeContextMenu.$el.style.top = `${event.clientY}px`;
@ -66,13 +89,14 @@ class ContextMenuRegistry {
/** /**
* @private * @private
*/ */
_createContextMenuFromActions(actions) { _createContextMenuForObject(objectPath, actions) {
return new Vue({ return new Vue({
components: { components: {
ContextMenu: ContextMenuComponent ContextMenu: ContextMenuComponent
}, },
provide: { provide: {
actions: actions actions: actions,
objectPath: objectPath
}, },
template: '<ContextMenu></ContextMenu>' template: '<ContextMenu></ContextMenu>'
}); });

View File

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

View File

@ -31,7 +31,7 @@ export default {
}); });
this.$once('hook:destroyed', removeListener); 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); this.$once('hook:destroyed', detachContextMenu);
}, },
computed: { computed: {

View File

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