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;