diff --git a/src/components/timeline/form/TimelineEditorLayerFilter.svelte b/src/components/timeline/form/TimelineEditorLayerFilter.svelte index c2baa5be9f..de142497de 100644 --- a/src/components/timeline/form/TimelineEditorLayerFilter.svelte +++ b/src/components/timeline/form/TimelineEditorLayerFilter.svelte @@ -10,7 +10,7 @@ export let layer: Layer; export let values: string[]; - export let options: string[]; + export let options: string[] = []; const dispatch = createEventDispatcher(); diff --git a/src/components/timeline/form/TimelineEditorPanel.svelte b/src/components/timeline/form/TimelineEditorPanel.svelte index 2b74963fff..cc73c88382 100644 --- a/src/components/timeline/form/TimelineEditorPanel.svelte +++ b/src/components/timeline/form/TimelineEditorPanel.svelte @@ -28,6 +28,7 @@ viewUpdateRow, viewUpdateTimeline, } from '../../../stores/views'; + import type { ActivityType } from '../../../types/activity'; import type { ActivityLayer, Axis, @@ -431,15 +432,16 @@ return []; } - function getFilterOptionsForLayer(layer: Layer) { + function getFilterOptionsForLayer(layer: Layer, activityTypes: ActivityType[], externalResourceNames: string[]) { if (layer.chartType === 'activity') { - return $activityTypes.map(t => t.name); + return activityTypes.map(t => t.name); } else if (layer.chartType === 'line' || layer.chartType === 'x-range') { return $resourceTypes .map(t => t.name) - .concat($externalResourceNames) + .concat(externalResourceNames) .sort(); } + return []; } @@ -945,7 +947,7 @@ { const { values } = event.detail; diff --git a/src/routes/plans/[id]/+page.svelte b/src/routes/plans/[id]/+page.svelte index 37ecfc1a43..633c427b9f 100644 --- a/src/routes/plans/[id]/+page.svelte +++ b/src/routes/plans/[id]/+page.svelte @@ -52,6 +52,7 @@ activityTypes, maxTimeRange, plan, + planDatasets, planEndTimeMs, planId, planLocked, @@ -157,7 +158,6 @@ let windowWidth = 0; let simulationDataAbortController: AbortController; let resourcesExternalAbortController: AbortController; - let externalDatasetNamesAbortController: AbortController; $: ({ invalidActivityCount, ...activityErrorCounts } = $activityErrorRollups.reduce( (prevCounts, activityErrorRollup) => { @@ -290,12 +290,16 @@ initializeView({ ...data.initialView }); } - $: if ($plan) { - externalDatasetNamesAbortController?.abort(); - externalDatasetNamesAbortController = new AbortController(); - effects - .getExternalDatasetNames($plan.id, data.user, externalDatasetNamesAbortController.signal) - .then(names => ($externalResourceNames = names)); + $: if ($plan && $planDatasets) { + let datasetNames = []; + + for (const dataset of $planDatasets) { + for (const profile of dataset.dataset.profiles) { + datasetNames.push(profile.name); + } + } + + $externalResourceNames = [...new Set(datasetNames)]; resourcesExternalAbortController?.abort(); resourcesExternalAbortController = new AbortController(); diff --git a/src/stores/plan.ts b/src/stores/plan.ts index eb48097c57..5cd1f438cb 100644 --- a/src/stores/plan.ts +++ b/src/stores/plan.ts @@ -2,6 +2,7 @@ import { derived, writable, type Readable, type Writable } from 'svelte/store'; import type { ActivityType } from '../types/activity'; import type { ModelSlim } from '../types/model'; import type { Plan, PlanMergeRequest, PlanMergeRequestSchema } from '../types/plan'; +import type { PlanDataset } from '../types/simulation'; import type { Tag } from '../types/tags'; import type { TimeRange } from '../types/timeline'; import gql from '../utilities/gql'; @@ -47,6 +48,8 @@ export const planTags = gqlSubscribable(gql.SUB_PLAN_TAGS, { planId }, [] export const models = gqlSubscribable(gql.SUB_MODELS, {}, [], null); +export const planDatasets = gqlSubscribable(gql.SUB_PLAN_DATASET, { planId }, [], null); + export const planLocked = gqlSubscribable( gql.SUB_PLAN_LOCKED, { planId }, diff --git a/src/utilities/effects.ts b/src/utilities/effects.ts index 2b9d741531..b8a8d00f7d 100644 --- a/src/utilities/effects.ts +++ b/src/utilities/effects.ts @@ -112,7 +112,6 @@ import type { } from '../types/sequencing'; import type { PlanDataset, - PlanDatasetNames, Profile, Resource, ResourceType, @@ -2580,44 +2579,6 @@ const effects = { } }, - async getExternalDatasetNames( - planId: number, - user: User | null, - signal: AbortSignal | undefined = undefined, - ): Promise { - try { - const data = await reqHasura( - gql.GET_PROFILES_EXTERNAL_NAMES, - { - planId, - }, - user, - signal, - ); - const { plan_dataset: plan_datasets } = data; - - if (plan_datasets != null) { - const resourceNames: string[] = []; - - for (const dataset of plan_datasets) { - for (const profile of dataset.dataset.profiles) { - resourceNames.push(profile.name); - } - } - - return [...new Set(resourceNames)]; - } else { - throw Error('Unable to get external resource names'); - } - } catch (e) { - const error = e as Error; - if (error.name !== 'AbortError') { - catchError(error); - } - return []; - } - }, - async getModels(user: User | null): Promise { try { const data = await reqHasura(gql.GET_MODELS, {}, user); diff --git a/src/utilities/gql.ts b/src/utilities/gql.ts index a36329eda5..b0857e32b6 100644 --- a/src/utilities/gql.ts +++ b/src/utilities/gql.ts @@ -1683,6 +1683,23 @@ const gql = { } `, + SUB_PLAN_DATASET: `#graphql + subscription SubPlanDatasets($planId: Int!) { + plan_dataset(where: {plan_id: {_eq: $planId}}) { + dataset_id + simulation_dataset_id + dataset { + profiles { + duration + id + name + type + } + } + } + } + `, + SUB_PLAN_LOCKED: `#graphql subscription SubPlanLocked($planId: Int!) { planLocked: plan_by_pk(id: $planId) {