Compare commits

..

1 Commits

Author SHA1 Message Date
4992b99aa5 Refresh openmct require cache before each test 2020-04-21 13:40:34 -07:00
52 changed files with 301 additions and 999 deletions

View File

@ -20,8 +20,8 @@ jobs:
paths: paths:
- node_modules - node_modules
- run: - run:
name: npm run test:coverage name: npm run test
command: npm run test:coverage command: npm run test
- run: - run:
name: npm run lint name: npm run lint
command: npm run lint command: npm run lint

View File

@ -1,5 +1,5 @@
<!-- <!--
Open MCT, Copyright (c) 2014-2020, United States Government Open MCT, Copyright (c) 2014-2017, United States Government
as represented by the Administrator of the National Aeronautics and Space as represented by the Administrator of the National Aeronautics and Space
Administration. All rights reserved. Administration. All rights reserved.
@ -43,9 +43,9 @@
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry) openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
); );
openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.Espresso()); openmct.install(openmct.plugins.Espresso());
openmct.install(openmct.plugins.MyItems()); openmct.install(openmct.plugins.MyItems());
openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.Generator()); openmct.install(openmct.plugins.Generator());
openmct.install(openmct.plugins.ExampleImagery()); openmct.install(openmct.plugins.ExampleImagery());
openmct.install(openmct.plugins.UTCTimeSystem()); openmct.install(openmct.plugins.UTCTimeSystem());

View File

