Skip to content

Commit 6036758

Browse files
committed
Add ability to highlight/select method rows
1 parent b833591 commit 6036758

6 files changed

Lines changed: 69 additions & 4 deletions

File tree

extensions/ql-vscode/src/view/common/DataGrid.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ export function DataGrid({ gridTemplateColumns, children }: DataGridProps) {
3737
);
3838
}
3939

40-
const StyledDataGridRow = styled.div<{ $focused?: boolean }>`
40+
const StyledDataGridRow = styled.div<{
41+
$focused?: boolean;
42+
$selected?: boolean;
43+
}>`
4144
display: contents;
4245
4346
&:hover > * {
@@ -47,15 +50,20 @@ const StyledDataGridRow = styled.div<{ $focused?: boolean }>`
4750
& > * {
4851
// Use !important to override the background color set by the hover state
4952
background-color: ${(props) =>
53+
// TODO: Use different colors for selected and focused
5054
props.$focused
5155
? "var(--vscode-editor-selectionBackground) !important"
52-
: "inherit"};
56+
: props.$selected
57+
? "var(--vscode-editor-selectionBackground) !important"
58+
: "inherit"};
5359
}
5460
`;
5561

5662
interface DataGridRowProps {
5763
focused?: boolean;
64+
selected?: boolean;
5865
children: ReactNode;
66+
onClick?: () => void;
5967
"data-testid"?: string;
6068
}
6169

@@ -69,10 +77,22 @@ interface DataGridRowProps {
6977
*/
7078
export const DataGridRow = forwardRef(
7179
(
72-
{ focused, children, "data-testid": testId }: DataGridRowProps,
80+
{
81+
focused,
82+
selected,
83+
children,
84+
"data-testid": testId,
85+
onClick,
86+
}: DataGridRowProps,
7387
ref?: React.Ref<HTMLElement | undefined>,
7488
) => (
75-
<StyledDataGridRow $focused={focused} ref={ref} data-testid={testId}>
89+
<StyledDataGridRow
90+
$focused={focused}
91+
$selected={selected}
92+
ref={ref}
93+
data-testid={testId}
94+
onClick={onClick}
95+
>
7696
{children}
7797
</StyledDataGridRow>
7898
),

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,13 @@ export type LibraryRowProps = {
7272
methods: Method[];
7373
modeledMethodsMap: Record<string, ModeledMethod[]>;
7474
modifiedSignatures: Set<string>;
75+
selectedSignatures: Set<string>;
7576
inProgressMethods: Set<string>;
7677
viewState: ModelEditorViewState;
7778
hideModeledMethods: boolean;
7879
revealedMethodSignature: string | null;
7980
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
81+
onMethodClick: (methodSignature: string) => void;
8082
onSaveModelClick: (methodSignatures: string[]) => void;
8183
onGenerateFromLlmClick: (
8284
dependencyName: string,
@@ -93,11 +95,13 @@ export const LibraryRow = ({
9395
methods,
9496
modeledMethodsMap,
9597
modifiedSignatures,
98+
selectedSignatures,
9699
inProgressMethods,
97100
viewState,
98101
hideModeledMethods,
99102
revealedMethodSignature,
100103
onChange,
104+
onMethodClick,
101105
onSaveModelClick,
102106
onGenerateFromLlmClick,
103107
onStopGenerateFromLlmClick,
@@ -229,11 +233,13 @@ export const LibraryRow = ({
229233
methods={methods}
230234
modeledMethodsMap={modeledMethodsMap}
231235
modifiedSignatures={modifiedSignatures}
236+
selectedSignatures={selectedSignatures}
232237
inProgressMethods={inProgressMethods}
233238
viewState={viewState}
234239
hideModeledMethods={hideModeledMethods}
235240
revealedMethodSignature={revealedMethodSignature}
236241
onChange={onChange}
242+
onMethodClick={onMethodClick}
237243
/>
238244
<SectionDivider />
239245
<ButtonsContainer>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,12 @@ export type MethodRowProps = {
7171
methodCanBeModeled: boolean;
7272
modeledMethods: ModeledMethod[];
7373
methodIsUnsaved: boolean;
74+
methodIsSelected: boolean;
7475
modelingInProgress: boolean;
7576
viewState: ModelEditorViewState;
7677
revealedMethodSignature: string | null;
7778
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
79+
onMethodClick: (methodSignature: string) => void;
7880
};
7981

8082
export const MethodRow = (props: MethodRowProps) => {
@@ -104,9 +106,11 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
104106
method,
105107
modeledMethods: modeledMethodsProp,
106108
methodIsUnsaved,
109+
methodIsSelected,
107110
viewState,
108111
revealedMethodSignature,
109112
onChange,
113+
onMethodClick,
110114
} = props;
111115

112116
const [focusedIndex, setFocusedIndex] = useState<number | null>(null);
@@ -187,6 +191,10 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
187191
<DataGridRow
188192
data-testid="modelable-method-row"
189193
focused={revealedMethodSignature === method.signature}
194+
selected={methodIsSelected}
195+
onClick={() => {
196+
onMethodClick(method.signature);
197+
}}
190198
>
191199
<DataGridCell
192200
gridRow={`span ${modeledMethods.length + validationErrors.length}`}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ export function ModelEditor({
9696
new Set(),
9797
);
9898

99+
const [selectedSignatures, setSelectedSignatures] = useState<Set<string>>(
100+
new Set(),
101+
);
102+
99103
const [inProgressMethods, setInProgressMethods] = useState<Set<string>>(
100104
new Set(),
101105
);
@@ -190,6 +194,19 @@ export function ModelEditor({
190194
[],
191195
);
192196

197+
const onMethodClick = useCallback(
198+
(methodSignature: string) => {
199+
const newSelectedSignatures = new Set(selectedSignatures);
200+
if (selectedSignatures.has(methodSignature)) {
201+
newSelectedSignatures.delete(methodSignature);
202+
} else {
203+
newSelectedSignatures.add(methodSignature);
204+
}
205+
setSelectedSignatures(newSelectedSignatures);
206+
},
207+
[selectedSignatures],
208+
);
209+
193210
const onRefreshClick = useCallback(() => {
194211
vscode.postMessage({
195212
t: "refreshMethods",
@@ -340,11 +357,13 @@ export function ModelEditor({
340357
methods={methods}
341358
modeledMethodsMap={modeledMethods}
342359
modifiedSignatures={modifiedSignatures}
360+
selectedSignatures={selectedSignatures}
343361
inProgressMethods={inProgressMethods}
344362
viewState={viewState}
345363
hideModeledMethods={hideModeledMethods}
346364
revealedMethodSignature={revealedMethodSignature}
347365
onChange={onChange}
366+
onMethodClick={onMethodClick}
348367
onSaveModelClick={onSaveModelClick}
349368
onGenerateFromLlmClick={onGenerateFromLlmClick}
350369
onStopGenerateFromLlmClick={onStopGenerateFromLlmClick}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,26 @@ export type ModeledMethodDataGridProps = {
1616
methods: Method[];
1717
modeledMethodsMap: Record<string, ModeledMethod[]>;
1818
modifiedSignatures: Set<string>;
19+
selectedSignatures: Set<string>;
1920
inProgressMethods: Set<string>;
2021
viewState: ModelEditorViewState;
2122
hideModeledMethods: boolean;
2223
revealedMethodSignature: string | null;
2324
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
25+
onMethodClick: (methodSignature: string) => void;
2426
};
2527

2628
export const ModeledMethodDataGrid = ({
2729
methods,
2830
modeledMethodsMap,
2931
modifiedSignatures,
32+
selectedSignatures,
3033
inProgressMethods,
3134
viewState,
3235
hideModeledMethods,
3336
revealedMethodSignature,
3437
onChange,
38+
onMethodClick,
3539
}: ModeledMethodDataGridProps) => {
3640
const [methodsWithModelability, numHiddenMethods]: [
3741
Array<{ method: Method; methodCanBeModeled: boolean }>,
@@ -80,10 +84,12 @@ export const ModeledMethodDataGrid = ({
8084
methodCanBeModeled={methodCanBeModeled}
8185
modeledMethods={modeledMethods}
8286
methodIsUnsaved={modifiedSignatures.has(method.signature)}
87+
methodIsSelected={selectedSignatures.has(method.signature)}
8388
modelingInProgress={inProgressMethods.has(method.signature)}
8489
viewState={viewState}
8590
revealedMethodSignature={revealedMethodSignature}
8691
onChange={onChange}
92+
onMethodClick={onMethodClick}
8793
/>
8894
);
8995
})}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ export type ModeledMethodsListProps = {
1414
methods: Method[];
1515
modeledMethodsMap: Record<string, ModeledMethod[]>;
1616
modifiedSignatures: Set<string>;
17+
selectedSignatures: Set<string>;
1718
inProgressMethods: Set<string>;
1819
revealedMethodSignature: string | null;
1920
viewState: ModelEditorViewState;
2021
hideModeledMethods: boolean;
2122
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
23+
onMethodClick: (methodSignature: string) => void;
2224
onSaveModelClick: (methodSignatures: string[]) => void;
2325
onGenerateFromLlmClick: (
2426
packageName: string,
@@ -37,11 +39,13 @@ export const ModeledMethodsList = ({
3739
methods,
3840
modeledMethodsMap,
3941
modifiedSignatures,
42+
selectedSignatures,
4043
inProgressMethods,
4144
viewState,
4245
hideModeledMethods,
4346
revealedMethodSignature,
4447
onChange,
48+
onMethodClick,
4549
onSaveModelClick,
4650
onGenerateFromLlmClick,
4751
onStopGenerateFromLlmClick,
@@ -83,11 +87,13 @@ export const ModeledMethodsList = ({
8387
methods={grouped[libraryName]}
8488
modeledMethodsMap={modeledMethodsMap}
8589
modifiedSignatures={modifiedSignatures}
90+
selectedSignatures={selectedSignatures}
8691
inProgressMethods={inProgressMethods}
8792
viewState={viewState}
8893
hideModeledMethods={hideModeledMethods}
8994
revealedMethodSignature={revealedMethodSignature}
9095
onChange={onChange}
96+
onMethodClick={onMethodClick}
9197
onSaveModelClick={onSaveModelClick}
9298
onGenerateFromLlmClick={onGenerateFromLlmClick}
9399
onStopGenerateFromLlmClick={onStopGenerateFromLlmClick}

0 commit comments

Comments
 (0)