Skip to content

Commit 4f1a92d

Browse files
authored
Extract model input dropdown to its own component (#2837)
1 parent 606bfd7 commit 4f1a92d

File tree

2 files changed

+70
-34
lines changed

2 files changed

+70
-34
lines changed

extensions/ql-vscode/src/view/model-editor/MethodRow.tsx

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
import { InProgressDropdown } from "./InProgressDropdown";
2424
import { MethodName } from "./MethodName";
2525
import { ModelTypeDropdown } from "./ModelTypeDropdown";
26+
import { ModelInputDropdown } from "./ModelInputDropdown";
2627

2728
const ApiOrMethodCell = styled(VSCodeDataGridCell)`
2829
display: flex;
@@ -81,21 +82,6 @@ function ModelableMethodRow(props: MethodRowProps) {
8182
.split(",");
8283
}, [method.methodParameters]);
8384

84-
const handleInputInput = useCallback(
85-
(e: ChangeEvent<HTMLSelectElement>) => {
86-
if (!modeledMethod) {
87-
return;
88-
}
89-
90-
const target = e.target as HTMLSelectElement;
91-
92-
onChange(method, {
93-
...modeledMethod,
94-
input: target.value as ModeledMethod["input"],
95-
});
96-
},
97-
[onChange, method, modeledMethod],
98-
);
9985
const handleOutputInput = useCallback(
10086
(e: ChangeEvent<HTMLSelectElement>) => {
10187
if (!modeledMethod) {
@@ -130,17 +116,6 @@ function ModelableMethodRow(props: MethodRowProps) {
130116
[method],
131117
);
132118

133-
const inputOptions = useMemo(
134-
() => [
135-
{ value: "Argument[this]", label: "Argument[this]" },
136-
...argumentsList.map((argument, index) => ({
137-
value: `Argument[${index}]`,
138-
label: `Argument[${index}]: ${argument}`,
139-
})),
140-
],
141-
[argumentsList],
142-
);
143-
144119
const outputOptions = useMemo(
145120
() => [
146121
{ value: "ReturnValue", label: "ReturnValue" },
@@ -153,8 +128,6 @@ function ModelableMethodRow(props: MethodRowProps) {
153128
[argumentsList],
154129
);
155130

156-
const showInputCell =
157-
modeledMethod?.type && ["sink", "summary"].includes(modeledMethod?.type);
158131
const showOutputCell =
159132
modeledMethod?.type && ["source", "summary"].includes(modeledMethod?.type);
160133
const predicate =
@@ -205,12 +178,10 @@ function ModelableMethodRow(props: MethodRowProps) {
205178
/>
206179
</VSCodeDataGridCell>
207180
<VSCodeDataGridCell gridColumn={3}>
208-
<Dropdown
209-
value={modeledMethod?.input}
210-
options={inputOptions}
211-
disabled={!showInputCell}
212-
onChange={handleInputInput}
213-
aria-label="Input"
181+
<ModelInputDropdown
182+
method={method}
183+
modeledMethod={modeledMethod}
184+
onChange={onChange}
214185
/>
215186
</VSCodeDataGridCell>
216187
<VSCodeDataGridCell gridColumn={4}>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import * as React from "react";
2+
import { ChangeEvent, useCallback, useMemo } from "react";
3+
import { Dropdown } from "../common/Dropdown";
4+
import { ModeledMethod } from "../../model-editor/modeled-method";
5+
import { Method, getArgumentsList } from "../../model-editor/method";
6+
7+
type Props = {
8+
method: Method;
9+
modeledMethod: ModeledMethod | undefined;
10+
onChange: (method: Method, modeledMethod: ModeledMethod) => void;
11+
};
12+
13+
export const ModelInputDropdown = ({
14+
method,
15+
modeledMethod,
16+
onChange,
17+
}: Props): JSX.Element => {
18+
const argumentsList = useMemo(
19+
() => getArgumentsList(method.methodParameters),
20+
[method.methodParameters],
21+
);
22+
23+
const options = useMemo(
24+
() => [
25+
{ value: "Argument[this]", label: "Argument[this]" },
26+
...argumentsList.map((argument, index) => ({
27+
value: `Argument[${index}]`,
28+
label: `Argument[${index}]: ${argument}`,
29+
})),
30+
],
31+
[argumentsList],
32+
);
33+
34+
const enabled = useMemo(
35+
() =>
36+
modeledMethod?.type && ["sink", "summary"].includes(modeledMethod?.type),
37+
[modeledMethod?.type],
38+
);
39+
40+
const handleChange = useCallback(
41+
(e: ChangeEvent<HTMLSelectElement>) => {
42+
if (!modeledMethod) {
43+
return;
44+
}
45+
46+
const target = e.target as HTMLSelectElement;
47+
48+
onChange(method, {
49+
...modeledMethod,
50+
input: target.value,
51+
});
52+
},
53+
[onChange, method, modeledMethod],
54+
);
55+
56+
return (
57+
<Dropdown
58+
value={modeledMethod?.input}
59+
options={options}
60+
disabled={!enabled}
61+
onChange={handleChange}
62+
aria-label="Input"
63+
/>
64+
);
65+
};

0 commit comments

Comments
 (0)