@ -24,27 +24,16 @@
const devMode = process.env.NODE_ENV !== 'production'; const devMode = process.env.NODE_ENV !== 'production';
const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'ChromeHeadless']; const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'ChromeHeadless'];
const coverageEnabled = process.env.COVERAGE === 'true';
const reporters = ['progress', 'html'];
if (coverageEnabled) {
reporters.push('coverage-istanbul');
}
module.exports = (config) => { module.exports = (config) => {
const webpackConfig = require('./webpack.config.js'); const webpackConfig = require('./webpack.config.js');
delete webpackConfig.output; delete webpackConfig.output;
if (!devMode || coverageEnabled) { if (!devMode) {
webpackConfig.module.rules.push({ webpackConfig.module.rules.push({
test: /\.js$/, test: /\.js$/,
exclude: /node_modules|example|lib|dist/, exclude: /node_modules|example/,
use: { use: 'istanbul-instrumenter-loader'
loader: 'istanbul-instrumenter-loader',
options: {
esModules: true
}
}
}); });
} }
@ -56,7 +45,11 @@ module.exports = (config) => {
'src/**/*Spec.js' 'src/**/*Spec.js'
], ],
port: 9876, port: 9876,
reporters: reporters, reporters: [
'progress',
'coverage',
'html'
],
browsers: browsers, browsers: browsers,
customLaunchers: { customLaunchers: {
ChromeDebugging: { ChromeDebugging: {
@ -68,25 +61,25 @@ module.exports = (config) => {
colors: true, colors: true,
logLevel: config.LOG_INFO, logLevel: config.LOG_INFO,
autoWatch: true, autoWatch: true,
coverageReporter: {
dir: process.env.CIRCLE_ARTIFACTS ?
process.env.CIRCLE_ARTIFACTS + '/coverage' :
"dist/reports/coverage",
check: {
global: {
lines: 80,
excludes: ['src/plugins/plot/**/*.js']
}
}
},
// HTML test reporting. // HTML test reporting.
htmlReporter: { htmlReporter: {
outputDir: "dist/reports/tests", outputDir: "dist/reports/tests",
preserveDescribeNesting: true, preserveDescribeNesting: true,
foldAll: false foldAll: false
}, },
coverageIstanbulReporter: {
fixWebpackSourcePaths: true,
dir: process.env.CIRCLE_ARTIFACTS ?
process.env.CIRCLE_ARTIFACTS + '/coverage' :
"dist/reports/coverage",
reports: ['html', 'lcovonly', 'text-summary'],
thresholds: {
global: {
lines: 62
}
}
},
preprocessors: { preprocessors: {
// add webpack as preprocessor
'platform/**/*Spec.js': [ 'webpack', 'sourcemap' ], 'platform/**/*Spec.js': [ 'webpack', 'sourcemap' ],
'src/**/*Spec.js': [ 'webpack', 'sourcemap' ] 'src/**/*Spec.js': [ 'webpack', 'sourcemap' ]
}, },

View File

@ -2,11 +2,10 @@
"name": "openmct", "name": "openmct",
"version": "1.0.0-snapshot", "version": "1.0.0-snapshot",
"description": "The Open MCT core platform", "description": "The Open MCT core platform",
"dependencies": { "dependencies": {},
"plotly.js-dist": "^1.54.1"
},
"devDependencies": { "devDependencies": {
"angular": "1.7.9", "acorn": "6.2.0",
"angular": "1.4.14",
"angular-route": "1.4.14", "angular-route": "1.4.14",
"babel-eslint": "8.2.6", "babel-eslint": "8.2.6",
"comma-separated-values": "^3.6.4", "comma-separated-values": "^3.6.4",
@ -44,7 +43,6 @@
"karma-chrome-launcher": "^2.2.0", "karma-chrome-launcher": "^2.2.0",
"karma-cli": "^1.0.1", "karma-cli": "^1.0.1",
"karma-coverage": "^1.1.2", "karma-coverage": "^1.1.2",
"karma-coverage-istanbul-reporter": "^2.1.1",
"karma-html-reporter": "^0.2.7", "karma-html-reporter": "^0.2.7",
"karma-jasmine": "^1.1.2", "karma-jasmine": "^1.1.2",
"karma-sourcemap-loader": "^0.3.7", "karma-sourcemap-loader": "^0.3.7",
@ -55,7 +53,7 @@
"marked": "^0.3.5", "marked": "^0.3.5",
"mini-css-extract-plugin": "^0.4.1", "mini-css-extract-plugin": "^0.4.1",
"minimist": "^1.1.1", "minimist": "^1.1.1",
"moment": "^2.25.3", "moment": "^2.11.1",
"moment-duration-format": "^2.2.2", "moment-duration-format": "^2.2.2",
"moment-timezone": "^0.5.21", "moment-timezone": "^0.5.21",
"node-bourbon": "^4.2.3", "node-bourbon": "^4.2.3",
@ -78,16 +76,14 @@
"zepto": "^1.2.0" "zepto": "^1.2.0"
}, },
"scripts": { "scripts": {
"clean": "rm -rf ./dist",
"start": "node app.js", "start": "node app.js",
"lint": "eslint platform example src --ext .js,.vue openmct.js", "lint": "eslint platform example src/**/*.{js,vue} openmct.js",
"lint:fix": "eslint platform example src --ext .js,.vue openmct.js --fix", "lint:fix": "eslint platform example src/**/*.{js,vue} openmct.js --fix",
"build:prod": "cross-env NODE_ENV=production webpack", "build:prod": "cross-env NODE_ENV=production webpack",
"build:dev": "webpack", "build:dev": "webpack",
"build:watch": "webpack --watch", "build:watch": "webpack --watch",
"test": "karma start --single-run", "test": "karma start --single-run",
"test:debug": "cross-env NODE_ENV=debug karma start --no-single-run", "test-debug": "cross-env NODE_ENV=debug karma start --no-single-run",
"test:coverage": "./scripts/test-coverage.sh",
"test:watch": "karma start --no-single-run", "test:watch": "karma start --no-single-run",
"verify": "concurrently 'npm:test' 'npm:lint'", "verify": "concurrently 'npm:test' 'npm:lint'",
"jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api", "jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api",

View File

@ -87,11 +87,6 @@ define([
bootstrapper bootstrapper
); );
// Override of angular1.6 ! hashPrefix
app.config(['$locationProvider', function ($locationProvider) {
$locationProvider.hashPrefix('');
}]);
// Apply logging levels; this must be done now, before the // Apply logging levels; this must be done now, before the
// first log statement. // first log statement.
new LogLevel(logLevel).configure(app, $log); new LogLevel(logLevel).configure(app, $log);

View File

@ -71,7 +71,7 @@ define([
}, },
{ {
"key": "ELASTIC_PATH", "key": "ELASTIC_PATH",
"value": "mct/_doc", "value": "mct/domain_object",
"priority": "fallback" "priority": "fallback"
}, },
{ {

View File

@ -32,9 +32,9 @@ define(
// JSLint doesn't like underscore-prefixed properties, // JSLint doesn't like underscore-prefixed properties,
// so hide them here. // so hide them here.
var SRC = "_source", var SRC = "_source",
CONFLICT = 409, REV = "_version",
SEQ_NO = "_seq_no", ID = "_id",
PRIMARY_TERM = "_primary_term"; CONFLICT = 409;
/** /**
* The ElasticPersistenceProvider reads and writes JSON documents * The ElasticPersistenceProvider reads and writes JSON documents
@ -104,8 +104,7 @@ define(
// Get a domain object model out of ElasticSearch's response // Get a domain object model out of ElasticSearch's response
ElasticPersistenceProvider.prototype.getModel = function (response) { ElasticPersistenceProvider.prototype.getModel = function (response) {
if (response && response[SRC]) { if (response && response[SRC]) {
this.revs[response[SEQ_NO]] = response[SEQ_NO]; this.revs[response[ID]] = response[REV];
this.revs[response[PRIMARY_TERM]] = response[PRIMARY_TERM];
return response[SRC]; return response[SRC];
} else { } else {
return undefined; return undefined;
@ -117,8 +116,7 @@ define(
// indicate that the request failed. // indicate that the request failed.
ElasticPersistenceProvider.prototype.checkResponse = function (response, key) { ElasticPersistenceProvider.prototype.checkResponse = function (response, key) {
if (response && !response.error) { if (response && !response.error) {
this.revs[SEQ_NO] = response[SEQ_NO]; this.revs[key] = response[REV];
this.revs[PRIMARY_TERM] = response[PRIMARY_TERM];
return response; return response;
} else { } else {
return this.handleError(response, key); return this.handleError(response, key);
@ -149,7 +147,7 @@ define(
function checkUpdate(response) { function checkUpdate(response) {
return self.checkResponse(response, key); return self.checkResponse(response, key);
} }
return this.put(key, value) return this.put(key, value, { version: this.revs[key] })
.then(checkUpdate); .then(checkUpdate);
}; };

View File

@ -85,7 +85,7 @@ define(
it("allows object creation", function () { it("allows object creation", function () {
var model = { someKey: "some value" }; var model = { someKey: "some value" };
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_seq_no": 1, "_primary_term": 1 } data: { "_id": "abc", "_version": 1 }
})); }));
provider.createObject("testSpace", "abc", model).then(capture); provider.createObject("testSpace", "abc", model).then(capture);
expect(mockHttp).toHaveBeenCalledWith({ expect(mockHttp).toHaveBeenCalledWith({
@ -100,7 +100,7 @@ define(
it("allows object models to be read back", function () { it("allows object models to be read back", function () {
var model = { someKey: "some value" }; var model = { someKey: "some value" };
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_seq_no": 1, "_primary_term": 1, "_source": model } data: { "_id": "abc", "_version": 1, "_source": model }
})); }));
provider.readObject("testSpace", "abc").then(capture); provider.readObject("testSpace", "abc").then(capture);
expect(mockHttp).toHaveBeenCalledWith({ expect(mockHttp).toHaveBeenCalledWith({
@ -117,19 +117,19 @@ define(
// First do a read to populate rev tags... // First do a read to populate rev tags...
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_source": {} } data: { "_id": "abc", "_version": 42, "_source": {} }
})); }));
provider.readObject("testSpace", "abc"); provider.readObject("testSpace", "abc");
// Now perform an update // Now perform an update
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_seq_no": 1, "_source": {} } data: { "_id": "abc", "_version": 43, "_source": {} }
})); }));
provider.updateObject("testSpace", "abc", model).then(capture); provider.updateObject("testSpace", "abc", model).then(capture);
expect(mockHttp).toHaveBeenCalledWith({ expect(mockHttp).toHaveBeenCalledWith({
url: "/test/db/abc", url: "/test/db/abc",
method: "PUT", method: "PUT",
params: undefined, params: { version: 42 },
data: model data: model
}); });
expect(capture.calls.mostRecent().args[0]).toBeTruthy(); expect(capture.calls.mostRecent().args[0]).toBeTruthy();
@ -138,13 +138,13 @@ define(
it("allows object deletion", function () { it("allows object deletion", function () {
// First do a read to populate rev tags... // First do a read to populate rev tags...
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_source": {} } data: { "_id": "abc", "_version": 42, "_source": {} }
})); }));
provider.readObject("testSpace", "abc"); provider.readObject("testSpace", "abc");
// Now perform an update // Now perform an update
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_source": {} } data: { "_id": "abc", "_version": 42, "_source": {} }
})); }));
provider.deleteObject("testSpace", "abc", {}).then(capture); provider.deleteObject("testSpace", "abc", {}).then(capture);
expect(mockHttp).toHaveBeenCalledWith({ expect(mockHttp).toHaveBeenCalledWith({
@ -167,13 +167,13 @@ define(
expect(capture).toHaveBeenCalledWith(undefined); expect(capture).toHaveBeenCalledWith(undefined);
}); });
it("handles rejection due to _seq_no", function () { it("handles rejection due to version", function () {
var model = { someKey: "some value" }, var model = { someKey: "some value" },
mockErrorCallback = jasmine.createSpy('error'); mockErrorCallback = jasmine.createSpy('error');
// First do a read to populate rev tags... // First do a read to populate rev tags...
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_seq_no": 1, "_source": {} } data: { "_id": "abc", "_version": 42, "_source": {} }
})); }));
provider.readObject("testSpace", "abc"); provider.readObject("testSpace", "abc");
@ -196,7 +196,7 @@ define(
// First do a read to populate rev tags... // First do a read to populate rev tags...
mockHttp.and.returnValue(mockPromise({ mockHttp.and.returnValue(mockPromise({
data: { "_id": "abc", "_seq_no": 1, "_source": {} } data: { "_id": "abc", "_version": 42, "_source": {} }
})); }));
provider.readObject("testSpace", "abc"); provider.readObject("testSpace", "abc");

View File

@ -1,2 +0,0 @@
export NODE_OPTIONS=--max_old_space_size=4096
cross-env COVERAGE=true karma start --single-run

View File

@ -252,7 +252,6 @@ define([
// Plugin's that are installed by default // Plugin's that are installed by default
this.install(this.plugins.Plot()); this.install(this.plugins.Plot());
this.install(this.plugins.PlotlyPlot());
this.install(this.plugins.TelemetryTable()); this.install(this.plugins.TelemetryTable());
this.install(PreviewPlugin.default()); this.install(PreviewPlugin.default());
this.install(LegacyIndicatorsPlugin()); this.install(LegacyIndicatorsPlugin());

View File

@ -69,6 +69,9 @@ export default class ConditionClass extends EventEmitter {
console.log('no data received'); console.log('no data received');
return; return;
} }
if (!this.isTelemetryUsed(datum.id)) {
return;
}
this.criteria.forEach(criterion => { this.criteria.forEach(criterion => {
if (this.isAnyOrAllTelemetry(criterion)) { if (this.isAnyOrAllTelemetry(criterion)) {
criterion.getResult(datum, this.conditionManager.telemetryObjects); criterion.getResult(datum, this.conditionManager.telemetryObjects);
@ -203,7 +206,7 @@ export default class ConditionClass extends EventEmitter {
let latestTimestamp; let latestTimestamp;
let criteriaResults = {}; let criteriaResults = {};
const criteriaRequests = this.criteria const criteriaRequests = this.criteria
.map(criterion => criterion.requestLAD(this.conditionManager.telemetryObjects)); .map(criterion => criterion.requestLAD({telemetryObjects: this.conditionManager.telemetryObjects}));
return Promise.all(criteriaRequests) return Promise.all(criteriaRequests)
.then(results => { .then(results => {

View File

@ -55,7 +55,7 @@ export default class ConditionManager extends EventEmitter {
this.telemetryObjects[id] = Object.assign({}, endpoint, {telemetryMetaData: this.openmct.telemetry.getMetadata(endpoint).valueMetadatas}); this.telemetryObjects[id] = Object.assign({}, endpoint, {telemetryMetaData: this.openmct.telemetry.getMetadata(endpoint).valueMetadatas});
this.subscriptions[id] = this.openmct.telemetry.subscribe( this.subscriptions[id] = this.openmct.telemetry.subscribe(
endpoint, endpoint,
this.telemetryReceived.bind(this, endpoint) this.telemetryReceived.bind(this, id)
); );
// TODO check if this is needed // TODO check if this is needed
this.updateConditionTelemetry(); this.updateConditionTelemetry();
@ -71,7 +71,6 @@ export default class ConditionManager extends EventEmitter {
this.subscriptions[id](); this.subscriptions[id]();
delete this.subscriptions[id]; delete this.subscriptions[id];
delete this.telemetryObjects[id]; delete this.telemetryObjects[id];
this.removeConditionTelemetry();
} }
initialize() { initialize() {
@ -87,30 +86,6 @@ export default class ConditionManager extends EventEmitter {
this.conditionClassCollection.forEach((condition) => condition.updateTelemetry()); this.conditionClassCollection.forEach((condition) => condition.updateTelemetry());
} }
removeConditionTelemetry() {
let conditionsChanged = false;
this.conditionSetDomainObject.configuration.conditionCollection.forEach((conditionConfiguration) => {
conditionConfiguration.configuration.criteria.forEach((criterion, index) => {
const isAnyAllTelemetry = criterion.telemetry && (criterion.telemetry === 'any' || criterion.telemetry === 'all');
if (!isAnyAllTelemetry) {
const found = Object.values(this.telemetryObjects).find((telemetryObject) => {
return this.openmct.objects.areIdsEqual(telemetryObject.identifier, criterion.telemetry);
});
if (!found) {
criterion.telemetry = '';
criterion.metadata = '';
criterion.input = [];
criterion.operation = '';
conditionsChanged = true;
}
}
});
});
if (conditionsChanged) {
this.persistConditions();
}
}
updateCondition(conditionConfiguration, index) { updateCondition(conditionConfiguration, index) {
let condition = this.conditionClassCollection[index]; let condition = this.conditionClassCollection[index];
condition.update(conditionConfiguration); condition.update(conditionConfiguration);
@ -259,13 +234,9 @@ export default class ConditionManager extends EventEmitter {
this.openmct.time.timeSystem() this.openmct.time.timeSystem()
); );
}); });
if (!Object.values(latestTimestamp).some(timeSystem => timeSystem)) {
return [];
}
const currentCondition = this.getCurrentConditionLAD(conditionResults); const currentCondition = this.getCurrentConditionLAD(conditionResults);
const currentOutput = Object.assign(
return Object.assign(
{ {
output: currentCondition.configuration.output, output: currentCondition.configuration.output,
id: this.conditionSetDomainObject.identifier, id: this.conditionSetDomainObject.identifier,
@ -273,30 +244,12 @@ export default class ConditionManager extends EventEmitter {
}, },
latestTimestamp latestTimestamp
); );
return [currentOutput];
}); });
}); });
} }
isTelemetryUsed(endpoint) { telemetryReceived(id, datum) {
const id = this.openmct.objects.makeKeyString(endpoint.identifier); const normalizedDatum = this.createNormalizedDatum(datum, id);
for(const condition of this.conditionClassCollection) {
if (condition.isTelemetryUsed(id)) {
return true;
}
}
return false;
}
telemetryReceived(endpoint, datum) {
if (!this.isTelemetryUsed(endpoint)) {
return;
}
const normalizedDatum = this.createNormalizedDatum(datum, endpoint);
const timeSystemKey = this.openmct.time.timeSystem().key; const timeSystemKey = this.openmct.time.timeSystem().key;
let timestamp = {}; let timestamp = {};
timestamp[timeSystemKey] = normalizedDatum[timeSystemKey]; timestamp[timeSystemKey] = normalizedDatum[timeSystemKey];
@ -330,11 +283,8 @@ export default class ConditionManager extends EventEmitter {
return data; return data;
} }
createNormalizedDatum(telemetryDatum, endpoint) { createNormalizedDatum(telemetryDatum, id) {
const id = this.openmct.objects.makeKeyString(endpoint.identifier); const normalizedDatum = Object.values(this.telemetryObjects[id].telemetryMetaData).reduce((datum, metadatum) => {
const metadata = this.openmct.telemetry.getMetadata(endpoint).valueMetadatas;
const normalizedDatum = Object.values(metadata).reduce((datum, metadatum) => {
const testValue = this.getTestData(metadatum); const testValue = this.getTestData(metadatum);
const formatter = this.openmct.telemetry.getValueFormatter(metadatum); const formatter = this.openmct.telemetry.getValueFormatter(metadatum);
datum[metadatum.key] = testValue !== undefined ? formatter.parse(testValue) : formatter.parse(telemetryDatum[metadatum.source]); datum[metadatum.key] = testValue !== undefined ? formatter.parse(testValue) : formatter.parse(telemetryDatum[metadatum.source]);

View File

@ -54,22 +54,13 @@ export default class ConditionSetMetadataProvider {
return { return {
values: this.getDomains().concat([ values: this.getDomains().concat([
{ {
key: "state", name: 'Output',
source: "output", key: 'output',
name: "State", format: 'enum',
format: "enum",
enumerations: enumerations, enumerations: enumerations,
hints: { hints: {
range: 1 range: 1
} }
},
{
key: "output",
name: "Value",
format: "string",
hints: {
range: 2
}
} }
]) ])
}; };

View File

@ -45,7 +45,7 @@ export default class ConditionSetTelemetryProvider {
return conditionManager.requestLADConditionSetOutput() return conditionManager.requestLADConditionSetOutput()
.then(latestOutput => { .then(latestOutput => {
return latestOutput; return latestOutput ? [latestOutput] : [];
}); });
} }

View File

@ -23,13 +23,10 @@
import EventEmitter from 'EventEmitter'; import EventEmitter from 'EventEmitter';
export default class StyleRuleManager extends EventEmitter { export default class StyleRuleManager extends EventEmitter {
constructor(styleConfiguration, openmct, callback, suppressSubscriptionOnEdit) { constructor(styleConfiguration, openmct, callback) {
super(); super();
this.openmct = openmct; this.openmct = openmct;
this.callback = callback; this.callback = callback;
if (suppressSubscriptionOnEdit) {
this.openmct.editor.on('isEditing', this.toggleSubscription.bind(this));
}
if (styleConfiguration) { if (styleConfiguration) {
this.initialize(styleConfiguration); this.initialize(styleConfiguration);
if (styleConfiguration.conditionSetIdentifier) { if (styleConfiguration.conditionSetIdentifier) {
@ -40,25 +37,9 @@ export default class StyleRuleManager extends EventEmitter {
} }
} }
toggleSubscription(isEditing) {
this.isEditing = isEditing;
if (this.isEditing) {
if (this.stopProvidingTelemetry) {
this.stopProvidingTelemetry();
}
if (this.conditionSetIdentifier) {
this.applySelectedConditionStyle();
}
} else if (this.conditionSetIdentifier) {
this.subscribeToConditionSet();
}
}
initialize(styleConfiguration) { initialize(styleConfiguration) {
this.conditionSetIdentifier = styleConfiguration.conditionSetIdentifier; this.conditionSetIdentifier = styleConfiguration.conditionSetIdentifier;
this.staticStyle = styleConfiguration.staticStyle; this.staticStyle = styleConfiguration.staticStyle;
this.selectedConditionId = styleConfiguration.selectedConditionId;
this.defaultConditionId = styleConfiguration.defaultConditionId;
this.updateConditionStylesMap(styleConfiguration.styles || []); this.updateConditionStylesMap(styleConfiguration.styles || []);
} }
@ -73,7 +54,7 @@ export default class StyleRuleManager extends EventEmitter {
this.handleConditionSetResultUpdated(output[0]); this.handleConditionSetResultUpdated(output[0]);
} }
}); });
this.stopProvidingTelemetry = this.openmct.telemetry.subscribe(conditionSetDomainObject, this.handleConditionSetResultUpdated.bind(this)); this.stopProvidingTelemetry = this.openmct.telemetry.subscribe(conditionSetDomainObject, output => this.handleConditionSetResultUpdated(output));
}); });
} }
@ -85,16 +66,12 @@ export default class StyleRuleManager extends EventEmitter {
let isNewConditionSet = !this.conditionSetIdentifier || let isNewConditionSet = !this.conditionSetIdentifier ||
!this.openmct.objects.areIdsEqual(this.conditionSetIdentifier, styleConfiguration.conditionSetIdentifier); !this.openmct.objects.areIdsEqual(this.conditionSetIdentifier, styleConfiguration.conditionSetIdentifier);
this.initialize(styleConfiguration); this.initialize(styleConfiguration);
if (this.isEditing) {
this.applySelectedConditionStyle();
} else {
//Only resubscribe if the conditionSet has changed. //Only resubscribe if the conditionSet has changed.
if (isNewConditionSet) { if (isNewConditionSet) {
this.subscribeToConditionSet(); this.subscribeToConditionSet();
} }
} }
} }
}
updateConditionStylesMap(conditionStyles) { updateConditionStylesMap(conditionStyles) {
let conditionStyleMap = {}; let conditionStyleMap = {};
@ -126,16 +103,6 @@ export default class StyleRuleManager extends EventEmitter {
} }
} }
applySelectedConditionStyle() {
const conditionId = this.selectedConditionId || this.defaultConditionId;
if (!conditionId) {
this.applyStaticStyle();
} else if (this.conditionalStyleMap[conditionId]) {
this.currentStyle = this.conditionalStyleMap[conditionId];
this.updateDomainObjectStyle();
}
}
applyStaticStyle() { applyStaticStyle() {
if (this.staticStyle) { if (this.staticStyle) {
this.currentStyle = this.staticStyle.style; this.currentStyle = this.staticStyle.style;
@ -156,8 +123,6 @@ export default class StyleRuleManager extends EventEmitter {
} }
delete this.stopProvidingTelemetry; delete this.stopProvidingTelemetry;
this.conditionSetIdentifier = undefined; this.conditionSetIdentifier = undefined;
this.isEditing = undefined;
this.callback = undefined;
} }
} }

View File

@ -79,8 +79,6 @@
<div v-for="(conditionStyle, index) in conditionalStyles" <div v-for="(conditionStyle, index) in conditionalStyles"
:key="index" :key="index"
class="c-inspect-styles__condition" class="c-inspect-styles__condition"
:class="{'is-current': conditionStyle.conditionId === selectedConditionId}"
@click="applySelectedConditionStyle(conditionStyle.conditionId)"
> >
<condition-error :show-label="true" <condition-error :show-label="true"
:condition="getCondition(conditionStyle.conditionId)" :condition="getCondition(conditionStyle.conditionId)"
@ -128,8 +126,7 @@ export default {
isEditing: this.openmct.editor.isEditing(), isEditing: this.openmct.editor.isEditing(),
conditions: undefined, conditions: undefined,
conditionsLoaded: false, conditionsLoaded: false,
navigateToPath: '', navigateToPath: ''
selectedConditionId: ''
} }
}, },
destroyed() { destroyed() {
@ -194,9 +191,6 @@ export default {
if (this.stopObservingItems) { if (this.stopObservingItems) {
this.stopObservingItems(); this.stopObservingItems();
} }
if (this.stopProvidingTelemetry) {
this.stopProvidingTelemetry();
}
}, },
initialize(conditionSetDomainObject) { initialize(conditionSetDomainObject) {
//If there are new conditions in the conditionSet we need to set those styles to default //If there are new conditions in the conditionSet we need to set those styles to default
@ -206,13 +200,6 @@ export default {
}, },
setEditState(isEditing) { setEditState(isEditing) {
this.isEditing = isEditing; this.isEditing = isEditing;
if (this.isEditing) {
if (this.stopProvidingTelemetry) {
this.stopProvidingTelemetry();
}
} else {
this.subscribeToConditionSet();
}
}, },
addConditionSet() { addConditionSet() {
let conditionSetDomainObject; let conditionSetDomainObject;
@ -283,8 +270,6 @@ export default {
let domainObjectStyles = (this.domainObject.configuration && this.domainObject.configuration.objectStyles) || {}; let domainObjectStyles = (this.domainObject.configuration && this.domainObject.configuration.objectStyles) || {};
if (this.itemId) { if (this.itemId) {
domainObjectStyles[this.itemId].conditionSetIdentifier = undefined; domainObjectStyles[this.itemId].conditionSetIdentifier = undefined;
domainObjectStyles[this.itemId].selectedConditionId = undefined;
domainObjectStyles[this.itemId].defaultConditionId = undefined;
delete domainObjectStyles[this.itemId].conditionSetIdentifier; delete domainObjectStyles[this.itemId].conditionSetIdentifier;
domainObjectStyles[this.itemId].styles = undefined; domainObjectStyles[this.itemId].styles = undefined;
delete domainObjectStyles[this.itemId].styles; delete domainObjectStyles[this.itemId].styles;
@ -293,8 +278,6 @@ export default {
} }
} else { } else {
domainObjectStyles.conditionSetIdentifier = undefined; domainObjectStyles.conditionSetIdentifier = undefined;
domainObjectStyles.selectedConditionId = undefined;
domainObjectStyles.defaultConditionId = undefined;
delete domainObjectStyles.conditionSetIdentifier; delete domainObjectStyles.conditionSetIdentifier;
domainObjectStyles.styles = undefined; domainObjectStyles.styles = undefined;
delete domainObjectStyles.styles; delete domainObjectStyles.styles;
@ -304,23 +287,16 @@ export default {
} }
this.persist(domainObjectStyles); this.persist(domainObjectStyles);
if (this.stopProvidingTelemetry) {
this.stopProvidingTelemetry();
}
}, },
updateDomainObjectItemStyles(newItems) { updateDomainObjectItemStyles(newItems) {
//check that all items that have been styles still exist. Otherwise delete those styles //check that all items that have been styles still exist. Otherwise delete those styles
let domainObjectStyles = (this.domainObject.configuration && this.domainObject.configuration.objectStyles) || {}; let domainObjectStyles = (this.domainObject.configuration && this.domainObject.configuration.objectStyles) || {};
let itemsToRemove = []; let itemsToRemove = [];
let keys = Object.keys(domainObjectStyles); let keys = Object.keys(domainObjectStyles);
//TODO: Need an easier way to find which properties are itemIds
keys.forEach((key) => { keys.forEach((key) => {
const keyIsItemId = (key !== 'styles') && if ((key !== 'styles') &&
(key !== 'staticStyle') && (key !== 'staticStyle') &&
(key !== 'defaultConditionId') && (key !== 'conditionSetIdentifier')) {
(key !== 'selectedConditionId') &&
(key !== 'conditionSetIdentifier');
if (keyIsItemId) {
if (!(newItems.find(item => item.id === key))) { if (!(newItems.find(item => item.id === key))) {
itemsToRemove.push(key); itemsToRemove.push(key);
} }
@ -348,9 +324,6 @@ export default {
} }
let conditionalStyles = []; let conditionalStyles = [];
this.conditionSetDomainObject.configuration.conditionCollection.forEach((conditionConfiguration, index) => { this.conditionSetDomainObject.configuration.conditionCollection.forEach((conditionConfiguration, index) => {
if (conditionConfiguration.isDefault) {
this.selectedConditionId = conditionConfiguration.id;
}
this.conditions[conditionConfiguration.id] = conditionConfiguration; this.conditions[conditionConfiguration.id] = conditionConfiguration;
let foundStyle = this.findStyleByConditionId(conditionConfiguration.id); let foundStyle = this.findStyleByConditionId(conditionConfiguration.id);
if (foundStyle) { if (foundStyle) {
@ -366,27 +339,7 @@ export default {
//we're doing this so that we remove styles for any conditions that have been removed from the condition set //we're doing this so that we remove styles for any conditions that have been removed from the condition set
this.conditionalStyles = conditionalStyles; this.conditionalStyles = conditionalStyles;
this.conditionsLoaded = true; this.conditionsLoaded = true;
this.persist(this.getDomainObjectConditionalStyle(this.selectedConditionId)); this.persist(this.getDomainObjectConditionalStyle());
if (!this.isEditing) {
this.subscribeToConditionSet();
}
},
subscribeToConditionSet() {
if (this.stopProvidingTelemetry) {
this.stopProvidingTelemetry();
}
if (this.conditionSetDomainObject) {
this.openmct.telemetry.request(this.conditionSetDomainObject)
.then(output => {
if (output && output.length) {
this.handleConditionSetResultUpdated(output[0]);
}
});
this.stopProvidingTelemetry = this.openmct.telemetry.subscribe(this.conditionSetDomainObject, this.handleConditionSetResultUpdated.bind(this));
}
},
handleConditionSetResultUpdated(resultData) {
this.selectedConditionId = resultData ? resultData.conditionId : '';
}, },
initializeStaticStyle(objectStyles) { initializeStaticStyle(objectStyles) {
let staticStyle = objectStyles && objectStyles.staticStyle; let staticStyle = objectStyles && objectStyles.staticStyle;
@ -411,19 +364,14 @@ export default {
let found = this.findStyleByConditionId(conditionStyle.conditionId); let found = this.findStyleByConditionId(conditionStyle.conditionId);
if (found) { if (found) {
found.style = conditionStyle.style; found.style = conditionStyle.style;
this.selectedConditionId = found.conditionId;
this.persist(this.getDomainObjectConditionalStyle()); this.persist(this.getDomainObjectConditionalStyle());
} }
}, },
getDomainObjectConditionalStyle(defaultConditionId) { getDomainObjectConditionalStyle() {
let objectStyle = { let objectStyle = {
styles: this.conditionalStyles, styles: this.conditionalStyles,
staticStyle: this.staticStyle, staticStyle: this.staticStyle
selectedConditionId: this.selectedConditionId
}; };
if (defaultConditionId) {
objectStyle.defaultConditionId = defaultConditionId;
}
if (this.conditionSetDomainObject) { if (this.conditionSetDomainObject) {
objectStyle.conditionSetIdentifier = this.conditionSetDomainObject.identifier; objectStyle.conditionSetIdentifier = this.conditionSetDomainObject.identifier;
} }
@ -445,10 +393,6 @@ export default {
getCondition(id) { getCondition(id) {
return this.conditions ? this.conditions[id] : {}; return this.conditions ? this.conditions[id] : {};
}, },
applySelectedConditionStyle(conditionId) {
this.selectedConditionId = conditionId;
this.persist(this.getDomainObjectConditionalStyle());
},
persist(style) { persist(style) {
this.openmct.objects.mutate(this.domainObject, 'configuration.objectStyles', style); this.openmct.objects.mutate(this.domainObject, 'configuration.objectStyles', style);
} }

View File

@ -60,31 +60,6 @@
&__condition { &__condition {
@include discreteItem(); @include discreteItem();
border: 1px solid transparent;
pointer-events: none; // Prevent selecting when the object isn't being edited
&.is-current {
$c: $colorBodyFg;
border-color: rgba($c, 0.5);
background: rgba($c, 0.2);
}
.is-editing & {
cursor: pointer;
pointer-events: initial;
transition: $transOut;
&:hover {
background: rgba($colorBodyFg, 0.1);
transition: $transIn;
}
&.is-current {
$c: $editUIColorBg;
border-color: $c;
background: rgba($c, 0.1);
}
}
} }
.c-style { .c-style {

View File

@ -22,7 +22,6 @@
import TelemetryCriterion from './TelemetryCriterion'; import TelemetryCriterion from './TelemetryCriterion';
import { evaluateResults } from "../utils/evaluator"; import { evaluateResults } from "../utils/evaluator";
import { getLatestTimestamp } from '../utils/time';
export default class AllTelemetryCriterion extends TelemetryCriterion { export default class AllTelemetryCriterion extends TelemetryCriterion {
@ -48,21 +47,6 @@ export default class AllTelemetryCriterion extends TelemetryCriterion {
updateTelemetry(telemetryObjects) { updateTelemetry(telemetryObjects) {
this.telemetryObjects = { ...telemetryObjects }; this.telemetryObjects = { ...telemetryObjects };
this.removeTelemetryDataCache();
}
removeTelemetryDataCache() {
const telemetryCacheIds = Object.keys(this.telemetryDataCache);
Object.values(this.telemetryObjects).forEach(telemetryObject => {
const id = this.openmct.objects.makeKeyString(telemetryObject.identifier);
const foundIndex = telemetryCacheIds.indexOf(id);
if (foundIndex > -1) {
telemetryCacheIds.splice(foundIndex, 1);
}
});
telemetryCacheIds.forEach(id => {
delete (this.telemetryDataCache[id]);
});
} }
formatData(data, telemetryObjects) { formatData(data, telemetryObjects) {
@ -108,53 +92,40 @@ export default class AllTelemetryCriterion extends TelemetryCriterion {
this.result = evaluateResults(Object.values(this.telemetryDataCache), this.telemetry); this.result = evaluateResults(Object.values(this.telemetryDataCache), this.telemetry);
} }
requestLAD(telemetryObjects) { requestLAD(options) {
const options = { options = Object.assign({},
options,
{
strategy: 'latest', strategy: 'latest',
size: 1 size: 1
}; }
);
if (!this.isValid()) { if (!this.isValid()) {
return this.formatData({}, telemetryObjects); return this.formatData({}, options.telemetryObjects);
} }
let keys = Object.keys(Object.assign({}, telemetryObjects)); let keys = Object.keys(Object.assign({}, options.telemetryObjects));
const telemetryRequests = keys const telemetryRequests = keys
.map(key => this.openmct.telemetry.request( .map(key => this.openmct.telemetry.request(
telemetryObjects[key], options.telemetryObjects[key],
options options
)); ));
let telemetryDataCache = {};
return Promise.all(telemetryRequests) return Promise.all(telemetryRequests)
.then(telemetryRequestsResults => { .then(telemetryRequestsResults => {
let latestTimestamp; let latestDatum;
const timeSystems = this.openmct.time.getAllTimeSystems();
const timeSystem = this.openmct.time.timeSystem();
telemetryRequestsResults.forEach((results, index) => { telemetryRequestsResults.forEach((results, index) => {
const latestDatum = results.length ? results[results.length - 1] : {}; latestDatum = results.length ? results[results.length - 1] : {};
const datumId = keys[index]; if (index < telemetryRequestsResults.length-1) {
const normalizedDatum = this.createNormalizedDatum(latestDatum, telemetryObjects[datumId]); if (latestDatum) {
this.telemetryDataCache[latestDatum.id] = this.computeResult(latestDatum);
telemetryDataCache[datumId] = this.computeResult(normalizedDatum); }
}
latestTimestamp = getLatestTimestamp(
latestTimestamp,
normalizedDatum,
timeSystems,
timeSystem
);
}); });
const datum = {
result: evaluateResults(Object.values(telemetryDataCache), this.telemetry),
...latestTimestamp
};
return { return {
id: this.id, id: this.id,
data: datum data: this.formatData(latestDatum, options.telemetryObjects)
}; };
}); });
} }

View File

@ -61,21 +61,6 @@ export default class TelemetryCriterion extends EventEmitter {
this.telemetryObject = telemetryObjects[this.telemetryObjectIdAsString]; this.telemetryObject = telemetryObjects[this.telemetryObjectIdAsString];
} }
createNormalizedDatum(telemetryDatum, endpoint) {
const id = this.openmct.objects.makeKeyString(endpoint.identifier);
const metadata = this.openmct.telemetry.getMetadata(endpoint).valueMetadatas;
const normalizedDatum = Object.values(metadata).reduce((datum, metadatum) => {
const formatter = this.openmct.telemetry.getValueFormatter(metadatum);
datum[metadatum.key] = formatter.parse(telemetryDatum[metadatum.source]);
return datum;
}, {});
normalizedDatum.id = id;
return normalizedDatum;
}
formatData(data) { formatData(data) {
const datum = { const datum = {
result: this.computeResult(data) result: this.computeResult(data)
@ -94,11 +79,14 @@ export default class TelemetryCriterion extends EventEmitter {
this.result = this.computeResult(validatedData); this.result = this.computeResult(validatedData);
} }
requestLAD() { requestLAD(options) {
const options = { options = Object.assign({},
options,
{
strategy: 'latest', strategy: 'latest',
size: 1 size: 1
}; }
);
if (!this.isValid()) { if (!this.isValid()) {
return { return {
@ -112,11 +100,9 @@ export default class TelemetryCriterion extends EventEmitter {
options options
).then(results => { ).then(results => {
const latestDatum = results.length ? results[results.length - 1] : {}; const latestDatum = results.length ? results[results.length - 1] : {};
const normalizedDatum = this.createNormalizedDatum(latestDatum, this.telemetryObject);
return { return {
id: this.id, id: this.id,
data: this.formatData(normalizedDatum) data: this.formatData(latestDatum)
}; };
}); });
} }

View File

@ -34,10 +34,6 @@ const convertToStrings = (input) => {
return stringInputs; return stringInputs;
}; };
const joinValues = (values, length) => {
return values.slice(0, length).join(', ');
};
export const OPERATIONS = [ export const OPERATIONS = [
{ {
name: 'equalTo', name: 'equalTo',
@ -48,7 +44,7 @@ export const OPERATIONS = [
appliesTo: ['number'], appliesTo: ['number'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' is ' + joinValues(values, 1); return ' is ' + values.join(', ');
} }
}, },
{ {
@ -60,7 +56,7 @@ export const OPERATIONS = [
appliesTo: ['number'], appliesTo: ['number'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' is not ' + joinValues(values, 1); return ' is not ' + values.join(', ');
} }
}, },
{ {
@ -72,7 +68,7 @@ export const OPERATIONS = [
appliesTo: ['number'], appliesTo: ['number'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' > ' + joinValues(values, 1); return ' > ' + values.join(', ');
} }
}, },
{ {
@ -84,7 +80,7 @@ export const OPERATIONS = [
appliesTo: ['number'], appliesTo: ['number'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' < ' + joinValues(values, 1); return ' < ' + values.join(', ');
} }
}, },
{ {
@ -96,7 +92,7 @@ export const OPERATIONS = [
appliesTo: ['number'], appliesTo: ['number'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' >= ' + joinValues(values, 1); return ' >= ' + values.join(', ');
} }
}, },
{ {
@ -108,7 +104,7 @@ export const OPERATIONS = [
appliesTo: ['number'], appliesTo: ['number'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' <= ' + joinValues(values, 1); return ' <= ' + values.join(', ');
} }
}, },
{ {
@ -150,7 +146,7 @@ export const OPERATIONS = [
appliesTo: ['string'], appliesTo: ['string'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' contains ' + joinValues(values, 1); return ' contains ' + values.join(', ');
} }
}, },
{ {
@ -162,7 +158,7 @@ export const OPERATIONS = [
appliesTo: ['string'], appliesTo: ['string'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' does not contain ' + joinValues(values, 1); return ' does not contain ' + values.join(', ');
} }
}, },
{ {
@ -174,7 +170,7 @@ export const OPERATIONS = [
appliesTo: ['string'], appliesTo: ['string'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' starts with ' + joinValues(values, 1); return ' starts with ' + values.join(', ');
} }
}, },
{ {
@ -186,7 +182,7 @@ export const OPERATIONS = [
appliesTo: ['string'], appliesTo: ['string'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' ends with ' + joinValues(values, 1); return ' ends with ' + values.join(', ');
} }
}, },
{ {
@ -198,7 +194,7 @@ export const OPERATIONS = [
appliesTo: ['string'], appliesTo: ['string'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' is exactly ' + joinValues(values, 1); return ' is exactly ' + values.join(', ');
} }
}, },
{ {
@ -235,7 +231,7 @@ export const OPERATIONS = [
appliesTo: ['enum'], appliesTo: ['enum'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' is ' + joinValues(values, 1); return ' is ' + values.join(', ');
} }
}, },
{ {
@ -248,7 +244,7 @@ export const OPERATIONS = [
appliesTo: ['enum'], appliesTo: ['enum'],
inputCount: 1, inputCount: 1,
getDescription: function (values) { getDescription: function (values) {
return ' is not ' + joinValues(values, 1); return ' is not ' + values.join(', ');
} }
}, },
{ {

View File

@ -52,7 +52,7 @@ export default {
}, },
initObjectStyles() { initObjectStyles() {
if (!this.styleRuleManager) { if (!this.styleRuleManager) {
this.styleRuleManager = new StyleRuleManager(this.objectStyle, this.openmct, this.updateStyle.bind(this), true); this.styleRuleManager = new StyleRuleManager(this.objectStyle, this.openmct, this.updateStyle.bind(this));
} else { } else {
this.styleRuleManager.updateObjectStyleConfig(this.objectStyle); this.styleRuleManager.updateObjectStyleConfig(this.objectStyle);
} }

View File

@ -162,31 +162,19 @@ export default {
}).show(this.embed.snapshot.src); }).show(this.embed.snapshot.src);
}, },
changeLocation() { changeLocation() {
this.openmct.time.stopClock();
this.openmct.time.bounds({
start: this.embed.bounds.start,
end: this.embed.bounds.end
});
const link = this.embed.historicLink; const link = this.embed.historicLink;
if (!link) { if (!link) {
return; return;
} }
const bounds = this.openmct.time.bounds();
const isTimeBoundChanged = this.embed.bounds.start !== bounds.start
&& this.embed.bounds.end !== bounds.end;
const isFixedTimespanMode = !this.openmct.time.clock();
window.location.href = link; window.location.href = link;
const message = 'Time bounds changed to fixed timespan mode';
let message = '';
if (isTimeBoundChanged) {
this.openmct.time.bounds({
start: this.embed.bounds.start,
end: this.embed.bounds.end
});
message = 'Time bound values changed';
}
if (!isFixedTimespanMode) {
message = 'Time bound values changed to fixed timespan mode';
}
this.openmct.notifications.alert(message); this.openmct.notifications.alert(message);
}, },
formatTime(unixTime, timeFormat) { formatTime(unixTime, timeFormat) {

View File

@ -221,7 +221,7 @@ export default {
return position; return position;
}, },
formatTime(unixTime, timeFormat) { formatTime(unixTime, timeFormat) {
return Moment.utc(unixTime).format(timeFormat); return Moment(unixTime).format(timeFormat);
}, },
moveSnapshot(snapshotId) { moveSnapshot(snapshotId) {
const snapshot = this.snapshotContainer.getSnapshot(snapshotId); const snapshot = this.snapshotContainer.getSnapshot(snapshotId);

View File

@ -40,18 +40,6 @@ export default {
default() { default() {
return {}; return {};
} }
},
ignoreLink: {
type: Boolean,
default() {
return false;
}
},
objectPath: {
type: Array,
default() {
return null;
}
} }
}, },
data() { data() {
@ -109,27 +97,17 @@ export default {
this.showMenu = false; this.showMenu = false;
}, },
snapshot(notebook) { snapshot(notebook) {
this.hideMenu(); let element = document.getElementsByClassName("l-shell__main-container")[0];
this.$nextTick(() => {
const element = document.querySelector('.c-overlay__contents')
|| document.getElementsByClassName('l-shell__main-container')[0];
const bounds = this.openmct.time.bounds(); const bounds = this.openmct.time.bounds();
const link = !this.ignoreLink const objectPath = this.openmct.router.path;
? window.location.href
: null;
const objectPath = this.objectPath || this.openmct.router.path;
const snapshotMeta = { const snapshotMeta = {
bounds, bounds,
link, link: window.location.href,
objectPath, objectPath,
openmct: this.openmct openmct: this.openmct
}; };
this.notebookSnapshot.capture(snapshotMeta, notebook.type, element); this.notebookSnapshot.capture(snapshotMeta, notebook.type, element);
});
} }
} }
} }

View File

@ -495,7 +495,7 @@ export default {
return; return;
} }
if (id !== defaultNotebookSection.id) { if (section.id !== defaultNotebookSection.id) {
return; return;
} }

View File

@ -21,7 +21,7 @@
--> -->
<div ng-controller="StackedPlotController as stackedPlot" <div ng-controller="StackedPlotController as stackedPlot"
class="c-plot c-plot--stacked holder holder-plot has-control-bar"> class="c-plot c-plot--stacked holder holder-plot has-control-bar">
<div class="c-control-bar" ng-show="!stackedPlot.hideExportButtons"> <div class="l-control-bar" ng-show="!stackedPlot.hideExportButtons">
<span class="c-button-set c-button-set--strip-h"> <span class="c-button-set c-button-set--strip-h">
<button class="c-button icon-download" <button class="c-button icon-download"
ng-click="stackedPlot.exportPNG()" ng-click="stackedPlot.exportPNG()"

View File

@ -54,7 +54,6 @@ function (
* @constructor * @constructor
*/ */
function MCTChartController($scope) { function MCTChartController($scope) {
this.$onInit = () => {
this.$scope = $scope; this.$scope = $scope;
this.isDestroyed = false; this.isDestroyed = false;
this.lines = []; this.lines = [];
@ -77,7 +76,6 @@ function (
this.$scope.$watch('rectangles', this.scheduleDraw); this.$scope.$watch('rectangles', this.scheduleDraw);
this.config.series.forEach(this.onSeriesAdd, this); this.config.series.forEach(this.onSeriesAdd, this);
} }
}
eventHelpers.extend(MCTChartController.prototype); eventHelpers.extend(MCTChartController.prototype);

View File

@ -34,7 +34,6 @@ define([
* values near the cursor. * values near the cursor.
*/ */
function MCTPlotController($scope, $element, $window) { function MCTPlotController($scope, $element, $window) {
this.$onInit = () => {
this.$scope = $scope; this.$scope = $scope;
this.$scope.config = this.config; this.$scope.config = this.config;
this.$scope.plot = this; this.$scope.plot = this;
@ -55,7 +54,6 @@ define([
this.initialize(); this.initialize();
} }
}
MCTPlotController.$inject = ['$scope', '$element', '$window']; MCTPlotController.$inject = ['$scope', '$element', '$window'];

View File

@ -114,7 +114,6 @@ define([
} }
function MCTTicksController($scope, $element) { function MCTTicksController($scope, $element) {
this.$onInit = () => {
this.$scope = $scope; this.$scope = $scope;
this.$element = $element; this.$element = $element;
@ -125,7 +124,6 @@ define([
this.listenTo(this.$scope, '$destroy', this.stopListening, this); this.listenTo(this.$scope, '$destroy', this.stopListening, this);
this.updateTicks(); this.updateTicks();
} }
}
MCTTicksController.$inject = ['$scope', '$element']; MCTTicksController.$inject = ['$scope', '$element'];

View File

@ -81,8 +81,7 @@ define(
clonedElement.classList.add(className); clonedElement.classList.add(className);
} }
element.id = oldId; element.id = oldId;
}, }
removeContainer: true // Set to false to debug what html2canvas renders
}).then(function (canvas) { }).then(function (canvas) {
dialog.dismiss(); dialog.dismiss();
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {

View File

@ -1,35 +0,0 @@
export default class PlotlyTelemetryProvider {
constructor(openmct) {
this.openmct = openmct;
}
isTelemetryObject(domainObject) {
return domainObject.type === 'plotlyPlot';
}
supportsRequest(domainObject) {
return domainObject.type === 'plotlyPlot';
}
supportsSubscribe(domainObject) {
return domainObject.type === 'plotlyPlot';
}
request(domainObject) {
// let conditionManager = this.getConditionManager(domainObject);
// return conditionManager.requestLADConditionSetOutput()
// .then(latestOutput => {
// return latestOutput;
// });
}
subscribe(domainObject, callback) {
// let conditionManager = this.getConditionManager(domainObject);
// conditionManager.on('conditionSetResultUpdated', callback);
// return this.destroyConditionManager.bind(this, this.openmct.objects.makeKeyString(domainObject.identifier));
}
}

View File

@ -1,73 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2019, 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 PlotlyViewLayout from './components/PlotlyViewLayout.vue';
import Vue from 'vue';
export default function PlotlyViewProvider(openmct) {
return {
key: 'plotlyPlot',
name: 'Plotly Plot',
cssClass: 'icon-plot-overlay',
canView: function (domainObject) {
return domainObject.type === 'plotlyPlot';
},
canEdit: function (domainObject) {
return domainObject.type === 'plotlyPlot';
},
view: function (domainObject, objectPath) {
let component;
return {
show: function (element, isEditing) {
component = new Vue({
provide: {
openmct,
domainObject,
objectPath
},
el: element,
components: {
PlotlyViewLayout
},
data() {
return {
isEditing
}
},
template: '<plotly-view-layout :isEditing="isEditing"></plotly-view-layout>'
});
},
onEditModeChange: function (isEditing) {
component.isEditing = isEditing;
},
destroy: function (element) {
component.$destroy();
component = undefined;
}
};
},
priority: function () {
return 1;
}
};
}

View File

@ -1,138 +0,0 @@
<template>
<div class="l-view-section"></div>
</template>
<script>
import Plotly from 'plotly.js-dist';
import moment from 'moment'
export default {
inject: ['openmct', 'domainObject', 'objectPath'],
data: function () {
return {
telemetryObjects: []
// currentDomainObject: this.domainObject
}
},
mounted() {
this.composition = this.openmct.composition.get(this.domainObject);
this.composition.on('add', this.addTelemetry);
this.composition.load();
this.metadata = this.openmct.telemetry.getMetadata(this.domainObject);
console.log('this.metadata', this.metadata);
// this.keystring = this.openmct.objects.makeKeyString(this.domainObject.identifier);
// this.subscribe(this.domainObject);
this.plotElement = document.querySelector('.l-view-section');
// Plotly.newPlot(this.plotElement, [{
// x: [1, 2, 3, 4, 5],
// y: [1, 2, 4, 8, 16]
// }], this.getLayout(), {displayModeBar: false});
},
methods: {
getLayout() {
return {
hovermode: 'compare',
hoverdistance: -1,
autosize: "true",
showlegend: false,
font: {
family: "'Helvetica Neue', Helvetica, Arial, sans-serif",
size: "12px",
color: "#666"
},
xaxis: {
// title: this.plotAxisTitle.xAxisTitle,
zeroline: false
},
yaxis: {
// title: this.plotAxisTitle.yAxisTitle,
zeroline: false
},
margin: {
l: 20,
r: 10,
b: 20,
t: 10
},
paper_bgcolor: 'transparent',
plot_bgcolor: 'transparent'
}
},
addTelemetry(telemetryObject) {
return this.openmct.telemetry.request(telemetryObject)
.then(telemetryData => {
this.createPlot(telemetryData, telemetryObject);
}, () => {console.log(error)});
},
formatDatumX(datum) {
let timestamp = moment.utc(datum.utc).format('YYYY-MM-DD hh:mm:ss.ms');
return timestamp;
},
formatDatumY(datum) {
return datum.sin;
},
createPlot(telemetryData, telemetryObject) {
let x = [],
y = [];
telemetryData.forEach((datum, index) => {
x.push(this.formatDatumX(datum));
y.push(this.formatDatumY(datum));
})
let data = [{
x,
y,
mode: 'line'
}];
var layout = {
title:'Line and Scatter Plot'
};
Plotly.newPlot(
this.plotElement,
data,
this.getLayout()
)
this.subscribe(telemetryObject);
},
subscribe(domainObject) {
// this.date = ''
// this.openmct.objects.get(this.keystring)
// .then((object) => {
// const metadata = this.openmct.telemetry.getMetadata(this.domainObject);
// console.log('metadata', metadata);
// // this.timeKey = this.openmct.time.timeSystem().key;
// // this.timeFormat = this.openmct.telemetry.getValueFormatter(metadata.value(this.timeKey));
// // // this.imageFormat = this.openmct.telemetry.getValueFormatter(metadata.valuesForHints(['image'])[0]);
// // this.unsubscribe = this.openmct.telemetry
// // .subscribe(this.domainObject, (datum) => {
// // this.updateHistory(datum);
// // this.updateValues(datum);
// // });
// // this.requestHistory(this.openmct.time.bounds());
// });
this.openmct.telemetry.subscribe(domainObject, (datum) => {
this.updateData(datum)
})
},
updateData(datum) {
Plotly.extendTraces(
this.plotElement,
{
x: [[this.formatDatumX(datum)]],
y: [[this.formatDatumY(datum)]]
},
[0]
);
}
}
}
</script>

View File

@ -1,2 +0,0 @@
.plot svg {
}

View File

@ -1,20 +0,0 @@
import PlotlyViewProvider from './PlotlyViewProvider.js';
import PlotlyTelemetryProvider from './PlotlyTelemetryProvider.js';
export default function () {
return function install(openmct) {
openmct.objectViews.addProvider(new PlotlyViewProvider(openmct));
openmct.telemetry.addProvider(new PlotlyTelemetryProvider(openmct));
openmct.types.addType('plotlyPlot', {
name: "Plotly Plot",
description: "Simple plot rendered by plotly.js",
creatable: true,
cssClass: 'icon-plot-overlay',
initialize: function (domainObject) {
domainObject.composition = [];
domainObject.telemetry = {};
}
});
};
}

View File

@ -34,7 +34,6 @@ define([
'./URLIndicatorPlugin/URLIndicatorPlugin', './URLIndicatorPlugin/URLIndicatorPlugin',
'./telemetryMean/plugin', './telemetryMean/plugin',
'./plot/plugin', './plot/plugin',
'./plotlyPlot/plugin',
'./telemetryTable/plugin', './telemetryTable/plugin',
'./staticRootPlugin/plugin', './staticRootPlugin/plugin',
'./notebook/plugin', './notebook/plugin',
@ -67,7 +66,6 @@ define([
URLIndicatorPlugin, URLIndicatorPlugin,
TelemetryMean, TelemetryMean,
PlotPlugin, PlotPlugin,
PlotlyPlotPlugin,
TelemetryTablePlugin, TelemetryTablePlugin,
StaticRootPlugin, StaticRootPlugin,
Notebook, Notebook,
@ -90,8 +88,7 @@ define([
var bundleMap = { var bundleMap = {
LocalStorage: 'platform/persistence/local', LocalStorage: 'platform/persistence/local',
MyItems: 'platform/features/my-items', MyItems: 'platform/features/my-items',
CouchDB: 'platform/persistence/couch', CouchDB: 'platform/persistence/couch'
Elasticsearch: 'platform/persistence/elastic'
}; };
var plugins = _.mapValues(bundleMap, function (bundleName, pluginName) { var plugins = _.mapValues(bundleMap, function (bundleName, pluginName) {
@ -173,8 +170,8 @@ define([
plugins.ExampleImagery = ExampleImagery; plugins.ExampleImagery = ExampleImagery;
plugins.ImageryPlugin = ImageryPlugin; plugins.ImageryPlugin = ImageryPlugin;
plugins.Plot = PlotPlugin; plugins.Plot = PlotPlugin;
plugins.PlotlyPlot = PlotlyPlotPlugin.default;
plugins.TelemetryTable = TelemetryTablePlugin; plugins.TelemetryTable = TelemetryTablePlugin;
plugins.SummaryWidget = SummaryWidget; plugins.SummaryWidget = SummaryWidget;
plugins.TelemetryMean = TelemetryMean; plugins.TelemetryMean = TelemetryMean;
plugins.URLIndicator = URLIndicatorPlugin; plugins.URLIndicator = URLIndicatorPlugin;

View File

@ -165,16 +165,7 @@
/******************************* LEGACY */ /******************************* LEGACY */
.s-status-taking-snapshot, .s-status-taking-snapshot,
.overlay.snapshot { .overlay.snapshot {
.c-table { // Handle overflow-y issues with tables and html2canvas
&__body-w { // Replaces .l-sticky-headers .l-tabular-body { overflow: auto; }
overflow: auto; // Handle overflow-y issues with tables and html2canvas .c-table__body-w { overflow: auto; }
}
&-control-bar {
display: none;
+ * {
margin-top: 0 !important;
}
}
}
} }

View File

@ -565,20 +565,6 @@ select {
} }
} }
} }
/******************************************************** CONTROL BARS */
.c-control-bar {
display: flex;
align-items: center;
> * + * {
margin-left: $interiorMarginSm;
}
&__label {
display: inline-block;
white-space: nowrap;
}
}
/******************************************************** PALETTES */ /******************************************************** PALETTES */
.c-palette { .c-palette {

View File

@ -40,51 +40,17 @@ mct-plot {
} }
} }
} }
.c-plot,
.gl-plot {
.s-status-taking-snapshot & {
.c-control-bar {
display: none;
}
.gl-plot-y-label__select {
display: none;
}
}
}
.c-plot { .c-plot {
//$p: $mainViewPad; $p: $mainViewPad;
@include abs($mainViewPad); position: absolute;
//position: absolute; top: $p; right: $p; bottom: $p; left: $p;
//top: $p; right: $p; bottom: $p; left: $p;
display: flex;
flex-direction: column;
> * + * {
margin-top: $interiorMargin;
}
.l-control-bar {
flex: 0 0 auto;
}
.l-view-section {
display: flex;
flex: 1 1 auto;
flex-direction: column;
}
&--stacked { &--stacked {
.child-frame { .l-view-section {
.has-control-bar { // Make this a flex container
.c-control-bar { display: flex;
// Hides buttons per plot element in a stacked plot flex-flow: column nowrap;
display: none; .gl-plot.child-frame {
}
}
mct-plot { mct-plot {
display: flex; display: flex;
flex: 1 1 auto; flex: 1 1 auto;
@ -92,6 +58,10 @@ mct-plot {
position: relative; position: relative;
} }
flex: 1 1 auto; flex: 1 1 auto;
&:not(:first-child) {
margin-top: $interiorMargin;
}
}
} }
.s-status-timeconductor-unsynced .holder-plot { .s-status-timeconductor-unsynced .holder-plot {
@ -100,6 +70,7 @@ mct-plot {
} }
} }
} }
} }
@ -215,7 +186,7 @@ mct-plot {
left: 0; top: 0; right: auto; bottom: 0; left: 0; top: 0; right: auto; bottom: 0;
padding-left: 5px; padding-left: 5px;
text-orientation: mixed; text-orientation: mixed;
//overflow: hidden; overflow: hidden;
writing-mode: vertical-lr; writing-mode: vertical-lr;
&:before { &:before {
// Icon denoting configurability // Icon denoting configurability
@ -368,11 +339,11 @@ mct-plot {
z-index: -10; z-index: -10;
.l-view-section { .l-view-section {
//$m: $interiorMargin; $m: $interiorMargin;
//top: $m !important; top: $m !important;
//right: $m; right: $m;
//bottom: $m; bottom: $m;
//left: $m; left: $m;
.s-status-timeconductor-unsynced .holder-plot { .s-status-timeconductor-unsynced .holder-plot {
.t-object-alert.t-alert-unsynced { .t-object-alert.t-alert-unsynced {

View File

@ -19,6 +19,53 @@
* 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.
*****************************************************************************/ *****************************************************************************/
/******************************************************************* VIEWS */
// From _views.scss
// Legacy overlay and stacked plots depend on this for now
// Styles for sub-dividing views generically
.l-control-bar {
// Element that can be placed above l-view-section, holds controls, buttons, etc.
height: $controlBarH;
}
.c-control-bar {
display: flex;
align-items: center;
> * + * {
margin-left: $interiorMarginSm;
}
&__label {
display: inline-block;
white-space: nowrap;
}
}
.l-view-section {
@include abs();
overflow: auto;
}
.has-control-bar {
.l-view-section {
top: $controlBarH + $interiorMargin;
}
}
.child-frame {
.has-control-bar {
.l-control-bar,
.c-control-bar {
// Hides buttons per plot element in a stacked plot
display: none;
}
.l-view-section {
top: 0;
}
}
}
/*********************************************************************** CLOCKS AND TIMERS */ /*********************************************************************** CLOCKS AND TIMERS */
.c-clock, .c-clock,
.c-timer { .c-timer {

View File

@ -388,21 +388,7 @@
.s-status-taking-snapshot, .s-status-taking-snapshot,
.overlay.snapshot { .overlay.snapshot {
// Handle overflow-y issues with tables and html2canvas // Handle overflow-y issues with tables and html2canvas
background: $colorBodyBg; // Prevent html2canvas from using white background
color: $colorBodyFg;
padding: $interiorMarginSm !important; // Prevents items from going right to the edge of the image
.l-sticky-headers .l-tabular-body { overflow: auto; } .l-sticky-headers .l-tabular-body { overflow: auto; }
.l-browse-bar {
display: none; // Suppress browse-bar when snapshotting from view-large overlay
+ * {
margin-top: 0 !important; // Remove margin from any following elements
}
}
* {
box-shadow: none !important; // Prevent html2canvas problems with box-shadow
}
} }
.c-notebook-snapshot { .c-notebook-snapshot {

View File

@ -18,7 +18,6 @@
@import "../plugins/folderView/components/list-item.scss"; @import "../plugins/folderView/components/list-item.scss";
@import "../plugins/folderView/components/list-view.scss"; @import "../plugins/folderView/components/list-view.scss";
@import "../plugins/imagery/components/imagery-view-layout.scss"; @import "../plugins/imagery/components/imagery-view-layout.scss";
@import "../plugins/plotlyPlot/components/plotly.scss";
@import "../plugins/telemetryTable/components/table-row.scss"; @import "../plugins/telemetryTable/components/table-row.scss";
@import "../plugins/telemetryTable/components/telemetry-filter-indicator.scss"; @import "../plugins/telemetryTable/components/telemetry-filter-indicator.scss";
@import "../plugins/tabs/components/tabs.scss"; @import "../plugins/tabs/components/tabs.scss";

View File

@ -1,6 +1,8 @@
import MCT from 'MCT'; import MCT from 'MCT';
export function createOpenMct() { export function createOpenMct() {
delete require.cache[require.resolve('openmct')];
const openmct = new MCT(); const openmct = new MCT();
openmct.install(openmct.plugins.LocalStorage()); openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.UTCTimeSystem()); openmct.install(openmct.plugins.UTCTimeSystem());

View File

@ -59,8 +59,6 @@
<script> <script>
import ObjectView from './ObjectView.vue' import ObjectView from './ObjectView.vue'
import ContextMenuDropDown from './contextMenuDropDown.vue'; import ContextMenuDropDown from './contextMenuDropDown.vue';
import PreviewHeader from '@/ui/preview/preview-header.vue';
import Vue from 'vue';
const SIMPLE_CONTENT_TYPES = [ const SIMPLE_CONTENT_TYPES = [
'clock', 'clock',
@ -118,41 +116,13 @@ export default {
childElement = parentElement.children[0]; childElement = parentElement.children[0];
this.openmct.overlays.overlay({ this.openmct.overlays.overlay({
element: this.getOverlayElement(childElement), element: childElement,
size: 'large', size: 'large',
onDestroy() { onDestroy() {
parentElement.append(childElement); parentElement.append(childElement);
} }
}); });
}, },
getOverlayElement(childElement) {
const fragment = new DocumentFragment();
const header = this.getPreviewHeader();
fragment.append(header);
fragment.append(childElement);
return fragment;
},
getPreviewHeader() {
const domainObject = this.objectPath[0];
const preview = new Vue({
components: {
PreviewHeader
},
provide: {
openmct: this.openmct,
objectPath: this.objectPath
},
data() {
return {
domainObject
}
},
template: '<PreviewHeader :domainObject="domainObject" :hideViewSwitcher="true" :showNotebookMenuSwitcher="true"></PreviewHeader>'
});
return preview.$mount().$el;
},
getSelectionContext() { getSelectionContext() {
return this.$refs.objectView.getSelectionContext(); return this.$refs.objectView.getSelectionContext();
} }

View File

@ -201,7 +201,7 @@ export default {
}, },
initObjectStyles() { initObjectStyles() {
if (!this.styleRuleManager) { if (!this.styleRuleManager) {
this.styleRuleManager = new StyleRuleManager((this.currentObject.configuration && this.currentObject.configuration.objectStyles), this.openmct, this.updateStyle.bind(this), true); this.styleRuleManager = new StyleRuleManager((this.currentObject.configuration && this.currentObject.configuration.objectStyles), this.openmct, this.updateStyle.bind(this));
} else { } else {
this.styleRuleManager.updateObjectStyleConfig(this.currentObject.configuration && this.currentObject.configuration.objectStyles); this.styleRuleManager.updateObjectStyleConfig(this.currentObject.configuration && this.currentObject.configuration.objectStyles);
} }

View File

@ -23,12 +23,9 @@
} }
&:not(.c-so-view--no-frame) { &:not(.c-so-view--no-frame) {
background: $colorBodyBg;
border: $browseFrameBorder; border: $browseFrameBorder;
padding: $interiorMargin; padding: $interiorMargin;
.is-editing & {
background: rgba($colorBodyBg, 0.8);
}
} }
&--no-frame { &--no-frame {

View File

@ -108,7 +108,7 @@ export default {
let object = selection[0][0].context.item; let object = selection[0][0].context.item;
if (object) { if (object) {
let type = this.openmct.types.get(object.type); let type = this.openmct.types.get(object.type);
this.showStyles = this.isLayoutObject(selection[0], object.type) || this.isCreatableObject(object, type); this.showStyles = (this.excludeObjectTypes.indexOf(object.type) < 0) && type.definition.creatable;
} }
if (!this.currentTabbedView.key || (!this.showStyles && this.currentTabbedView.key === this.tabbedViews[1].key)) if (!this.currentTabbedView.key || (!this.showStyles && this.currentTabbedView.key === this.tabbedViews[1].key))
{ {
@ -116,14 +116,6 @@ export default {
} }
} }
}, },
isLayoutObject(selection, objectType) {
//we allow conditionSets to be styled if they're part of a layout
return selection.length > 1 &&
((objectType === 'conditionSet') || (this.excludeObjectTypes.indexOf(objectType) < 0));
},
isCreatableObject(object, type) {
return (this.excludeObjectTypes.indexOf(object.type) < 0) && type.definition.creatable;
},
updateCurrentTab(view) { updateCurrentTab(view) {
this.currentTabbedView = view; this.currentTabbedView = view;
}, },

View File

@ -36,7 +36,6 @@
<!-- Action buttons --> <!-- Action buttons -->
<NotebookMenuSwitcher v-if="notebookEnabled" <NotebookMenuSwitcher v-if="notebookEnabled"
:domain-object="domainObject" :domain-object="domainObject"
:object-path="openmct.router.path"
class="c-notebook-snapshot-menubutton" class="c-notebook-snapshot-menubutton"
/> />
<div class="l-browse-bar__actions"> <div class="l-browse-bar__actions">
@ -199,6 +198,8 @@ export default {
updateName(event) { updateName(event) {
if (event.target.innerText !== this.domainObject.name && event.target.innerText.match(/\S/)) { if (event.target.innerText !== this.domainObject.name && event.target.innerText.match(/\S/)) {
this.openmct.objects.mutate(this.domainObject, 'name', event.target.innerText); this.openmct.objects.mutate(this.domainObject, 'name', event.target.innerText);
} else {
event.target.innerText = this.domainObject.name;
} }
}, },
updateNameOnEnterKeyPress(event) { updateNameOnEnterKeyPress(event) {

View File

@ -21,12 +21,28 @@
*****************************************************************************/ *****************************************************************************/
<template> <template>
<div class="l-preview-window"> <div class="l-preview-window">
<PreviewHeader <div class="l-browse-bar">
:current-view="currentView" <div class="l-browse-bar__start">
:domain-object="domainObject" <div
class="l-browse-bar__object-name--w"
:class="type.cssClass"
>
<span class="l-browse-bar__object-name">
{{ domainObject.name }}
</span>
<context-menu-drop-down :object-path="objectPath" />
</div>
</div>
<div class="l-browse-bar__end">
<div class="l-browse-bar__actions">
<view-switcher
:views="views" :views="views"
:current-view="currentView"
@setView="setView" @setView="setView"
/> />
</div>
</div>
</div>
<div class="l-preview-window__object-view"> <div class="l-preview-window__object-view">
<div ref="objectView"></div> <div ref="objectView"></div>
</div> </div>
@ -34,11 +50,13 @@
</template> </template>
<script> <script>
import PreviewHeader from './preview-header.vue'; import ContextMenuDropDown from '../../ui/components/contextMenuDropDown.vue';
import ViewSwitcher from '../../ui/layout/ViewSwitcher.vue';
export default { export default {
components: { components: {
PreviewHeader ContextMenuDropDown,
ViewSwitcher
}, },
inject: [ inject: [
'openmct', 'openmct',
@ -46,9 +64,12 @@ export default {
], ],
data() { data() {
let domainObject = this.objectPath[0]; let domainObject = this.objectPath[0];
let type = this.openmct.types.get(domainObject.type);
return { return {
domainObject: domainObject, domainObject: domainObject,
type: type,
notebookEnabled: false,
viewKey: undefined viewKey: undefined
}; };
}, },
@ -76,7 +97,6 @@ export default {
this.view.destroy(); this.view.destroy();
this.$refs.objectView.innerHTML = ''; this.$refs.objectView.innerHTML = '';
} }
delete this.view; delete this.view;
delete this.viewContainer; delete this.viewContainer;
}, },

View File

@ -36,12 +36,7 @@ export default class PreviewAction {
* Dependencies * Dependencies
*/ */
this._openmct = openmct; this._openmct = openmct;
if (PreviewAction.isVisible === undefined) {
PreviewAction.isVisible = false;
} }
}
invoke(objectPath) { invoke(objectPath) {
let preview = new Vue({ let preview = new Vue({
components: { components: {
@ -64,27 +59,16 @@ export default class PreviewAction {
callback: () => overlay.dismiss() callback: () => overlay.dismiss()
} }
], ],
onDestroy: () => { onDestroy: () => preview.$destroy()
PreviewAction.isVisible = false;
preview.$destroy()
}
}); });
PreviewAction.isVisible = true;
} }
appliesTo(objectPath) { appliesTo(objectPath) {
return !PreviewAction.isVisible && !this._isNavigatedObject(objectPath); return !this._isNavigatedObject(objectPath)
} }
_isNavigatedObject(objectPath) { _isNavigatedObject(objectPath) {
let targetObject = objectPath[0]; let targetObject = objectPath[0];
let navigatedObject = this._openmct.router.path[0]; let navigatedObject = this._openmct.router.path[0];
return targetObject.identifier.namespace === navigatedObject.identifier.namespace && return targetObject.identifier.namespace === navigatedObject.identifier.namespace &&
targetObject.identifier.key === navigatedObject.identifier.key; targetObject.identifier.key === navigatedObject.identifier.key;
} }
_preventPreview(objectPath) {
const noPreviewTypes = ['folder'];
return noPreviewTypes.includes(objectPath[0].type);
}
} }

View File

@ -1,92 +0,0 @@
<template>
<div class="l-browse-bar">
<div class="l-browse-bar__start">
<div
class="l-browse-bar__object-name--w"
:class="type.cssClass"
>
<span class="l-browse-bar__object-name">
{{ domainObject.name }}
</span>
<context-menu-drop-down :object-path="objectPath" />
</div>
</div>
<div class="l-browse-bar__end">
<div class="l-browse-bar__actions">
<view-switcher
:v-if="!hideViewSwitcher"
:views="views"
:current-view="currentView"
@setView="setView"
/>
<NotebookMenuSwitcher v-if="showNotebookMenuSwitcher"
:domain-object="domainObject"
:ignore-link="true"
:object-path="objectPath"
class="c-notebook-snapshot-menubutton"
/>
</div>
</div>
</div>
</template>
<script>
import ContextMenuDropDown from '../../ui/components/contextMenuDropDown.vue';
import NotebookMenuSwitcher from '@/plugins/notebook/components/notebook-menu-switcher.vue';
import ViewSwitcher from '../../ui/layout/ViewSwitcher.vue';
export default {
inject: [
'openmct',
'objectPath'
],
components: {
ContextMenuDropDown,
NotebookMenuSwitcher,
ViewSwitcher
},
props: {
currentView: {
type: Object,
default: () => {
return {};
}
},
domainObject: {
type: Object,
default: () => {
return {};
}
},
hideViewSwitcher: {
type: Boolean,
default: () => {
return false;
}
},
showNotebookMenuSwitcher: {
type: Boolean,
default: () => {
return false;
}
},
views: {
type: Array,
default: () => {
return [];
}
}
},
data() {
return {
type: this.openmct.types.get(this.domainObject.type)
};
},
methods: {
setView(view) {
this.$emit('setView', view);
}
}
}
</script>