Skip to content

Commit 0d69ede

Browse files
committed
making selectedMode or numberofShades required
1 parent d4d9064 commit 0d69ede

File tree

8 files changed

+62
-63
lines changed

8 files changed

+62
-63
lines changed

packages/base/src/dialogs/symbology/components/color_ramp/CanvasSelectComponent.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { Button } from '@jupyterlab/ui-components';
22
import React, { useEffect, useRef, useState } from 'react';
33

4-
import { useColorMapList } from '@/src/dialogs/symbology/colorRampUtils';
4+
import {
5+
ColorRampName,
6+
useColorMapList,
7+
} from '@/src/dialogs/symbology/colorRampUtils';
58
import ColorRampEntry from './ColorRampEntry';
69

710
export interface IColorMap {
@@ -10,7 +13,7 @@ export interface IColorMap {
1013
}
1114

1215
interface ICanvasSelectComponentProps {
13-
selectedRamp: string;
16+
selectedRamp: ColorRampName;
1417
setSelected: (item: any) => void;
1518
}
1619

packages/base/src/dialogs/symbology/components/color_ramp/ColorRamp.tsx

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,28 @@ import { LoadingIcon } from '@/src/shared/components/loading';
66
import { ClassificationMode } from '@/src/types';
77
import CanvasSelectComponent from './CanvasSelectComponent';
88
import ModeSelectRow from './ModeSelectRow';
9+
import { ColorRampName } from '../../colorRampUtils';
910

1011
interface IColorRampProps {
1112
modeOptions: ClassificationMode[];
1213
layerParams: IDict;
1314
classifyFunc: (
14-
selectedMode: ClassificationMode | undefined,
15-
numberOfShades: number | undefined,
16-
selectedRamp: string,
15+
selectedMode: ClassificationMode,
16+
numberOfShades: number,
17+
selectedRamp: ColorRampName,
1718
setIsLoading: (isLoading: boolean) => void,
1819
) => void;
1920
showModeRow: boolean;
2021
showRampSelector: boolean;
2122
}
2223

2324
export type ColorRampOptions = {
24-
selectedRamp: string;
25-
numberOfShades: number | undefined;
26-
selectedMode: ClassificationMode | undefined;
25+
selectedRamp: ColorRampName;
26+
numberOfShades: number;
27+
selectedMode: ClassificationMode;
2728
};
2829

29-
const isValidNumberOfShades = (value: number | undefined) => {
30-
return value !== undefined && !isNaN(value) && value > 0;
31-
};
30+
const isValidNumberOfShades = (value: number) => !isNaN(value) && value > 0;
3231

3332
const ColorRamp: React.FC<IColorRampProps> = ({
3433
layerParams,
@@ -37,34 +36,27 @@ const ColorRamp: React.FC<IColorRampProps> = ({
3736
showModeRow,
3837
showRampSelector,
3938
}) => {
40-
const [selectedRamp, setSelectedRamp] = useState('');
41-
const [selectedMode, setSelectedMode] = useState<
42-
ClassificationMode | undefined
43-
>();
44-
const [numberOfShades, setNumberOfShades] = useState<number | undefined>();
39+
const [selectedRamp, setSelectedRamp] = useState<ColorRampName>('viridis');
40+
const [selectedMode, setSelectedMode] =
41+
useState<ClassificationMode>('equal interval');
42+
const [numberOfShades, setNumberOfShades] = useState<number>(9);
4543
const [isLoading, setIsLoading] = useState<boolean>(false);
4644

4745
useEffect(() => {
48-
if (
49-
selectedRamp === '' &&
50-
selectedMode === undefined &&
51-
numberOfShades === undefined
52-
) {
46+
if (layerParams.symbologyState) {
5347
populateOptions();
5448
}
55-
}, [layerParams]);
49+
}, [
50+
layerParams.symbologyState.nClasses,
51+
layerParams.symbologyState.mode,
52+
layerParams.symbologyState.colorRamp,
53+
]);
5654

5755
const populateOptions = () => {
58-
let nClasses, singleBandMode, colorRamp;
59-
60-
if (layerParams.symbologyState) {
61-
nClasses = layerParams.symbologyState.nClasses;
62-
singleBandMode = layerParams.symbologyState.mode;
63-
colorRamp = layerParams.symbologyState.colorRamp;
64-
}
65-
setNumberOfShades(nClasses ? nClasses : 9);
66-
setSelectedMode((singleBandMode as ClassificationMode) ?? 'equal interval');
67-
setSelectedRamp(colorRamp ? colorRamp : 'viridis');
56+
const { nClasses, mode, colorRamp } = layerParams.symbologyState ?? {};
57+
setNumberOfShades(nClasses ?? 9);
58+
setSelectedMode((mode as ClassificationMode) ?? 'equal interval');
59+
setSelectedRamp((colorRamp as ColorRampName) ?? 'viridis');
6860
};
6961

7062
return (
@@ -92,7 +84,7 @@ const ColorRamp: React.FC<IColorRampProps> = ({
9284
) : (
9385
<Button
9486
className="jp-Dialog-button jp-mod-accept jp-mod-styled"
95-
disabled={!isValidNumberOfShades(numberOfShades)}
87+
disabled={!isValidNumberOfShades(numberOfShades) || !selectedMode}
9688
onClick={() =>
9789
classifyFunc(
9890
selectedMode,

packages/base/src/dialogs/symbology/components/color_ramp/ModeSelectRow.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import React from 'react';
22

33
import { ClassificationMode } from '@/src/types';
44
interface IModeSelectRowProps {
5-
numberOfShades: number | undefined;
6-
setNumberOfShades: React.Dispatch<React.SetStateAction<number | undefined>>;
7-
selectedMode: ClassificationMode | undefined;
8-
setSelectedMode: React.Dispatch<
9-
React.SetStateAction<ClassificationMode | undefined>
10-
>;
5+
numberOfShades: number;
6+
setNumberOfShades: React.Dispatch<React.SetStateAction<number>>;
7+
selectedMode: ClassificationMode;
8+
setSelectedMode: React.Dispatch<React.SetStateAction<ClassificationMode>>;
119
modeOptions: ClassificationMode[];
1210
}
1311
const ModeSelectRow: React.FC<IModeSelectRowProps> = ({
@@ -25,10 +23,12 @@ const ModeSelectRow: React.FC<IModeSelectRowProps> = ({
2523
className="jp-mod-styled"
2624
name="class-number-input"
2725
type="number"
28-
value={selectedMode === 'continuous' ? 52 : (numberOfShades ?? '')}
26+
value={selectedMode === 'continuous' ? 52 : numberOfShades}
2927
onChange={event => {
30-
const value = event.target.value;
31-
setNumberOfShades(value === '' ? undefined : Number(value));
28+
const value = Number(event.target.value);
29+
if (!isNaN(value) && value > 0) {
30+
setNumberOfShades(value);
31+
}
3232
}}
3333
disabled={selectedMode === 'continuous'}
3434
/>

packages/base/src/dialogs/symbology/symbologyUtils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { IJGISLayer } from '@jupytergis/schema';
22
import colormap from 'colormap';
33

4+
import { ColorRampName } from './colorRampUtils';
45
import { IStopRow } from './symbologyDialog';
56

67
const COLOR_EXPR_STOPS_START = 3;
@@ -101,7 +102,7 @@ export namespace VectorUtils {
101102
export namespace Utils {
102103
export const getValueColorPairs = (
103104
stops: number[],
104-
selectedRamp: string,
105+
selectedRamp: ColorRampName,
105106
nClasses: number,
106107
reverse = false,
107108
) => {

packages/base/src/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import BandRow from '@/src/dialogs/symbology/tiff_layer/components/BandRow';
2121
import { LoadingOverlay } from '@/src/shared/components/loading';
2222
import { GlobalStateDbManager } from '@/src/store';
2323
import { ClassificationMode } from '@/src/types';
24+
import { ColorRampName } from '../../colorRampUtils';
2425

2526
export type InterpolationType = 'discrete' | 'linear' | 'exact';
2627

@@ -287,9 +288,9 @@ const SingleBandPseudoColor: React.FC<ISymbologyDialogProps> = ({
287288
};
288289

289290
const buildColorInfoFromClassification = async (
290-
selectedMode: ClassificationMode | undefined,
291-
numberOfShades: number | undefined,
292-
selectedRamp: string,
291+
selectedMode: ClassificationMode,
292+
numberOfShades: number,
293+
selectedRamp: ColorRampName,
293294
setIsLoading: (isLoading: boolean) => void,
294295
) => {
295296
// Update layer state with selected options
@@ -304,8 +305,7 @@ const SingleBandPseudoColor: React.FC<ISymbologyDialogProps> = ({
304305
const currentBand = bandRows[selectedBand - 1];
305306
const source = model.getSource(layer?.parameters?.source);
306307
const sourceInfo = source?.parameters?.urls[0];
307-
const nClasses =
308-
selectedMode === 'continuous' ? 52 : (numberOfShades as number);
308+
const nClasses = selectedMode === 'continuous' ? 52 : numberOfShades;
309309

310310
setIsLoading(true);
311311
switch (selectedMode) {

packages/base/src/dialogs/symbology/vector_layer/types/Categorized.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import { Utils, VectorUtils } from '@/src/dialogs/symbology/symbologyUtils';
1313
import ValueSelect from '@/src/dialogs/symbology/vector_layer/components/ValueSelect';
1414
import { SymbologyTab, ClassificationMode } from '@/src/types';
15+
import { ColorRampName } from '../../colorRampUtils';
1516

1617
const Categorized: React.FC<ISymbologyTabbedDialogWithAttributesProps> = ({
1718
model,
@@ -117,16 +118,16 @@ const Categorized: React.FC<ISymbologyTabbedDialogWithAttributesProps> = ({
117118
}, [selectedAttribute, stopRows, colorRampOptions]);
118119

119120
const buildColorInfoFromClassification = (
120-
selectedMode: ClassificationMode | undefined,
121-
numberOfShades: number | undefined,
122-
selectedRamp: string,
121+
selectedMode: ClassificationMode,
122+
numberOfShades: number,
123+
selectedRamp: ColorRampName,
123124
setIsLoading: (isLoading: boolean) => void,
124125
) => {
125126
setColorRampOptions({
126127
selectedFunction: '',
127128
selectedRamp,
128-
numberOfShades: '',
129-
selectedMode: '',
129+
numberOfShades,
130+
selectedMode,
130131
});
131132

132133
const stops = Array.from(

packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import { Utils, VectorUtils } from '@/src/dialogs/symbology/symbologyUtils';
1515
import ValueSelect from '@/src/dialogs/symbology/vector_layer/components/ValueSelect';
1616
import { ClassificationMode } from '@/src/types';
17+
import { ColorRampName } from '../../colorRampUtils';
1718

1819
const Graduated: React.FC<ISymbologyTabbedDialogWithAttributesProps> = ({
1920
model,
@@ -216,9 +217,9 @@ const Graduated: React.FC<ISymbologyTabbedDialogWithAttributesProps> = ({
216217
};
217218

218219
const buildColorInfoFromClassification = (
219-
selectedMode: ClassificationMode | undefined,
220-
numberOfShades: number | undefined,
221-
selectedRamp: string,
220+
selectedMode: ClassificationMode,
221+
numberOfShades: number,
222+
selectedRamp: ColorRampName,
222223
) => {
223224
setColorRampOptions({
224225
selectedRamp,
@@ -234,31 +235,31 @@ const Graduated: React.FC<ISymbologyTabbedDialogWithAttributesProps> = ({
234235
case 'quantile':
235236
stops = VectorClassifications.calculateQuantileBreaks(
236237
values,
237-
numberOfShades as number,
238+
numberOfShades,
238239
);
239240
break;
240241
case 'equal interval':
241242
stops = VectorClassifications.calculateEqualIntervalBreaks(
242243
values,
243-
numberOfShades as number,
244+
numberOfShades,
244245
);
245246
break;
246247
case 'jenks':
247248
stops = VectorClassifications.calculateJenksBreaks(
248249
values,
249-
numberOfShades as number,
250+
numberOfShades,
250251
);
251252
break;
252253
case 'pretty':
253254
stops = VectorClassifications.calculatePrettyBreaks(
254255
values,
255-
numberOfShades as number,
256+
numberOfShades,
256257
);
257258
break;
258259
case 'logarithmic':
259260
stops = VectorClassifications.calculateLogarithmicBreaks(
260261
values,
261-
numberOfShades as number,
262+
numberOfShades,
262263
);
263264
break;
264265
default:
@@ -272,7 +273,7 @@ const Graduated: React.FC<ISymbologyTabbedDialogWithAttributesProps> = ({
272273
: Utils.getValueColorPairs(
273274
stops,
274275
selectedRamp,
275-
numberOfShades as number,
276+
numberOfShades,
276277
reverseRamp,
277278
);
278279

packages/base/src/dialogs/symbology/vector_layer/types/Heatmap.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, { useEffect, useRef, useState } from 'react';
33

44
import CanvasSelectComponent from '@/src/dialogs/symbology/components/color_ramp/CanvasSelectComponent';
55
import { ISymbologyDialogProps } from '@/src/dialogs/symbology/symbologyDialog';
6+
import { ColorRampName } from '../../colorRampUtils';
67

78
const Heatmap: React.FC<ISymbologyDialogProps> = ({
89
model,
@@ -18,7 +19,7 @@ const Heatmap: React.FC<ISymbologyDialogProps> = ({
1819
if (!layer?.parameters) {
1920
return;
2021
}
21-
const [selectedRamp, setSelectedRamp] = useState('');
22+
const [selectedRamp, setSelectedRamp] = useState<ColorRampName>('viridis');
2223
const [heatmapOptions, setHetamapOptions] = useState({
2324
radius: 8,
2425
blur: 15,

0 commit comments

Comments
 (0)