Compare commits
1 Commits
multi-comp
...
refresh-op
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4992b99aa5 |
@@ -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
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="example">{{ msg }}</div>
|
<div class="example">{{ msg }}</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data () {
|
||||||
return {
|
return {
|
||||||
msg: 'Hello world!'
|
msg: 'Hello world!'
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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,27 +61,27 @@ 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: {
|
||||||
'platform/**/*Spec.js': ['webpack', 'sourcemap'],
|
// add webpack as preprocessor
|
||||||
'src/**/*Spec.js': ['webpack', 'sourcemap']
|
'platform/**/*Spec.js': [ 'webpack', 'sourcemap' ],
|
||||||
|
'src/**/*Spec.js': [ 'webpack', 'sourcemap' ]
|
||||||
},
|
},
|
||||||
webpack: webpackConfig,
|
webpack: webpackConfig,
|
||||||
webpackMiddleware: {
|
webpackMiddleware: {
|
||||||
|
|||||||
14
package.json
14
package.json
@@ -4,7 +4,8 @@
|
|||||||
"description": "The Open MCT core platform",
|
"description": "The Open MCT core platform",
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"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",
|
||||||
@@ -42,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",
|
||||||
@@ -53,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.24.0",
|
"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",
|
||||||
@@ -76,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",
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ define([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "ELASTIC_PATH",
|
"key": "ELASTIC_PATH",
|
||||||
"value": "mct/_doc",
|
"value": "mct/domain_object",
|
||||||
"priority": "fallback"
|
"priority": "fallback"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
export NODE_OPTIONS=--max_old_space_size=4096
|
|
||||||
cross-env COVERAGE=true karma start --single-run
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
:key="action.name"
|
:key="action.name"
|
||||||
:class="action.cssClass"
|
:class="action.cssClass"
|
||||||
:title="action.description"
|
:title="action.description"
|
||||||
@click="action.invoke(objectPath, context)"
|
@click="action.invoke(objectPath)"
|
||||||
>
|
>
|
||||||
{{ action.name }}
|
{{ action.name }}
|
||||||
</li>
|
</li>
|
||||||
@@ -19,6 +19,6 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
inject: ['actions', 'objectPath', 'context']
|
inject: ['actions', 'objectPath']
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class ContextMenuAPI {
|
|||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_showContextMenuForObjectPath(objectPath, x, y, actionsToBeIncluded, context) {
|
_showContextMenuForObjectPath(objectPath, x, y, actionsToBeIncluded) {
|
||||||
|
|
||||||
let applicableActions = this._allActions.filter((action) => {
|
let applicableActions = this._allActions.filter((action) => {
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ class ContextMenuAPI {
|
|||||||
this._hideActiveContextMenu();
|
this._hideActiveContextMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._activeContextMenu = this._createContextMenuForObject(objectPath, applicableActions, context);
|
this._activeContextMenu = this._createContextMenuForObject(objectPath, applicableActions);
|
||||||
this._activeContextMenu.$mount();
|
this._activeContextMenu.$mount();
|
||||||
document.body.appendChild(this._activeContextMenu.$el);
|
document.body.appendChild(this._activeContextMenu.$el);
|
||||||
|
|
||||||
@@ -141,15 +141,14 @@ class ContextMenuAPI {
|
|||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_createContextMenuForObject(objectPath, actions, context) {
|
_createContextMenuForObject(objectPath, actions) {
|
||||||
return new Vue({
|
return new Vue({
|
||||||
components: {
|
components: {
|
||||||
ContextMenu: ContextMenuComponent
|
ContextMenu: ContextMenuComponent
|
||||||
},
|
},
|
||||||
provide: {
|
provide: {
|
||||||
actions: actions,
|
actions: actions,
|
||||||
objectPath: objectPath,
|
objectPath: objectPath
|
||||||
context
|
|
||||||
},
|
},
|
||||||
template: '<ContextMenu></ContextMenu>'
|
template: '<ContextMenu></ContextMenu>'
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -69,7 +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);
|
||||||
@@ -204,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 => {
|
||||||
|
|||||||
@@ -55,8 +55,9 @@ 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
|
||||||
this.updateConditionTelemetry();
|
this.updateConditionTelemetry();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,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() {
|
||||||
@@ -86,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);
|
||||||
@@ -258,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,
|
||||||
@@ -272,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];
|
||||||
@@ -329,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]);
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export default class ConditionSetTelemetryProvider {
|
|||||||
|
|
||||||
return conditionManager.requestLADConditionSetOutput()
|
return conditionManager.requestLADConditionSetOutput()
|
||||||
.then(latestOutput => {
|
.then(latestOutput => {
|
||||||
return latestOutput;
|
return latestOutput ? [latestOutput] : [];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,13 +66,9 @@ 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) {
|
//Only resubscribe if the conditionSet has changed.
|
||||||
this.applySelectedConditionStyle();
|
if (isNewConditionSet) {
|
||||||
} else {
|
this.subscribeToConditionSet();
|
||||||
//Only resubscribe if the conditionSet has changed.
|
|
||||||
if (isNewConditionSet) {
|
|
||||||
this.subscribeToConditionSet();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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({},
|
||||||
strategy: 'latest',
|
options,
|
||||||
size: 1
|
{
|
||||||
};
|
strategy: 'latest',
|
||||||
|
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)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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({},
|
||||||
strategy: 'latest',
|
options,
|
||||||
size: 1
|
{
|
||||||
};
|
strategy: 'latest',
|
||||||
|
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)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(', ');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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];
|
||||||
|
const bounds = this.openmct.time.bounds();
|
||||||
|
const objectPath = this.openmct.router.path;
|
||||||
|
const snapshotMeta = {
|
||||||
|
bounds,
|
||||||
|
link: window.location.href,
|
||||||
|
objectPath,
|
||||||
|
openmct: this.openmct
|
||||||
|
};
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.notebookSnapshot.capture(snapshotMeta, notebook.type, element);
|
||||||
const element = document.querySelector('.c-overlay__contents')
|
|
||||||
|| document.getElementsByClassName('l-shell__main-container')[0];
|
|
||||||
|
|
||||||
const bounds = this.openmct.time.bounds();
|
|
||||||
const link = !this.ignoreLink
|
|
||||||
? window.location.href
|
|
||||||
: null;
|
|
||||||
|
|
||||||
const objectPath = this.objectPath || this.openmct.router.path;
|
|
||||||
const snapshotMeta = {
|
|
||||||
bounds,
|
|
||||||
link,
|
|
||||||
objectPath,
|
|
||||||
openmct: this.openmct
|
|
||||||
};
|
|
||||||
|
|
||||||
this.notebookSnapshot.capture(snapshotMeta, notebook.type, element);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -495,7 +495,7 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id !== defaultNotebookSection.id) {
|
if (section.id !== defaultNotebookSection.id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()"
|
||||||
|
|||||||
@@ -54,29 +54,27 @@ 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 = [];
|
this.pointSets = [];
|
||||||
this.pointSets = [];
|
this.alarmSets = [];
|
||||||
this.alarmSets = [];
|
this.offset = {};
|
||||||
this.offset = {};
|
this.config = $scope.config;
|
||||||
this.config = $scope.config;
|
this.listenTo(this.$scope, '$destroy', this.destroy, this);
|
||||||
this.listenTo(this.$scope, '$destroy', this.destroy, this);
|
this.draw = this.draw.bind(this);
|
||||||
this.draw = this.draw.bind(this);
|
this.scheduleDraw = this.scheduleDraw.bind(this);
|
||||||
this.scheduleDraw = this.scheduleDraw.bind(this);
|
this.seriesElements = new WeakMap();
|
||||||
this.seriesElements = new WeakMap();
|
|
||||||
|
|
||||||
this.listenTo(this.config.series, 'add', this.onSeriesAdd, this);
|
this.listenTo(this.config.series, 'add', this.onSeriesAdd, this);
|
||||||
this.listenTo(this.config.series, 'remove', this.onSeriesRemove, this);
|
this.listenTo(this.config.series, 'remove', this.onSeriesRemove, this);
|
||||||
this.listenTo(this.config.yAxis, 'change:key', this.clearOffset, this);
|
this.listenTo(this.config.yAxis, 'change:key', this.clearOffset, this);
|
||||||
this.listenTo(this.config.xAxis, 'change:key', this.clearOffset, this);
|
this.listenTo(this.config.xAxis, 'change:key', this.clearOffset, this);
|
||||||
this.listenTo(this.config.yAxis, 'change', this.scheduleDraw);
|
this.listenTo(this.config.yAxis, 'change', this.scheduleDraw);
|
||||||
this.listenTo(this.config.xAxis, 'change', this.scheduleDraw);
|
this.listenTo(this.config.xAxis, 'change', this.scheduleDraw);
|
||||||
this.$scope.$watch('highlights', this.scheduleDraw);
|
this.$scope.$watch('highlights', this.scheduleDraw);
|
||||||
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);
|
||||||
|
|||||||
@@ -34,27 +34,25 @@ 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;
|
this.$element = $element;
|
||||||
this.$element = $element;
|
this.$window = $window;
|
||||||
this.$window = $window;
|
|
||||||
|
|
||||||
this.xScale = new LinearScale(this.config.xAxis.get('displayRange'));
|
this.xScale = new LinearScale(this.config.xAxis.get('displayRange'));
|
||||||
this.yScale = new LinearScale(this.config.yAxis.get('displayRange'));
|
this.yScale = new LinearScale(this.config.yAxis.get('displayRange'));
|
||||||
|
|
||||||
this.pan = undefined;
|
this.pan = undefined;
|
||||||
this.marquee = undefined;
|
this.marquee = undefined;
|
||||||
|
|
||||||
this.chartElementBounds = undefined;
|
this.chartElementBounds = undefined;
|
||||||
this.tickUpdate = false;
|
this.tickUpdate = false;
|
||||||
|
|
||||||
this.$scope.plotHistory = this.plotHistory = [];
|
this.$scope.plotHistory = this.plotHistory = [];
|
||||||
this.listenTo(this.$scope, 'plot:clearHistory', this.clear, this);
|
this.listenTo(this.$scope, 'plot:clearHistory', this.clear, this);
|
||||||
|
|
||||||
this.initialize();
|
this.initialize();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MCTPlotController.$inject = ['$scope', '$element', '$window'];
|
MCTPlotController.$inject = ['$scope', '$element', '$window'];
|
||||||
|
|||||||
@@ -114,17 +114,15 @@ define([
|
|||||||
}
|
}
|
||||||
|
|
||||||
function MCTTicksController($scope, $element) {
|
function MCTTicksController($scope, $element) {
|
||||||
this.$onInit = () => {
|
this.$scope = $scope;
|
||||||
this.$scope = $scope;
|
this.$element = $element;
|
||||||
this.$element = $element;
|
|
||||||
|
|
||||||
this.tickCount = 4;
|
this.tickCount = 4;
|
||||||
this.tickUpdate = false;
|
this.tickUpdate = false;
|
||||||
this.listenTo(this.axis, 'change:displayRange', this.updateTicks, this);
|
this.listenTo(this.axis, 'change:displayRange', this.updateTicks, this);
|
||||||
this.listenTo(this.axis, 'change:format', this.updateTicks, this);
|
this.listenTo(this.axis, 'change:format', this.updateTicks, this);
|
||||||
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'];
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -88,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) {
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ export default class RemoveAction {
|
|||||||
this.openmct = openmct;
|
this.openmct = openmct;
|
||||||
}
|
}
|
||||||
|
|
||||||
invoke(objectPath, context) {
|
invoke(objectPath) {
|
||||||
let object = objectPath[0];
|
let object = objectPath[0];
|
||||||
let parent = objectPath[1];
|
let parent = objectPath[1];
|
||||||
this.showConfirmDialog(object).then(() => {
|
this.showConfirmDialog(object).then(() => {
|
||||||
this.removeFromComposition(parent, object, context.sequenceNumber);
|
this.removeFromComposition(parent, object);
|
||||||
if (this.inNavigationPath(object)) {
|
if (this.inNavigationPath(object)) {
|
||||||
this.navigateTo(objectPath.slice(1));
|
this.navigateTo(objectPath.slice(1));
|
||||||
}
|
}
|
||||||
@@ -79,21 +79,23 @@ export default class RemoveAction {
|
|||||||
window.location.href = '#/browse/' + urlPath;
|
window.location.href = '#/browse/' + urlPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
removeFromComposition(parent, child, sequenceNumber) {
|
removeFromComposition(parent, child) {
|
||||||
this.openmct.composition.get(parent).then(compositionCollection => {
|
let composition = parent.composition.filter(id =>
|
||||||
compositionCollection.remove(child, sequenceNumber);
|
!this.openmct.objects.areIdsEqual(id, child.identifier)
|
||||||
})
|
);
|
||||||
|
|
||||||
|
this.openmct.objects.mutate(parent, 'composition', composition);
|
||||||
|
|
||||||
if (this.inNavigationPath(child) && this.openmct.editor.isEditing()) {
|
if (this.inNavigationPath(child) && this.openmct.editor.isEditing()) {
|
||||||
this.openmct.editor.save();
|
this.openmct.editor.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find another way of doing this with notebooks
|
const parentKeyString = this.openmct.objects.makeKeyString(parent.identifier);
|
||||||
// const parentKeyString = this.openmct.objects.makeKeyString(parent.identifier);
|
const isAlias = parentKeyString !== child.location;
|
||||||
// const isAlias = parentKeyString !== child.location;
|
|
||||||
// if (!isAlias) {
|
if (!isAlias) {
|
||||||
// this.openmct.objects.mutate(child, 'location', null);
|
this.openmct.objects.mutate(child, 'location', null);
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
appliesTo(objectPath) {
|
appliesTo(objectPath) {
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -40,58 +40,28 @@ 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 {
|
||||||
|
display: flex;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
flex: 1 1 auto;
|
||||||
|
&:not(:first-child) {
|
||||||
|
margin-top: $interiorMargin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mct-plot {
|
|
||||||
display: flex;
|
|
||||||
flex: 1 1 auto;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
flex: 1 1 auto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,10 +36,6 @@ export default {
|
|||||||
navigateToPath: {
|
navigateToPath: {
|
||||||
type: String,
|
type: String,
|
||||||
default: undefined
|
default: undefined
|
||||||
},
|
|
||||||
sequenceNumber: {
|
|
||||||
type: Number,
|
|
||||||
default: undefined
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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">
|
||||||
@@ -110,8 +109,7 @@ export default {
|
|||||||
domainObject: PLACEHOLDER_OBJECT,
|
domainObject: PLACEHOLDER_OBJECT,
|
||||||
viewKey: undefined,
|
viewKey: undefined,
|
||||||
isEditing: this.openmct.editor.isEditing(),
|
isEditing: this.openmct.editor.isEditing(),
|
||||||
notebookEnabled: this.openmct.types.get('notebook'),
|
notebookEnabled: this.openmct.types.get('notebook')
|
||||||
sequenceNumber: undefined
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -200,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) {
|
||||||
@@ -268,14 +268,7 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
showContextMenu(event) {
|
showContextMenu(event) {
|
||||||
this.openmct.contextMenu._showContextMenuForObjectPath(
|
this.openmct.contextMenu._showContextMenuForObjectPath(this.openmct.router.path, event.clientX, event.clientY);
|
||||||
this.openmct.router.path,
|
|
||||||
event.clientX,
|
|
||||||
event.clientY,
|
|
||||||
undefined,
|
|
||||||
{
|
|
||||||
sequenceNumber: this.sequenceNumber
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
goToParent() {
|
goToParent() {
|
||||||
window.location.hash = this.parentUrl;
|
window.location.hash = this.parentUrl;
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
v-for="treeItem in allTreeItems"
|
v-for="treeItem in allTreeItems"
|
||||||
:key="treeItem.id"
|
:key="treeItem.id"
|
||||||
:node="treeItem"
|
:node="treeItem"
|
||||||
:sequence-number="0"
|
|
||||||
/>
|
/>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- end main tree -->
|
<!-- end main tree -->
|
||||||
@@ -48,7 +47,6 @@
|
|||||||
v-for="treeItem in filteredTreeItems"
|
v-for="treeItem in filteredTreeItems"
|
||||||
:key="treeItem.id"
|
:key="treeItem.id"
|
||||||
:node="treeItem"
|
:node="treeItem"
|
||||||
:sequence-number="0"
|
|
||||||
/>
|
/>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- end search tree -->
|
<!-- end search tree -->
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
:domain-object="node.object"
|
:domain-object="node.object"
|
||||||
:object-path="node.objectPath"
|
:object-path="node.objectPath"
|
||||||
:navigate-to-path="navigateToPath"
|
:navigate-to-path="navigateToPath"
|
||||||
:sequence-number="sequenceNumber"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<ul
|
<ul
|
||||||
@@ -29,10 +28,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<tree-item
|
<tree-item
|
||||||
v-for="(child, index) in children"
|
v-for="child in children"
|
||||||
:key="child.id"
|
:key="child.id"
|
||||||
:node="child"
|
:node="child"
|
||||||
:sequence-number="index"
|
|
||||||
/>
|
/>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -55,10 +53,6 @@ export default {
|
|||||||
node: {
|
node: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
},
|
|
||||||
sequenceNumber: {
|
|
||||||
type: Number,
|
|
||||||
required: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|||||||
@@ -13,20 +13,13 @@ export default {
|
|||||||
if (!this.objectPath.length) {
|
if (!this.objectPath.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let url;
|
|
||||||
|
|
||||||
if (this.navigateToPath) {
|
if (this.navigateToPath) {
|
||||||
url = '#' + this.navigateToPath;
|
return '#' + this.navigateToPath;
|
||||||
} else {
|
|
||||||
url = '#/browse/' + this.objectPath
|
|
||||||
.map(o => o && this.openmct.objects.makeKeyString(o.identifier))
|
|
||||||
.reverse()
|
|
||||||
.join('/');
|
|
||||||
}
|
}
|
||||||
if (this.sequenceNumber) {
|
return '#/browse/' + this.objectPath
|
||||||
url += `?sequenceNumber=${this.sequenceNumber}`;
|
.map(o => o && this.openmct.objects.makeKeyString(o.identifier))
|
||||||
}
|
.reverse()
|
||||||
return url;
|
.join('/');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
:views="views"
|
class="l-browse-bar__object-name--w"
|
||||||
@setView="setView"
|
: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"
|
||||||
|
:current-view="currentView"
|
||||||
|
@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;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -27,13 +27,6 @@ define([
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newParams.sequenceNumber) {
|
|
||||||
openmct.layout.$refs.browseBar.sequenceNumber = parseInt(newParams.sequenceNumber);
|
|
||||||
} else {
|
|
||||||
openmct.layout.$refs.browseBar.sequenceNumber = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (changed.view && browseObject) {
|
if (changed.view && browseObject) {
|
||||||
let provider = openmct
|
let provider = openmct
|
||||||
.objectViews
|
.objectViews
|
||||||
|
|||||||
Reference in New Issue
Block a user