diff --git a/frontend/src/framework/ModuleContext.ts b/frontend/src/framework/ModuleContext.ts index 063431ee1..591b1a196 100644 --- a/frontend/src/framework/ModuleContext.ts +++ b/frontend/src/framework/ModuleContext.ts @@ -7,6 +7,7 @@ import { GenreType, SubscriberDefinitions, Type, + TypeToTSTypeMapping, } from "./DataChannelTypes"; import { InitialSettings } from "./InitialSettings"; import { ModuleInstance } from "./ModuleInstance"; @@ -102,20 +103,33 @@ export class ModuleContext< channelIdent: TIdent; dependencies: any[]; contents: ContentDefinition[]; - dataGenerator: (contentIdent: string) => TChannelDefs[TIdent]["metaData"] extends undefined - ? Data[] - : { + dataGenerator: (contentIdent: string) => TChannelDefs[TIdent] extends { metaData: Record } + ? { data: Data[]; - metaData: TChannelDefs[TIdent]["metaData"]; - }; + metaData: { + [K in keyof TChannelDefs[TIdent]["metaData"]]: TypeToTSTypeMapping[TChannelDefs[TIdent]["metaData"][K]]; + }; + } + : Data[]; }) { + const { channelIdent, ...rest } = options; const channel = this._moduleInstance.getPublishSubscribeBroker().getChannel(options.channelIdent); if (!channel) { throw new Error(`Channel '${options.channelIdent}' does not exist`); } return usePublish({ channel, - ...options, + ...rest, }); } } + +const l = {} as const; + +type n = typeof l; + +type m = n extends { metaData: Record } + ? { + [K in keyof n["metaData"]]: TypeToTSTypeMapping[n["metaData"][K]]; + } + : never; diff --git a/frontend/src/framework/internal/DataChannels/Channel.ts b/frontend/src/framework/internal/DataChannels/Channel.ts index 0934ce26e..6e2f49c4d 100644 --- a/frontend/src/framework/internal/DataChannels/Channel.ts +++ b/frontend/src/framework/internal/DataChannels/Channel.ts @@ -3,14 +3,22 @@ import { PublishSubscribeBroker } from "./PublishSubscribeBroker"; import { Data, Genre, GenreType, Type } from "../../DataChannelTypes"; -export interface ChannelDefinitions { - [ident: string]: { - name: string; - genre: Genre; - dataType: Type; - metaData?: Record; - }; -} +export type ChannelDefinitions = + | { + [ident: string]: { + name: string; + genre: Genre; + dataType: Type; + }; + } + | { + [ident: string]: { + name: string; + genre: Genre; + dataType: Type; + metaData: Record; + }; + }; export enum ChannelTopic { ContentsChange = "contents-change", diff --git a/frontend/src/framework/internal/DataChannels/Content.ts b/frontend/src/framework/internal/DataChannels/Content.ts index 51a91e2b5..5ce505e17 100644 --- a/frontend/src/framework/internal/DataChannels/Content.ts +++ b/frontend/src/framework/internal/DataChannels/Content.ts @@ -1,5 +1,3 @@ -import { Data } from "../../DataChannelTypes"; - export interface ContentDefinition { ident: string; name: string; diff --git a/frontend/src/framework/internal/DataChannels/PublishSubscribeBroker.ts b/frontend/src/framework/internal/DataChannels/PublishSubscribeBroker.ts index b4d8e20ea..b086ef06e 100644 --- a/frontend/src/framework/internal/DataChannels/PublishSubscribeBroker.ts +++ b/frontend/src/framework/internal/DataChannels/PublishSubscribeBroker.ts @@ -1,7 +1,7 @@ import { Channel, ChannelDefinitions } from "./Channel"; import { Subscriber, SubscriberDefinitions } from "./Subscriber"; -import { Genre } from "../../DataChannelTypes"; +import { Genre, Type } from "../../DataChannelTypes"; export enum BroadcastServiceTopic { ChannelsChange = "channels-change", @@ -26,7 +26,11 @@ export class PublishSubscribeBroker< getChannel>( ident: T - ): Channel | null { + ): Channel< + TChannelDefs[T]["genre"], + TChannelDefs[T]["dataType"], + TChannelDefs[T] extends { metaData: Record } ? TChannelDefs[T]["metaData"] : never + > | null { return this._channels.find((c) => c.getIdent() === ident) ?? null; } diff --git a/frontend/src/framework/internal/DataChannels/hooks/usePublish.ts b/frontend/src/framework/internal/DataChannels/hooks/usePublish.ts index 3882209b0..ac071f876 100644 --- a/frontend/src/framework/internal/DataChannels/hooks/usePublish.ts +++ b/frontend/src/framework/internal/DataChannels/hooks/usePublish.ts @@ -9,7 +9,7 @@ import { ContentDefinition } from "../Content"; export function usePublish< TGenre extends Genre, TContentType extends Type, - TMetaData extends Record | undefined + TMetaData extends Record >(options: { channel: Channel; dependencies: any[]; diff --git a/frontend/src/modules/DistributionPlot/loadModule.tsx b/frontend/src/modules/DistributionPlot/loadModule.tsx index 23f5225c2..5d8e43b80 100644 --- a/frontend/src/modules/DistributionPlot/loadModule.tsx +++ b/frontend/src/modules/DistributionPlot/loadModule.tsx @@ -2,7 +2,7 @@ import { ModuleRegistry } from "@framework/ModuleRegistry"; import { settings } from "./settings"; import { PlotType, State } from "./state"; -import { subscriberDefs } from "./subscriberDefs"; +import { SubscriberDefs } from "./subscriberDefs"; import { view } from "./view"; const defaultState: State = { @@ -11,7 +11,7 @@ const defaultState: State = { orientation: "h", }; -const module = ModuleRegistry.initModule("DistributionPlot", defaultState); +const module = ModuleRegistry.initModule("DistributionPlot", defaultState); module.viewFC = view; module.settingsFC = settings; diff --git a/frontend/src/modules/DistributionPlot/settings.tsx b/frontend/src/modules/DistributionPlot/settings.tsx index 48257a705..f6322ba31 100644 --- a/frontend/src/modules/DistributionPlot/settings.tsx +++ b/frontend/src/modules/DistributionPlot/settings.tsx @@ -8,7 +8,7 @@ import { RadioGroup } from "@lib/components/RadioGroup"; import { Slider } from "@lib/components/Slider"; import { PlotType, State } from "./state"; -import { subscriberDefs } from "./subscriberDefs"; +import { SubscriberDefs } from "./subscriberDefs"; const plotTypes = [ { @@ -34,7 +34,7 @@ export function settings({ moduleContext, workbenchServices, initialSettings, -}: ModuleFCProps) { +}: ModuleFCProps) { const [prevChannelXName, setPrevChannelXName] = React.useState(null); const [prevChannelYName, setPrevChannelYName] = React.useState(null); const [prevChannelColorName, setPrevChannelColorName] = React.useState(null); diff --git a/frontend/src/modules/DistributionPlot/subscriberDefs.ts b/frontend/src/modules/DistributionPlot/subscriberDefs.ts index 1b624f456..a5500860c 100644 --- a/frontend/src/modules/DistributionPlot/subscriberDefs.ts +++ b/frontend/src/modules/DistributionPlot/subscriberDefs.ts @@ -1,4 +1,4 @@ -import { Genre, SubscriberDefinitions } from "@framework/DataChannelTypes"; +import { Genre } from "@framework/DataChannelTypes"; export const subscriberDefs = { ["channelX"]: { @@ -26,3 +26,5 @@ export const subscriberDefs = { supportedGenres: [Genre.Realization], }, } as const; + +export type SubscriberDefs = typeof subscriberDefs; diff --git a/frontend/src/modules/DistributionPlot/view.tsx b/frontend/src/modules/DistributionPlot/view.tsx index c3f134eee..9c2c34108 100644 --- a/frontend/src/modules/DistributionPlot/view.tsx +++ b/frontend/src/modules/DistributionPlot/view.tsx @@ -15,7 +15,7 @@ import { Histogram } from "./components/histogram"; import { ScatterPlot } from "./components/scatterPlot"; import { ScatterPlotWithColorMapping } from "./components/scatterPlotWithColorMapping"; import { PlotType, State } from "./state"; -import { subscriberDefs } from "./subscriberDefs"; +import { SubscriberDefs } from "./subscriberDefs"; function nFormatter(num: number, digits: number): string { const lookup = [ @@ -225,7 +225,7 @@ export const view = ({ workbenchServices, initialSettings, workbenchSettings, -}: ModuleFCProps) => { +}: ModuleFCProps) => { const [plotType, setPlotType] = moduleContext.useStoreState("plotType"); const numBins = moduleContext.useStoreValue("numBins"); const orientation = moduleContext.useStoreValue("orientation"); diff --git a/frontend/src/modules/InplaceVolumetrics/channelDefs.ts b/frontend/src/modules/InplaceVolumetrics/channelDefs.ts index 639e25141..d239debd8 100644 --- a/frontend/src/modules/InplaceVolumetrics/channelDefs.ts +++ b/frontend/src/modules/InplaceVolumetrics/channelDefs.ts @@ -1,4 +1,4 @@ -import { ChannelDefinitions, Genre, Type } from "@framework/DataChannelTypes"; +import { Genre, Type } from "@framework/DataChannelTypes"; export enum BroadcastChannelNames { Response = "Response (per realization)", @@ -12,3 +12,5 @@ export const channelDefs = { metaData: undefined, }, } as const; + +export type ChannelDefs = typeof channelDefs; diff --git a/frontend/src/modules/InplaceVolumetrics/loadModule.tsx b/frontend/src/modules/InplaceVolumetrics/loadModule.tsx index 2c2ad2388..0e832723d 100644 --- a/frontend/src/modules/InplaceVolumetrics/loadModule.tsx +++ b/frontend/src/modules/InplaceVolumetrics/loadModule.tsx @@ -1,6 +1,6 @@ import { ModuleRegistry } from "@framework/ModuleRegistry"; -import { channelDefs } from "./channelDefs"; +import { ChannelDefs } from "./channelDefs"; import { settings } from "./settings"; import { State } from "./state"; import { view } from "./view"; @@ -14,7 +14,7 @@ const defaultState: State = { realizationsToInclude: null, }; -const module = ModuleRegistry.initModule("InplaceVolumetrics", defaultState); +const module = ModuleRegistry.initModule("InplaceVolumetrics", defaultState); module.viewFC = view; module.settingsFC = settings; diff --git a/frontend/src/modules/InplaceVolumetrics/settings.tsx b/frontend/src/modules/InplaceVolumetrics/settings.tsx index 94044cd5d..4b5fb4c1f 100644 --- a/frontend/src/modules/InplaceVolumetrics/settings.tsx +++ b/frontend/src/modules/InplaceVolumetrics/settings.tsx @@ -13,7 +13,7 @@ import { Label } from "@lib/components/Label"; import { Select } from "@lib/components/Select"; import { UseQueryResult } from "@tanstack/react-query"; -import { channelDefs } from "./channelDefs"; +import { ChannelDefs } from "./channelDefs"; import { useTableDescriptionsQuery } from "./queryHooks"; import { State } from "./state"; @@ -97,7 +97,7 @@ function getTableResponseOptions( return responsesToSelectOptions(responses); } -export function settings({ moduleContext, workbenchSession }: ModuleFCProps) { +export function settings({ moduleContext, workbenchSession }: ModuleFCProps) { const ensembleSet = useEnsembleSet(workbenchSession); const [ensembleIdent, setEnsembleIdent] = moduleContext.useStoreState("ensembleIdent"); const [tableName, setTableName] = moduleContext.useStoreState("tableName"); diff --git a/frontend/src/modules/InplaceVolumetrics/view.tsx b/frontend/src/modules/InplaceVolumetrics/view.tsx index 29e985e29..ed176526b 100644 --- a/frontend/src/modules/InplaceVolumetrics/view.tsx +++ b/frontend/src/modules/InplaceVolumetrics/view.tsx @@ -11,12 +11,12 @@ import { useElementSize } from "@lib/hooks/useElementSize"; import { Layout, PlotData, PlotHoverEvent } from "plotly.js"; -import { BroadcastChannelNames, channelDefs } from "./channelDefs"; +import { BroadcastChannelNames, ChannelDefs } from "./channelDefs"; import { useRealizationsResponseQuery } from "./queryHooks"; import { VolumetricResponseAbbreviations } from "./settings"; import { State } from "./state"; -export const view = (props: ModuleFCProps) => { +export const view = (props: ModuleFCProps) => { const wrapperDivRef = React.useRef(null); const wrapperDivSize = useElementSize(wrapperDivRef); const ensembleIdent = props.moduleContext.useStoreValue("ensembleIdent"); diff --git a/frontend/src/modules/InplaceVolumetricsNew/channelDefs.ts b/frontend/src/modules/InplaceVolumetricsNew/channelDefs.ts index f777327df..c99dc7dfa 100644 --- a/frontend/src/modules/InplaceVolumetricsNew/channelDefs.ts +++ b/frontend/src/modules/InplaceVolumetricsNew/channelDefs.ts @@ -4,10 +4,13 @@ export enum Channels { ResponseValuePerRealization = "Response value (per realization)", } -export const channels: ChannelDefinitions = { +export const channelDefs = { [Channels.ResponseValuePerRealization]: { name: "Response value (per realization)", genre: Genre.Realization, dataType: Type.Number, + metaData: {}, }, -}; +} as const; + +export type ChannelDefs = typeof channelDefs; diff --git a/frontend/src/modules/InplaceVolumetricsNew/loadModule.tsx b/frontend/src/modules/InplaceVolumetricsNew/loadModule.tsx index 8c98dd1f5..442afcc88 100644 --- a/frontend/src/modules/InplaceVolumetricsNew/loadModule.tsx +++ b/frontend/src/modules/InplaceVolumetricsNew/loadModule.tsx @@ -1,5 +1,6 @@ import { ModuleRegistry } from "@framework/ModuleRegistry"; +import { ChannelDefs } from "./channelDefs"; import { settings } from "./settings"; import { State } from "./state"; import { view } from "./view"; @@ -11,7 +12,7 @@ const defaultState: State = { selectedCategoricalMetadata: [], }; -const module = ModuleRegistry.initModule("InplaceVolumetricsNew", defaultState); +const module = ModuleRegistry.initModule("InplaceVolumetricsNew", defaultState); module.viewFC = view; module.settingsFC = settings; diff --git a/frontend/src/modules/InplaceVolumetricsNew/registerModule.ts b/frontend/src/modules/InplaceVolumetricsNew/registerModule.ts index 1561441af..48ba2176a 100644 --- a/frontend/src/modules/InplaceVolumetricsNew/registerModule.ts +++ b/frontend/src/modules/InplaceVolumetricsNew/registerModule.ts @@ -1,11 +1,11 @@ import { ModuleRegistry } from "@framework/ModuleRegistry"; -import { channels } from "./channelDefs"; +import { channelDefs } from "./channelDefs"; import { State } from "./state"; ModuleRegistry.registerModule({ moduleName: "InplaceVolumetricsNew", defaultTitle: "Inplace Volumetrics (new)", description: "A module for comparing and investigating responses.", - channels: channels, + channels: channelDefs, }); diff --git a/frontend/src/modules/InplaceVolumetricsNew/settings.tsx b/frontend/src/modules/InplaceVolumetricsNew/settings.tsx index 581d20030..dcb577d11 100644 --- a/frontend/src/modules/InplaceVolumetricsNew/settings.tsx +++ b/frontend/src/modules/InplaceVolumetricsNew/settings.tsx @@ -13,6 +13,7 @@ import { Label } from "@lib/components/Label"; import { LoadingStateWrapper } from "@lib/components/StateWrapper/stateWrapper"; import { FilterAlt } from "@mui/icons-material"; +import { ChannelDefs } from "./channelDefs"; import FilterSelect from "./components/filterSelect"; import { useTableNameAndMetadataFilterOptions } from "./hooks/useTableNameAndMetadataFilterOptions"; import { useTableNamesAndMetadata } from "./hooks/useTableNamesAndMetadata"; @@ -32,7 +33,7 @@ function findValidRealizations(ensembleIdents: EnsembleIdent[], ensembleSet: Ens return validRealizations; } -export const settings = ({ workbenchSession, moduleContext }: ModuleFCProps) => { +export const settings = ({ workbenchSession, moduleContext }: ModuleFCProps) => { const [selectedEnsembleIdents, setSelectedEnsembleIdents] = moduleContext.useStoreState("selectedEnsembleIdents"); const [selectedResponseNames, setSelectedResponseNames] = moduleContext.useStoreState("selectedResponseNames"); const [selectedTableNames, setSelectedTableNames] = moduleContext.useStoreState("selectedTableNames"); diff --git a/frontend/src/modules/InplaceVolumetricsNew/view.tsx b/frontend/src/modules/InplaceVolumetricsNew/view.tsx index 00be27f70..8c8cf26a7 100644 --- a/frontend/src/modules/InplaceVolumetricsNew/view.tsx +++ b/frontend/src/modules/InplaceVolumetricsNew/view.tsx @@ -7,11 +7,11 @@ import { TableHeading } from "@lib/components/Table/table"; import { useElementSize } from "@lib/hooks/useElementSize"; import { ContentInfo } from "@modules/_shared/components/ContentMessage"; -import { Channels } from "./channelDefs"; +import { ChannelDefs, Channels } from "./channelDefs"; import { useRealizationsResponses } from "./hooks/useRealizationResponses"; import { State } from "./state"; -export const view = (props: ModuleFCProps) => { +export const view = (props: ModuleFCProps) => { const responseNames = props.moduleContext.useStoreValue("selectedResponseNames"); const tableNames = props.moduleContext.useStoreValue("selectedTableNames"); const ensembleIdents = props.moduleContext.useStoreValue("selectedEnsembleIdents"); diff --git a/frontend/src/modules/Map/channelDefs.ts b/frontend/src/modules/Map/channelDefs.ts index dad3cd9e1..7df073706 100644 --- a/frontend/src/modules/Map/channelDefs.ts +++ b/frontend/src/modules/Map/channelDefs.ts @@ -1,14 +1,15 @@ -import { ChannelDefinition, DataType, Genre } from "@framework/DataChannelTypes"; +import { Genre, Type } from "@framework/DataChannelTypes"; export enum Channels { GridIJK = "Grid IJK", } -export const channels: ChannelDefinition[] = [ - { - ident: Channels.GridIJK, +export const channelDefs = { + [Channels.GridIJK]: { name: "Grid IJK", genre: Genre.GridIJK, - dataType: DataType.Numeric, + dataType: Type.Number, }, -]; +} as const; + +export type ChannelDefs = typeof channelDefs; diff --git a/frontend/src/modules/Map/registerModule.ts b/frontend/src/modules/Map/registerModule.ts index 20e988823..1f7abaa98 100644 --- a/frontend/src/modules/Map/registerModule.ts +++ b/frontend/src/modules/Map/registerModule.ts @@ -2,7 +2,7 @@ import { ModuleRegistry } from "@framework/ModuleRegistry"; import { SyncSettingKey } from "@framework/SyncSettings"; import { MapState } from "./MapState"; -import { channels } from "./channelDefs"; +import { channelDefs } from "./channelDefs"; import { preview } from "./preview"; ModuleRegistry.registerModule({ @@ -10,5 +10,5 @@ ModuleRegistry.registerModule({ defaultTitle: "Map", syncableSettingKeys: [SyncSettingKey.ENSEMBLE, SyncSettingKey.SURFACE, SyncSettingKey.DATE], preview, - channels: channels, + channels: channelDefs, }); diff --git a/frontend/src/modules/SimulationTimeSeries/channelDefs.ts b/frontend/src/modules/SimulationTimeSeries/channelDefs.ts index 900705071..8a7ae2680 100644 --- a/frontend/src/modules/SimulationTimeSeries/channelDefs.ts +++ b/frontend/src/modules/SimulationTimeSeries/channelDefs.ts @@ -1,14 +1,16 @@ -import { ChannelDefinition, DataType, Genre } from "@framework/DataChannelTypes"; +import { ChannelDefinitions, Genre, Type } from "@framework/DataChannelTypes"; export enum BroadcastChannelNames { Realization_Value = "Value (per realization)", } -export const channelDefs: ChannelDefinition[] = [ - { - ident: BroadcastChannelNames.Realization_Value, +export const channelDefs = { + [BroadcastChannelNames.Realization_Value]: { name: "Value (per realization)", genre: Genre.Realization, - dataType: DataType.Numeric, + dataType: Type.Number, + metaData: undefined, }, -]; +} as const; + +export type ChannelDefs = typeof channelDefs; diff --git a/frontend/src/modules/SimulationTimeSeries/loadModule.tsx b/frontend/src/modules/SimulationTimeSeries/loadModule.tsx index 22bd982f0..6c79023af 100644 --- a/frontend/src/modules/SimulationTimeSeries/loadModule.tsx +++ b/frontend/src/modules/SimulationTimeSeries/loadModule.tsx @@ -1,6 +1,7 @@ import { Frequency_api } from "@api"; import { ModuleRegistry } from "@framework/ModuleRegistry"; +import { ChannelDefs } from "./channelDefs"; import { settings } from "./settings"; import { State } from "./state"; import { view } from "./view"; @@ -14,7 +15,7 @@ const defaultState: State = { realizationsToInclude: null, }; -const module = ModuleRegistry.initModule("SimulationTimeSeries", defaultState); +const module = ModuleRegistry.initModule("SimulationTimeSeries", defaultState); module.viewFC = view; module.settingsFC = settings; diff --git a/frontend/src/modules/SimulationTimeSeries/settings.tsx b/frontend/src/modules/SimulationTimeSeries/settings.tsx index f04fc8247..fef3419dc 100644 --- a/frontend/src/modules/SimulationTimeSeries/settings.tsx +++ b/frontend/src/modules/SimulationTimeSeries/settings.tsx @@ -17,11 +17,12 @@ import { Select, SelectOption } from "@lib/components/Select"; import { sortBy, sortedUniq } from "lodash"; +import { ChannelDefs } from "./channelDefs"; import { useVectorListQuery } from "./queryHooks"; import { State } from "./state"; //----------------------------------------------------------------------------------------------------------- -export function settings({ moduleContext, workbenchSession, workbenchServices }: ModuleFCProps) { +export function settings({ moduleContext, workbenchSession, workbenchServices }: ModuleFCProps) { const myInstanceIdStr = moduleContext.getInstanceIdString(); console.debug(`${myInstanceIdStr} -- render SimulationTimeSeries settings`); diff --git a/frontend/src/modules/SimulationTimeSeries/view.tsx b/frontend/src/modules/SimulationTimeSeries/view.tsx index a70fb3f23..19afcad6b 100644 --- a/frontend/src/modules/SimulationTimeSeries/view.tsx +++ b/frontend/src/modules/SimulationTimeSeries/view.tsx @@ -8,7 +8,7 @@ import { useElementSize } from "@lib/hooks/useElementSize"; import { Layout, PlotData, PlotDatum, PlotHoverEvent } from "plotly.js"; -import { BroadcastChannelNames } from "./channelDefs"; +import { BroadcastChannelNames, ChannelDefs } from "./channelDefs"; import { useHistoricalVectorDataQuery, useStatisticalVectorDataQuery, useVectorDataQuery } from "./queryHooks"; import { State } from "./state"; @@ -19,7 +19,7 @@ interface MyPlotData extends Partial { legendrank?: number; } -export const view = ({ moduleContext, workbenchSession, workbenchServices }: ModuleFCProps) => { +export const view = ({ moduleContext, workbenchSession, workbenchServices }: ModuleFCProps) => { // Leave this in until we get a feeling for React18/Plotly const renderCount = React.useRef(0); React.useEffect(function incrementRenderCount() { diff --git a/frontend/src/modules/SimulationTimeSeriesMatrix/channelDefs.ts b/frontend/src/modules/SimulationTimeSeriesMatrix/channelDefs.ts index c40c5d62f..cab4cb902 100644 --- a/frontend/src/modules/SimulationTimeSeriesMatrix/channelDefs.ts +++ b/frontend/src/modules/SimulationTimeSeriesMatrix/channelDefs.ts @@ -1,18 +1,19 @@ -import { ChannelDefinition, DataType, Genre } from "@framework/DataChannelTypes"; +import { Genre, Type } from "@framework/DataChannelTypes"; export enum BroadcastChannelNames { TimeSeries = "TimeSeries (with value per realization)", } -export const channelDefs: ChannelDefinition[] = [ - { - ident: BroadcastChannelNames.TimeSeries, +export const channelDefs = { + [BroadcastChannelNames.TimeSeries]: { name: "TimeSeries (with value per realization)", genre: Genre.Realization, - dataType: DataType.Numeric, + dataType: Type.Number, metaData: { - ensemble: DataType.String, - unit: DataType.String, + ensemble: Type.String, + unit: Type.String, }, }, -]; +} as const; + +export type ChannelDefs = typeof channelDefs; diff --git a/frontend/src/modules/SimulationTimeSeriesMatrix/loadModule.tsx b/frontend/src/modules/SimulationTimeSeriesMatrix/loadModule.tsx index 925579edb..b5d46d5ee 100644 --- a/frontend/src/modules/SimulationTimeSeriesMatrix/loadModule.tsx +++ b/frontend/src/modules/SimulationTimeSeriesMatrix/loadModule.tsx @@ -1,6 +1,7 @@ import { Frequency_api, StatisticFunction_api } from "@api"; import { ModuleRegistry } from "@framework/ModuleRegistry"; +import { ChannelDefs } from "./channelDefs"; import { settings } from "./settings"; import { FanchartStatisticOption, GroupBy, State, VisualizationMode } from "./state"; import { view } from "./view"; @@ -21,7 +22,7 @@ const defaultState: State = { realizationsToInclude: null, }; -const module = ModuleRegistry.initModule("SimulationTimeSeriesMatrix", defaultState); +const module = ModuleRegistry.initModule("SimulationTimeSeriesMatrix", defaultState); module.viewFC = view; module.settingsFC = settings; diff --git a/frontend/src/modules/SimulationTimeSeriesMatrix/settings.tsx b/frontend/src/modules/SimulationTimeSeriesMatrix/settings.tsx index daacb8325..e0ecd5eb2 100644 --- a/frontend/src/modules/SimulationTimeSeriesMatrix/settings.tsx +++ b/frontend/src/modules/SimulationTimeSeriesMatrix/settings.tsx @@ -26,6 +26,7 @@ import { FilterAlt } from "@mui/icons-material"; import { isEqual } from "lodash"; +import { ChannelDefs } from "./channelDefs"; import { useVectorListQueries } from "./queryHooks"; import { FanchartStatisticOption, @@ -47,7 +48,7 @@ enum StatisticsType { FANCHART = "Fanchart", } -export function settings({ moduleContext, workbenchSession }: ModuleFCProps) { +export function settings({ moduleContext, workbenchSession }: ModuleFCProps) { const ensembleSet = useEnsembleSet(workbenchSession); const statusWriter = useSettingsStatusWriter(moduleContext); diff --git a/frontend/src/modules/SimulationTimeSeriesMatrix/view.tsx b/frontend/src/modules/SimulationTimeSeriesMatrix/view.tsx index 02d6dadfc..f2a5d94db 100644 --- a/frontend/src/modules/SimulationTimeSeriesMatrix/view.tsx +++ b/frontend/src/modules/SimulationTimeSeriesMatrix/view.tsx @@ -13,7 +13,7 @@ import { ContentError } from "@modules/_shared/components/ContentMessage"; import { indexOf } from "lodash"; import { Layout, PlotDatum, PlotMouseEvent } from "plotly.js"; -import { BroadcastChannelNames } from "./channelDefs"; +import { BroadcastChannelNames, ChannelDefs } from "./channelDefs"; import { useHistoricalVectorDataQueries, useStatisticalVectorDataQueries, useVectorDataQueries } from "./queryHooks"; import { GroupBy, State, VisualizationMode } from "./state"; import { EnsemblesContinuousParameterColoring } from "./utils/ensemblesContinuousParameterColoring"; @@ -24,7 +24,7 @@ import { filterVectorSpecificationAndIndividualStatisticsDataArray, } from "./utils/vectorSpecificationsAndQueriesUtils"; -export const view = ({ moduleContext, workbenchSession, workbenchSettings }: ModuleFCProps) => { +export const view = ({ moduleContext, workbenchSession, workbenchSettings }: ModuleFCProps) => { const wrapperDivRef = React.useRef(null); const wrapperDivSize = useElementSize(wrapperDivRef); @@ -143,7 +143,10 @@ export const view = ({ moduleContext, workbenchSession, workbenchSettings }: Mod }); return { data, - metaData: metaData ?? undefined, + metaData: metaData ?? { + unit: "", + ensemble: "", + }, }; }, }); diff --git a/frontend/src/modules/SimulationTimeSeriesSensitivity/channelDefs.ts b/frontend/src/modules/SimulationTimeSeriesSensitivity/channelDefs.ts index 0ebd32214..ccec01f48 100644 --- a/frontend/src/modules/SimulationTimeSeriesSensitivity/channelDefs.ts +++ b/frontend/src/modules/SimulationTimeSeriesSensitivity/channelDefs.ts @@ -1,14 +1,13 @@ -import { ChannelDefinition, DataType, Genre } from "@framework/DataChannelTypes"; +import { Genre, Type } from "@framework/DataChannelTypes"; export enum BroadcastChannelNames { Realization_Value = "Value (per realization)", } -export const channelDefs: ChannelDefinition[] = [ - { - ident: BroadcastChannelNames.Realization_Value, +export const channelDefs = { + [BroadcastChannelNames.Realization_Value]: { name: "Value (per realization)", genre: Genre.Realization, - dataType: DataType.Numeric + dataType: Type.Number, }, -]; +} as const; diff --git a/frontend/src/modules/TornadoChart/registerModule.ts b/frontend/src/modules/TornadoChart/registerModule.ts index c34c58fc7..77a153c50 100644 --- a/frontend/src/modules/TornadoChart/registerModule.ts +++ b/frontend/src/modules/TornadoChart/registerModule.ts @@ -1,18 +1,17 @@ -import { Genre, SubscriberDefinition } from "@framework/DataChannelTypes"; +import { Genre } from "@framework/DataChannelTypes"; import { ModuleRegistry } from "@framework/ModuleRegistry"; import { SyncSettingKey } from "@framework/SyncSettings"; import { preview } from "./preview"; import { State } from "./state"; -const subscriberDefs: SubscriberDefinition[] = [ - { - ident: "response", +const subscriberDefs = { + ["response"]: { name: "Response", supportedGenres: [Genre.Realization], supportsMultiContents: false, }, -]; +} as const; ModuleRegistry.registerModule({ moduleName: "TornadoChart",