From 73921685bcccaa536e8e89ef0025e97dd02d207f Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:48:13 +0000 Subject: [PATCH 1/8] Add ability to highlight/select method rows --- .../ql-vscode/src/view/common/DataGrid.tsx | 28 ++++++++++++++++--- .../src/view/model-editor/LibraryRow.tsx | 6 ++++ .../src/view/model-editor/MethodRow.tsx | 8 ++++++ .../src/view/model-editor/ModelEditor.tsx | 19 +++++++++++++ .../model-editor/ModeledMethodDataGrid.tsx | 6 ++++ .../view/model-editor/ModeledMethodsList.tsx | 6 ++++ 6 files changed, 69 insertions(+), 4 deletions(-) diff --git a/extensions/ql-vscode/src/view/common/DataGrid.tsx b/extensions/ql-vscode/src/view/common/DataGrid.tsx index ee790a6aeb4..f69b21010cc 100644 --- a/extensions/ql-vscode/src/view/common/DataGrid.tsx +++ b/extensions/ql-vscode/src/view/common/DataGrid.tsx @@ -37,7 +37,10 @@ export function DataGrid({ gridTemplateColumns, children }: DataGridProps) { ); } -const StyledDataGridRow = styled.div<{ $focused?: boolean }>` +const StyledDataGridRow = styled.div<{ + $focused?: boolean; + $selected?: boolean; +}>` display: contents; &:hover > * { @@ -47,15 +50,20 @@ const StyledDataGridRow = styled.div<{ $focused?: boolean }>` & > * { // Use !important to override the background color set by the hover state background-color: ${(props) => + // TODO: Use different colors for selected and focused props.$focused ? "var(--vscode-editor-selectionBackground) !important" - : "inherit"}; + : props.$selected + ? "var(--vscode-editor-selectionBackground) !important" + : "inherit"}; } `; interface DataGridRowProps { focused?: boolean; + selected?: boolean; children: ReactNode; + onClick?: () => void; "data-testid"?: string; } @@ -69,10 +77,22 @@ interface DataGridRowProps { */ export const DataGridRow = forwardRef( ( - { focused, children, "data-testid": testId }: DataGridRowProps, + { + focused, + selected, + children, + "data-testid": testId, + onClick, + }: DataGridRowProps, ref?: React.Ref, ) => ( - + {children} ), diff --git a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx index 5f5c95faa7d..abaf07e6d86 100644 --- a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx @@ -71,11 +71,13 @@ export type LibraryRowProps = { methods: Method[]; modeledMethodsMap: Record; modifiedSignatures: Set; + selectedSignatures: Set; inProgressMethods: Set; viewState: ModelEditorViewState; hideModeledMethods: boolean; revealedMethodSignature: string | null; onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; + onMethodClick: (methodSignature: string) => void; onSaveModelClick: (methodSignatures: string[]) => void; onGenerateFromLlmClick: ( dependencyName: string, @@ -92,11 +94,13 @@ export const LibraryRow = ({ methods, modeledMethodsMap, modifiedSignatures, + selectedSignatures, inProgressMethods, viewState, hideModeledMethods, revealedMethodSignature, onChange, + onMethodClick, onSaveModelClick, onGenerateFromLlmClick, onStopGenerateFromLlmClick, @@ -228,11 +232,13 @@ export const LibraryRow = ({ methods={methods} modeledMethodsMap={modeledMethodsMap} modifiedSignatures={modifiedSignatures} + selectedSignatures={selectedSignatures} inProgressMethods={inProgressMethods} viewState={viewState} hideModeledMethods={hideModeledMethods} revealedMethodSignature={revealedMethodSignature} onChange={onChange} + onMethodClick={onMethodClick} /> diff --git a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx index 7323cda5a2b..35b318bec0c 100644 --- a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx @@ -70,10 +70,12 @@ export type MethodRowProps = { methodCanBeModeled: boolean; modeledMethods: ModeledMethod[]; methodIsUnsaved: boolean; + methodIsSelected: boolean; modelingInProgress: boolean; viewState: ModelEditorViewState; revealedMethodSignature: string | null; onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; + onMethodClick: (methodSignature: string) => void; }; export const MethodRow = (props: MethodRowProps) => { @@ -103,9 +105,11 @@ const ModelableMethodRow = forwardRef( method, modeledMethods: modeledMethodsProp, methodIsUnsaved, + methodIsSelected, viewState, revealedMethodSignature, onChange, + onMethodClick, } = props; const [focusedIndex, setFocusedIndex] = useState(null); @@ -186,6 +190,10 @@ const ModelableMethodRow = forwardRef( { + onMethodClick(method.signature); + }} > >( + new Set(), + ); + const [inProgressMethods, setInProgressMethods] = useState>( new Set(), ); @@ -189,6 +193,19 @@ export function ModelEditor({ [], ); + const onMethodClick = useCallback( + (methodSignature: string) => { + const newSelectedSignatures = new Set(selectedSignatures); + if (selectedSignatures.has(methodSignature)) { + newSelectedSignatures.delete(methodSignature); + } else { + newSelectedSignatures.add(methodSignature); + } + setSelectedSignatures(newSelectedSignatures); + }, + [selectedSignatures], + ); + const onRefreshClick = useCallback(() => { vscode.postMessage({ t: "refreshMethods", @@ -339,11 +356,13 @@ export function ModelEditor({ methods={methods} modeledMethodsMap={modeledMethods} modifiedSignatures={modifiedSignatures} + selectedSignatures={selectedSignatures} inProgressMethods={inProgressMethods} viewState={viewState} hideModeledMethods={hideModeledMethods} revealedMethodSignature={revealedMethodSignature} onChange={onChange} + onMethodClick={onMethodClick} onSaveModelClick={onSaveModelClick} onGenerateFromLlmClick={onGenerateFromLlmClick} onStopGenerateFromLlmClick={onStopGenerateFromLlmClick} diff --git a/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx b/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx index c50b2912702..b3e521a4b72 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx @@ -16,22 +16,26 @@ export type ModeledMethodDataGridProps = { methods: Method[]; modeledMethodsMap: Record; modifiedSignatures: Set; + selectedSignatures: Set; inProgressMethods: Set; viewState: ModelEditorViewState; hideModeledMethods: boolean; revealedMethodSignature: string | null; onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; + onMethodClick: (methodSignature: string) => void; }; export const ModeledMethodDataGrid = ({ methods, modeledMethodsMap, modifiedSignatures, + selectedSignatures, inProgressMethods, viewState, hideModeledMethods, revealedMethodSignature, onChange, + onMethodClick, }: ModeledMethodDataGridProps) => { const [methodsWithModelability, numHiddenMethods]: [ Array<{ method: Method; methodCanBeModeled: boolean }>, @@ -80,10 +84,12 @@ export const ModeledMethodDataGrid = ({ methodCanBeModeled={methodCanBeModeled} modeledMethods={modeledMethods} methodIsUnsaved={modifiedSignatures.has(method.signature)} + methodIsSelected={selectedSignatures.has(method.signature)} modelingInProgress={inProgressMethods.has(method.signature)} viewState={viewState} revealedMethodSignature={revealedMethodSignature} onChange={onChange} + onMethodClick={onMethodClick} /> ); })} diff --git a/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx b/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx index 40f54512180..2a1388fc717 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx @@ -13,11 +13,13 @@ export type ModeledMethodsListProps = { methods: Method[]; modeledMethodsMap: Record; modifiedSignatures: Set; + selectedSignatures: Set; inProgressMethods: Set; revealedMethodSignature: string | null; viewState: ModelEditorViewState; hideModeledMethods: boolean; onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; + onMethodClick: (methodSignature: string) => void; onSaveModelClick: (methodSignatures: string[]) => void; onGenerateFromLlmClick: ( packageName: string, @@ -36,11 +38,13 @@ export const ModeledMethodsList = ({ methods, modeledMethodsMap, modifiedSignatures, + selectedSignatures, inProgressMethods, viewState, hideModeledMethods, revealedMethodSignature, onChange, + onMethodClick, onSaveModelClick, onGenerateFromLlmClick, onStopGenerateFromLlmClick, @@ -82,11 +86,13 @@ export const ModeledMethodsList = ({ methods={grouped[libraryName]} modeledMethodsMap={modeledMethodsMap} modifiedSignatures={modifiedSignatures} + selectedSignatures={selectedSignatures} inProgressMethods={inProgressMethods} viewState={viewState} hideModeledMethods={hideModeledMethods} revealedMethodSignature={revealedMethodSignature} onChange={onChange} + onMethodClick={onMethodClick} onSaveModelClick={onSaveModelClick} onGenerateFromLlmClick={onGenerateFromLlmClick} onStopGenerateFromLlmClick={onStopGenerateFromLlmClick} From 3199b5b01edbe804e832399866b12985556c7639 Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Wed, 13 Dec 2023 17:06:49 +0000 Subject: [PATCH 2/8] Make "Save" button respect selected rows --- .../src/view/model-editor/LibraryRow.tsx | 2 +- .../src/view/model-editor/ModelEditor.tsx | 28 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx index abaf07e6d86..38f27590c22 100644 --- a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx @@ -243,7 +243,7 @@ export const LibraryRow = ({ - Save + {selectedSignatures.size === 0 ? "Save" : "Save selected"} diff --git a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx index ef8caa8e6d5..f55cbef61e8 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx @@ -215,15 +215,27 @@ export function ModelEditor({ const onSaveAllClick = useCallback(() => { vscode.postMessage({ t: "saveModeledMethods", + methodSignatures: + selectedSignatures.size === 0 + ? undefined + : Array.from(selectedSignatures), }); - }, []); + }, [selectedSignatures]); - const onSaveModelClick = useCallback((methodSignatures: string[]) => { - vscode.postMessage({ - t: "saveModeledMethods", - methodSignatures, - }); - }, []); + const onSaveModelClick = useCallback( + (methodSignatures: string[]) => { + vscode.postMessage({ + t: "saveModeledMethods", + methodSignatures: + selectedSignatures.size === 0 + ? methodSignatures + : methodSignatures.filter((signature) => + selectedSignatures.has(signature), + ), + }); + }, + [selectedSignatures], + ); const onGenerateFromSourceClick = useCallback(() => { vscode.postMessage({ @@ -326,7 +338,7 @@ export function ModelEditor({ onClick={onSaveAllClick} disabled={modifiedSignatures.size === 0} > - Save all + {selectedSignatures.size === 0 ? "Save all" : "Save selected"} Refresh From b94722c59d9990aa50c083b247e4e299f4b22f3d Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Wed, 13 Dec 2023 17:13:41 +0000 Subject: [PATCH 3/8] Fix tests Just gets the tests to compile, haven't tested the new behaviour yet --- .../src/view/model-editor/__tests__/LibraryRow.spec.tsx | 3 +++ .../src/view/model-editor/__tests__/MethodRow.spec.tsx | 3 +++ .../view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx | 3 +++ .../view/model-editor/__tests__/ModeledMethodsList.spec.tsx | 3 +++ 4 files changed, 12 insertions(+) diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx index 1f16cd1b947..4b0bf01e308 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx @@ -8,6 +8,7 @@ import { createMockModelEditorViewState } from "../../../../test/factories/model describe(LibraryRow.name, () => { const method = createMethod(); const onChange = jest.fn(); + const onMethodClick = jest.fn(); const onSaveModelClick = jest.fn(); const onGenerateFromLlmClick = jest.fn(); const onStopGenerateFromLlmClick = jest.fn(); @@ -33,11 +34,13 @@ describe(LibraryRow.name, () => { ], }} modifiedSignatures={new Set([method.signature])} + selectedSignatures={new Set()} inProgressMethods={new Set()} viewState={viewState} hideModeledMethods={false} revealedMethodSignature={null} onChange={onChange} + onMethodClick={onMethodClick} onSaveModelClick={onSaveModelClick} onGenerateFromLlmClick={onGenerateFromLlmClick} onStopGenerateFromLlmClick={onStopGenerateFromLlmClick} diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/MethodRow.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/MethodRow.spec.tsx index fd2cd07df17..6782cade7ee 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/MethodRow.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/MethodRow.spec.tsx @@ -30,6 +30,7 @@ describe(MethodRow.name, () => { provenance: "manual", }; const onChange = jest.fn(); + const onMethodClick = jest.fn(); const viewState = createMockModelEditorViewState(); @@ -40,10 +41,12 @@ describe(MethodRow.name, () => { methodCanBeModeled={true} modeledMethods={[modeledMethod]} methodIsUnsaved={false} + methodIsSelected={false} modelingInProgress={false} revealedMethodSignature={null} viewState={viewState} onChange={onChange} + onMethodClick={onMethodClick} {...props} />, ); diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx index 44b44679d1b..c4176bf26cb 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx @@ -36,6 +36,7 @@ describe(ModeledMethodDataGrid.name, () => { supported: true, }); const onChange = jest.fn(); + const onMethodClick = jest.fn(); const viewState = createMockModelEditorViewState(); @@ -55,11 +56,13 @@ describe(ModeledMethodDataGrid.name, () => { ], }} modifiedSignatures={new Set([method1.signature])} + selectedSignatures={new Set()} inProgressMethods={new Set()} viewState={viewState} hideModeledMethods={false} revealedMethodSignature={null} onChange={onChange} + onMethodClick={onMethodClick} {...props} />, ); diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx index 92296b52c98..6717f2faf91 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx @@ -33,6 +33,7 @@ describe(ModeledMethodsList.name, () => { methodParameters: "(String)", }); const onChange = jest.fn(); + const onMethodClick = jest.fn(); const onSaveModelClick = jest.fn(); const onGenerateFromLlmClick = jest.fn(); const onStopGenerateFromLlmClick = jest.fn(); @@ -56,11 +57,13 @@ describe(ModeledMethodsList.name, () => { ], }} modifiedSignatures={new Set([method1.signature])} + selectedSignatures={new Set()} inProgressMethods={new Set()} viewState={viewState} hideModeledMethods={false} revealedMethodSignature={null} onChange={onChange} + onMethodClick={onMethodClick} onSaveModelClick={onSaveModelClick} onGenerateFromLlmClick={onGenerateFromLlmClick} onStopGenerateFromLlmClick={onStopGenerateFromLlmClick} From d5ebce236c90a7a4a79291c53249b10925ba33b2 Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:05:14 +0000 Subject: [PATCH 4/8] Use different styling for focused and selected rows --- extensions/ql-vscode/src/view/common/DataGrid.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/ql-vscode/src/view/common/DataGrid.tsx b/extensions/ql-vscode/src/view/common/DataGrid.tsx index f69b21010cc..a8bce90b0a3 100644 --- a/extensions/ql-vscode/src/view/common/DataGrid.tsx +++ b/extensions/ql-vscode/src/view/common/DataGrid.tsx @@ -50,9 +50,8 @@ const StyledDataGridRow = styled.div<{ & > * { // Use !important to override the background color set by the hover state background-color: ${(props) => - // TODO: Use different colors for selected and focused props.$focused - ? "var(--vscode-editor-selectionBackground) !important" + ? "var(--vscode-editor-findMatchHighlightBackground) !important" : props.$selected ? "var(--vscode-editor-selectionBackground) !important" : "inherit"}; From 051686a40eecaa9556b48f0ff7aacc07a41b8bab Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Tue, 19 Dec 2023 12:26:33 +0000 Subject: [PATCH 5/8] Add model editor test for save all/selected button --- .../__tests__/ModelEditor.spec.tsx | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 extensions/ql-vscode/src/view/model-editor/__tests__/ModelEditor.spec.tsx diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/ModelEditor.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/ModelEditor.spec.tsx new file mode 100644 index 00000000000..42d3bba43b7 --- /dev/null +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/ModelEditor.spec.tsx @@ -0,0 +1,69 @@ +import { act, render as reactRender, screen } from "@testing-library/react"; +import { createMethod } from "../../../../test/factories/model-editor/method-factories"; +import { ModelEditor } from "../ModelEditor"; +import { createMockModelEditorViewState } from "../../../../test/factories/model-editor/view-state"; +import { userEvent } from "@testing-library/user-event"; + +describe(ModelEditor.name, () => { + const method1 = createMethod({ + library: "sql2o", + libraryVersion: "1.6.0", + signature: "org.sql2o.Connection#createQuery(String)", + packageName: "org.sql2o", + typeName: "Connection", + methodName: "createQuery", + methodParameters: "(String)", + supported: false, + }); + const method2 = createMethod({ + library: "sql2o", + libraryVersion: "1.6.0", + signature: "org.sql2o.Query#executeScalar(Class)", + packageName: "org.sql2o", + typeName: "Query", + methodName: "executeScalar", + methodParameters: "(Class)", + supported: false, + }); + const method3 = createMethod({ + library: "sql2o", + libraryVersion: "1.6.0", + signature: "org.sql2o.Sql2o#open()", + packageName: "org.sql2o", + typeName: "Sql2o", + methodName: "open", + methodParameters: "()", + supported: true, + }); + + const viewState = createMockModelEditorViewState(); + + const render = () => + reactRender( + , + ); + + it("renders Save button when no rows are selected", () => { + render(); + + expect(screen.getByText("Save all")).toBeInTheDocument(); + }); + + it("renders Save button when rows are selected", async () => { + render(); + + await act(async () => { + await userEvent.click(screen.getAllByLabelText("Expand")[0]); + }); + + await act(async () => { + await userEvent.click(screen.getAllByTestId("modelable-method-row")[0]); + }); + + // The top-level Save button and the per-library Save button should have been updated. + expect(screen.getAllByText("Save selected")).toHaveLength(2); + }); +}); From c8d31278a383edc63cedec4115243197668370c6 Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Mon, 8 Jan 2024 10:59:54 +0000 Subject: [PATCH 6/8] Don't select row when clicking a button or dropdown --- .../ql-vscode/src/view/common/Dropdown.tsx | 4 +++ .../src/view/model-editor/MethodRow.tsx | 26 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/extensions/ql-vscode/src/view/common/Dropdown.tsx b/extensions/ql-vscode/src/view/common/Dropdown.tsx index 17c4e9048da..ffd7e3582ca 100644 --- a/extensions/ql-vscode/src/view/common/Dropdown.tsx +++ b/extensions/ql-vscode/src/view/common/Dropdown.tsx @@ -25,6 +25,9 @@ type Props = { "aria-label"?: string; }; +const stopClickPropagation = (e: React.MouseEvent) => { + e.stopPropagation(); +}; /** * A dropdown implementation styled to look like `VSCodeDropdown`. * @@ -50,6 +53,7 @@ export function Dropdown({ value={disabled ? disabledValue : value} disabled={disabled} onChange={onChange} + onClick={stopClickPropagation} className={className} {...props} > diff --git a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx index 35b318bec0c..890041560d4 100644 --- a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx @@ -204,11 +204,23 @@ const ModelableMethodRow = forwardRef( {viewState.mode === Mode.Application && ( - + { + event.stopPropagation(); + jumpToMethod(); + }} + > {method.usages.length} )} - View + { + event.stopPropagation(); + jumpToMethod(); + }} + > + View + {props.modelingInProgress && } @@ -277,7 +289,10 @@ const ModelableMethodRow = forwardRef( { + event.stopPropagation(); + handleAddModelClick(); + }} disabled={addModelButtonDisabled} > @@ -286,7 +301,10 @@ const ModelableMethodRow = forwardRef( { + event.stopPropagation(); + removeModelClickedHandlers[index](); + }} > From cab57a26978f0ed6f1b50cecc3587d872ac0c3f5 Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Mon, 8 Jan 2024 11:00:49 +0000 Subject: [PATCH 7/8] Add button to deselect all rows --- .../ql-vscode/src/view/model-editor/ModelEditor.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx index f55cbef61e8..b59f5e9ccfa 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx @@ -222,6 +222,10 @@ export function ModelEditor({ }); }, [selectedSignatures]); + const onDeselectAllClick = useCallback(() => { + setSelectedSignatures(new Set()); + }, []); + const onSaveModelClick = useCallback( (methodSignatures: string[]) => { vscode.postMessage({ @@ -340,6 +344,13 @@ export function ModelEditor({ > {selectedSignatures.size === 0 ? "Save all" : "Save selected"} + + Deselect all + Refresh From 3f06c6689df780410440ba789901b948af9b2bfa Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:39:58 +0000 Subject: [PATCH 8/8] Update changelog Co-authored-by: Robert --- extensions/ql-vscode/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/ql-vscode/CHANGELOG.md b/extensions/ql-vscode/CHANGELOG.md index 1ce3a9f6d63..6d5b4ae249c 100644 --- a/extensions/ql-vscode/CHANGELOG.md +++ b/extensions/ql-vscode/CHANGELOG.md @@ -2,6 +2,7 @@ ## [UNRELEASED] +- In the CodeQL model editor, you can now select individual method rows and save changes to only the selected rows, instead of having to save the entire library model. [#3156](https://github.com/github/vscode-codeql/pull/3156) - If you run a query without having selected a database, we show a more intuitive prompt to help you select a database. [#3214](https://github.com/github/vscode-codeql/pull/3214) - The UI for browsing and running CodeQL tests has moved to use VS Code's built-in test UI. This makes the CodeQL test UI more consistent with the test UIs for other languages. This change means that this extension no longer depends on the "Test Explorer UI" and "Test Adapter Converter" extensions. You can uninstall those two extensions if they are