Skip to content

Commit 6aef083

Browse files
committed
Sort available settings alphabetically and adjust time/interval setting
- Sort available settings arrays for options ordered alphabetically - Make use of TimeOrIntervalSetting for formatting of label in Dropdown
1 parent 0a724a4 commit 6aef083

File tree

8 files changed

+62
-45
lines changed

8 files changed

+62
-45
lines changed

frontend/src/modules/Intersection/DataProviderFramework/customDataProviderImplementations/EnsembleWellborePicksProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export class EnsembleWellborePicksProvider
9191

9292
const picksByInterpreter = groupBy(wellborePicks, "interpreter");
9393

94-
return keys(picksByInterpreter);
94+
return Array.from(keys(picksByInterpreter)).sort();
9595
});
9696

9797
availableSettingsUpdater(Setting.WELLBORE_PICKS, ({ getLocalSetting, getHelperDependency }) => {
@@ -102,7 +102,7 @@ export class EnsembleWellborePicksProvider
102102
return [];
103103
}
104104

105-
return filter(wellborePicks, ["interpreter", interpreter]);
105+
return filter(wellborePicks, ["interpreter", interpreter]).sort();
106106
});
107107
}
108108

frontend/src/modules/Intersection/DataProviderFramework/customDataProviderImplementations/RealizationSurfacesProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ export class RealizationSurfacesProvider
158158
return [];
159159
}
160160

161-
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.attribute_name)));
161+
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.attribute_name))).sort();
162162
});
163163

164164
availableSettingsUpdater(Setting.SURFACE_NAMES, ({ getHelperDependency }) => {
@@ -168,7 +168,7 @@ export class RealizationSurfacesProvider
168168
return [];
169169
}
170170

171-
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.name)));
171+
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.name))).sort();
172172
});
173173

174174
// Create intersection polyline and actual section lengths data asynchronously

frontend/src/modules/Intersection/DataProviderFramework/customDataProviderImplementations/SurfacesPerRealizationValuesProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ export class SurfacesPerRealizationValuesProvider
163163
return [];
164164
}
165165

166-
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.attribute_name)));
166+
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.attribute_name))).sort();
167167
});
168168

169169
availableSettingsUpdater(Setting.SURFACE_NAMES, ({ getHelperDependency }) => {
@@ -173,7 +173,7 @@ export class SurfacesPerRealizationValuesProvider
173173
return [];
174174
}
175175

176-
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.name)));
176+
return Array.from(new Set(depthSurfacesMetadata.map((elm) => elm.name))).sort();
177177
});
178178

179179
// Create intersection polyline and actual section lengths data asynchronously

frontend/src/modules/_shared/DataProviderFramework/dataProviders/implementations/IntersectionRealizationGridProvider.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export class IntersectionRealizationGridProvider
183183
return [];
184184
}
185185

186-
const availableGridNames = [...Array.from(new Set(data.map((gridModelInfo) => gridModelInfo.grid_name)))];
186+
const availableGridNames = Array.from(new Set(data.map((gridModelInfo) => gridModelInfo.grid_name))).sort();
187187

188188
return availableGridNames;
189189
});
@@ -199,16 +199,16 @@ export class IntersectionRealizationGridProvider
199199
const gridAttributeArr =
200200
data.find((gridModel) => gridModel.grid_name === gridName)?.property_info_arr ?? [];
201201

202-
const availableGridAttributes = [
203-
...Array.from(new Set(gridAttributeArr.map((gridAttribute) => gridAttribute.property_name))),
204-
];
202+
const availableGridAttributes = Array.from(
203+
new Set(gridAttributeArr.map((gridAttribute) => gridAttribute.property_name)),
204+
).sort();
205205

206206
return availableGridAttributes;
207207
});
208208

209-
const wellboreHeadersDep = helperDependency(({ getLocalSetting, abortSignal }) =>
210-
fetchWellboreHeaders(getLocalSetting(Setting.ENSEMBLE), abortSignal, workbenchSession, queryClient),
211-
);
209+
const wellboreHeadersDep = helperDependency(({ getLocalSetting, abortSignal }) => {
210+
return fetchWellboreHeaders(getLocalSetting(Setting.ENSEMBLE), abortSignal, workbenchSession, queryClient);
211+
});
212212

