diff --git a/platform/features/layout/src/FixedController.js b/platform/features/layout/src/FixedController.js index de3c5a32f6..fd6e0a284b 100644 --- a/platform/features/layout/src/FixedController.js +++ b/platform/features/layout/src/FixedController.js @@ -360,22 +360,47 @@ define( */ FixedController.prototype.updateView = function (telemetryObject, datum) { var metadata = this.openmct.telemetry.getMetadata(telemetryObject); - var rangeMetadata = metadata.valuesForHints(['range'])[0]; - var rangeKey = rangeMetadata.source || rangeMetadata.key; - var valueMetadata = metadata.value(rangeKey); + var telemetryKeyToDisplay = this.chooseTelemetryKeyToDisplay(metadata); + var formattedTelemetryValue = this.getFormattedTelemetryValueForKey(telemetryKeyToDisplay, datum, metadata); var limitEvaluator = this.openmct.telemetry.limitEvaluator(telemetryObject); - var formatter = this.openmct.telemetry.getValueFormatter(valueMetadata); - var value = datum[valueMetadata.key]; - var alarm = limitEvaluator && limitEvaluator.evaluate(datum, rangeKey); + var alarm = limitEvaluator && limitEvaluator.evaluate(datum, telemetryKeyToDisplay); this.setDisplayedValue( telemetryObject, - formatter.format(value), + formattedTelemetryValue, alarm && alarm.cssClass ); this.digest(); }; + /** + * @private + */ + FixedController.prototype.getFormattedTelemetryValueForKey = function (telemetryKeyToDisplay, datum, metadata) { + var valueMetadata = metadata.value(telemetryKeyToDisplay); + var formatter = this.openmct.telemetry.getValueFormatter(valueMetadata); + + return formatter.format(datum[valueMetadata.key]); + }; + + /** + * @private + */ + FixedController.prototype.chooseTelemetryKeyToDisplay = function (metadata) { + // If there is a range value, show that preferentially + var telemetryKeyToDisplay = metadata.valuesForHints(['range'])[0]; + + // If no range is defined, default to the highest priority non time-domain data. + if (telemetryKeyToDisplay === undefined) { + var valuesOrderedByPriority = metadata.values(); + telemetryKeyToDisplay = valuesOrderedByPriority.filter(function (valueMetadata) { + return !(valueMetadata.hints.domain); + })[0]; + } + + return telemetryKeyToDisplay.source; + }; + /** * Request the last historical data point for the given domain objects * @param {object[]} objects @@ -388,7 +413,9 @@ define( objects.forEach(function (object) { self.openmct.telemetry.request(object, {start: bounds.start, end: bounds.end, size: 1}) .then(function (data) { - self.updateView(object, data[data.length - 1]); + if (data.length > 0) { + self.updateView(object, data[data.length - 1]); + } }); }); return objects; diff --git a/platform/features/layout/test/FixedControllerSpec.js b/platform/features/layout/test/FixedControllerSpec.js index 8849fb00e6..8f42d98fe0 100644 --- a/platform/features/layout/test/FixedControllerSpec.js +++ b/platform/features/layout/test/FixedControllerSpec.js @@ -178,7 +178,6 @@ define( Promise.resolve(mockChildren) ); - mockScope.model = testModel; mockScope.configuration = testConfiguration; mockScope.selection = jasmine.createSpyObj( @@ -194,7 +193,8 @@ define( mockMetadata = jasmine.createSpyObj('mockMetadata', [ 'valuesForHints', - 'value' + 'value', + 'values' ]); mockMetadata.value.andReturn({ key: 'value' @@ -653,6 +653,39 @@ define( }); }); + it("selects an range value to display, if available", function () { + mockMetadata.valuesForHints.andReturn([ + { + key: 'range', + source: 'range' + } + ]); + var key = controller.chooseTelemetryKeyToDisplay(mockMetadata); + expect(key).toEqual('range'); + }); + + it("selects the first non-domain value to display, if no range available", function () { + mockMetadata.valuesForHints.andReturn([]); + mockMetadata.values.andReturn([ + { + key: 'domain', + source: 'domain', + hints: { + domain: 1 + } + }, + { + key: 'image', + source: 'image', + hints: { + image: 1 + } + } + ]); + var key = controller.chooseTelemetryKeyToDisplay(mockMetadata); + expect(key).toEqual('image'); + }); + it("reflects limit status", function () { mockLimitEvaluator.evaluate.andReturn({cssClass: "alarm-a"}); controller.updateView(mockTelemetryObject, [{