Skip to content

Commit

Permalink
Merge branch 'develop' into fix/1105/profile-fetch-fail-toast
Browse files Browse the repository at this point in the history
  • Loading branch information
dandelany authored Feb 17, 2024
2 parents aa684e1 + c6bd033 commit 60acd6e
Show file tree
Hide file tree
Showing 61 changed files with 1,713 additions and 697 deletions.
4 changes: 3 additions & 1 deletion .env
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ PUBLIC_GATEWAY_SERVER_URL=http://localhost:9000
PUBLIC_HASURA_CLIENT_URL=http://localhost:8080/v1/graphql
PUBLIC_HASURA_SERVER_URL=http://localhost:8080/v1/graphql
PUBLIC_HASURA_WEB_SOCKET_URL=ws://localhost:8080/v1/graphql
PUBLIC_LOGIN_PAGE=enabled
PUBLIC_AUTH_SSO_ENABLED=false
# VITE_HOST=localhost.jpl.nasa.gov
# VITE_HTTPS=true
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ node_modules
/.svelte-kit
test-results
unit-test-results
*.local
2 changes: 1 addition & 1 deletion docs/ENVIRONMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ This document provides detailed information about environment variables for Aeri
| -------------------------------- | --------------------------------------------------------------------------------------------------------- | -------- | -------------------------------- |
| `ORIGIN` | Url of where the UI is served from. See the [Svelte Kit Adapter Node docs][svelte-kit-adapter-node-docs]. | `string` | http://localhost |
| `PUBLIC_AERIE_FILE_STORE_PREFIX` | Prefix to prepend to files uploaded through simulation configuration. | `string` | /usr/src/app/merlin_file_store/ |
| `PUBLIC_AUTH_SSO_ENABLED` | Whether to use the SSO-based auth flow, or the /login page auth flow | `string` | false |
| `PUBLIC_GATEWAY_CLIENT_URL` | Url of the Gateway as called from the client (i.e. web browser) | `string` | http://localhost:9000 |
| `PUBLIC_GATEWAY_SERVER_URL` | Url of the Gateway as called from the server (i.e. Node.js container) | `string` | http://localhost:9000 |
| `PUBLIC_HASURA_CLIENT_URL` | Url of Hasura as called from the client (i.e. web browser) | `string` | http://localhost:8080/v1/graphql |
| `PUBLIC_HASURA_SERVER_URL` | Url of Hasura as called from the server (i.e. Node.js container) | `string` | http://localhost:8080/v1/graphql |
| `PUBLIC_HASURA_WEB_SOCKET_URL` | Url of Hasura called to establish a web-socket connection from the client | `string` | ws://localhost:8080/v1/graphql |
| `PUBLIC_LOGIN_PAGE` | Set to `enabled` to turn on login page. Otherwise set to `disabled` to turn off login page. | `string` | enabled |
2 changes: 1 addition & 1 deletion e2e-tests/tests/plans.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ test.describe.serial('Plans', () => {
await plans.fillInputStartTime();

const endTime = await plans.inputEndTime.inputValue();
expect(endTime).toEqual(plans.startTime);
expect(endTime).toEqual('2022-002T00:00:00');
});