213213
availableSettingsUpdater(Setting.INTERSECTION, ({ getHelperDependency, getGlobalSetting }) => {
214214
const wellboreHeaders = getHelperDependency(wellboreHeadersDep) ?? [];
@@ -229,15 +229,13 @@ export class IntersectionRealizationGridProvider
229229
const gridAttributeArr =
230230
data.find((gridModel) => gridModel.grid_name === gridName)?.property_info_arr ?? [];
231231

232-
const availableTimeOrIntervals = [
233-
...Array.from(
234-
new Set(
235-
gridAttributeArr
236-
.filter((attr) => attr.property_name === gridAttribute)
237-
.map((gridAttribute) => gridAttribute.iso_date_or_interval ?? "NO_TIME"),
238-
),
232+
const availableTimeOrIntervals = Array.from(
233+
new Set(
234+
gridAttributeArr
235+
.filter((attr) => attr.property_name === gridAttribute)
236+
.map((gridAttribute) => gridAttribute.iso_date_or_interval ?? "NO_TIME"),
239237
),
240-
];
238+
).sort();
241239

242240
return availableTimeOrIntervals;
243241
});

frontend/src/modules/_shared/DataProviderFramework/dataProviders/implementations/IntersectionRealizationSeismicProvider.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export class IntersectionRealizationSeismicProvider
185185
.filter((el) => el.isDepth && el.isObservation === doRequestObservation)
186186
.map((el) => el.seismicAttribute),
187187
),
188-
);
188+
).sort();
189189

190190
return availableAttributes;
191191
});
@@ -198,9 +198,7 @@ export class IntersectionRealizationSeismicProvider
198198
const wellboreHeaders = getHelperDependency(wellboreHeadersDep) ?? [];
199199
const intersectionPolylines = getGlobalSetting("intersectionPolylines");
200200

201-
const tmp = getAvailableIntersectionOptions(wellboreHeaders, intersectionPolylines);
202-
203-
return tmp;
201+
return getAvailableIntersectionOptions(wellboreHeaders, intersectionPolylines);
204202
});
205203

206204
availableSettingsUpdater(Setting.TIME_OR_INTERVAL, ({ getLocalSetting, getHelperDependency }) => {
@@ -218,7 +216,7 @@ export class IntersectionRealizationSeismicProvider
218216
.filter((surface) => surface.seismicAttribute === seismicAttribute)
219217
.map((el) => el.isoDateOrInterval),
220218
),
221-
),
219+
).sort(),
222220
];
223221

224222
return availableTimeOrIntervals;

frontend/src/modules/_shared/DataProviderFramework/settings/SettingRegistry/_registerAllSettings.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { SelectNumberSetting } from "../implementations/SelectNumberSetting";
1515
import { SelectStringSetting } from "../implementations/SelectStringSetting";
1616
import { SensitivitySetting } from "../implementations/SensitivitySetting";
1717
import { StatisticFunctionSetting } from "../implementations/StatisticFunctionSetting";
18+
import { TimeOrIntervalSetting } from "../implementations/TimeOrIntervalSetting";
1819
import { Setting } from "../settingsDefinitions";
1920

