From d7c266d70f53f0c421ad61cce8799cf2e11b695d Mon Sep 17 00:00:00 2001 From: Jamie Vigliotta Date: Mon, 13 Jul 2020 14:24:51 -0700 Subject: [PATCH] unit coluns in telem tables, need to add config options for those columns --- .../generator/GeneratorMetadataProvider.js | 2 + .../displayLayout/DisplayLayoutToolbar.js | 37 +++++++++++ .../components/TelemetryView.vue | 21 +++++- src/plugins/telemetryTable/TelemetryTable.js | 49 +++++++++++++- .../telemetryTable/TelemetryTableRow.js | 6 +- .../TelemetryTableUnitColumn.js | 64 +++++++++++++++++++ .../components/table-configuration.vue | 3 +- src/ui/toolbar/Toolbar.vue | 12 ++-- 8 files changed, 183 insertions(+), 11 deletions(-) create mode 100644 src/plugins/telemetryTable/TelemetryTableUnitColumn.js diff --git a/example/generator/GeneratorMetadataProvider.js b/example/generator/GeneratorMetadataProvider.js index e3969600c3..4934c516a1 100644 --- a/example/generator/GeneratorMetadataProvider.js +++ b/example/generator/GeneratorMetadataProvider.js @@ -41,6 +41,7 @@ define([ { key: "sin", name: "Sine", + unit: "Hz", formatString: '%0.2f', hints: { range: 1 @@ -49,6 +50,7 @@ define([ { key: "cos", name: "Cosine", + unit: "deg", formatString: '%0.2f', hints: { range: 2 diff --git a/src/plugins/displayLayout/DisplayLayoutToolbar.js b/src/plugins/displayLayout/DisplayLayoutToolbar.js index a0daa29cf1..c07c58d26a 100644 --- a/src/plugins/displayLayout/DisplayLayoutToolbar.js +++ b/src/plugins/displayLayout/DisplayLayoutToolbar.js @@ -134,6 +134,13 @@ define(['lodash'], function (_) { return `configuration.items[${selectionPath[0].context.index}]`; } + function getAllOfType(selection, specificType) { + return selection.filter(selectionPath => { + let type = selectionPath[0].context.layoutItem.type; + return type === specificType; + }); + } + function getAllTypes(selection) { return selection.filter(selectionPath => { let type = selectionPath[0].context.layoutItem.type; @@ -506,6 +513,32 @@ define(['lodash'], function (_) { return allTelemetry; } + function getToggleUnitsButton(selectedParent, selection) { + let applicableItems = getAllOfType(selection, 'telemetry-view'); + return { + control: "toggle-button", + domainObject: selectedParent, + applicableSelectedItems: applicableItems, + contextMethod: 'toggleUnits', + property: function (selectionPath) { + console.log('path', selectionPath, getPath(selectionPath) + '.showUnits'); + return getPath(selectionPath) + '.showUnits'; + }, + options: [ + { + value: true, + icon: 'icon-eye-open', + title: "Show units" + }, + { + value: false, + icon: 'icon-eye-disabled', + title: "Hide units" + } + ] + }; + } + function getViewSwitcherMenu(selectedParent, selectionPath, selection) { if (selection.length === 1) { let displayLayoutContext = selectionPath[1].context, @@ -589,6 +622,7 @@ define(['lodash'], function (_) { 'text-style': [], 'position': [], 'duplicate': [], + 'unit-toggle': [], 'remove': [] }; @@ -649,6 +683,9 @@ define(['lodash'], function (_) { if (toolbar.viewSwitcher.length === 0) { toolbar.viewSwitcher = [getViewSwitcherMenu(selectedParent, selectionPath, selectedObjects)]; } + if (toolbar['unit-toggle'].length === 0) { + toolbar['unit-toggle'] = [getToggleUnitsButton(selectedParent, selectedObjects)]; + } } else if (layoutItem.type === 'text-view') { if (toolbar['text-style'].length === 0) { toolbar['text-style'] = [ diff --git a/src/plugins/displayLayout/components/TelemetryView.vue b/src/plugins/displayLayout/components/TelemetryView.vue index 2f7aa39bc1..51006532db 100644 --- a/src/plugins/displayLayout/components/TelemetryView.vue +++ b/src/plugins/displayLayout/components/TelemetryView.vue @@ -52,6 +52,12 @@ >
{{ telemetryValue }} + + {{ unit }} +
@@ -117,7 +123,8 @@ export default { datum: undefined, formats: undefined, domainObject: undefined, - currentObjectPath: undefined + currentObjectPath: undefined, + showUnits: true } }, computed: { @@ -129,6 +136,11 @@ export default { let displayMode = this.item.displayMode; return displayMode === 'all' || displayMode === 'value'; }, + unit() { + let value = this.item.value, + unit = this.metadata.value(value).unit; + return unit; + }, styleObject() { return Object.assign({}, { fontSize: this.item.size @@ -248,7 +260,9 @@ export default { item: domainObject, layoutItem: this.item, index: this.index, - updateTelemetryFormat: this.updateTelemetryFormat + updateTelemetryFormat: this.updateTelemetryFormat, + toggleUnits: this.toggleUnits, + showUnits: this.showUnits }; this.removeSelectable = this.openmct.selection.selectable( this.$el, this.context, this.immediatelySelect || this.initSelect); @@ -259,6 +273,9 @@ export default { }, showContextMenu(event) { this.openmct.contextMenu._showContextMenuForObjectPath(this.currentObjectPath, event.x, event.y, CONTEXT_MENU_ACTIONS); + }, + toggleUnits(show) { + this.showUnits = show; } } } diff --git a/src/plugins/telemetryTable/TelemetryTable.js b/src/plugins/telemetryTable/TelemetryTable.js index 57b6458ca5..be0852ff63 100644 --- a/src/plugins/telemetryTable/TelemetryTable.js +++ b/src/plugins/telemetryTable/TelemetryTable.js @@ -27,6 +27,7 @@ define([ './collections/FilteredTableRowCollection', './TelemetryTableRow', './TelemetryTableColumn', + './TelemetryTableUnitColumn', './TelemetryTableConfiguration' ], function ( EventEmitter, @@ -35,6 +36,7 @@ define([ FilteredTableRowCollection, TelemetryTableRow, TelemetryTableColumn, + TelemetryTableUnitColumn, TelemetryTableConfiguration ) { class TelemetryTable extends EventEmitter { @@ -206,10 +208,14 @@ define([ addColumnsForObject(telemetryObject) { let metadataValues = this.openmct.telemetry.getMetadata(telemetryObject).values(); - metadataValues.forEach(metadatum => { let column = this.createColumn(metadatum); this.configuration.addSingleColumnForObject(telemetryObject, column); + // add units column if available + if(metadatum.unit !== undefined) { + let unitColumn = this.createUnitColumn(metadatum); + this.configuration.addSingleColumnForObject(telemetryObject, unitColumn); + } }); } @@ -217,6 +223,47 @@ define([ return new TelemetryTableColumn(this.openmct, metadatum); } + createUnitColumn(metadatum) { + return new TelemetryTableUnitColumn(this.openmct, metadatum); + // let unitColumn = { + // isUnit: true, + // metadatum, + // titleValue: metadatum.name + ' Unit', + // selectable: false, + // formatter: { + // format(telemetryDatum) { + // return metadatum.unit; + // }, + // parse(telemetryDatum) { + // return metadatum.unit; + // } + // }, + // getKey() { + // return this.metadatum.key + '-unit'; + // }, + // getTitle() { + // return this.titleValue; + // }, + // getMetadatum() { + // return this.metadatum; + // }, + // hasValueForDatum(telemetryDatum) { + // return telemetryDatum.hasOwnProperty(this.metadatum.source); + // }, + // getRawValue(telemetryDatum) { + // return this.metadatum.unit; + // }, + // getFormattedValue(telemetryDatum) { + // return this.formatter.format(telemetryDatum); + // }, + // getParsedValue(telemetryDatum) { + // return this.formatter.parse(telemetryDatum); + // } + // }; + // return unitColumn; + + } + subscribeTo(telemetryObject) { let subscribeOptions = this.buildOptionsFromConfiguration(telemetryObject); let keyString = this.openmct.objects.makeKeyString(telemetryObject.identifier); diff --git a/src/plugins/telemetryTable/TelemetryTableRow.js b/src/plugins/telemetryTable/TelemetryTableRow.js index 56d23a9486..cc9c63115a 100644 --- a/src/plugins/telemetryTable/TelemetryTableRow.js +++ b/src/plugins/telemetryTable/TelemetryTableRow.js @@ -65,8 +65,10 @@ define([], function () { getCellLimitClasses() { if (!this.cellLimitClasses) { this.cellLimitClasses = Object.values(this.columns).reduce((alarmStateMap, column) => { - let limitEvaluation = this.limitEvaluator.evaluate(this.datum, column.getMetadatum()); - alarmStateMap[column.getKey()] = limitEvaluation && limitEvaluation.cssClass; + if(!column.isUnit) { + let limitEvaluation = this.limitEvaluator.evaluate(this.datum, column.getMetadatum()); + alarmStateMap[column.getKey()] = limitEvaluation && limitEvaluation.cssClass; + } return alarmStateMap; }, {}); diff --git a/src/plugins/telemetryTable/TelemetryTableUnitColumn.js b/src/plugins/telemetryTable/TelemetryTableUnitColumn.js new file mode 100644 index 0000000000..b98e8a35be --- /dev/null +++ b/src/plugins/telemetryTable/TelemetryTableUnitColumn.js @@ -0,0 +1,64 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2018, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +define([ + './TelemetryTableColumn.js' +], function ( + TelemetryTableColumn +) { + class TelemetryTableUnitColumn extends TelemetryTableColumn { + constructor(openmct, metadatum) { + super(openmct, metadatum); + this.isUnit = true; + this.titleValue += ' Unit'; + this.formatter = { + format(datum) { + return metadatum.unit; + }, + parse(datum) { + return metadatum.unit; + } + }; + } + + getKey() { + return this.metadatum.key + '-unit'; + } + + getTitle() { + return this.metadatum.name + ' Unit'; + } + + getRawValue(telemetryDatum) { + return this.metadatum.unit; + } + + getFormattedValue(telemetryDatum) { + return this.formatter.format(telemetryDatum); + } + + getParsedValue(telemetryDatum) { + return this.formatter.parse(telemetryDatum); + } + } + + return TelemetryTableUnitColumn; +}); diff --git a/src/plugins/telemetryTable/components/table-configuration.vue b/src/plugins/telemetryTable/components/table-configuration.vue index 105f8a0995..cffbda0750 100644 --- a/src/plugins/telemetryTable/components/table-configuration.vue +++ b/src/plugins/telemetryTable/components/table-configuration.vue @@ -80,6 +80,7 @@ export default { } }, mounted() { + console.log('table-config mounted'); this.unlisteners = []; this.openmct.editor.on('isEditing', this.toggleEdit); let compositionCollection = this.openmct.composition.get(this.tableConfiguration.domainObject); @@ -131,7 +132,7 @@ export default { }, addColumnsForObject(telemetryObject) { let metadataValues = this.openmct.telemetry.getMetadata(telemetryObject).values(); - + console.log(metadataValues); metadataValues.forEach(metadatum => { let column = new TelemetryTableColumn(this.openmct, metadatum); this.tableConfiguration.addSingleColumnForObject(telemetryObject, column); diff --git a/src/ui/toolbar/Toolbar.vue b/src/ui/toolbar/Toolbar.vue index 6c0aa4b369..688f3eb067 100644 --- a/src/ui/toolbar/Toolbar.vue +++ b/src/ui/toolbar/Toolbar.vue @@ -134,7 +134,6 @@ export default { value = this.getFormValue(domainObject, toolbarItem); } else { let values = []; - if (applicableSelectedItems) { applicableSelectedItems.forEach(selectionPath => { values.push(this.getPropertyValue(domainObject, toolbarItem, selectionPath)); @@ -160,7 +159,6 @@ export default { if (formKey) { property = property + "." + formKey; } - return _.get(domainObject, property); }, getFormValue(domainObject, toolbarItem) { @@ -204,7 +202,6 @@ export default { }, updateObjectValue(value, item) { let changedItemId = this.openmct.objects.makeKeyString(item.domainObject.identifier); - this.structure = this.structure.map(toolbarItem => { if (toolbarItem.domainObject) { let id = this.openmct.objects.makeKeyString(toolbarItem.domainObject.identifier); @@ -234,7 +231,13 @@ export default { } }); } else { - if (item.applicableSelectedItems) { + if(item.contextMethod) { + let method = item.contextMethod; + item.applicableSelectedItems.forEach(selectionPath => { + this.mutateObject(item, value, selectionPath); + selectionPath[0].context[method](value); + }); + } else if (item.applicableSelectedItems) { item.applicableSelectedItems.forEach(selectionPath => { this.mutateObject(item, value, selectionPath); }); @@ -249,7 +252,6 @@ export default { if (formKey) { property = property + "." + formKey; } - this.openmct.objects.mutate(item.domainObject, property, value); }, triggerMethod(item, event) {