Skip to content

Commit d5c4f33

Browse files
Use a native select instead of VSCodeDropdown
1 parent f75b358 commit d5c4f33

3 files changed

Lines changed: 76 additions & 51 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import styled from "styled-components";
2+
3+
/**
4+
* Styled to look like a `VSCodeDropdown`.
5+
*
6+
* The reason for doing this is that `VSCodeDropdown` doesn't handle fitting into
7+
* available space and truncating content, and this leads to breaking the
8+
* `VSCodeDataGrid` layout. This version using `select` directly will truncate the
9+
* content as necessary and fit into whatever space is available.
10+
* See https://github.com/github/vscode-codeql/pull/2582#issuecomment-1622164429
11+
* for more info on the problem and other potential solutions.
12+
*/
13+
export const Dropdown = styled.select`
14+
width: 100%;
15+
height: calc(var(--input-height) * 1px);
16+
background: var(--dropdown-background);
17+
color: var(--foreground);
18+
font-family: var(--font-family);
19+
border: none;
20+
padding: 2px 6px 2px 8px;
21+
`;

extensions/ql-vscode/src/view/data-extensions-editor/KindInput.tsx

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
import * as React from "react";
2-
import { useCallback, useEffect } from "react";
3-
import styled from "styled-components";
4-
import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react";
2+
import { ChangeEvent, useCallback, useEffect } from "react";
53

64
import type { ModeledMethod } from "../../data-extensions-editor/modeled-method";
7-
8-
const Dropdown = styled(VSCodeDropdown)`
9-
width: 100%;
10-
`;
5+
import { Dropdown } from "../common/Dropdown";
116

