Skip to content

Commit d5339e4

Browse files
committed
Add persistence
1 parent f0d9615 commit d5339e4

File tree

12 files changed

+457
-328
lines changed

12 files changed

+457
-328
lines changed

frontend/src/modules/ModuleSerializedStateMap.ts

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Generated by generateModuleSerializedStateMap CLI
33

44
import type { SerializedSettings as M_2DViewerSettings } from "@modules/2DViewer/settings/persistence";
5+
import type { SerializedSettings as WellCompletionsSettings } from "@modules/WellCompletions/settings/persistence";
56
import type { SerializedView as M_2DViewerView } from "@modules/2DViewer/view/persistence";
67

78
export type ModuleSerializedStateMap = {
@@ -13,10 +14,6 @@ export type ModuleSerializedStateMap = {
1314
settings?: never,
1415
view?: never,
1516
},
16-
"3DViewerNew": {
17-
settings?: never,
18-
view?: never,
19-
},
2017
"DbgWorkbenchSpy": {
2118
settings?: never,
2219
view?: never,
@@ -29,14 +26,6 @@ export type ModuleSerializedStateMap = {
2926
settings?: never,
3027
view?: never,
3128
},
32-
"Grid3D": {
33-
settings?: never,
34-
view?: never,
35-
},
36-
"Grid3DIntersection": {
37-
settings?: never,
38-
view?: never,
39-
},
4029
"InplaceVolumesPlot": {
4130
settings?: never,
4231
view?: never,
@@ -45,10 +34,6 @@ export type ModuleSerializedStateMap = {
4534
settings?: never,
4635
view?: never,
4736
},
48-
"InplaceVolumetrics": {
49-
settings?: never,
50-
view?: never,
51-
},
5237
"Intersection": {
5338
settings?: never,
5439
view?: never,
@@ -93,10 +78,6 @@ export type ModuleSerializedStateMap = {
9378
settings?: never,
9479
view?: never,
9580
},
96-
"SeismicIntersection": {
97-
settings?: never,
98-
view?: never,
99-
},
10081
"SensitivityPlot": {
10182
settings?: never,
10283
view?: never,
@@ -105,23 +86,15 @@ export type ModuleSerializedStateMap = {
10586
settings?: never,
10687
view?: never,
10788
},
108-
"SimulationTimeSeriesMatrix": {
109-
settings?: never,
110-
view?: never,
111-
},
11289
"SimulationTimeSeriesSensitivity": {
11390
settings?: never,
11491
view?: never,
11592
},
116-
"StructuralUncertaintyIntersection": {
117-
settings?: never,
118-
view?: never,
119-
},
12093
"SubsurfaceMap": {
12194
settings?: never,
12295
view?: never,
12396
},
124-
"TimeSeriesParameterDistribution": {
97+
"TopographicMap": {
12598
settings?: never,
12699
view?: never,
127100
},
@@ -130,7 +103,7 @@ export type ModuleSerializedStateMap = {
130103
view?: never,
131104
},
132105
"WellCompletions": {
133-
settings?: never,
106+
settings?: Partial<WellCompletionsSettings>,
134107
view?: never,
135108
},
136109
"WellLogViewer": {

frontend/src/modules/WellCompletions/loadModule.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ import { ModuleRegistry } from "@framework/ModuleRegistry";
22

33
import type { Interfaces } from "./interfaces";
44
import { settingsToViewInterfaceInitialization } from "./interfaces";
5+
import { serializeStateFunctions, type SerializedState } from "./persistence";
56
import { MODULE_NAME } from "./registerModule";
67
import { Settings } from "./settings/settings";
78
import { View } from "./view";
89

9-
const module = ModuleRegistry.initModule<Interfaces>(MODULE_NAME, { settingsToViewInterfaceInitialization });
10+
const module = ModuleRegistry.initModule<Interfaces, SerializedState>(MODULE_NAME, {
11+
settingsToViewInterfaceInitialization,
12+
...serializeStateFunctions,
13+
});
1014

1115
module.viewFC = View;
1216
module.settingsFC = Settings;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { ModuleComponentSerializationFunctions, ModuleStateSchema } from "@framework/Module";
2+
3+
import {
4+
deserializeSettings,
5+
SERIALIZED_SETTINGS_SCHEMA,
6+
serializeSettings,
7+
type SerializedSettings,
8+
} from "./settings/persistence";
9+
10+
export type SerializedState = {
11+
settings: SerializedSettings;
12+
};
13+
14+
export const SERIALIZED_STATE_SCHEMA: ModuleStateSchema<SerializedState> = {
15+
settings: SERIALIZED_SETTINGS_SCHEMA,
16+
} as const;
17+
18+
export const serializeStateFunctions: ModuleComponentSerializationFunctions<SerializedState> = {
19+
serializeStateFunctions: {
20+
settings: serializeSettings,
21+
},
22+
deserializeStateFunctions: {
23+
settings: deserializeSettings,
24+
},
25+
};

frontend/src/modules/WellCompletions/registerModule.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@ import { ModuleDataTagId } from "@framework/ModuleDataTags";
33
import { ModuleRegistry } from "@framework/ModuleRegistry";
44

55
import type { Interfaces } from "./interfaces";
6+
import { SERIALIZED_STATE_SCHEMA, type SerializedState } from "./persistence";
67
import { preview } from "./preview";
78

89
export const MODULE_NAME = "WellCompletions";
910
const description = "Vizualizes Eclipse well completions data per well. The data is grouped by well and zone.";
1011

11-
ModuleRegistry.registerModule<Interfaces>({
12+
ModuleRegistry.registerModule<Interfaces, SerializedState>({
1213
moduleName: MODULE_NAME,
1314
defaultTitle: "Well Completions",
1415
category: ModuleCategory.MAIN,
1516
devState: ModuleDevState.PROD,
1617
dataTagIds: [ModuleDataTagId.WELL_COMPLETIONS],
1718
preview,
1819
description,
20+
serializedStateSchema: SERIALIZED_STATE_SCHEMA,
1921
});

frontend/src/modules/WellCompletions/settings/atoms/baseAtoms.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,15 @@ import { atom } from "jotai";
33

44
import type { RegularEnsembleIdent } from "@framework/RegularEnsembleIdent";
55
import type { ColorSet } from "@lib/utils/ColorSet";
6-
import { RealizationSelection, TimeAggregationSelection } from "@modules/WellCompletions/typesAndEnums";
7-
6+
import { RealizationMode, TimeAggregationMode } from "@modules/WellCompletions/typesAndEnums";
87

98
export const syncedEnsembleIdentsAtom = atom<RegularEnsembleIdent[] | null>(null);
109
export const selectedStratigraphyColorSetAtom = atom<ColorSet | null>(null);
11-
export const userExcludeWellTextAtom = atom<string>("");
12-
export const userSearchWellTextAtom = atom<string>("");
13-
export const userSelectedCompletionDateIndexAtom = atom<number>(0);
14-
export const userSelectedCompletionDateIndexRangeAtom = atom<[number, number]>([0, 0]);
15-
export const userSelectedTimeAggregationAtom = atom<TimeAggregationSelection>(TimeAggregationSelection.NONE);
16-
export const userSelectedHideZeroCompletionsAtom = atom<boolean>(false);
17-
export const userSelectedEnsembleIdentAtom = atom<RegularEnsembleIdent | null>(null);
18-
export const userSelectedRealizationNumberAtom = atom<number | null>(null);
19-
export const userSelectedRealizationSelectionAtom = atom<RealizationSelection>(RealizationSelection.AGGREGATED);
20-
export const userSelectedSortWellsByAtom = atom<SortWellsBy>(SortWellsBy.WELL_NAME);
21-
export const userSelectedSortWellsDirectionAtom = atom<SortDirection>(SortDirection.ASCENDING);
10+
11+
export const realizationModeAtom = atom<RealizationMode>(RealizationMode.AGGREGATED);
12+
export const timeAggregationModeAtom = atom<TimeAggregationMode>(TimeAggregationMode.NONE);
13+
export const isZeroCompletionsHiddenAtom = atom<boolean>(false);
14+
export const wellExclusionTextAtom = atom<string>("");
15+
export const wellSearchTextAtom = atom<string>("");
16+
export const sortWellsByAtom = atom<SortWellsBy>(SortWellsBy.WELL_NAME);
17+
export const wellSortDirectionAtom = atom<SortDirection>(SortDirection.ASCENDING);
Lines changed: 30 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,28 @@
11
import type { PlotData } from "@webviz/well-completions-plot";
22
import { atom } from "jotai";
33

4-
import { EnsembleSetAtom, ValidEnsembleRealizationsFunctionAtom } from "@framework/GlobalAtoms";
5-
import type { RegularEnsembleIdent } from "@framework/RegularEnsembleIdent";
6-
import { DataLoadingStatus, TimeAggregationSelection } from "@modules/WellCompletions/typesAndEnums";
4+
import { ValidEnsembleRealizationsFunctionAtom } from "@framework/GlobalAtoms";
5+
import { DataLoadingStatus, TimeAggregationMode } from "@modules/WellCompletions/typesAndEnums";
76
import { WellCompletionsDataAccessor } from "@modules/WellCompletions/utils/wellCompletionsDataAccessor";
87

9-
108
import {
119
selectedStratigraphyColorSetAtom,
12-
syncedEnsembleIdentsAtom,
13-
userExcludeWellTextAtom,
14-
userSearchWellTextAtom,
15-
userSelectedCompletionDateIndexAtom,
16-
userSelectedCompletionDateIndexRangeAtom,
17-
userSelectedEnsembleIdentAtom,
18-
userSelectedHideZeroCompletionsAtom,
19-
userSelectedRealizationNumberAtom,
20-
userSelectedSortWellsByAtom,
21-
userSelectedSortWellsDirectionAtom,
22-
userSelectedTimeAggregationAtom,
10+
wellExclusionTextAtom,
11+
wellSearchTextAtom,
12+
isZeroCompletionsHiddenAtom,
13+
sortWellsByAtom,
14+
wellSortDirectionAtom,
15+
timeAggregationModeAtom,
2316
} from "./baseAtoms";
17+
import {
18+
selectedCompletionDateIndexAtom,
19+
selectedCompletionDateIndexRangeAtom,
20+
selectedEnsembleIdentAtom,
21+
} from "./persistableFixableAtoms";
2422
import { wellCompletionsQueryAtom } from "./queryAtoms";
2523

26-
export const selectedEnsembleIdentAtom = atom<RegularEnsembleIdent | null>((get) => {
27-
const syncedEnsembleIdents = get(syncedEnsembleIdentsAtom);
28-
const userSelectedEnsembleIdent = get(userSelectedEnsembleIdentAtom);
29-
const ensembleSet = get(EnsembleSetAtom);
30-
31-
if (syncedEnsembleIdents && syncedEnsembleIdents.length > 0) {
32-
return syncedEnsembleIdents[0];
33-
}
34-
if (userSelectedEnsembleIdent === null || !ensembleSet.hasEnsemble(userSelectedEnsembleIdent)) {
35-
return ensembleSet.getRegularEnsembleArray()[0]?.getIdent() || null;
36-
}
37-
return userSelectedEnsembleIdent;
38-
});
39-
40-
export const validRealizationNumbersAtom = atom<number[]>((get) => {
41-
const selectedEnsembleIdent = get(selectedEnsembleIdentAtom);
24+
export const availableRealizationsAtom = atom<number[]>((get) => {
25+
const selectedEnsembleIdent = get(selectedEnsembleIdentAtom).value;
4226
const validEnsembleRealizationsFunction = get(ValidEnsembleRealizationsFunctionAtom);
4327

4428
const validRealizationNumbers = selectedEnsembleIdent
@@ -47,21 +31,6 @@ export const validRealizationNumbersAtom = atom<number[]>((get) => {
4731
return validRealizationNumbers;
4832
});
4933

50-
export const selectedRealizationNumberAtom = atom<number | null>((get) => {
51-
const userSelectedRealizationNumber = get(userSelectedRealizationNumberAtom);
52-
const validRealizationNumbers = get(validRealizationNumbersAtom);
53-
54-
if (validRealizationNumbers.length === 0) {
55-
return null;
56-
}
57-
58-
if (userSelectedRealizationNumber === null || !validRealizationNumbers.includes(userSelectedRealizationNumber)) {
59-
return validRealizationNumbers[0];
60-
}
61-
62-
return userSelectedRealizationNumber;
63-
});
64-
6534
export const isQueryFetchingAtom = atom<boolean>((get) => {
6635
const wellCompletionsQuery = get(wellCompletionsQueryAtom);
6736

@@ -105,83 +74,36 @@ export const sortedCompletionDatesAtom = atom<string[] | null>((get) => {
10574
return wellCompletionsDataAccessor.getSortedCompletionDates();
10675
});
10776

108-
export const selectedCompletionDateIndexAtom = atom<number | null>((get) => {
109-
const userSelectedCompletionDateIndex = get(userSelectedCompletionDateIndexAtom);
110-
const userSelectedCompletionDateIndexRange = get(userSelectedCompletionDateIndexRangeAtom);
111-
const userSelectedTimeAggregation = get(userSelectedTimeAggregationAtom);
112-
const sortedCompletionDates = get(sortedCompletionDatesAtom);
113-
114-
if (!sortedCompletionDates) {
115-
return null;
116-
}
117-
118-
if (userSelectedTimeAggregation === TimeAggregationSelection.NONE) {
119-
if (userSelectedCompletionDateIndex >= sortedCompletionDates.length) {
120-
return sortedCompletionDates.length - 1;
121-
}
122-
return userSelectedCompletionDateIndex;
123-
}
124-
125-
// Update index to match first index in range
126-
const firstRangeIndex = userSelectedCompletionDateIndexRange[0];
127-
const newTimeStepIndex = firstRangeIndex < sortedCompletionDates.length ? firstRangeIndex : 0;
128-
return newTimeStepIndex;
129-
});
130-
131-
export const selectedCompletionDateIndexRangeAtom = atom<[number, number] | null>((get) => {
132-
const userSelectedCompletionDateIndexRange = get(userSelectedCompletionDateIndexRangeAtom);
133-
const userSelectedTimeAggregation = get(userSelectedTimeAggregationAtom);
134-
const sortedCompletionDates = get(sortedCompletionDatesAtom);
135-
136-
if (!sortedCompletionDates) {
137-
return null;
138-
}
139-
140-
if (userSelectedTimeAggregation === TimeAggregationSelection.NONE) {
141-
return [0, sortedCompletionDates.length - 1];
142-
}
143-
144-
let startIndex = userSelectedCompletionDateIndexRange[0];
145-
let endIndex = userSelectedCompletionDateIndexRange[1];
146-
if (startIndex >= sortedCompletionDates.length) {
147-
startIndex = sortedCompletionDates.length - 1;
148-
}
149-
if (endIndex >= sortedCompletionDates.length) {
150-
endIndex = sortedCompletionDates.length - 1;
151-
}
152-
return [startIndex, endIndex];
153-
});
154-
15577
export const plotDataAtom = atom<PlotData | null>((get) => {
15678
const wellCompletionsDataAccessor = get(wellCompletionsDataAccessorAtom);
15779

158-
const userExcludeWellText = get(userExcludeWellTextAtom);
159-
const userSearchWellText = get(userSearchWellTextAtom);
160-
const userSelectedHideZeroCompletions = get(userSelectedHideZeroCompletionsAtom);
161-
const userSelectedTimeAggregation = get(userSelectedTimeAggregationAtom);
162-
const userSelectedSortWellsBy = get(userSelectedSortWellsByAtom);
163-
const userSelectedSortWellsDirection = get(userSelectedSortWellsDirectionAtom);
80+
const wellExclusionText = get(wellExclusionTextAtom);
81+
const wellSearchText = get(wellSearchTextAtom);
82+
const isZeroCompletionsHidden = get(isZeroCompletionsHiddenAtom);
83+
const timeAggregationMode = get(timeAggregationModeAtom);
84+
const sortWellsBy = get(sortWellsByAtom);
85+
const wellSortDirection = get(wellSortDirectionAtom);
16486

165-
const selectedCompletionDateIndex = get(selectedCompletionDateIndexAtom);
166-
const selectedCompletionDateIndexRange = get(selectedCompletionDateIndexRangeAtom);
87+
const selectedCompletionDateIndex = get(selectedCompletionDateIndexAtom).value;
88+
const selectedCompletionDateIndexRange = get(selectedCompletionDateIndexRangeAtom).value;
16789

16890
if (!wellCompletionsDataAccessor) {
16991
return null;
17092
}
17193

17294
const completionDateIndexSelection =
173-
userSelectedTimeAggregation === TimeAggregationSelection.NONE
95+
timeAggregationMode === TimeAggregationMode.NONE
17496
? selectedCompletionDateIndex
17597
: selectedCompletionDateIndexRange;
17698
if (completionDateIndexSelection === null) {
17799
return null;
178100
}
179101

180-
wellCompletionsDataAccessor.setExcludeWellText(userExcludeWellText);
181-
wellCompletionsDataAccessor.setSearchWellText(userSearchWellText);
182-
wellCompletionsDataAccessor.setHideZeroCompletions(userSelectedHideZeroCompletions);
183-
wellCompletionsDataAccessor.setSortWellsBy(userSelectedSortWellsBy);
184-
wellCompletionsDataAccessor.setSortDirection(userSelectedSortWellsDirection);
102+
wellCompletionsDataAccessor.setWellExclusionText(wellExclusionText);
103+
wellCompletionsDataAccessor.setWellSearchText(wellSearchText);
104+
wellCompletionsDataAccessor.setHideZeroCompletions(isZeroCompletionsHidden);
105+
wellCompletionsDataAccessor.setSortWellsBy(sortWellsBy);
106+
wellCompletionsDataAccessor.setSortDirection(wellSortDirection);
185107

186-
return wellCompletionsDataAccessor.createPlotData(completionDateIndexSelection, userSelectedTimeAggregation);
108+
return wellCompletionsDataAccessor.createPlotData(completionDateIndexSelection, timeAggregationMode);
187109
});

0 commit comments

Comments
 (0)