test('Entering an invalid start should not prepopulate the end time', async () => {
Expand Down
38 changes: 29 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "aerie-ui",
"description": "The client application for Aerie.",
"version": "2.2.0",
"version": "2.3.0",
"type": "module",
"private": true,
"license": "MIT",
Expand Down Expand Up @@ -38,7 +38,7 @@
"dependencies": {
"@fontsource/jetbrains-mono": "^5.0.3",
"@nasa-jpl/aerie-ampcs": "^1.0.1",
"@nasa-jpl/stellar": "^1.1.16",
"@nasa-jpl/stellar": "^1.1.18",
"@sveltejs/adapter-node": "1.2.4",
"@sveltejs/kit": "1.20.5",
"ag-grid-community": "29.3.3",
Expand Down Expand Up @@ -93,6 +93,7 @@
"@types/toastify-js": "^1.11.1",
"@typescript-eslint/eslint-plugin": "^5.60.1",
"@typescript-eslint/parser": "^5.60.1",
"@vitejs/plugin-basic-ssl": "^1.0.2",
"@vitest/ui": "^0.32.2",
"cloc": "^2.11.0",
"d3-format": "^3.1.0",
Expand Down
3 changes: 2 additions & 1 deletion src/components/app/NavButton.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script lang="ts">
import { createEventDispatcher } from 'svelte';
import { getColorForStatus, type Status } from '../../utilities/status';
import type { Status } from '../../enums/status';
import { getColorForStatus } from '../../utilities/status';
export let selected: boolean = false;
export let status: Status | null = null;
Expand Down
3 changes: 2 additions & 1 deletion src/components/constraints/ConstraintForm.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@
<option value={null} />
{#each models as model}
<option value={model.id} disabled={!hasModelPermission(model.id, mode, user)}>
{model.name} ({model.id})
{model.name}
(Version: {model.version})
</option>
{/each}
</select>
Expand Down
30 changes: 29 additions & 1 deletion src/components/constraints/ConstraintListItem.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
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 { Status } from '../../enums/status';
import type { User } from '../../types/app';
import type { Constraint, ConstraintResponse } from '../../types/constraint';
import type { Plan } from '../../types/plan';
Expand All @@ -18,6 +19,7 @@
import Collapse from '../Collapse.svelte';
import ContextMenuHeader from '../context-menu/ContextMenuHeader.svelte';
import ContextMenuItem from '../context-menu/ContextMenuItem.svelte';
import StatusBadge from '../ui/StatusBadge.svelte';
import ConstraintViolationButton from './ConstraintViolationButton.svelte';
export let constraint: Constraint;
Expand Down Expand Up @@ -58,6 +60,10 @@
<div class="no-violations" use:tooltip={{ content: 'No Violations', placement: 'top' }}>
<CheckmarkIcon />
</div>
{:else}
<span class="unchecked">
<StatusBadge status={Status.Unchecked} />
</span>
{/if}
<button
use:tooltip={{ content: visible ? 'Hide' : 'Show', placement: 'top' }}
Expand Down Expand Up @@ -97,6 +103,16 @@
{/if}
</Collapse>

{#if !success && constraintResponse?.errors}
<Collapse title="Errors" defaultExpanded={false}>
<div class="errors">
{#each constraintResponse?.errors as error}
<div class="st-typography-body">{error.message}</div>
{/each}
</div>
</Collapse>
{/if}

<svelte:fragment slot="contextMenuContent">
<ContextMenuHeader>Actions</ContextMenuHeader>
<ContextMenuItem
Expand Down Expand Up @@ -149,11 +165,16 @@
padding: 0px 6px;
}
.violations {
.violations,
.errors {
display: flex;
flex-direction: column;
}
.errors {
gap: 8px;
}
.no-violations {
align-items: center;
color: var(--st-success-green);
Expand All @@ -171,4 +192,11 @@
justify-content: center;
width: 20px;
}
.unchecked {
display: flex;
flex-shrink: 0;
justify-content: center;
width: 20px;
}
</style>
33 changes: 23 additions & 10 deletions src/components/constraints/ConstraintsPanel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,19 @@
import VisibleHideIcon from '@nasa-jpl/stellar/icons/visible_hide.svg?component';
import VisibleShowIcon from '@nasa-jpl/stellar/icons/visible_show.svg?component';
import { PlanStatusMessages } from '../../enums/planStatusMessages';
import { Status } from '../../enums/status';
import {
checkConstraintsStatus,
constraintResponseMap,
constraintVisibilityMap,
constraints,
constraintsStatus,
setAllConstraintsVisible,
setConstraintVisibility,
} from '../../stores/constraints';
import { field } from '../../stores/form';
import { plan, planReadOnly, viewTimeRange } from '../../stores/plan';
import { simulationStatus } from '../../stores/simulation';
import type { User } from '../../types/app';
import type { Constraint, ConstraintResponse } from '../../types/constraint';
import type { FieldStore } from '../../types/form';
Expand Down Expand Up @@ -50,7 +53,7 @@
let startTimeDoyField: FieldStore<string>;
let showFilters: boolean = false;
let showConstraintsWithNoViolations: boolean = true;
let filteredConstraintResponseMap: Record<Constraint['id'], ConstraintResponse> = {};
let constraintToConstraintResponseMap: Record<Constraint['id'], ConstraintResponse> = {};
$: startTimeDoy = $plan?.start_time_doy || '';
$: startTimeDoyField = field<string>(startTimeDoy, [required, timestamp]);
Expand All @@ -60,11 +63,11 @@
$: endTimeMs = getUnixEpochTime(endTimeDoy);
$: if ($constraints && $constraintResponseMap && startTimeMs && endTimeMs) {
filteredConstraintResponseMap = {};
constraintToConstraintResponseMap = {};
$constraints.forEach(constraint => {
const constraintResponse = $constraintResponseMap[constraint.id];
if (constraintResponse) {
filteredConstraintResponseMap[constraint.id] = {
constraintToConstraintResponseMap[constraint.id] = {
constraintId: constraintResponse.constraintId,
constraintName: constraintResponse.constraintName,
errors: constraintResponse.errors,
Expand All @@ -86,16 +89,20 @@
$: filteredConstraints = filterConstraints(
$constraints,
filteredConstraintResponseMap,
constraintToConstraintResponseMap,
filterText,
showConstraintsWithNoViolations,
);
$: filteredConstraintResponses = Object.values(constraintToConstraintResponseMap).filter(r =>
filteredConstraints.find(c => c.id === r.constraintId),
);
$: totalViolationCount = getViolationCount(Object.values($constraintResponseMap));
$: filteredViolationCount = getViolationCount(Object.values(filteredConstraintResponseMap));
$: filteredViolationCount = getViolationCount(Object.values(filteredConstraintResponses));
function filterConstraints(
constraints: Constraint[],
filteredConstraintResponseMap: Record<Constraint['id'], ConstraintResponse>,
constraintToConstraintResponseMap: Record<Constraint['id'], ConstraintResponse>,
filterText: string,
showConstraintsWithNoViolations: boolean,
) {
Expand All @@ -106,7 +113,7 @@
return false;
}
const constraintResponse = filteredConstraintResponseMap[constraint.id];
const constraintResponse = constraintToConstraintResponseMap[constraint.id];
// Always show constraints with no violations
if (!constraintResponse?.results.violations?.length) {
return showConstraintsWithNoViolations;
Expand All @@ -118,7 +125,7 @@
function getViolationCount(constraintResponse: ConstraintResponse[]) {
return constraintResponse.reduce((count, constraintResponse) => {
return constraintResponse.results.violations ? constraintResponse.results.violations.length + count : 0;
return constraintResponse.results.violations ? constraintResponse.results.violations.length + count : count;
}, 0);
}
Expand Down Expand Up @@ -170,8 +177,10 @@
<Panel>
<svelte:fragment slot="header">
<GridMenu {gridSection} title="Constraints" />
<PanelHeaderActions status={$checkConstraintsStatus}>
<PanelHeaderActions status={$constraintsStatus} indeterminate>
<PanelHeaderActionButton
disabled={$simulationStatus !== Status.Complete}
tooltipContent={$simulationStatus !== Status.Complete ? 'Completed simulation required' : ''}
title="Check Constraints"
on:click={() => $plan && effects.checkConstraints($plan, user)}
use={[
Expand Down Expand Up @@ -287,7 +296,7 @@
{#each filteredConstraints as constraint}
<ConstraintListItem
{constraint}
constraintResponse={filteredConstraintResponseMap[constraint.id]}
constraintResponse={constraintToConstraintResponseMap[constraint.id]}
hasDeletePermission={$plan ? featurePermissions.constraints.canDelete(user, $plan) : false}
hasEditPermission={$plan ? featurePermissions.constraints.canUpdate(user, $plan) : false}
plan={$plan}
Expand Down Expand Up @@ -331,6 +340,10 @@
gap: 4px;
}
.filter-label :global(svg) {
flex-shrink: 0;
}
.checkbox-container {
align-items: center;
display: flex;
Expand Down
2 changes: 1 addition & 1 deletion src/components/expansion/ExpansionPanel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@
<Panel padBody={false}>
<svelte:fragment slot="header">
<GridMenu {gridSection} title="Expansion" />
<PanelHeaderActions status={$planExpansionStatus}>
<PanelHeaderActions status={$planExpansionStatus} indeterminate>
<PanelHeaderActionButton
title="Expand"
showLabel
Expand Down
1 change: 1 addition & 0 deletions src/components/expansion/ExpansionRuleForm.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@
{#each $models as model}
<option value={model.id}>
{model.name}
(Version: {model.version})
</option>
{/each}
</select>
Expand Down
1 change: 1 addition & 0 deletions src/components/expansion/ExpansionSetForm.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@
{#each $models as model}
<option value={model.id} disabled={!hasModelPermission(model.id, user)}>
{model.name}
(Version: {model.version})
</option>
{/each}
</select>
Expand Down
2 changes: 1 addition & 1 deletion src/components/menus/ActivityStatusMenu.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
<script lang="ts">
import WaterfallIcon from '@nasa-jpl/stellar/icons/waterfall.svg?component';
import { createEventDispatcher } from 'svelte';
import { Status } from '../../enums/status';
import type { ActivityDirectiveValidationStatus } from '../../types/activity';
import type { ActivityErrorCounts } from '../../types/errors';
import { Status } from '../../utilities/status';
import PlanNavButton from '../plan/PlanNavButton.svelte';
import ActivityErrorsRollup from '../ui/ActivityErrorsRollup.svelte';
Expand Down
Loading

0 comments on commit 60acd6e

Please sign in to comment.