diff --git a/packages/base/src/dialogs/symbology/components/color_ramp/ColorRampControls.tsx b/packages/base/src/dialogs/symbology/components/color_ramp/ColorRampControls.tsx index 0d2d7050b..e2094e512 100644 --- a/packages/base/src/dialogs/symbology/components/color_ramp/ColorRampControls.tsx +++ b/packages/base/src/dialogs/symbology/components/color_ramp/ColorRampControls.tsx @@ -22,17 +22,18 @@ import { Button } from '@jupyterlab/ui-components'; import React, { useEffect, useState } from 'react'; import { LoadingIcon } from '@/src/shared/components/loading'; +import { ClassificationMode } from '@/src/types'; import ColorRampSelector from './ColorRampSelector'; import ModeSelectRow from './ModeSelectRow'; import { COLOR_RAMP_DEFAULTS, ColorRampName } from '../../colorRampUtils'; interface IColorRampControlsProps { - modeOptions: string[]; + modeOptions: ClassificationMode[]; layerParams: IDict; classifyFunc: ( - selectedMode: string, - numberOfShades: string, - selectedRamp: string, + selectedMode: ClassificationMode, + numberOfShades: number, + selectedRamp: ColorRampName, setIsLoading: (isLoading: boolean) => void, ) => void; showModeRow: boolean; @@ -40,11 +41,13 @@ interface IColorRampControlsProps { } export type ColorRampControlsOptions = { - selectedRamp: string; - numberOfShades: string; - selectedMode: string; + selectedRamp: ColorRampName; + numberOfShades: number; + selectedMode: ClassificationMode; }; +const isValidNumberOfShades = (value: number) => !isNaN(value) && value > 0; + const ColorRampControls: React.FC = ({ layerParams, modeOptions, @@ -52,27 +55,31 @@ const ColorRampControls: React.FC = ({ showModeRow, showRampSelector, }) => { - const [selectedRamp, setSelectedRamp] = useState(''); - const [selectedMode, setSelectedMode] = useState(''); - const [numberOfShades, setNumberOfShades] = useState(''); - const [isLoading, setIsLoading] = useState(false); + const [selectedRamp, setSelectedRamp] = useState('viridis'); + const [selectedMode, setSelectedMode] = + useState('equal interval'); + const [numberOfShades, setNumberOfShades] = useState(9); + const [isLoading, setIsLoading] = useState(false); const [warning, setWarning] = useState(null); useEffect(() => { - if (selectedRamp === '' && selectedMode === '' && numberOfShades === '') { + if (layerParams.symbologyState) { populateOptions(); } - }, [layerParams]); + }, [ + layerParams.symbologyState.nClasses, + layerParams.symbologyState.mode, + layerParams.symbologyState.colorRamp, + ]); useEffect(() => { if (!selectedRamp) { return; } - const defaultClasses = - COLOR_RAMP_DEFAULTS[selectedRamp as ColorRampName] ?? 9; + const defaultClasses = COLOR_RAMP_DEFAULTS[selectedRamp] ?? 9; - setNumberOfShades(defaultClasses.toString()); + setNumberOfShades(defaultClasses); setWarning(null); }, [selectedRamp]); @@ -81,8 +88,8 @@ const ColorRampControls: React.FC = ({ return; } - const minRequired = COLOR_RAMP_DEFAULTS[selectedRamp as ColorRampName]; - const shades = parseInt(numberOfShades, 10); + const minRequired = COLOR_RAMP_DEFAULTS[selectedRamp]; + const shades = numberOfShades; const rampLabel = selectedRamp .split('-') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) @@ -97,20 +104,10 @@ const ColorRampControls: React.FC = ({ } }, [selectedRamp, numberOfShades]); const populateOptions = () => { - let nClasses, singleBandMode, colorRamp; - - if (layerParams.symbologyState) { - nClasses = layerParams.symbologyState.nClasses; - singleBandMode = layerParams.symbologyState.mode; - colorRamp = layerParams.symbologyState.colorRamp; - } - const defaultRamp = colorRamp ? colorRamp : 'viridis'; - const defaultClasses = - nClasses ?? COLOR_RAMP_DEFAULTS[defaultRamp as ColorRampName] ?? 9; - - setNumberOfShades(defaultClasses.toString()); - setSelectedMode(singleBandMode ? singleBandMode : 'equal interval'); - setSelectedRamp(defaultRamp); + const { nClasses, mode, colorRamp } = layerParams.symbologyState ?? {}; + setNumberOfShades(Number(nClasses ?? 9)); + setSelectedMode((mode as ClassificationMode) ?? 'equal interval'); + setSelectedRamp((colorRamp as ColorRampName) ?? 'viridis'); }; return ( @@ -146,7 +143,9 @@ const ColorRampControls: React.FC = ({ ) : (