67 lines
1.4 KiB
TypeScript
67 lines
1.4 KiB
TypeScript
|
/**
|
||
|
* Validate a min and max value for a range slider against defined constraints (min, max, step).
|
||
|
*
|
||
|
* @return {[number, number]} Validated and updated min/max values that fit within the range slider constraints.
|
||
|
*/
|
||
|
export const constrainRangeSliderValues = (
|
||
|
/**
|
||
|
* Tuple containing min and max values.
|
||
|
*/
|
||
|
values: [ number, number ],
|
||
|
/**
|
||
|
* Min allowed value for the sliders.
|
||
|
*/
|
||
|
min?: number | null,
|
||
|
/**
|
||
|
* Max allowed value for the sliders.
|
||
|
*/
|
||
|
max?: number | null,
|
||
|
/**
|
||
|
* Step value for the sliders.
|
||
|
*/
|
||
|
step = 1,
|
||
|
/**
|
||
|
* Whether we're currently interacting with the min range slider or not, so we update the correct values.
|
||
|
*/
|
||
|
isMin = false
|
||
|
): [ number, number ] => {
|
||
|
let [ minValue, maxValue ] = values;
|
||
|
|
||
|
const isFinite = ( n: number | undefined ): n is number =>
|
||
|
Number.isFinite( n );
|
||
|
|
||
|
if ( ! isFinite( minValue ) ) {
|
||
|
minValue = min || 0;
|
||
|
}
|
||
|
|
||
|
if ( ! isFinite( maxValue ) ) {
|
||
|
maxValue = max || step;
|
||
|
}
|
||
|
|
||
|
if ( isFinite( min ) && min > minValue ) {
|
||
|
minValue = min;
|
||
|
}
|
||
|
|
||
|
if ( isFinite( max ) && max <= minValue ) {
|
||
|
minValue = max - step;
|
||
|
}
|
||
|
|
||
|
if ( isFinite( min ) && min >= maxValue ) {
|
||
|
maxValue = min + step;
|
||
|
}
|
||
|
|
||
|
if ( isFinite( max ) && max < maxValue ) {
|
||
|
maxValue = max;
|
||
|
}
|
||
|
|
||
|
if ( ! isMin && minValue >= maxValue ) {
|
||
|
minValue = maxValue - step;
|
||
|
}
|
||
|
|
||
|
if ( isMin && maxValue <= minValue ) {
|
||
|
maxValue = minValue + step;
|
||
|
}
|
||
|
|
||
|
return [ minValue, maxValue ];
|
||
|
};
|