Skip to content

Commit d6cae8a

Browse files
committed
discriminated union for select box options
1 parent 6182bb7 commit d6cae8a

File tree

3 files changed

+86
-36
lines changed

3 files changed

+86
-36
lines changed

src/notebooks/deepnote/selectInputSettingsWebview.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,25 @@ export class SelectInputSettingsWebviewProvider {
103103

104104
const metadata = this.currentCell.metadata as Record<string, unknown> | undefined;
105105

106-
const settings: SelectInputSettings = {
107-
allowMultipleValues: (metadata?.deepnote_allow_multiple_values as boolean) ?? false,
108-
allowEmptyValue: (metadata?.deepnote_allow_empty_values as boolean) ?? false,
109-
selectType: (metadata?.deepnote_variable_select_type as 'from-options' | 'from-variable') ?? 'from-options',
110-
options: (metadata?.deepnote_variable_custom_options as string[]) ?? [],
111-
selectedVariable: (metadata?.deepnote_variable_selected_variable as string) ?? ''
112-
};
106+
const allowMultipleValues = (metadata?.deepnote_allow_multiple_values as boolean) ?? false;
107+
const allowEmptyValue = (metadata?.deepnote_allow_empty_values as boolean) ?? false;
108+
const selectType =
109+
(metadata?.deepnote_variable_select_type as 'from-options' | 'from-variable') ?? 'from-options';
110+
111+
const settings: SelectInputSettings =
112+
selectType === 'from-options'
113+
? {
114+
allowMultipleValues,
115+
allowEmptyValue,
116+
selectType: 'from-options',
117+
options: (metadata?.deepnote_variable_custom_options as string[]) ?? []
118+
}
119+
: {
120+
allowMultipleValues,
121+
allowEmptyValue,
122+
selectType: 'from-variable',
123+
selectedVariable: (metadata?.deepnote_variable_selected_variable as string) ?? ''
124+
};
113125

114126
await this.currentPanel.webview.postMessage({
115127
type: 'init',
@@ -195,14 +207,15 @@ export class SelectInputSettingsWebviewProvider {
195207
metadata.deepnote_allow_multiple_values = settings.allowMultipleValues;
196208
metadata.deepnote_allow_empty_values = settings.allowEmptyValue;
197209
metadata.deepnote_variable_select_type = settings.selectType;
198-
metadata.deepnote_variable_custom_options = settings.options;
199-
metadata.deepnote_variable_selected_variable = settings.selectedVariable;
200210

201211
// Update the options field based on the select type
202212
if (settings.selectType === 'from-options') {
213+
metadata.deepnote_variable_custom_options = settings.options;
203214
metadata.deepnote_variable_options = settings.options;
215+
delete metadata.deepnote_variable_selected_variable;
204216
} else {
205-
// Clear stale options when not using 'from-options' mode
217+
metadata.deepnote_variable_selected_variable = settings.selectedVariable;
218+
delete metadata.deepnote_variable_custom_options;
206219
delete metadata.deepnote_variable_options;
207220
}
208221

src/platform/notebooks/deepnote/types.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@ import { EnvironmentVariables } from '../../common/variables/types';
44
import { IntegrationConfig } from './integrationTypes';
55

66
/**
7-
* Settings for select input blocks
7+
* Settings for select input blocks - discriminated union based on selectType
88
*/
9-
export interface SelectInputSettings {
10-
allowMultipleValues: boolean;
11-
allowEmptyValue: boolean;
12-
selectType: 'from-options' | 'from-variable';
13-
options: string[];
14-
selectedVariable: string;
15-
}
9+
export type SelectInputSettings =
10+
| {
11+
allowMultipleValues: boolean;
12+
allowEmptyValue: boolean;
13+
selectType: 'from-options';
14+
options: string[];
15+
}
16+
| {
17+
allowMultipleValues: boolean;
18+
allowEmptyValue: boolean;
19+
selectType: 'from-variable';
20+
selectedVariable: string;
21+
};
1622

1723
/**
1824
* Message types for select input settings webview

src/webviews/webview-side/selectInputSettings/SelectInputSettingsPanel.tsx

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ export const SelectInputSettingsPanel: React.FC<ISelectInputSettingsPanelProps>
1313
allowMultipleValues: false,
1414
allowEmptyValue: false,
1515
selectType: 'from-options',
16-
options: [],
17-
selectedVariable: ''
16+
options: []
1817
});
1918

2019
const [newOption, setNewOption] = React.useState('');
@@ -51,13 +50,30 @@ export const SelectInputSettingsPanel: React.FC<ISelectInputSettingsPanelProps>
5150
};
5251

5352
const handleSelectTypeChange = (selectType: 'from-options' | 'from-variable') => {
54-
setSettings((prev) => ({
55-
...prev,
56-
selectType
57-
}));
53+
setSettings((prev) => {
54+
if (selectType === 'from-options') {
55+
return {
56+
allowMultipleValues: prev.allowMultipleValues,
57+
allowEmptyValue: prev.allowEmptyValue,
58+
selectType: 'from-options',
59+
options: prev.selectType === 'from-options' ? prev.options : []
60+
};
61+
} else {
62+
return {
63+
allowMultipleValues: prev.allowMultipleValues,
64+
allowEmptyValue: prev.allowEmptyValue,
65+
selectType: 'from-variable',
66+
selectedVariable: prev.selectType === 'from-variable' ? prev.selectedVariable : ''
67+
};
68+
}
69+
});
5870
};
5971

6072
const handleAddOption = () => {
73+
if (settings.selectType !== 'from-options') {
74+
return;
75+
}
76+
6177
const trimmedValue = newOption.trim();
6278

6379
// Check if the trimmed value is non-empty
@@ -76,25 +92,40 @@ export const SelectInputSettingsPanel: React.FC<ISelectInputSettingsPanelProps>
7692
}
7793

7894
// Add the trimmed value and clear input
79-
setSettings((prev) => ({
80-
...prev,
81-
options: [...prev.options, trimmedValue]
82-
}));
95+
setSettings((prev) => {
96+
if (prev.selectType !== 'from-options') {
97+
return prev;
98+
}
99+
return {
100+
...prev,
101+
options: [...prev.options, trimmedValue]
102+
};
103+
});
83104
setNewOption('');
84105
};
85106

86107
const handleRemoveOption = (index: number) => {
87-
setSettings((prev) => ({
88-
...prev,
89-
options: prev.options.filter((_, i) => i !== index)
90-
}));
108+
setSettings((prev) => {
109+
if (prev.selectType !== 'from-options') {
110+
return prev;
111+
}
112+
return {
113+
...prev,
114+
options: prev.options.filter((_, i) => i !== index)
115+
};
116+
});
91117
};
92118

93119
const handleVariableChange = (e: React.ChangeEvent<HTMLInputElement>) => {
94-
setSettings((prev) => ({
95-
...prev,
96-
selectedVariable: e.target.value
97-
}));
120+
setSettings((prev) => {
121+
if (prev.selectType !== 'from-variable') {
122+
return prev;
123+
}
124+
return {
125+
...prev,
126+
selectedVariable: e.target.value
127+
};
128+
});
98129
};
99130

100131
const handleSave = () => {

0 commit comments

Comments
 (0)