mirror of
https://github.com/nasa/openmct.git
synced 2025-01-02 19:36:41 +00:00
Remove legacy type service usage from modern Open MCT codebase (#4534)
* Remove type service from the DefaultMetadataProvider * Added tests * Move unknown types to new type registry * Migrate legacy type telemetry information to new types to obviate need to use type service from new API * Remove default object, it's not needed any more * Remove injector from spec
This commit is contained in:
parent
1f588a2a6e
commit
01d02642e8
@ -220,26 +220,6 @@ define([
|
|||||||
"key": "root",
|
"key": "root",
|
||||||
"name": "Root",
|
"name": "Root",
|
||||||
"cssClass": "icon-folder"
|
"cssClass": "icon-folder"
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "folder",
|
|
||||||
"name": "Folder",
|
|
||||||
"cssClass": "icon-folder",
|
|
||||||
"features": "creation",
|
|
||||||
"description": "Create folders to organize other objects or links to objects.",
|
|
||||||
"priority": 1000,
|
|
||||||
"model": {
|
|
||||||
"composition": []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "unknown",
|
|
||||||
"name": "Unknown Type",
|
|
||||||
"cssClass": "icon-object-unknown"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Unknown Type",
|
|
||||||
"cssClass": "icon-object-unknown"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"capabilities": [
|
"capabilities": [
|
||||||
|
@ -102,8 +102,10 @@ define([
|
|||||||
DefaultMetadataProvider.prototype.getMetadata = function (domainObject) {
|
DefaultMetadataProvider.prototype.getMetadata = function (domainObject) {
|
||||||
const metadata = domainObject.telemetry || {};
|
const metadata = domainObject.telemetry || {};
|
||||||
if (this.typeHasTelemetry(domainObject)) {
|
if (this.typeHasTelemetry(domainObject)) {
|
||||||
const typeMetadata = this.typeService.getType(domainObject.type).typeDef.telemetry;
|
const typeMetadata = this.openmct.types.get(domainObject.type).definition.telemetry;
|
||||||
|
|
||||||
Object.assign(metadata, typeMetadata);
|
Object.assign(metadata, typeMetadata);
|
||||||
|
|
||||||
if (!metadata.values) {
|
if (!metadata.values) {
|
||||||
metadata.values = valueMetadatasFromOldFormat(metadata);
|
metadata.values = valueMetadatasFromOldFormat(metadata);
|
||||||
}
|
}
|
||||||
@ -116,11 +118,9 @@ define([
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
DefaultMetadataProvider.prototype.typeHasTelemetry = function (domainObject) {
|
DefaultMetadataProvider.prototype.typeHasTelemetry = function (domainObject) {
|
||||||
if (!this.typeService) {
|
const type = this.openmct.types.get(domainObject.type);
|
||||||
this.typeService = this.openmct.$injector.get('typeService');
|
|
||||||
}
|
|
||||||
|
|
||||||
return Boolean(this.typeService.getType(domainObject.type).typeDef.telemetry);
|
return Boolean(type.definition.telemetry);
|
||||||
};
|
};
|
||||||
|
|
||||||
return DefaultMetadataProvider;
|
return DefaultMetadataProvider;
|
||||||
|
@ -27,7 +27,6 @@ describe('Telemetry API', function () {
|
|||||||
const NO_PROVIDER = 'No provider found';
|
const NO_PROVIDER = 'No provider found';
|
||||||
let openmct;
|
let openmct;
|
||||||
let telemetryAPI;
|
let telemetryAPI;
|
||||||
let mockTypeService;
|
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
openmct = {
|
openmct = {
|
||||||
@ -35,14 +34,11 @@ describe('Telemetry API', function () {
|
|||||||
'timeSystem',
|
'timeSystem',
|
||||||
'bounds'
|
'bounds'
|
||||||
]),
|
]),
|
||||||
$injector: jasmine.createSpyObj('injector', [
|
types: jasmine.createSpyObj('typeRegistry', [
|
||||||
'get'
|
'get'
|
||||||
])
|
])
|
||||||
};
|
};
|
||||||
mockTypeService = jasmine.createSpyObj('typeService', [
|
|
||||||
'getType'
|
|
||||||
]);
|
|
||||||
openmct.$injector.get.and.returnValue(mockTypeService);
|
|
||||||
openmct.time.timeSystem.and.returnValue({key: 'system'});
|
openmct.time.timeSystem.and.returnValue({key: 'system'});
|
||||||
openmct.time.bounds.and.returnValue({
|
openmct.time.bounds.and.returnValue({
|
||||||
start: 0,
|
start: 0,
|
||||||
@ -356,7 +352,7 @@ describe('Telemetry API', function () {
|
|||||||
describe('metadata', function () {
|
describe('metadata', function () {
|
||||||
let mockMetadata = {};
|
let mockMetadata = {};
|
||||||
let mockObjectType = {
|
let mockObjectType = {
|
||||||
typeDef: {}
|
definition: {}
|
||||||
};
|
};
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
telemetryAPI.addProvider({
|
telemetryAPI.addProvider({
|
||||||
@ -368,7 +364,7 @@ describe('Telemetry API', function () {
|
|||||||
return mockMetadata;
|
return mockMetadata;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mockTypeService.getType.and.returnValue(mockObjectType);
|
openmct.types.get.and.returnValue(mockObjectType);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('respects explicit priority', function () {
|
it('respects explicit priority', function () {
|
||||||
@ -587,7 +583,7 @@ describe('Telemetry API', function () {
|
|||||||
let domainObject;
|
let domainObject;
|
||||||
let mockMetadata = {};
|
let mockMetadata = {};
|
||||||
let mockObjectType = {
|
let mockObjectType = {
|
||||||
typeDef: {}
|
definition: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
@ -601,7 +597,7 @@ describe('Telemetry API', function () {
|
|||||||
return mockMetadata;
|
return mockMetadata;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mockTypeService.getType.and.returnValue(mockObjectType);
|
openmct.types.get.and.returnValue(mockObjectType);
|
||||||
domainObject = {
|
domainObject = {
|
||||||
identifier: {
|
identifier: {
|
||||||
key: 'a',
|
key: 'a',
|
||||||
|
@ -82,6 +82,32 @@ define(function () {
|
|||||||
definition.cssClass = legacyDefinition.cssClass;
|
definition.cssClass = legacyDefinition.cssClass;
|
||||||
definition.description = legacyDefinition.description;
|
definition.description = legacyDefinition.description;
|
||||||
definition.form = legacyDefinition.properties;
|
definition.form = legacyDefinition.properties;
|
||||||
|
if (legacyDefinition.telemetry !== undefined) {
|
||||||
|
let telemetry = {
|
||||||
|
values: []
|
||||||
|
};
|
||||||
|
|
||||||
|
if (legacyDefinition.telemetry.domains !== undefined) {
|
||||||
|
legacyDefinition.telemetry.domains.forEach((domain, index) => {
|
||||||
|
domain.hints = {
|
||||||
|
domain: index
|
||||||
|
};
|
||||||
|
telemetry.values.push(domain);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (legacyDefinition.telemetry.ranges !== undefined) {
|
||||||
|
legacyDefinition.telemetry.ranges.forEach((range, index) => {
|
||||||
|
range.hints = {
|
||||||
|
range: index
|
||||||
|
};
|
||||||
|
telemetry.values.push(range);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
definition.telemetry = telemetry;
|
||||||
|
}
|
||||||
|
|
||||||
if (legacyDefinition.model) {
|
if (legacyDefinition.model) {
|
||||||
definition.initialize = function (model) {
|
definition.initialize = function (model) {
|
||||||
for (let [k, v] of Object.entries(legacyDefinition.model)) {
|
for (let [k, v] of Object.entries(legacyDefinition.model)) {
|
||||||
|
@ -19,8 +19,13 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
define(['./Type'], function (Type) {
|
define(['./Type'], function (Type) {
|
||||||
|
const UNKNOWN_TYPE = new Type({
|
||||||
|
key: "unknown",
|
||||||
|
name: "Unknown Type",
|
||||||
|
cssClass: "icon-object-unknown"
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef TypeDefinition
|
* @typedef TypeDefinition
|
||||||
* @memberof module:openmct.TypeRegistry~
|
* @memberof module:openmct.TypeRegistry~
|
||||||
@ -89,11 +94,11 @@ define(['./Type'], function (Type) {
|
|||||||
* @returns {module:openmct.Type} the registered type
|
* @returns {module:openmct.Type} the registered type
|
||||||
*/
|
*/
|
||||||
TypeRegistry.prototype.get = function (typeKey) {
|
TypeRegistry.prototype.get = function (typeKey) {
|
||||||
return this.types[typeKey];
|
return this.types[typeKey] || UNKNOWN_TYPE;
|
||||||
};
|
};
|
||||||
|
|
||||||
TypeRegistry.prototype.importLegacyTypes = function (types) {
|
TypeRegistry.prototype.importLegacyTypes = function (types) {
|
||||||
types.filter((t) => !this.get(t.key))
|
types.filter((t) => this.get(t.key) === UNKNOWN_TYPE)
|
||||||
.forEach((type) => {
|
.forEach((type) => {
|
||||||
let def = Type.definitionFromLegacyDefinition(type);
|
let def = Type.definitionFromLegacyDefinition(type);
|
||||||
this.addType(type.key, def);
|
this.addType(type.key, def);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a
|
<a
|
||||||
class="l-grid-view__item c-grid-item"
|
class="l-grid-view__item c-grid-item js-folder-child"
|
||||||
:class="[{
|
:class="[{
|
||||||
'is-alias': item.isAlias === true,
|
'is-alias': item.isAlias === true,
|
||||||
'c-grid-item--unknown': item.type.cssClass === undefined || item.type.cssClass.indexOf('unknown') !== -1
|
'c-grid-item--unknown': item.type.cssClass === undefined || item.type.cssClass.indexOf('unknown') !== -1
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<tr
|
<tr
|
||||||
class="c-list-item"
|
class="c-list-item js-folder-child"
|
||||||
:class="{
|
:class="{
|
||||||
'is-alias': item.isAlias === true
|
'is-alias': item.isAlias === true
|
||||||
}"
|
}"
|
||||||
|
@ -29,6 +29,17 @@ define([
|
|||||||
) {
|
) {
|
||||||
return function plugin() {
|
return function plugin() {
|
||||||
return function install(openmct) {
|
return function install(openmct) {
|
||||||
|
openmct.types.addType('folder', {
|
||||||
|
name: "Folder",
|
||||||
|
key: "folder",
|
||||||
|
description: "Create folders to organize other objects or links to objects without the ability to edit it's properties.",
|
||||||
|
cssClass: "icon-folder",
|
||||||
|
creatable: true,
|
||||||
|
initialize: function (domainObject) {
|
||||||
|
domainObject.composition = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
openmct.objectViews.addProvider(new FolderGridView(openmct));
|
openmct.objectViews.addProvider(new FolderGridView(openmct));
|
||||||
openmct.objectViews.addProvider(new FolderListView(openmct));
|
openmct.objectViews.addProvider(new FolderListView(openmct));
|
||||||
};
|
};
|
||||||
|
153
src/plugins/folderView/pluginSpec.js
Normal file
153
src/plugins/folderView/pluginSpec.js
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2021, 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 FolderPlugin from './plugin.js';
|
||||||
|
import Vue from 'vue';
|
||||||
|
import {
|
||||||
|
createOpenMct,
|
||||||
|
resetApplicationState
|
||||||
|
} from 'utils/testing';
|
||||||
|
|
||||||
|
describe("The folder plugin", () => {
|
||||||
|
let openmct;
|
||||||
|
let folderPlugin;
|
||||||
|
|
||||||
|
beforeEach((done) => {
|
||||||
|
openmct = createOpenMct();
|
||||||
|
folderPlugin = new FolderPlugin();
|
||||||
|
openmct.install(folderPlugin);
|
||||||
|
|
||||||
|
openmct.on('start', done);
|
||||||
|
openmct.startHeadless();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
return resetApplicationState(openmct);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the folder object type", () => {
|
||||||
|
let folderType;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
folderType = openmct.types.get('folder');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is installed by the plugin", () => {
|
||||||
|
expect(folderType).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is user creatable", () => {
|
||||||
|
expect(folderType.definition.creatable).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the folder grid view", () => {
|
||||||
|
let gridViewProvider;
|
||||||
|
let listViewProvider;
|
||||||
|
let folderObject;
|
||||||
|
let addCallback;
|
||||||
|
let parentDiv;
|
||||||
|
let childDiv;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
parentDiv = document.createElement("div");
|
||||||
|
childDiv = document.createElement("div");
|
||||||
|
parentDiv.appendChild(childDiv);
|
||||||
|
|
||||||
|
folderObject = {
|
||||||
|
identifier: {
|
||||||
|
namespace: 'test-namespace',
|
||||||
|
key: 'folder-object'
|
||||||
|
},
|
||||||
|
name: "A folder!",
|
||||||
|
type: "folder",
|
||||||
|
composition: [
|
||||||
|
{
|
||||||
|
namespace: 'test-namespace',
|
||||||
|
key: 'child-object-1'
|
||||||
|
}, {
|
||||||
|
namespace: 'test-namespace',
|
||||||
|
key: 'child-object-2'
|
||||||
|
}, {
|
||||||
|
namespace: 'test-namespace',
|
||||||
|
key: 'child-object-3'
|
||||||
|
}, {
|
||||||
|
namespace: 'test-namespace',
|
||||||
|
key: 'child-object-4'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
gridViewProvider = openmct.objectViews.get(folderObject, [folderObject]).find((view) => view.key === 'grid');
|
||||||
|
listViewProvider = openmct.objectViews.get(folderObject, [folderObject]).find((view) => view.key === 'list-view');
|
||||||
|
|
||||||
|
const fakeCompositionCollection = jasmine.createSpyObj('compositionCollection', [
|
||||||
|
'on',
|
||||||
|
'load'
|
||||||
|
]);
|
||||||
|
fakeCompositionCollection.on.and.callFake((eventName, callback) => {
|
||||||
|
if (eventName === "add") {
|
||||||
|
addCallback = callback;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fakeCompositionCollection.load.and.callFake(() => {
|
||||||
|
folderObject.composition.forEach((identifier) => {
|
||||||
|
addCallback({
|
||||||
|
identifier,
|
||||||
|
type: "folder"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
spyOn(openmct.composition, "get").and.returnValue(fakeCompositionCollection);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the grid view", () => {
|
||||||
|
it("is installed by the plugin and is applicable to the folder type", () => {
|
||||||
|
expect(gridViewProvider).toBeDefined();
|
||||||
|
});
|
||||||
|
it("renders each item contained in the folder's composition", async () => {
|
||||||
|
let folderView = gridViewProvider.view(folderObject, [folderObject]);
|
||||||
|
folderView.show(childDiv, true);
|
||||||
|
|
||||||
|
await Vue.nextTick();
|
||||||
|
|
||||||
|
let children = parentDiv.getElementsByClassName("js-folder-child");
|
||||||
|
expect(children.length).toBe(folderObject.composition.length);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the list view", () => {
|
||||||
|
it("installs a list view for the folder type", () => {
|
||||||
|
expect(listViewProvider).toBeDefined();
|
||||||
|
});
|
||||||
|
it("renders each item contained in the folder's composition", async () => {
|
||||||
|
let folderView = listViewProvider.view(folderObject, [folderObject]);
|
||||||
|
folderView.show(childDiv, true);
|
||||||
|
|
||||||
|
await Vue.nextTick();
|
||||||
|
|
||||||
|
let children = parentDiv.getElementsByClassName("js-folder-child");
|
||||||
|
expect(children.length).toBe(folderObject.composition.length);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user