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) {