diff --git a/backend_py/primary/primary/services/inplace_volumetrics_assembler/inplace_volumetrics_assembler.py b/backend_py/primary/primary/services/inplace_volumetrics_assembler/inplace_volumetrics_assembler.py index 74e4645b6..4f8caee70 100644 --- a/backend_py/primary/primary/services/inplace_volumetrics_assembler/inplace_volumetrics_assembler.py +++ b/backend_py/primary/primary/services/inplace_volumetrics_assembler/inplace_volumetrics_assembler.py @@ -257,7 +257,7 @@ async def _get_volume_df_per_fluid_selection_and_categorized_result_names_async( Calculation of volume names and properties, and creation of the results is handled outside this function. """ - # Check for empty identifier selections + # Check for empty identifier selection lists has_empty_identifier_selection = any( not identifier_with_values.values for identifier_with_values in identifiers_with_values ) @@ -285,10 +285,10 @@ async def _get_volume_df_per_fluid_selection_and_categorized_result_names_async( ) # Get volume table per fluid selection - requested volumes and volumes needed for properties - volume_df_per_fluid_selection: dict[ - FluidSelection, pl.DataFrame - ] = await self._create_volume_df_per_fluid_selection( - table_name, all_volume_names, fluid_zones, realizations, identifiers_with_values, accumulate_fluid_zones + volume_df_per_fluid_selection: dict[FluidSelection, pl.DataFrame] = ( + await self._create_volume_df_per_fluid_selection( + table_name, all_volume_names, fluid_zones, realizations, identifiers_with_values, accumulate_fluid_zones + ) ) # If accumulate_fluid_zones is True, exclude BO and BG from valid properties diff --git a/backend_py/primary/primary/services/sumo_access/inplace_volumetrics_types.py b/backend_py/primary/primary/services/sumo_access/inplace_volumetrics_types.py index a4071df31..a018cd263 100644 --- a/backend_py/primary/primary/services/sumo_access/inplace_volumetrics_types.py +++ b/backend_py/primary/primary/services/sumo_access/inplace_volumetrics_types.py @@ -1,6 +1,5 @@ from enum import StrEnum from dataclasses import dataclass -from typing import Dict, List, Union # NOTE: @@ -88,26 +87,26 @@ class CategorizedResultNames: Class to hold categorized result names Attributes: - - volume_names: List[str] - Basic volume names among result names - - calculated_volume_names: List[str] - Calculated volume names among result names (STOIIP_TOTAL, GIIP_TOTAL) - - property_names: List[str] - Property names among result names + - volume_names: list[str] - Basic volume names among result names + - calculated_volume_names: list[str] - Calculated volume names among result names (STOIIP_TOTAL, GIIP_TOTAL) + - property_names: list[str] - Property names among result names """ - volume_names: List[str] - calculated_volume_names: List[str] - property_names: List[str] + volume_names: list[str] + calculated_volume_names: list[str] + property_names: list[str] @dataclass class InplaceVolumetricsIdentifierWithValues: """ - Unique values for an identifier column in an inplace volumetrics table + Unique values for an identifier column in an inplace volumetric table NOTE: Ideally all values should be strings, but it is possible that some values are integers - especially for REGION """ identifier: InplaceVolumetricsIdentifier - values: List[Union[str, int]] # List of values: str or int + values: list[str | int] # list of values: str or int @dataclass @@ -115,9 +114,9 @@ class InplaceVolumetricsTableDefinition: """Definition of a volumetric table""" table_name: str - identifiers_with_values: List[InplaceVolumetricsIdentifierWithValues] - result_names: List[str] - fluid_zones: List[FluidZone] + identifiers_with_values: list[InplaceVolumetricsIdentifierWithValues] + result_names: list[str] + fluid_zones: list[FluidZone] @dataclass @@ -125,20 +124,20 @@ class RepeatedTableColumnData: """Definition of a column with repeated column data""" column_name: str - unique_values: List[str | int] # ["Valysar", "Therys", "Volon"] - indices: List[int] # [0, 1, 1, 1, 2, 2, 2]. Length = number of rows in the table + unique_values: list[str | int] # ["Valysar", "Therys", "Volon"] + indices: list[int] # [0, 1, 1, 1, 2, 2, 2]. Length = number of rows in the table @dataclass class TableColumnData: column_name: str - values: List[float] # Column values Length = number of rows in the table + values: list[float] # Column values Length = number of rows in the table @dataclass class TableColumnStatisticalData: column_name: str - statistic_values: Dict[Statistic, List[float]] # Statistics values Length = number of rows in the table + statistic_values: dict[Statistic, list[float]] # Statistics values Length = number of rows in the table @dataclass @@ -148,10 +147,10 @@ class InplaceVolumetricTableData: Contains data for a single fluid zone, e.g. Oil, Gas, Water, or sum of fluid zones """ - # fluid_zones: List[FluidZone] # Oil, Gas, Water or "Oil + Gas", etc. + # fluid_zones: list[FluidZone] # Oil, Gas, Water or "Oil + Gas", etc. fluid_selection_name: str # Oil, Gas, Water or "Oil + Gas", etc. - selector_columns: List[RepeatedTableColumnData] # Index columns and realizations - result_columns: List[TableColumnData] + selector_columns: list[RepeatedTableColumnData] # Index columns and realizations + result_columns: list[TableColumnData] @dataclass @@ -163,8 +162,8 @@ class InplaceStatisticalVolumetricTableData: """ fluid_selection_name: str # Oil, Gas, Water or "Oil + Gas", etc. - selector_columns: List[RepeatedTableColumnData] # Index columns and realizations - result_column_statistics: List[TableColumnStatisticalData] + selector_columns: list[RepeatedTableColumnData] # Index columns and realizations + result_column_statistics: list[TableColumnStatisticalData] @dataclass @@ -175,7 +174,7 @@ class InplaceVolumetricTableDataPerFluidSelection: Fluid selection can be single fluid zones, e.g. Oil, Gas, Water, or sum of fluid zones - Oil + Gas + Water """ - table_data_per_fluid_selection: List[InplaceVolumetricTableData] + table_data_per_fluid_selection: list[InplaceVolumetricTableData] @dataclass @@ -186,4 +185,4 @@ class InplaceStatisticalVolumetricTableDataPerFluidSelection: Fluid selection can be single fluid zones, e.g. Oil, Gas, Water, or sum of fluid zones - Oil + Gas + Water """ - table_data_per_fluid_selection: List[InplaceStatisticalVolumetricTableData] + table_data_per_fluid_selection: list[InplaceStatisticalVolumetricTableData] diff --git a/frontend/src/lib/utils/fixupUserSelection.ts b/frontend/src/lib/utils/fixupUserSelection.ts index f614e821c..378200e18 100644 --- a/frontend/src/lib/utils/fixupUserSelection.ts +++ b/frontend/src/lib/utils/fixupUserSelection.ts @@ -1,13 +1,24 @@ +export enum FixupSelection { + SELECT_NONE = "SELECT_NONE", + SELECT_ALL = "SELECT_ALL", + SELECT_FIRST = "SELECT_FIRST", +} + export function fixupUserSelection( userSelection: TSelection[], validOptions: TSelection[], - selectAll: boolean = false + fixupSelection: FixupSelection = FixupSelection.SELECT_FIRST ): TSelection[] { const newSelections = userSelection.filter((selection) => validOptions.includes(selection)); if (newSelections.length === 0 && validOptions.length > 0) { - if (selectAll) { + if (fixupSelection === FixupSelection.SELECT_ALL) { return validOptions; } + if (fixupSelection === FixupSelection.SELECT_NONE) { + return []; + } + + // Fall back to selecting the first valid option newSelections.push(validOptions[0]); } diff --git a/frontend/src/modules/InplaceVolumetricsPlot/settings/atoms/derivedAtoms.ts b/frontend/src/modules/InplaceVolumetricsPlot/settings/atoms/derivedAtoms.ts index e7cc889be..607aaa14c 100644 --- a/frontend/src/modules/InplaceVolumetricsPlot/settings/atoms/derivedAtoms.ts +++ b/frontend/src/modules/InplaceVolumetricsPlot/settings/atoms/derivedAtoms.ts @@ -1,7 +1,7 @@ import { FluidZone_api, InplaceVolumetricResultName_api, InplaceVolumetricsIdentifierWithValues_api } from "@api"; import { EnsembleSetAtom } from "@framework/GlobalAtoms"; import { fixupRegularEnsembleIdents } from "@framework/utils/ensembleUiHelpers"; -import { fixupUserSelection } from "@lib/utils/fixupUserSelection"; +import { FixupSelection, fixupUserSelection } from "@lib/utils/fixupUserSelection"; import { fixupUserSelectedIdentifierValues } from "@modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues"; import { RealSelector, SelectorColumn, SourceAndTableIdentifierUnion } from "@modules/_shared/InplaceVolumetrics/types"; import { @@ -121,7 +121,11 @@ export const selectedFluidZonesAtom = atom((get) => { return tableDefinitionsAccessor.getFluidZonesIntersection(); } - return fixupUserSelection(userSelectedFluidZones, tableDefinitionsAccessor.getFluidZonesIntersection(), true); + return fixupUserSelection( + userSelectedFluidZones, + tableDefinitionsAccessor.getFluidZonesIntersection(), + FixupSelection.SELECT_ALL + ); }); export const selectedResultNameAtom = atom((get) => { @@ -174,7 +178,7 @@ export const selectedSelectorColumnAtom = atom((get) => { const possibleSelectorColumns = [ RealSelector.REAL, - ...tableDefinitionsAccessor.getIdentifiersWithIntersectionValues().map((ident) => ident.identifier), + ...tableDefinitionsAccessor.getCommonIdentifiersWithValues().map((ident) => ident.identifier), ]; if (!userSelectedSelectorColumn) { return possibleSelectorColumns[0]; @@ -192,13 +196,12 @@ export const selectedIdentifiersValuesAtom = atom): React.ReactNod .map((name) => ({ label: name, value: name, hoverText: createHoverTextForVolume(name) })); // Create selector options - const identifiersIntersection = tableDefinitionsAccessor.getIdentifiersWithIntersectionValues().map((ident) => { + const commonIdentifiers = tableDefinitionsAccessor.getCommonIdentifiersWithValues().map((ident) => { return ident.identifier; }); const selectorOptions: DropdownOption[] = [ { label: RealSelector.REAL, value: RealSelector.REAL }, - ...identifiersIntersection.map((name) => ({ label: name, value: name })), + ...commonIdentifiers.map((name) => ({ label: name, value: name })), ]; const subplotOptions = makeSubplotByOptions(tableDefinitionsAccessor, selectedTableNames); @@ -163,7 +163,7 @@ export function Settings(props: ModuleSettingsProps): React.ReactNod isPending={tableDefinitionsQueryResult.isLoading} availableFluidZones={tableDefinitionsAccessor.getFluidZonesIntersection()} availableTableNames={tableDefinitionsAccessor.getTableNamesIntersection()} - availableIdentifiersWithValues={tableDefinitionsAccessor.getIdentifiersWithIntersectionValues()} + availableIdentifiersWithValues={tableDefinitionsAccessor.getCommonIdentifiersWithValues()} selectedEnsembleIdents={selectedEnsembleIdents} selectedFluidZones={selectedFluidZones} selectedIdentifiersValues={selectedIdentifiersValues} diff --git a/frontend/src/modules/InplaceVolumetricsPlot/settings/utils/plotDimensionUtils.ts b/frontend/src/modules/InplaceVolumetricsPlot/settings/utils/plotDimensionUtils.ts index 4a66b64d6..5f4bf1215 100644 --- a/frontend/src/modules/InplaceVolumetricsPlot/settings/utils/plotDimensionUtils.ts +++ b/frontend/src/modules/InplaceVolumetricsPlot/settings/utils/plotDimensionUtils.ts @@ -37,7 +37,7 @@ export function makeSubplotByOptions( }, ]; - for (const identifier of tableDefinitionsAccessor.getIdentifiersWithIntersectionValues()) { + for (const identifier of tableDefinitionsAccessor.getCommonIdentifiersWithValues()) { options.push({ value: identifier.identifier, label: identifier.identifier, @@ -98,7 +98,7 @@ export function makeColorByOptions( }); } - for (const identifier of tableDefinitionsAccessor.getIdentifiersWithIntersectionValues()) { + for (const identifier of tableDefinitionsAccessor.getCommonIdentifiersWithValues()) { if (selectedSubplotBy !== identifier.identifier) { options.push({ value: identifier.identifier, diff --git a/frontend/src/modules/InplaceVolumetricsPlot/view/view.tsx b/frontend/src/modules/InplaceVolumetricsPlot/view/view.tsx index 98ab81ead..756c34af1 100644 --- a/frontend/src/modules/InplaceVolumetricsPlot/view/view.tsx +++ b/frontend/src/modules/InplaceVolumetricsPlot/view/view.tsx @@ -57,7 +57,7 @@ export function View(props: ModuleViewProps): React.ReactNode { return "Failed to load volumetric table data"; } if (!areSelectedTablesComparable) { - return "Selected volumetric tables are not comparable"; + return "Selected volumetric tables are not comparable due to mismatching fluid zones, result names or identifier columns"; } return null; diff --git a/frontend/src/modules/InplaceVolumetricsTable/settings/atoms/derivedAtoms.ts b/frontend/src/modules/InplaceVolumetricsTable/settings/atoms/derivedAtoms.ts index 04cfb02ca..3a68144a3 100644 --- a/frontend/src/modules/InplaceVolumetricsTable/settings/atoms/derivedAtoms.ts +++ b/frontend/src/modules/InplaceVolumetricsTable/settings/atoms/derivedAtoms.ts @@ -1,7 +1,7 @@ import { FluidZone_api, InplaceVolumetricResultName_api, InplaceVolumetricsIdentifierWithValues_api } from "@api"; import { EnsembleSetAtom } from "@framework/GlobalAtoms"; import { fixupRegularEnsembleIdents } from "@framework/utils/ensembleUiHelpers"; -import { fixupUserSelection } from "@lib/utils/fixupUserSelection"; +import { FixupSelection, fixupUserSelection } from "@lib/utils/fixupUserSelection"; import { fixupUserSelectedIdentifierValues } from "@modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues"; import { SourceAndTableIdentifierUnion, SourceIdentifier } from "@modules/_shared/InplaceVolumetrics/types"; import { @@ -111,7 +111,11 @@ export const selectedFluidZonesAtom = atom((get) => { return tableDefinitionsAccessor.getFluidZonesIntersection(); } - return fixupUserSelection(userSelectedFluidZones, tableDefinitionsAccessor.getFluidZonesIntersection(), true); + return fixupUserSelection( + userSelectedFluidZones, + tableDefinitionsAccessor.getFluidZonesIntersection(), + FixupSelection.SELECT_ALL + ); }); export const selectedResultNamesAtom = atom((get) => { @@ -136,7 +140,7 @@ export const selectedAccumulationOptionsAtom = atom< SourceAndTableIdentifierUnion, SourceIdentifier.ENSEMBLE | SourceIdentifier.TABLE_NAME >[] = [SourceIdentifier.FLUID_ZONE]; - for (const identifier of tableDefinitionsAccessor.getIdentifiersWithIntersectionValues()) { + for (const identifier of tableDefinitionsAccessor.getCommonIdentifiersWithValues()) { availableUniqueAccumulationOptions.push(identifier.identifier); } @@ -144,20 +148,19 @@ export const selectedAccumulationOptionsAtom = atom< return []; } - return fixupUserSelection(userSelectedAccumulation, availableUniqueAccumulationOptions); + return fixupUserSelection(userSelectedAccumulation, availableUniqueAccumulationOptions, FixupSelection.SELECT_NONE); }); export const selectedIdentifiersValuesAtom = atom((get) => { const userSelectedIdentifierValues = get(userSelectedIdentifiersValuesAtom); const tableDefinitionsAccessor = get(tableDefinitionsAccessorAtom); - const uniqueIdentifierValues = tableDefinitionsAccessor.getIdentifiersWithIntersectionValues(); - const selectAllOnFixup = true; + const uniqueIdentifierValues = tableDefinitionsAccessor.getCommonIdentifiersWithValues(); const fixedUpIdentifierValues: InplaceVolumetricsIdentifierWithValues_api[] = fixupUserSelectedIdentifierValues( userSelectedIdentifierValues, uniqueIdentifierValues, - selectAllOnFixup + FixupSelection.SELECT_ALL ); return fixedUpIdentifierValues; diff --git a/frontend/src/modules/InplaceVolumetricsTable/settings/settings.tsx b/frontend/src/modules/InplaceVolumetricsTable/settings/settings.tsx index 68bc04239..0a449c519 100644 --- a/frontend/src/modules/InplaceVolumetricsTable/settings/settings.tsx +++ b/frontend/src/modules/InplaceVolumetricsTable/settings/settings.tsx @@ -101,7 +101,7 @@ export function Settings(props: ModuleSettingsProps): React.ReactNod const accumulateOptions: TagOption< Omit >[] = [{ label: "FLUID ZONE", value: SourceIdentifier.FLUID_ZONE }]; - for (const identifier of tableDefinitionsAccessor.getIdentifiersWithIntersectionValues()) { + for (const identifier of tableDefinitionsAccessor.getCommonIdentifiersWithValues()) { accumulateOptions.push({ label: identifier.identifier, value: identifier.identifier }); } @@ -162,7 +162,7 @@ export function Settings(props: ModuleSettingsProps): React.ReactNod isPending={tableDefinitionsQueryResult.isLoading} availableFluidZones={tableDefinitionsAccessor.getFluidZonesIntersection()} availableTableNames={tableDefinitionsAccessor.getTableNamesIntersection()} - availableIdentifiersWithValues={tableDefinitionsAccessor.getIdentifiersWithIntersectionValues()} + availableIdentifiersWithValues={tableDefinitionsAccessor.getCommonIdentifiersWithValues()} selectedEnsembleIdents={selectedEnsembleIdents} selectedFluidZones={selectedFluidZones} selectedIdentifiersValues={selectedIdentifiersValues} diff --git a/frontend/src/modules/InplaceVolumetricsTable/view/view.tsx b/frontend/src/modules/InplaceVolumetricsTable/view/view.tsx index de71c7096..6914ff237 100644 --- a/frontend/src/modules/InplaceVolumetricsTable/view/view.tsx +++ b/frontend/src/modules/InplaceVolumetricsTable/view/view.tsx @@ -72,7 +72,7 @@ export function View(props: ModuleViewProps): React.ReactNode { return "Failed to load volumetric table data"; } if (!areSelectedTablesComparable) { - return "Selected volumetric tables are not comparable"; + return "Selected volumetric tables are not comparable due to mismatching fluid zones, result names or identifier columns"; } return null; diff --git a/frontend/src/modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor.ts b/frontend/src/modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor.ts index c9265f20f..08282e34c 100644 --- a/frontend/src/modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor.ts +++ b/frontend/src/modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor.ts @@ -2,10 +2,13 @@ import { FluidZone_api, InplaceVolumetricResultName_api, InplaceVolumetricsIdentifierWithValues_api, + InplaceVolumetricsIdentifier_api, InplaceVolumetricsTableDefinition_api, } from "@api"; import { RegularEnsembleIdent } from "@framework/RegularEnsembleIdent"; +import { isEqual } from "lodash"; + import { sortResultNames } from "./sortResultNames"; type TableDefinitionsForEnsembleIdent = { @@ -52,7 +55,8 @@ export class TableDefinitionsAccessor { private _tableNamesIntersection: string[]; private _fluidZonesIntersection: FluidZone_api[] = []; private _resultNamesIntersection: InplaceVolumetricResultName_api[] = []; - private _identifiersWithIntersectionValues: InplaceVolumetricsIdentifierWithValues_api[] = []; + private _commonIdentifiersWithValues: InplaceVolumetricsIdentifierWithValues_api[] = []; + private _tablesNotComparable: boolean = false; constructor(tableDefinitionsPerEnsembleIdent: TableDefinitionsForEnsembleIdent[], tableNamesFilter?: string[]) { @@ -64,32 +68,36 @@ export class TableDefinitionsAccessor { } private makeIntersections(): void { + if (this._tableDefinitions.length === 0) { + return; + } + const fluidZones: Set = new Set(); const resultNames: Set = new Set(); - const identifiersWithValuesIntersection: InplaceVolumetricsIdentifierWithValues_api[] = []; + const commonIdentifiersWithValuesMap: Map< + InplaceVolumetricsIdentifier_api, + InplaceVolumetricsIdentifierWithValues_api + > = new Map(); - let index = 0; + let isInitialized = false; for (const tableDefinition of this._tableDefinitions) { if (this._tableNamesFilter && !this._tableNamesFilter.includes(tableDefinition.tableName)) { continue; } - if (index === 0) { + if (!isInitialized) { // Initialize sets and arrays with the first valid tableDefinition tableDefinition.fluidZones.forEach((fluidZone) => fluidZones.add(fluidZone)); tableDefinition.resultNames.forEach((resultName) => resultNames.add(resultName)); for (const identifierWithValues of tableDefinition.identifiersWithValues) { - const existingIdentifierWithValues = identifiersWithValuesIntersection.find( - (el) => el.identifier === identifierWithValues.identifier - ); - if (existingIdentifierWithValues) { + if (commonIdentifiersWithValuesMap.has(identifierWithValues.identifier)) { throw new Error(`Duplicate identifier ${identifierWithValues.identifier}`); } - - identifiersWithValuesIntersection.push(identifierWithValues); + commonIdentifiersWithValuesMap.set(identifierWithValues.identifier, identifierWithValues); } - index++; + + isInitialized = true; continue; } @@ -98,41 +106,48 @@ export class TableDefinitionsAccessor { fluidZones.delete(fluidZone); } } - for (const resultName of resultNames) { if (!tableDefinition.resultNames.includes(resultName)) { resultNames.delete(resultName); } } - for (const identifierWithIntersectionValues of identifiersWithValuesIntersection) { + const identifiersToRemove = []; + for (const [identifier, identifierWithValues] of commonIdentifiersWithValuesMap) { const currentIdentifierWithValues = tableDefinition.identifiersWithValues.find( - (item) => item.identifier === identifierWithIntersectionValues.identifier + (item) => item.identifier === identifier ); + // Remove identifiers that are not present in all table definitions if (!currentIdentifierWithValues) { - // Identifier is not present in the current tableDefinition, an intersection is not possible - this._tablesNotComparable = true; - break; + identifiersToRemove.push(identifier); + continue; } - // Update values of the identifier - identifierWithIntersectionValues.values = identifierWithIntersectionValues.values.filter((value) => - currentIdentifierWithValues.values.includes(value) - ); - - if (identifierWithIntersectionValues.values.length === 0) { - // Intersection is empty, an intersection is not possible + // Tables are not comparable when identifier values are not equal + if (!isEqual(identifierWithValues.values.sort(), currentIdentifierWithValues.values.sort())) { this._tablesNotComparable = true; break; } } - index++; + + // Remove identifiers that are not common among all table definitions + for (const identifier of identifiersToRemove) { + commonIdentifiersWithValuesMap.delete(identifier); + } } this._fluidZonesIntersection = Array.from(fluidZones).sort(); this._resultNamesIntersection = sortResultNames(Array.from(resultNames)); - this._identifiersWithIntersectionValues = identifiersWithValuesIntersection.sort(); + this._commonIdentifiersWithValues = Array.from(commonIdentifiersWithValuesMap.values()); + + if ( + this._fluidZonesIntersection.length === 0 || + this._resultNamesIntersection.length === 0 || + this._commonIdentifiersWithValues.length === 0 + ) { + this._tablesNotComparable = true; + } } getUniqueEnsembleIdents(): RegularEnsembleIdent[] { @@ -151,8 +166,8 @@ export class TableDefinitionsAccessor { return this._resultNamesIntersection; } - getIdentifiersWithIntersectionValues(): InplaceVolumetricsIdentifierWithValues_api[] { - return this._identifiersWithIntersectionValues; + getCommonIdentifiersWithValues(): InplaceVolumetricsIdentifierWithValues_api[] { + return this._commonIdentifiersWithValues; } getAreTablesComparable(): boolean { @@ -206,7 +221,7 @@ export class TableDefinitionsAccessor { hasIdentifiersWithValues(identifiersWithValues: InplaceVolumetricsIdentifierWithValues_api[]): boolean { for (const identifierValue of identifiersWithValues) { const identifier = identifierValue.identifier; - const tableDefinitionsIdentifier = this._identifiersWithIntersectionValues.find( + const tableDefinitionsIdentifier = this._commonIdentifiersWithValues.find( (el) => el.identifier === identifier ); if (!tableDefinitionsIdentifier) { diff --git a/frontend/src/modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues.ts b/frontend/src/modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues.ts index 2f058c432..bf9a54fb6 100644 --- a/frontend/src/modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues.ts +++ b/frontend/src/modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues.ts @@ -1,10 +1,10 @@ import { InplaceVolumetricsIdentifierWithValues_api } from "@api"; -import { fixupUserSelection } from "@lib/utils/fixupUserSelection"; +import { FixupSelection, fixupUserSelection } from "@lib/utils/fixupUserSelection"; export function fixupUserSelectedIdentifierValues( userSelectedIdentifierValues: InplaceVolumetricsIdentifierWithValues_api[] | null, uniqueIdentifierValues: InplaceVolumetricsIdentifierWithValues_api[], - selectAllOnFixup: boolean + fixupSelection: FixupSelection ): InplaceVolumetricsIdentifierWithValues_api[] { const fixedUpIdentifierValues: InplaceVolumetricsIdentifierWithValues_api[] = []; if (!userSelectedIdentifierValues) { @@ -14,7 +14,7 @@ export function fixupUserSelectedIdentifierValues( values: fixupUserSelection( entry.values, uniqueIdentifierValues.find((el) => el.identifier === entry.identifier)?.values ?? [], - selectAllOnFixup + fixupSelection ), }); } @@ -30,7 +30,7 @@ export function fixupUserSelectedIdentifierValues( values: fixupUserSelection( entry.values, uniqueIdentifierValues.find((el) => el.identifier === entry.identifier)?.values ?? [], - selectAllOnFixup + fixupSelection ), }); } diff --git a/frontend/src/modules/_shared/components/InplaceVolumetricsFilterComponent/inplaceVolumetricsFilterComponent.tsx b/frontend/src/modules/_shared/components/InplaceVolumetricsFilterComponent/inplaceVolumetricsFilterComponent.tsx index d23937519..61cdf07cd 100644 --- a/frontend/src/modules/_shared/components/InplaceVolumetricsFilterComponent/inplaceVolumetricsFilterComponent.tsx +++ b/frontend/src/modules/_shared/components/InplaceVolumetricsFilterComponent/inplaceVolumetricsFilterComponent.tsx @@ -221,7 +221,8 @@ export function InplaceVolumetricsFilterComponent(props: InplaceVolumetricsFilte let errorMessage: string | undefined = undefined; if (props.areCurrentlySelectedTablesComparable === false) { - errorMessage = "Selected tables are not comparable"; + errorMessage = + "Selected tables are not comparable due to mismatching fluid zones, result names or identifier columns"; } return ( @@ -234,7 +235,7 @@ export function InplaceVolumetricsFilterComponent(props: InplaceVolumetricsFilte size={5} /> - +
{props.additionalSettings}
@@ -255,36 +256,28 @@ export function InplaceVolumetricsFilterComponent(props: InplaceVolumetricsFilte size={3} /> - - -
- {props.availableIdentifiersWithValues.map((identifier) => ( - - ({ + value: value, + label: value.toString(), + }))} + value={ + identifiersValues.find((el) => el.identifier === identifier.identifier) + ?.values ?? [] + } + onChange={(value) => handleIdentifierValuesChange(identifier.identifier, value)} + multiple + size={Math.max(Math.min(identifier.values.length, 10), 3)} + showQuickSelectButtons={true} + /> + + ))} +
+