1- import React , { ChangeEvent , useState } from "react" ;
1+ import React , { ChangeEvent , useEffect , useState } from "react" ;
22import { ModelConfig } from "@/dto/FormConfig" ;
33import { Accordion , Autocomplete , Button , NativeSelect , TextField , Typography } from "@equinor/eds-core-react" ;
44import { MetaTooltip } from "@/functions/Tooltip" ;
@@ -116,6 +116,25 @@ function GridRangeInput({ candidateSubstances }: { candidateSubstances: string[]
116116 const axis = axes [ 0 ] ;
117117 const isActive = axis !== undefined ;
118118
119+ const [ minStr , setMinStr ] = useState ( axis ?. range . min . toString ( ) ?? "" ) ;
120+ const [ maxStr , setMaxStr ] = useState ( axis ?. range . max . toString ( ) ?? "" ) ;
121+ const [ stepsStr , setStepsStr ] = useState ( axis ?. range . steps . toString ( ) ?? "" ) ;
122+
123+ useEffect ( ( ) => {
124+ if ( axis ) {
125+ setMinStr ( axis . range . min . toString ( ) ) ;
126+ setMaxStr ( axis . range . max . toString ( ) ) ;
127+ setStepsStr ( axis . range . steps . toString ( ) ) ;
128+ }
129+ } , [ axis ?. substance ] ) ;
130+
131+ const commitRange = ( field : "min" | "max" | "steps" , raw : string ) => {
132+ if ( ! axis ) return ;
133+ const v = Number ( raw ) ;
134+ if ( Number . isNaN ( v ) ) return ;
135+ updateAxis ( 0 , { range : { ...axis . range , [ field ] : v } } ) ;
136+ } ;
137+
119138 const headerText = isActive
120139 ? `Concentration range: ${ optionName ( axis . substance ) } `
121140 : "Concentration range" ;
@@ -159,8 +178,9 @@ function GridRangeInput({ candidateSubstances }: { candidateSubstances: string[]
159178 step = "any"
160179 min = { 0 }
161180 max = { PPM_MAX }
162- value = { axis . range . min }
163- onChange = { ( e : ChangeEvent < HTMLInputElement > ) => updateAxis ( 0 , { range : { ...axis . range , min : e . target . valueAsNumber } } ) }
181+ value = { minStr }
182+ onChange = { ( e : ChangeEvent < HTMLInputElement > ) => setMinStr ( e . target . value ) }
183+ onBlur = { ( ) => commitRange ( "min" , minStr ) }
164184 variant = { axis . range . max > axis . range . min ? undefined : "error" }
165185 />
166186 < TextField
@@ -171,8 +191,9 @@ function GridRangeInput({ candidateSubstances }: { candidateSubstances: string[]
171191 step = "any"
172192 min = { 0 }
173193 max = { PPM_MAX }
174- value = { axis . range . max }
175- onChange = { ( e : ChangeEvent < HTMLInputElement > ) => updateAxis ( 0 , { range : { ...axis . range , max : e . target . valueAsNumber } } ) }
194+ value = { maxStr }
195+ onChange = { ( e : ChangeEvent < HTMLInputElement > ) => setMaxStr ( e . target . value ) }
196+ onBlur = { ( ) => commitRange ( "max" , maxStr ) }
176197 variant = { axis . range . max > axis . range . min ? undefined : "error" }
177198 helperText = { axis . range . max > axis . range . min ? undefined : "'To' must be greater than 'From'" }
178199 />
@@ -183,8 +204,9 @@ function GridRangeInput({ candidateSubstances }: { candidateSubstances: string[]
183204 step = { 1 }
184205 min = { 2 }
185206 max = { 25 }
186- value = { axis . range . steps }
187- onChange = { ( e : ChangeEvent < HTMLInputElement > ) => updateAxis ( 0 , { range : { ...axis . range , steps : e . target . valueAsNumber } } ) }
207+ value = { stepsStr }
208+ onChange = { ( e : ChangeEvent < HTMLInputElement > ) => setStepsStr ( e . target . value ) }
209+ onBlur = { ( ) => commitRange ( "steps" , stepsStr ) }
188210 />
189211 </ >
190212 ) }
0 commit comments