Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/components/expansion/ExpansionPanel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,7 @@
}

if (expandedResult !== null) {
// TODO: remove this after expansion runs are made to work in new workspaces
// await effects.sendSequenceToWorkspace(sequence, expandedResult, user);
await effects.sendSequenceToWorkspace(sequence, expandedResult, user);
}
}

Expand Down
47 changes: 14 additions & 33 deletions src/components/modals/ExpansionPanelModal.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,45 @@
import { Label, Select } from '@nasa-jpl/stellar-svelte';
import { createEventDispatcher } from 'svelte';
import { field } from '../../stores/form';
import { parcels } from '../../stores/sequencing';
import { workspaces } from '../../stores/workspaces';
import type { Parcel } from '../../types/sequencing';
import type { User } from '../../types/app';
import type { Workspace } from '../../types/workspace';
import { featurePermissions } from '../../utilities/permissions';
import { min } from '../../utilities/validators';
import Field from '../form/Field.svelte';
import Modal from './Modal.svelte';
import ModalContent from './ModalContent.svelte';
import ModalFooter from './ModalFooter.svelte';
import ModalHeader from './ModalHeader.svelte';

export let user: User | null;
export let height: number = 200;
export let width: number = 380;

const dispatch = createEventDispatcher<{
close: void;
save: { parcelId: number; workspaceId: number };
save: { workspaceId: number; workspaceName: string };
Comment thread
duranb marked this conversation as resolved.
}>();

let workspaceIdField = field<number>(-1, [min(1, 'Field is required')]);
let workspaceIdFieldName: string;
let selectedWorkspace: Workspace | undefined;

let parcelIdField = field<number>(-1, [min(1, 'Field is required')]);
let selectedParcel: Parcel | undefined;
let hasUpdatePermission: boolean = false;

let saveButtonDisabled: boolean = true;

$: saveButtonDisabled = $workspaceIdField.value === -1 || $parcelIdField.value === -1;
$: if (selectedWorkspace !== undefined) {
hasUpdatePermission = featurePermissions.workspace.canUpdate(user, selectedWorkspace);
}
$: saveButtonDisabled = $workspaceIdField.value === -1 || !hasUpdatePermission;
$: selectedWorkspace = $workspaces.find(({ id }) => $workspaceIdField.value === id);
$: selectedParcel = $parcels.find(({ id }) => $parcelIdField.value === id);
$: if ($workspaceIdField.value) {
workspaceIdFieldName = $workspaces.find(workspace => workspace.id === $workspaceIdField.value)?.name ?? '';
}

function save() {
if (!saveButtonDisabled) {
dispatch('save', { parcelId: $parcelIdField.value, workspaceId: $workspaceIdField.value });
dispatch('save', { workspaceId: $workspaceIdField.value, workspaceName: workspaceIdFieldName });
}
}

Expand All @@ -55,13 +60,6 @@
}
return `${workspace.name} (${workspace.id})`;
}

function getDisplayNameForParcel(parcel?: Parcel) {
if (!parcel) {
return '';
}
return `${parcel.name} (${parcel.id})`;
}
</script>

