Skip to content

Commit 3bac7ca

Browse files
committed
Add ability to highlight/select method rows
1 parent d0e8112 commit 3bac7ca

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
@@ -36,7 +36,10 @@ export function DataGrid({ gridTemplateColumns, children }: DataGridProps) {
3636
);
3737
}
3838

39-
const StyledDataGridRow = styled.div<{ $focused?: boolean }>`
39+
const StyledDataGridRow = styled.div<{
40+
$focused?: boolean;
41+
$selected?: boolean;
42+
}>`
4043
display: contents;
4144
4245
&:hover > * {
@@ -46,15 +49,20 @@ const StyledDataGridRow = styled.div<{ $focused?: boolean }>`
4649
& > * {
4750
// Use !important to override the background color set by the hover state
4851
background-color: ${(props) =>
52+
// TODO: Use different colors for selected and focused
4953
props.$focused
5054
? "var(--vscode-editor-selectionBackground) !important"
51-
: "inherit"};
55+
: props.$selected
56+
? "var(--vscode-editor-selectionBackground) !important"
57+
: "inherit"};
5258
}
5359
`;
5460

5561
interface DataGridRowProps {
5662
focused?: boolean;
63+
selected?: boolean;
5764
children: ReactNode;
65+
onClick?: () => void;
5866
"data-testid"?: string;
5967
}
6068

@@ -68,10 +76,22 @@ interface DataGridRowProps {
6876
*/
6977
export const DataGridRow = forwardRef(
7078
(
71-
{ focused, children, "data-testid": testId }: DataGridRowProps,
79+
{
80+
focused,
81+
selected,
82+
children,
83+
"data-testid": testId,
84+
onClick,
85+
}: DataGridRowProps,
7286
ref?: React.Ref<HTMLElement | undefined>,
7387
) => (
74-
<StyledDataGridRow $focused={focused} ref={ref} data-testid={testId}>
88+
<StyledDataGridRow
89+
$focused={focused}
90+
$selected={selected}
91+
ref={ref}
92+
data-testid={testId}
93+
onClick={onClick}
94+
>
7595
{children}
7696
</StyledDataGridRow>
7797
),

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,13 @@ export type LibraryRowProps = {
7171
methods: Method[];
7272
modeledMethodsMap: Record<string, ModeledMethod[]>;
7373
modifiedSignatures: Set<string>;
74+
selectedSignatures: Set<string>;
7475
inProgressMethods: Set<string>;
7576
viewState: ModelEditorViewState;
7677
hideModeledMethods: boolean;
7778
revealedMethodSignature: string | null;
7879
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
80+
onMethodClick: (methodSignature: string) => void;
7981
onSaveModelClick: (methodSignatures: string[]) => void;
8082
onGenerateFromLlmClick: (
8183
dependencyName: string,
@@ -92,11 +94,13 @@ export const LibraryRow = ({
9294
methods,
9395
modeledMethodsMap,
9496
modifiedSignatures,
97+
selectedSignatures,
9598
inProgressMethods,
9699
viewState,
97100
hideModeledMethods,
98101
revealedMethodSignature,
99102
onChange,
103+
onMethodClick,
100104
onSaveModelClick,
101105
onGenerateFromLlmClick,
102106
onStopGenerateFromLlmClick,
@@ -228,11 +232,13 @@ export const LibraryRow = ({
228232
methods={methods}
229233
modeledMethodsMap={modeledMethodsMap}
230234
modifiedSignatures={modifiedSignatures}
235+
selectedSignatures={selectedSignatures}
231236
inProgressMethods={inProgressMethods}
232237
viewState={viewState}
233238
hideModeledMethods={hideModeledMethods}
234239
revealedMethodSignature={revealedMethodSignature}
235240
onChange={onChange}
241+
onMethodClick={onMethodClick}
236242
/>
237243
<SectionDivider />
238244
<ButtonsContainer>

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

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

7981
export const MethodRow = (props: MethodRowProps) => {
@@ -103,9 +105,11 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
103105
method,
104106
modeledMethods: modeledMethodsProp,
105107
methodIsUnsaved,
108+
methodIsSelected,
106109
viewState,
107110
revealedMethodSignature,
108111
onChange,
112+
onMethodClick,
109113
} = props;
110114

111115
const [focusedIndex, setFocusedIndex] = useState<number | null>(null);
@@ -186,6 +190,10 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
186190
<DataGridRow
187191
data-testid="modelable-method-row"
188192
focused={revealedMethodSignature === method.signature}
193+
selected={methodIsSelected}
194+
onClick={() => {
195+
onMethodClick(method.signature);
196+
}}
189197
>
190198
<DataGridCell
191199
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
@@ -95,6 +95,10 @@ export function ModelEditor({
9595
new Set(),
9696
);
9797

98+
const [selectedSignatures, setSelectedSignatures] = useState<Set<string>>(
99+
new Set(),
100+
);
101+
98102
const [inProgressMethods, setInProgressMethods] = useState<Set<string>>(
99103
new Set(),
100104
);
@@ -189,6 +193,19 @@ export function ModelEditor({
189193
[],
190194
);
191195

196+
const onMethodClick = useCallback(
197+
(methodSignature: string) => {
198+
const newSelectedSignatures = new Set(selectedSignatures);
199+
if (selectedSignatures.has(methodSignature)) {
200+
newSelectedSignatures.delete(methodSignature);
201+
} else {
202+
newSelectedSignatures.add(methodSignature);
203+
}
204+
setSelectedSignatures(newSelectedSignatures);
205+
},
206+
[selectedSignatures],
207+
);
208+
192209
const onRefreshClick = useCallback(() => {
193210
vscode.postMessage({
194211
t: "refreshMethods",
@@ -339,11 +356,13 @@ export function ModelEditor({
339356
methods={methods}
340357
modeledMethodsMap={modeledMethods}
341358
modifiedSignatures={modifiedSignatures}
359+
selectedSignatures={selectedSignatures}
342360
inProgressMethods={inProgressMethods}
343361
viewState={viewState}
344362
hideModeledMethods={hideModeledMethods}
345363
revealedMethodSignature={revealedMethodSignature}
346364
onChange={onChange}
365+
onMethodClick={onMethodClick}
347366
onSaveModelClick={onSaveModelClick}
348367
onGenerateFromLlmClick={onGenerateFromLlmClick}
349368
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
@@ -15,22 +15,26 @@ export type ModeledMethodDataGridProps = {
1515
methods: Method[];
1616
modeledMethodsMap: Record<string, ModeledMethod[]>;
1717
modifiedSignatures: Set<string>;
18+
selectedSignatures: Set<string>;
1819
inProgressMethods: Set<string>;
1920
viewState: ModelEditorViewState;
2021
hideModeledMethods: boolean;
2122
revealedMethodSignature: string | null;
2223
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
24+
onMethodClick: (methodSignature: string) => void;
2325
};
2426

2527
export const ModeledMethodDataGrid = ({
2628
methods,
2729
modeledMethodsMap,
2830
modifiedSignatures,
31+
selectedSignatures,
2932
inProgressMethods,
3033
viewState,
3134
hideModeledMethods,
3235
revealedMethodSignature,
3336
onChange,
37+
onMethodClick,
3438
}: ModeledMethodDataGridProps) => {
3539
const [methodsWithModelability, numHiddenMethods]: [
3640
Array<{ method: Method; methodCanBeModeled: boolean }>,
@@ -79,10 +83,12 @@ export const ModeledMethodDataGrid = ({
7983
methodCanBeModeled={methodCanBeModeled}
8084
modeledMethods={modeledMethods}
8185
methodIsUnsaved={modifiedSignatures.has(method.signature)}
86+
methodIsSelected={selectedSignatures.has(method.signature)}
8287
modelingInProgress={inProgressMethods.has(method.signature)}
8388
viewState={viewState}
8489
revealedMethodSignature={revealedMethodSignature}
8590
onChange={onChange}
91+
onMethodClick={onMethodClick}
8692
/>
8793
);
8894
})}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ export type ModeledMethodsListProps = {
1313
methods: Method[];
1414
modeledMethodsMap: Record<string, ModeledMethod[]>;
1515
modifiedSignatures: Set<string>;
16+
selectedSignatures: Set<string>;
1617
inProgressMethods: Set<string>;
1718
revealedMethodSignature: string | null;
1819
viewState: ModelEditorViewState;
1920
hideModeledMethods: boolean;
2021
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
22+
onMethodClick: (methodSignature: string) => void;
2123
onSaveModelClick: (methodSignatures: string[]) => void;
2224
onGenerateFromLlmClick: (
2325
packageName: string,
@@ -36,11 +38,13 @@ export const ModeledMethodsList = ({
3638
methods,
3739
modeledMethodsMap,
3840
modifiedSignatures,
41+
selectedSignatures,
3942
inProgressMethods,
4043
viewState,
4144
hideModeledMethods,
4245
revealedMethodSignature,
4346
onChange,
47+
onMethodClick,
4448
onSaveModelClick,
4549
onGenerateFromLlmClick,
4650
onStopGenerateFromLlmClick,
@@ -82,11 +86,13 @@ export const ModeledMethodsList = ({
8286
methods={grouped[libraryName]}
8387
modeledMethodsMap={modeledMethodsMap}
8488
modifiedSignatures={modifiedSignatures}
89+
selectedSignatures={selectedSignatures}
8590
inProgressMethods={inProgressMethods}
8691
viewState={viewState}
8792
hideModeledMethods={hideModeledMethods}
8893
revealedMethodSignature={revealedMethodSignature}
8994
onChange={onChange}
95+
onMethodClick={onMethodClick}
9096
onSaveModelClick={onSaveModelClick}
9197
onGenerateFromLlmClick={onGenerateFromLlmClick}
9298
onStopGenerateFromLlmClick={onStopGenerateFromLlmClick}

0 commit comments

Comments
 (0)