Skip to content

Commit fca8f53

Browse files
committed
Add persistence
1 parent 58c05e7 commit fca8f53

File tree

12 files changed

+480
-299
lines changed

12 files changed

+480
-299
lines changed

frontend/src/modules/ModuleSerializedStateMap.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import type { SerializedSettings as M_2DViewerSettings } from "@modules/2DViewer/settings/persistence";
55
import type { SerializedSettings as MyModuleSettings } from "@modules/MyModule/settings/persistence";
6+
import type { SerializedSettings as WellCompletionsSettings } from "@modules/WellCompletions/settings/persistence";
67
import type { SerializedView as M_2DViewerView } from "@modules/2DViewer/view/persistence";
78

89
export type ModuleSerializedStateMap = {
@@ -30,6 +31,10 @@ export type ModuleSerializedStateMap = {
3031
settings?: never,
3132
view?: never,
3233
},
34+
"Grid3DIntersection": {
35+
settings?: never,
36+
view?: never,
37+
},
3338
"InplaceVolumesPlot": {
3439
settings?: never,
3540
view?: never,
@@ -82,6 +87,18 @@ export type ModuleSerializedStateMap = {
8287
settings?: never,
8388
view?: never,
8489
},
90+
"SeismicIntersection": {
91+
settings?: never,
92+
view?: never,
93+
},
94+
"SeismicMap": {
95+
settings?: never,
96+
view?: never,
97+
},
98+
"Sensitivity": {
99+
settings?: never,
100+
view?: never,
101+
},
85102
"SimulationTimeSeries": {
86103
settings?: never,
87104
view?: never,
@@ -90,6 +107,10 @@ export type ModuleSerializedStateMap = {
90107
settings?: never,
91108
view?: never,
92109
},
110+
"StructuralUncertaintyIntersection": {
111+
settings?: never,
112+
view?: never,
113+
},
93114
"SubsurfaceMap": {
94115
settings?: never,
95116
view?: never,
@@ -98,6 +119,10 @@ export type ModuleSerializedStateMap = {
98119
settings?: never,
99120
view?: never,
100121
},
122+
"TopographicMap": {
123+
settings?: never,
124+
view?: never,
125+
},
101126
"TornadoChart": {
102127
settings?: never,
103128
view?: never,
@@ -107,7 +132,7 @@ export type ModuleSerializedStateMap = {
107132
view?: never,
108133
},
109134
"WellCompletions": {
110-
settings?: never,
135+
settings?: Partial<WellCompletionsSettings>,
111136
view?: never,
112137
},
113138
"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)