<svelte:window on:keydown={onKeydown} />
Expand Down Expand Up @@ -97,23 +95,6 @@
<Select.Input type="number" name="workspace-id" aria-label="Select Workspace hidden input" />
</Select.Root>
</Field>
<Field field={parcelIdField}>
<Label size="sm" for="parcel-id" class="pb-0.5">Parcel Id</Label>
<Select.Root selected={{ label: getDisplayNameForParcel(selectedParcel), value: selectedParcel?.id ?? '' }}>
<Select.Trigger class="min-w-[124px]" value={selectedParcel?.id} size="xs" aria-labelledby={null}>
<Select.Value aria-label="Select a parcel" placeholder="Select a parcel" />
</Select.Trigger>
<Select.Content class="z-[10000]">
{#each $parcels as parcel}
<Select.Item size="xs" value={parcel.id} label={getDisplayNameForParcel(parcel)} class="flex gap-1">
{parcel.name}
<div class="whitespace-nowrap text-muted-foreground">(Id: {parcel.id})</div>
</Select.Item>
{/each}
</Select.Content>
<Select.Input type="number" name="parcel-id" aria-label="Select Parcel hidden input" />
</Select.Root>
</Field>
</fieldset>
</ModalContent>

Expand Down
67 changes: 67 additions & 0 deletions src/utilities/effects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
import type { SeqJson } from '@nasa-jpl/seq-json-schema/types';
import { chunk } from 'lodash-es';
import { get } from 'svelte/store';
import { PATH_DELIMITER } from '../constants/workspaces';
import { ConstraintDefinitionType } from '../enums/constraint';
import { DictionaryTypes } from '../enums/dictionaryTypes';
import { SchedulingDefinitionType } from '../enums/scheduling';
Expand Down Expand Up @@ -270,6 +271,7 @@ import {
showDeleteExternalEventSourceTypeModal,
showDeleteExternalSourceModal,
showEditViewModal,
showExpansionPanelModal,
showImportWorkspaceFileModal,
showLibrarySequenceModel,
showManagePlanConstraintsModal,
Expand Down Expand Up @@ -7122,6 +7124,71 @@ const effects = {
}
},

async sendSequenceToWorkspace(
sequence: ExpansionSequence | null,
expandedSequence: string | null,
user: User | null,
): Promise<string | null> {
try {
if (sequence === null) {
throw new Error("Sequence Doesn't Exist");
}
if (expandedSequence === null) {
throw new Error("Expanded Sequence Doesn't Exist");
}

const { confirm: confirmWorkspace, value: valueWorkspace } = await showExpansionPanelModal(user);

if (!confirmWorkspace || !valueWorkspace) {
throw new Error('Unable To Find The Specified Workspace');
}

const { workspaceId, workspaceName } = valueWorkspace;

if (!featurePermissions.workspace.canUpdate(user, workspaceId)) {
throwPermissionError('upload to the selected workspace');
}

const workspaceContents = await effects.getWorkspaceContents(workspaceId, '', user);
if (!workspaceContents) {
throw new Error('Unable To Find The Specified Workspace');
}

const workspaceTree: WorkspaceTreeNode = {
contents: workspaceContents,
name: workspaceName,
type: WorkspaceContentType.Workspace,
};
workspaceTree;

const { confirm: confirmNewFile, value: confirmNewFileValue } = await showNewWorkspaceSequenceModal(
workspaceId,
workspaceTree,
workspaceName,
user,
);

if (confirmNewFile && confirmNewFileValue) {
let { filePath: newFilePath } = confirmNewFileValue;
// Trim workspace from path to avoid making extra directory
if (newFilePath.includes(PATH_DELIMITER)) {
const newFilePathContents: Array<string> = newFilePath.split(PATH_DELIMITER);
newFilePathContents.shift();
newFilePath = newFilePathContents.join(PATH_DELIMITER);
}
await WorkspaceApi.saveFile(workspaceId, newFilePath, expandedSequence, false, user);

showSuccessToast('Workspace File Created Successfully');
} else {
throw new Error('Workspace File Creation Failed');
}
} catch (e) {
catchError('Workspace file was unable to be created', e as Error);
showFailureToast('Workspace File Creation Failed');
}
return null;
},

async session(user: BaseUser | null): Promise<ReqSessionResponse> {
try {
const data = await reqGateway<ReqSessionResponse>('/auth/session', 'GET', null, user, false);
Expand Down
6 changes: 3 additions & 3 deletions src/utilities/modal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1604,13 +1604,13 @@ export async function showUpdatePlanMissionModelModal(plan: PlanSlim, user: User
/**
* Shows an ExpansionPanelModal.
*/
export async function showExpansionPanelModal(): Promise<ModalElementValue> {
export async function showExpansionPanelModal(user: User | null): Promise<ModalElementValue> {
return new Promise(resolve => {
if (browser) {
const target: ModalElement | null = document.querySelector('#svelte-modal');

if (target) {
const expansionPanelModal = new ExpansionPanelModal({ props: {}, target });
const expansionPanelModal = new ExpansionPanelModal({ props: { user }, target });
target.resolve = resolve;

expansionPanelModal.$on('close', () => {
Expand All @@ -1620,7 +1620,7 @@ export async function showExpansionPanelModal(): Promise<ModalElementValue> {
expansionPanelModal.$destroy();
});

expansionPanelModal.$on('save', (e: CustomEvent<{ parcelId: number; workspaceId: number }>) => {
expansionPanelModal.$on('save', (e: CustomEvent<{ workspaceId: number; workspaceName: string }>) => {
target.replaceChildren();
target.resolve = null;
resolve({ confirm: true, value: e.detail });
Expand Down
Loading