From 344e2f4e41acd3512a71c6d429766c18cc4e7a8b Mon Sep 17 00:00:00 2001 From: JosephVolosin Date: Thu, 17 Sep 2026 16:27:44 -0400 Subject: [PATCH] Send directive & span definitions to extension --- src/routes/plans/[id]/+page.svelte | 31 ++++++++++++++++++++++++------ src/stores/activities.ts | 16 ++++++++++++++- src/types/extension.ts | 6 +++++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/routes/plans/[id]/+page.svelte b/src/routes/plans/[id]/+page.svelte index 6eab2ffbb1..f176fde535 100644 --- a/src/routes/plans/[id]/+page.svelte +++ b/src/routes/plans/[id]/+page.svelte @@ -44,10 +44,12 @@ import { activityArgumentDefaults, activityArgumentDefaultsModelId, + activityDirectivesMap, activityDirectiveValidationStatuses, resetActivityStores, selectActivity, - selectedActivityDirectiveId, + selectedActivityDirective, + selectedActivitySpan, } from '../../../stores/activities'; import { activityErrorRollups, @@ -72,8 +74,7 @@ uncheckedConstraintCount, } from '../../../stores/constraints'; import { directiveBuilderIsVisible, resetDirectiveBuilder } from '../../../stores/directiveBuilder'; - import { resetExpansionStores, expansionSequences } from '../../../stores/expansion'; - import { sequenceTemplateExpansionStatus, resetSequenceTemplateStores } from '../../../stores/sequence-template'; + import { expansionSequences, resetExpansionStores } from '../../../stores/expansion'; import { extensions } from '../../../stores/extensions'; import { externalEventTypes } from '../../../stores/external-event'; import { resetExternalSourceStores } from '../../../stores/external-source'; @@ -109,7 +110,11 @@ schedulingAnalysisStatus, schedulingGoalCount, } from '../../../stores/scheduling'; - import { lastTemplatedSimulationDatasetId } from '../../../stores/sequence-template'; + import { + lastTemplatedSimulationDatasetId, + resetSequenceTemplateStores, + sequenceTemplateExpansionStatus, + } from '../../../stores/sequence-template'; import { enableSimulation, externalResourceNames, @@ -117,6 +122,8 @@ resetSimulationStores, resourceTypes, resourceTypesLoading, + selectedSpan, + selectedSpanId, simulationDataset, simulationDatasetId, simulationDatasetLatest, @@ -125,6 +132,7 @@ simulationProgress, simulationStatus, spans, + spanUtilityMaps, } from '../../../stores/simulation'; import { getUserStore } from '../../../stores/user'; import { @@ -135,10 +143,11 @@ viewTogglePanel, viewUpdateGrid, } from '../../../stores/views'; - import type { ActivityDirectiveInsertInput } from '../../../types/activity'; + import type { ActivityDirective, ActivityDirectiveInsertInput } from '../../../types/activity'; import type { ActivityErrorCounts, LogLevel } from '../../../types/console'; import type { Extension } from '../../../types/extension'; import type { PlanSnapshot } from '../../../types/plan-snapshot'; + import type { Span } from '../../../types/simulation'; import type { View, ViewSaveEvent, ViewToggleEvent } from '../../../types/view'; import { getConstraintStatus } from '../../../utilities/constraint'; import effects from '../../../utilities/effects'; @@ -625,9 +634,19 @@ } async function onCallExtension(event: CustomEvent) { + // Gather directive if either directive is directly selected or span is selected + const directive: ActivityDirective | null = $selectedActivityDirective + ? $selectedActivityDirective + : $selectedSpanId && $spanUtilityMaps && $activityDirectivesMap + ? $activityDirectivesMap[$spanUtilityMaps.spanIdToDirectiveIdMap[$selectedSpanId]] + : null; + // Gather span if either span is directly selected or directive is selected + const span: Span | null = $selectedActivitySpan ? $selectedActivitySpan : $selectedSpan ? $selectedSpan : null; + const payload = { planId: $planId, - selectedActivityDirectiveId: $selectedActivityDirectiveId, + selectedActivityDirective: directive, + selectedSimulatedActivity: span, simulationDatasetId: $simulationDatasetId, url: event.detail.url, }; diff --git a/src/stores/activities.ts b/src/stores/activities.ts index bf8fc54d49..01929aa18d 100644 --- a/src/stores/activities.ts +++ b/src/stores/activities.ts @@ -7,7 +7,7 @@ import type { } from '../types/activity'; import type { ActivityMetadataDefinition } from '../types/activity-metadata'; import type { DefaultEffectiveArguments, DefaultEffectiveArgumentsMap } from '../types/parameter'; -import type { SpanId } from '../types/simulation'; +import type { Span, SpanId } from '../types/simulation'; import { computeActivityDirectivesMap } from '../utilities/activities'; import gql from '../utilities/gql'; import { planEndTimeDoy, planId, planStartTimeYmd } from './plan'; @@ -108,6 +108,20 @@ export const selectedActivityDirective = derived( }, ); +export const selectedActivitySpan: Readable = derived( + [spanUtilityMaps, spansMap, selectedActivityDirectiveId], + ([$spanUtilityMaps, $spansMap, $selectedActivityDirectiveId]) => { + if (!$selectedActivityDirectiveId || !$spansMap || !$spanUtilityMaps) { + return null; + } + const spanId = $spanUtilityMaps.directiveIdToSpanIdMap[$selectedActivityDirectiveId]; + if (!spanId) { + return null; + } + return $spansMap[spanId]; + }, +); + /* Helper Functions. */ export function selectActivity( diff --git a/src/types/extension.ts b/src/types/extension.ts index 86c2f27211..d9192d74c3 100644 --- a/src/types/extension.ts +++ b/src/types/extension.ts @@ -1,3 +1,6 @@ +import type { ActivityDirective } from './activity'; +import type { Span } from './simulation'; + export type Extension = { description: string; extension_roles: ExtensionRole[]; @@ -11,7 +14,8 @@ export type ExtensionPayload = { gateway?: string; hasura?: string; planId: number; - selectedActivityDirectiveId: number | null; + selectedActivityDirective: ActivityDirective | null; + selectedSimulatedActivity?: Span | null; simulationDatasetId: number | null; };