diff --git a/src/components/constraints/ConstraintListItem.svelte b/src/components/constraints/ConstraintListItem.svelte
index f477bb2ddf..3cbb78f37c 100644
--- a/src/components/constraints/ConstraintListItem.svelte
+++ b/src/components/constraints/ConstraintListItem.svelte
@@ -6,9 +6,10 @@
import FilterIcon from '@nasa-jpl/stellar/icons/filter.svg?component';
import VisibleHideIcon from '@nasa-jpl/stellar/icons/visible_hide.svg?component';
import VisibleShowIcon from '@nasa-jpl/stellar/icons/visible_show.svg?component';
+ import WarningIcon from '@nasa-jpl/stellar/icons/warning.svg?component';
import { createEventDispatcher } from 'svelte';
import type { User } from '../../types/app';
- import type { Constraint, ConstraintResult } from '../../types/constraint';
+ import type { Constraint, ConstraintResponse } from '../../types/constraint';
import type { Plan } from '../../types/plan';
import effects from '../../utilities/effects';
import { permissionHandler } from '../../utilities/permissionHandler';
@@ -19,7 +20,7 @@
import ConstraintViolationButton from './ConstraintViolationButton.svelte';
export let constraint: Constraint;
- export let constraintResult: ConstraintResult;
+ export let constraintResponse: ConstraintResponse;
export let hasDeletePermission: boolean = false;
export let hasEditPermission: boolean = false;
export let plan: Plan | null;
@@ -29,7 +30,8 @@
const dispatch = createEventDispatcher();
- $: violationCount = constraintResult?.violations?.length;
+ $: violationCount = constraintResponse?.results?.violations?.length;
+ $: success = constraintResponse?.success;
@@ -47,7 +49,11 @@
{violationCount}
{/if}
- {:else}
+ {:else if constraintResponse && !success}
+
- {#if constraintResult?.violations?.length}
+ {#if constraintResponse?.results?.violations?.length}
- {#each constraintResult.violations as violation}
+ {#each constraintResponse?.results?.violations as violation}
{#each violation.windows as window}
{/each}
@@ -155,4 +161,13 @@
justify-content: center;
width: 20px;
}
+
+ .violations-error {
+ align-items: center;
+ color: var(--st-error-red);
+ display: flex;
+ flex-shrink: 0;
+ justify-content: center;
+ width: 20px;
+ }
diff --git a/src/components/constraints/ConstraintsPanel.svelte b/src/components/constraints/ConstraintsPanel.svelte
index f06e40bd15..851f9946ab 100644
--- a/src/components/constraints/ConstraintsPanel.svelte
+++ b/src/components/constraints/ConstraintsPanel.svelte
@@ -8,11 +8,11 @@
import PlanRightArrow from '@nasa-jpl/stellar/icons/plan_with_right_arrow.svg?component';
import VisibleHideIcon from '@nasa-jpl/stellar/icons/visible_hide.svg?component';
import VisibleShowIcon from '@nasa-jpl/stellar/icons/visible_show.svg?component';
+ import { isEmpty } from 'lodash-es';
import { PlanStatusMessages } from '../../enums/planStatusMessages';
import {
checkConstraintsStatus,
- constraintResultMap,
- constraintResults,
+ constraintResponseMap,
constraintVisibilityMap,
constraints,
setAllConstraintsVisible,
@@ -21,7 +21,7 @@
import { field } from '../../stores/form';
import { plan, planReadOnly, viewTimeRange } from '../../stores/plan';
import type { User } from '../../types/app';
- import type { Constraint, ConstraintResult } from '../../types/constraint';
+ import type { Constraint, ConstraintResponse } from '../../types/constraint';
import type { FieldStore } from '../../types/form';
import type { ViewGridSection } from '../../types/view';
import effects from '../../utilities/effects';
@@ -51,7 +51,7 @@
let startTimeDoyField: FieldStore;
let showFilters: boolean = false;
let showConstraintsWithNoViolations: boolean = true;
- let filteredConstraintResultMap: Record = {};
+ let filteredConstraintResponseMap: Record = {};
$: startTimeDoy = $plan?.start_time_doy || '';
$: startTimeDoyField = field(startTimeDoy, [required, timestamp]);
@@ -60,33 +60,42 @@
$: startTimeMs = getUnixEpochTime(startTimeDoy);
$: endTimeMs = getUnixEpochTime(endTimeDoy);
- $: if ($constraints && $constraintResults && startTimeMs && endTimeMs) {
- filteredConstraintResultMap = {};
+ $: if ($constraints && $constraintResponseMap && startTimeMs && endTimeMs) {
+ filteredConstraintResponseMap = {};
$constraints.forEach(constraint => {
- const constraintResult = $constraintResultMap[constraint.id];
- if (constraintResult) {
+ const constraintResponse = $constraintResponseMap[constraint.id];
+ if (constraintResponse) {
// Filter violations/windows by time bounds
- const filteredViolations = constraintResult.violations.map(violation => ({
- ...violation,
- windows: violation.windows.filter(window => window.end >= startTimeMs && window.start <= endTimeMs),
- }));
- filteredConstraintResultMap[constraint.id] = { ...constraintResult, violations: filteredViolations };
+ if (constraintResponse.results && !isEmpty(constraintResponse.results)) {
+ constraintResponse.results.violations = constraintResponse.results.violations.map(violation => ({
+ ...violation,
+ windows: violation.windows.filter(window => window.end >= startTimeMs && window.start <= endTimeMs),
+ }));
+ }
+ filteredConstraintResponseMap[constraint.id] = {
+ constraintId: constraintResponse.constraintId,
+ constraintName: constraintResponse.constraintName,
+ errors: constraintResponse.errors,
+ results: constraintResponse.results,
+ success: constraintResponse.success,
+ type: constraintResponse.type,
+ };
}
});
}
$: filteredConstraints = filterConstraints(
$constraints,
- filteredConstraintResultMap,
+ filteredConstraintResponseMap,
filterText,
showConstraintsWithNoViolations,
);
- $: totalViolationCount = getViolationCount($constraintResults);
- $: filteredViolationCount = getViolationCount(Object.values(filteredConstraintResultMap));
+ $: totalViolationCount = getViolationCount(Object.values($constraintResponseMap));
+ $: filteredViolationCount = getViolationCount(Object.values(filteredConstraintResponseMap));
function filterConstraints(
constraints: Constraint[],
- filteredConstraintResultMap: Record,
+ filteredConstraintResponseMap: Record,
filterText: string,
showConstraintsWithNoViolations: boolean,
) {
@@ -97,9 +106,9 @@
return false;
}
- const constraintResult = filteredConstraintResultMap[constraint.id];
+ const constraintResponse = filteredConstraintResponseMap[constraint.id];
// Always show constraints with no violations
- if (!constraintResult?.violations?.length) {
+ if (!constraintResponse?.results.violations?.length) {
return showConstraintsWithNoViolations;
}
@@ -107,9 +116,9 @@
});
}
- function getViolationCount(constraintResults: ConstraintResult[]) {
- return constraintResults.reduce((count, constraintResult) => {
- return count + constraintResult.violations.length;
+ function getViolationCount(constraintResponse: ConstraintResponse[]) {
+ return constraintResponse.reduce((count, constraintResponse) => {
+ return constraintResponse.results.violations ? constraintResponse.results.violations.length + count : 0;
}, 0);
}
@@ -278,11 +287,11 @@
{#each filteredConstraints as constraint}
{
- constraintResult.violations.forEach(violation => {
- violation.windows.forEach(window => {
- if (xScaleMax !== null) {
- const xStart = xScaleMax(window.start);
- const xEnd = xScaleMax(window.end);
- const clampedStart = xStart < 0 ? 0 : xStart;
- const clampedEnd = xEnd > drawWidth ? drawWidth : xEnd;
- const width = clampedEnd - clampedStart;
- const clampedWidth = width <= 0 ? 5 : width;
- constraintViolationsToRender.push({ width: clampedWidth, x: clampedStart });
- }
+ constraintResults
+ .filter(result => !isEmpty(result))
+ .forEach(constraintResult => {
+ constraintResult.violations.forEach(violation => {
+ violation.windows.forEach(window => {
+ if (xScaleMax !== null) {
+ const xStart = xScaleMax(window.start);
+ const xEnd = xScaleMax(window.end);
+ const clampedStart = xStart < 0 ? 0 : xStart;
+ const clampedEnd = xEnd > drawWidth ? drawWidth : xEnd;
+ const width = clampedEnd - clampedStart;
+ const clampedWidth = width <= 0 ? 5 : width;
+ constraintViolationsToRender.push({ width: clampedWidth, x: clampedStart });
+ }
+ });
});
});
- });
}
$: if (histogramContainer && drawWidth) {
diff --git a/src/components/timeline/Tooltip.svelte b/src/components/timeline/Tooltip.svelte
index 64442fb35f..71afd308fa 100644
--- a/src/components/timeline/Tooltip.svelte
+++ b/src/components/timeline/Tooltip.svelte
@@ -2,8 +2,10 @@