127
type Props = {
138
kinds: Array<ModeledMethod["kind"]>;
@@ -19,7 +14,7 @@ type Props = {
1914

2015
export const KindInput = ({ kinds, value, disabled, onChange }: Props) => {
2116
const handleInput = useCallback(
22-
(e: InputEvent) => {
17+
(e: ChangeEvent<HTMLSelectElement>) => {
2318
const target = e.target as HTMLSelectElement;
2419

2520
onChange(target.value as ModeledMethod["kind"]);
@@ -38,12 +33,16 @@ export const KindInput = ({ kinds, value, disabled, onChange }: Props) => {
3833
}, [value, kinds, onChange]);
3934

4035
return (
41-
<Dropdown value={value} disabled={disabled} onInput={handleInput}>
42-
{kinds.map((kind) => (
43-
<VSCodeOption key={kind} value={kind}>
44-
{kind}
45-
</VSCodeOption>
46-
))}
36+
<Dropdown value={value} disabled={disabled} onChange={handleInput}>
37+
{!disabled && (
38+
<>
39+
{kinds.map((kind) => (
40+
<option key={kind} value={kind}>
41+
{kind}
42+
</option>
43+
))}
44+
</>
45+
)}
4746
</Dropdown>
4847
);
4948
};

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

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import {
22
VSCodeCheckbox,
33
VSCodeDataGridCell,
44
VSCodeDataGridRow,
5-
VSCodeDropdown,
65
VSCodeLink,
7-
VSCodeOption,
86
} from "@vscode/webview-ui-toolkit/react";
97
import * as React from "react";
10-
import { useCallback, useMemo } from "react";
8+
import { ChangeEvent, useCallback, useMemo } from "react";
119
import styled from "styled-components";
1210
import { vscode } from "../vscode-api";
1311

@@ -20,10 +18,7 @@ import {
2018
import { KindInput } from "./KindInput";
2119
import { extensiblePredicateDefinitions } from "../../data-extensions-editor/predicates";
2220
import { Mode } from "../../data-extensions-editor/shared/mode";
23-
24-
const Dropdown = styled(VSCodeDropdown)`
25-
width: 100%;
26-
`;
21+
import { Dropdown } from "../common/Dropdown";
2722

2823
const ApiOrMethodCell = styled(VSCodeDataGridCell)`
2924
display: flex;
@@ -66,9 +61,7 @@ export const MethodRow = ({
6661
}, [externalApiUsage.methodParameters]);
6762

6863
const handleTypeInput = useCallback(
69-
(e: InputEvent) => {
70-
const target = e.target as HTMLSelectElement;
71-
64+
(e: ChangeEvent<HTMLSelectElement>) => {
7265
let newProvenance: Provenance = "manual";
7366
if (modeledMethod?.provenance === "df-generated") {
7467
newProvenance = "df-manual";
@@ -82,14 +75,14 @@ export const MethodRow = ({
8275
output: "ReturnType",
8376
kind: "value",
8477
...modeledMethod,
85-
type: target.value as ModeledMethodType,
78+
type: e.target.value as ModeledMethodType,
8679
provenance: newProvenance,
8780
});
8881
},
8982
[onChange, externalApiUsage, modeledMethod, argumentsList],
9083
);
9184
const handleInputInput = useCallback(
92-
(e: InputEvent) => {
85+
(e: ChangeEvent<HTMLSelectElement>) => {
9386
if (!modeledMethod) {
9487
return;
9588
}
@@ -104,7 +97,7 @@ export const MethodRow = ({
10497
[onChange, externalApiUsage, modeledMethod],
10598
);
10699
const handleOutputInput = useCallback(
107-
(e: InputEvent) => {
100+
(e: ChangeEvent<HTMLSelectElement>) => {
108101
if (!modeledMethod) {
109102
return;
110103
}
@@ -172,44 +165,56 @@ export const MethodRow = ({
172165
</ApiOrMethodCell>
173166
<VSCodeDataGridCell gridColumn={2}>
174167
<Dropdown
175-
value={showModelTypeCell && (modeledMethod?.type ?? "none")}
168+
value={showModelTypeCell ? modeledMethod?.type ?? "none" : undefined}
176169
disabled={!showModelTypeCell}
177-
onInput={handleTypeInput}
170+
onChange={handleTypeInput}
178171
>
179-
<VSCodeOption value="none">Unmodeled</VSCodeOption>
180-
<VSCodeOption value="source">Source</VSCodeOption>
181-
<VSCodeOption value="sink">Sink</VSCodeOption>
182-
<VSCodeOption value="summary">Flow summary</VSCodeOption>
183-
<VSCodeOption value="neutral">Neutral</VSCodeOption>
172+
{showModelTypeCell && (
173+
<>
174+
<option value="none">Unmodeled</option>
175+
<option value="source">Source</option>
176+
<option value="sink">Sink</option>
177+
<option value="summary">Flow summary</option>
178+
<option value="neutral">Neutral</option>
179+
</>
180+
)}
184181
</Dropdown>
185182
</VSCodeDataGridCell>
186183
<VSCodeDataGridCell gridColumn={3}>
187184
<Dropdown
188-
value={showInputCell && modeledMethod?.input}
185+
value={showInputCell ? modeledMethod?.input : undefined}
189186
disabled={!showInputCell}
190-
onInput={handleInputInput}
187+
onChange={handleInputInput}
191188
>
192-
<VSCodeOption value="Argument[this]">Argument[this]</VSCodeOption>
193-
{argumentsList.map((argument, index) => (
194-
<VSCodeOption key={argument} value={`Argument[${index}]`}>
195-
Argument[{index}]: {argument}
196-
</VSCodeOption>
197-
))}
189+
{showInputCell && (
190+
<>
191+
<option value="Argument[this]">Argument[this]</option>
192+
{argumentsList.map((argument, index) => (
193+
<option key={argument} value={`Argument[${index}]`}>
194+
Argument[{index}]: {argument}
195+
</option>
196+
))}
197+
</>
198+
)}
198199
</Dropdown>
199200
</VSCodeDataGridCell>
200201
<VSCodeDataGridCell gridColumn={4}>
201202
<Dropdown
202-
value={showOutputCell && modeledMethod?.output}
203+
value={showOutputCell ? modeledMethod?.output : undefined}
203204
disabled={!showOutputCell}
204-
onInput={handleOutputInput}
205+
onChange={handleOutputInput}
205206
>
206-
<VSCodeOption value="ReturnValue">ReturnValue</VSCodeOption>
207-
<VSCodeOption value="Argument[this]">Argument[this]</VSCodeOption>
208-
{argumentsList.map((argument, index) => (
209-
<VSCodeOption key={argument} value={`Argument[${index}]`}>
210-
Argument[{index}]: {argument}
211-
</VSCodeOption>
212-
))}
207+
{showOutputCell && (
208+
<>
209+
<option value="ReturnValue">ReturnValue</option>
210+
<option value="Argument[this]">Argument[this]</option>
211+
{argumentsList.map((argument, index) => (
212+
<option key={argument} value={`Argument[${index}]`}>
213+
Argument[{index}]: {argument}
214+
</option>
215+
))}
216+
</>
217+
)}
213218
</Dropdown>
214219
</VSCodeDataGridCell>
215220
<VSCodeDataGridCell gridColumn={5}>

0 commit comments

Comments
 (0)