@@ -5,6 +5,7 @@ import React, { useEffect, useState } from 'react';
55import { LoadingIcon } from '@/src/shared/components/loading' ;
66import CanvasSelectComponent from './CanvasSelectComponent' ;
77import ModeSelectRow from './ModeSelectRow' ;
8+ import { COLOR_RAMP_DEFAULTS , ColorRampName } from '../../colorRampUtils' ;
89
910interface IColorRampProps {
1011 modeOptions : string [ ] ;
@@ -36,13 +37,46 @@ const ColorRamp: React.FC<IColorRampProps> = ({
3637 const [ selectedMode , setSelectedMode ] = useState ( '' ) ;
3738 const [ numberOfShades , setNumberOfShades ] = useState ( '' ) ;
3839 const [ isLoading , setIsLoading ] = useState ( false ) ;
40+ const [ warning , setWarning ] = useState < string | null > ( null ) ;
3941
4042 useEffect ( ( ) => {
4143 if ( selectedRamp === '' && selectedMode === '' && numberOfShades === '' ) {
4244 populateOptions ( ) ;
4345 }
4446 } , [ layerParams ] ) ;
4547
48+ useEffect ( ( ) => {
49+ if ( ! selectedRamp ) {
50+ return ;
51+ }
52+
53+ const defaultClasses =
54+ COLOR_RAMP_DEFAULTS [ selectedRamp as ColorRampName ] ?? 9 ;
55+
56+ setNumberOfShades ( defaultClasses . toString ( ) ) ;
57+ setWarning ( null ) ;
58+ } , [ selectedRamp ] ) ;
59+
60+ useEffect ( ( ) => {
61+ if ( ! selectedRamp || ! numberOfShades ) {
62+ return ;
63+ }
64+
65+ const minRequired = COLOR_RAMP_DEFAULTS [ selectedRamp as ColorRampName ] ;
66+ const shades = parseInt ( numberOfShades , 10 ) ;
67+ const rampLabel = selectedRamp
68+ . split ( '-' )
69+ . map ( word => word . charAt ( 0 ) . toUpperCase ( ) + word . slice ( 1 ) )
70+ . join ( '-' ) ;
71+
72+ if ( minRequired && shades < minRequired ) {
73+ setWarning (
74+ `${ rampLabel } requires at least ${ minRequired } classes (got ${ shades } )` ,
75+ ) ;
76+ } else {
77+ setWarning ( null ) ;
78+ }
79+ } , [ selectedRamp , numberOfShades ] ) ;
4680 const populateOptions = ( ) => {
4781 let nClasses , singleBandMode , colorRamp ;
4882
@@ -51,9 +85,13 @@ const ColorRamp: React.FC<IColorRampProps> = ({
5185 singleBandMode = layerParams . symbologyState . mode ;
5286 colorRamp = layerParams . symbologyState . colorRamp ;
5387 }
54- setNumberOfShades ( nClasses ? nClasses : '9' ) ;
88+ const defaultRamp = colorRamp ? colorRamp : 'viridis' ;
89+ const defaultClasses =
90+ nClasses ?? COLOR_RAMP_DEFAULTS [ defaultRamp as ColorRampName ] ?? 9 ;
91+
92+ setNumberOfShades ( defaultClasses . toString ( ) ) ;
5593 setSelectedMode ( singleBandMode ? singleBandMode : 'equal interval' ) ;
56- setSelectedRamp ( colorRamp ? colorRamp : 'viridis' ) ;
94+ setSelectedRamp ( defaultRamp ) ;
5795 } ;
5896
5997 return (
@@ -76,11 +114,20 @@ const ColorRamp: React.FC<IColorRampProps> = ({
76114 setSelectedMode = { setSelectedMode }
77115 />
78116 ) }
117+ { warning && (
118+ < div
119+ className = "jp-gis-warning"
120+ style = { { color : 'orange' , marginTop : 4 } }
121+ >
122+ { warning }
123+ </ div >
124+ ) }
79125 { isLoading ? (
80126 < LoadingIcon />
81127 ) : (
82128 < Button
83129 className = "jp-Dialog-button jp-mod-accept jp-mod-styled"
130+ disabled = { ! ! warning }
84131 onClick = { ( ) =>
85132 classifyFunc (
86133 selectedMode ,
0 commit comments