diff --git a/static/js/components/observationhistory.vue b/static/js/components/observationhistory.vue
index 6b390e7a..8ed8efd7 100644
--- a/static/js/components/observationhistory.vue
+++ b/static/js/components/observationhistory.vue
@@ -101,10 +101,13 @@
}
observation.state = state;
- if (observation.fail_reason !== '') {
+ if (_.isString(observation.fail_reason) && observation.fail_reason !== '') {
observation.fail_reason = '
reason: ' + observation.fail_reason;
+ } else {
+ observation.fail_reason = '';
}
- if (observation.percent_completed > 0) {
+
+ if (_.isFinite(observation.percent_completed) && observation.percent_completed > 0) {
observation.percent_completed = '
percent completed: ' + observation.percent_completed.toFixed(1);
}
else {
diff --git a/static/js/request_detail.vue b/static/js/request_detail.vue
index 035d8b71..d85df02b 100644
--- a/static/js/request_detail.vue
+++ b/static/js/request_detail.vue
@@ -410,27 +410,53 @@
let fail_reason = '';
for (let csIndex in that.observationData[observationIdx].configuration_statuses) {
let configurationStatus = that.observationData[observationIdx].configuration_statuses[csIndex];
- if (!_.isEmpty(configurationStatus.summary)) {
- time_completed += configurationStatus.summary.time_completed;
- if (fail_reason === '' && configurationStatus.summary.reason !== 'N/A') {
- fail_reason = configurationStatus.summary.reason;
- }
+ let summaryExists = !_.isEmpty(configurationStatus.summary);
+ if (summaryExists) {
+ fail_reason = that.getFailReason(fail_reason, configurationStatus.summary.reason);
}
+ // Find the configuration that goes with this configuration status
+ let configuration;
for (let cIndex in that.request.configurations) {
if (that.request.configurations[cIndex].id === configurationStatus.configuration) {
- for (let icIndex in that.request.configurations[cIndex].instrument_configs) {
- let instConfig = that.request.configurations[cIndex].instrument_configs[icIndex];
+ configuration = that.request.configurations[cIndex];
+ break;
+ }
+ }
+ if (configuration) {
+ if (_.startsWith(configuration.type, 'REPEAT') && configuration.repeat_duration) {
+ if (summaryExists) {
+ let start = new Date(configurationStatus.summary.start);
+ let end = new Date(configurationStatus.summary.end);
+ time_completed += (end - start) / 1000;
+ }
+ total_time += configuration.repeat_duration;
+ } else {
+ if (summaryExists) {
+ time_completed += configurationStatus.summary.time_completed;
+ }
+ for (let icIndex in configuration.instrument_configs) {
+ let instConfig = configuration.instrument_configs[icIndex];
total_time += instConfig.exposure_time * instConfig.exposure_count;
}
- break;
}
}
}
- that.observationData[observationIdx].percent_completed = (time_completed / total_time) * 100.0;
+ let percentCompleted;
+ if (total_time > 0) {
+ percentCompleted = (time_completed / total_time) * 100.0;
+ }
+ that.observationData[observationIdx].percent_completed = percentCompleted;
that.observationData[observationIdx].fail_reason = fail_reason;
}
});
},
+ getFailReason: function(currentFailReason, newFailReason) {
+ let failReason = '';
+ if (currentFailReason === '' && newFailReason !== 'N/A') {
+ failReason = newFailReason;
+ }
+ return failReason;
+ },
loadAirmassData: function() {
if (this.hasTarget) {
let that = this;