2021
import { SettingRegistry } from "./_SettingRegistry";
@@ -65,7 +66,7 @@ SettingRegistry.registerSetting(Setting.SMDA_WELLBORE_HEADERS, "SMDA Wellbore He
6566
SettingRegistry.registerSetting(Setting.STATISTIC_FUNCTION, "Statistic Function", StatisticFunctionSetting);
6667
SettingRegistry.registerSetting(Setting.SURFACE_NAME, "Surface Name", DropdownStringSetting);
6768
SettingRegistry.registerSetting(Setting.SURFACE_NAMES, "Surface Names", SelectStringSetting);
68-
SettingRegistry.registerSetting(Setting.TIME_OR_INTERVAL, "Time or Interval", DropdownStringSetting);
69+
SettingRegistry.registerSetting(Setting.TIME_OR_INTERVAL, "Time or Interval", TimeOrIntervalSetting);
6970
SettingRegistry.registerSetting(
7071
Setting.SAMPLE_RESOLUTION_IN_METERS,
7172
"Sample Resolution in Meters",

frontend/src/modules/_shared/DataProviderFramework/settings/implementations/TimeOrIntervalSetting.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ import type React from "react";
33
import { SurfaceTimeType_api } from "@api";
44
import type { DropdownOption } from "@lib/components/Dropdown";
55
import { Dropdown } from "@lib/components/Dropdown";
6+
import {
7+
isIsoIntervalString,
8+
isIsoString,
9+
isoIntervalStringToDateLabel,
10+
isoStringToDateLabel,
11+
} from "@modules/_shared/utils/isoDatetimeStringFormatting";
612

713
import type {
814
CustomSettingImplementation,
@@ -21,7 +27,7 @@ export class TimeOrIntervalSetting implements CustomSettingImplementation<ValueT
2127
}
2228

2329
makeComponent(): (props: SettingComponentProps<ValueType, SettingCategory.SINGLE_SELECT>) => React.ReactNode {
24-
return function Ensemble(props: SettingComponentProps<ValueType, SettingCategory.SINGLE_SELECT>) {
30+
return function TimeOrIntervalSetting(props: SettingComponentProps<ValueType, SettingCategory.SINGLE_SELECT>) {
2531
const availableValues = props.availableValues ?? [];
2632

2733
const options: DropdownOption[] = availableValues.map((value) => {
@@ -34,6 +40,7 @@ export class TimeOrIntervalSetting implements CustomSettingImplementation<ValueT
3440
return (
3541
<Dropdown
3642
options={options}
43+
placeholder="Select a date"
3744
value={!props.isOverridden ? props.value?.toString() : props.overriddenValue?.toString()}
3845
onChange={props.onValueChange}
3946
disabled={props.isOverridden}
@@ -54,21 +61,14 @@ export class TimeOrIntervalSetting implements CustomSettingImplementation<ValueT
5461

5562
function timeTypeToLabel(input: string): string {
5663
if (input === SurfaceTimeType_api.NO_TIME) {
57-
return "Initial / No date";
64+
return "No date";
5865
}
59-
const [start, end] = input.split("/");
60-
if (end) {
61-
return isoIntervalStringToDateLabel(start, end);
66+
if (isIsoIntervalString(input)) {
67+
return isoIntervalStringToDateLabel(input);
6268
}
63-
return isoStringToDateLabel(start);
64-
}
65-
function isoStringToDateLabel(isoDatestring: string): string {
66-
const date = isoDatestring.split("T")[0];
67-
return `${date}`;
68-
}
69-
70-
function isoIntervalStringToDateLabel(startIsoDateString: string, endIsoDateString: string): string {
71-
const startDate = startIsoDateString.split("T")[0];
72-
const endDate = endIsoDateString.split("T")[0];
73-
return `${startDate}/${endDate}`;
69+
if (isIsoString(input)) {
70+
return isoStringToDateLabel(input);
71+
}
72+
// Fallback to the original input if it doesn't match any known format
73+
return input;
7474
}

frontend/src/modules/_shared/utils/isoDatetimeStringFormatting.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
1+
/**
2+
* Utility functions to check if a valid interval of ISO date strings on the format startDate/endDate
3+
*
4+
* Input ISO interval string format: '2018-01-01T00:00:00/2019-07-01T00:00:00'
5+
*/
6+
export function isIsoIntervalString(input: string): boolean {
7+
const isoIntervalRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/;
8+
return isoIntervalRegex.test(input);
9+
}
10+
11+
/**
12+
* Utility function to check if a string is a valid ISO date string
13+
*
14+
* Input ISO string format: '2018-01-01T00:00:00'
15+
*/
16+
export function isIsoString(input: string): boolean {
17+
const isoRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/;
18+
return isoRegex.test(input);
19+
}
20+
121
/**
222
* Extracts the date substring from an ISO string
323
*
4-
* Input ISO string format: '2018-01-01T00:00:00.000'
24+
* Input ISO string format: '2018-01-01T00:00:00'
525
* Returns: '2018-01-01'
626
*/
727
export function isoStringToDateLabel(inputIsoString: string): string {
@@ -12,7 +32,7 @@ export function isoStringToDateLabel(inputIsoString: string): string {
1232
/**
1333
* Extracts interval date substring from an ISO string
1434
*
15-
* Input ISO string format: '2018-01-01T00:00:00.000/2019-07-01T00:00:00.000'
35+
* Input ISO string format: '2018-01-01T00:00:00/2019-07-01T00:00:00'
1636
* Returns: '2018-01-01/2019-07-01'
1737
*/
1838
export function isoIntervalStringToDateLabel(inputIsoIntervalString: string): string {

0 commit comments

Comments
 (0)