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} +
+ +
+ {:else if constraintResponse && success}
@@ -77,9 +83,9 @@ - {#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 @@