import { useCallback } from 'react';
import { NumberOrDateRange, NumberRange, DateRange } from '../../types/general';
import {
ValueTypeAddon,
LabelAddon,
ContainerStylesAddon,
} from '../../types/plots';
import {
NumberRangeInput,
DateRangeInput,
} from '../widgets/NumberAndDateRangeInputs';
export interface AxisRangeControlProps
extends ValueTypeAddon,
LabelAddon,
ContainerStylesAddon {
/** the controlled range for the axis */
range?: NumberOrDateRange;
/** function to call when widget updates the range */
onRangeChange?: (newRange?: NumberOrDateRange) => void;
// add disabled prop to disable input fields
disabled?: boolean;
/** is this for a log scale axis? If so, we'll validate the min value to be > 0 */
logScale?: boolean;
}
export default function AxisRangeControl({
label,
valueType,
range,
onRangeChange,
containerStyles,
// add disabled prop to disable input fields: default is false
disabled = false,
logScale = false,
}: AxisRangeControlProps) {
const validator = useCallback(
(
range?: NumberOrDateRange
): {
validity: boolean;
message: string;
} => {
if (range) {
if (range.min === range.max) {
return {
validity: false,
message: 'Start and end of range cannot be the same',
};
} else if (range.min > range.max) {
return {
validity: false,
message: 'End cannot be before start of range',
};
} else if (logScale && range.min <= 0) {
return {
validity: false,
message:
'Range start should be greater than zero when using log scale',
};
}
}
return { validity: true, message: '' };
},
[logScale]
);
return onRangeChange ? (
valueType != null && valueType === 'date' ? (
) : (
)
) : null;
}