Skip to content

Commit 3c50571

Browse files
authored
Merge pull request #2957 from github/koesie10/modeled-methods-panel-multiple-save
Use `SetMultipleModeledMethodsMessage` in modeled methods panel
2 parents 8ecc31f + 095f5ae commit 3c50571

File tree

9 files changed

+50
-56
lines changed

9 files changed

+50
-56
lines changed

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -572,11 +572,6 @@ interface HideModeledMethodsMessage {
572572
hideModeledMethods: boolean;
573573
}
574574

575-
interface SetModeledMethodMessage {
576-
t: "setModeledMethod";
577-
method: ModeledMethod;
578-
}
579-
580575
interface SetMultipleModeledMethodsMessage {
581576
t: "setMultipleModeledMethods";
582577
methodSignature: string;
@@ -627,7 +622,7 @@ interface StartModelingMessage {
627622

628623
export type FromMethodModelingMessage =
629624
| CommonFromViewMessages
630-
| SetModeledMethodMessage
625+
| SetMultipleModeledMethodsMessage
631626
| RevealInEditorMessage
632627
| StartModelingMessage;
633628

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import { assertNever } from "../../common/helpers-pure";
1414
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
1515
import { ModelConfigListener } from "../../config";
1616
import { DatabaseItem } from "../../databases/local-databases";
17-
import { convertFromLegacyModeledMethod } from "../shared/modeled-methods-legacy";
1817

1918
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
2019
ToMethodModelingMessage,
@@ -108,19 +107,19 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
108107
);
109108
break;
110109

111-
case "setModeledMethod": {
110+
case "setMultipleModeledMethods": {
112111
if (!this.databaseItem) {
113112
return;
114113
}
115114

116115
this.modelingStore.updateModeledMethods(
117116
this.databaseItem,
118-
msg.method.signature,
119-
convertFromLegacyModeledMethod(msg.method),
117+
msg.methodSignature,
118+
msg.modeledMethods,
120119
);
121120
this.modelingStore.addModifiedMethod(
122121
this.databaseItem,
123-
msg.method.signature,
122+
msg.methodSignature,
124123
);
125124
break;
126125
}

extensions/ql-vscode/src/model-editor/shared/modeled-methods-legacy.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,5 @@
11
import { ModeledMethod } from "../modeled-method";
22

3-
/**
4-
* Converts a single ModeledMethod to a ModeledMethod[] for legacy usage. This function should always be used instead
5-
* of the trivial conversion to track usages of this conversion.
6-
*
7-
* This method should only be called inside a `onMessage` function (or its equivalent). If it's used anywhere else,
8-
* consider whether the boundary is correct: the boundary should as close as possible to the webview -> extension host
9-
* boundary.
10-
*
11-
* @param modeledMethod The single ModeledMethod
12-
*/
13-
export function convertFromLegacyModeledMethod(
14-
modeledMethod: ModeledMethod | undefined,
15-
): ModeledMethod[] {
16-
return modeledMethod ? [modeledMethod] : [];
17-
}
18-
193
/**
204
* Converts a ModeledMethod[] to a single ModeledMethod for legacy usage. This function should always be used instead
215
* of the trivial conversion to track usages of this conversion.

extensions/ql-vscode/src/stories/method-modeling/MultipleModeledMethodsPanel.stories.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const Template: StoryFn<typeof MultipleModeledMethodsPanelComponent> = (
2525
}, [args.modeledMethods]);
2626

2727
const handleChange = useCallback(
28-
(modeledMethods: ModeledMethod[]) => {
29-
args.onChange(modeledMethods);
28+
(methodSignature: string, modeledMethods: ModeledMethod[]) => {
29+
args.onChange(methodSignature, modeledMethods);
3030
setModeledMethods(modeledMethods);
3131
},
3232
[args],

extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export type MethodModelingProps = {
5353
method: Method;
5454
modeledMethods: ModeledMethod[];
5555
showMultipleModels?: boolean;
56-
onChange: (modeledMethod: ModeledMethod) => void;
56+
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
5757
};
5858

5959
export const MethodModeling = ({

extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,14 @@ export function MethodModelingView({ initialViewState }: Props): JSX.Element {
8686
return <MethodAlreadyModeled />;
8787
}
8888

89-
const onChange = (modeledMethod: ModeledMethod) => {
89+
const onChange = (
90+
methodSignature: string,
91+
modeledMethods: ModeledMethod[],
92+
) => {
9093
vscode.postMessage({
91-
t: "setModeledMethod",
92-
method: modeledMethod,
94+
t: "setMultipleModeledMethods",
95+
methodSignature,
96+
modeledMethods,
9397
});
9498
};
9599

extensions/ql-vscode/src/view/method-modeling/ModeledMethodsPanel.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export type ModeledMethodsPanelProps = {
1111
method: Method;
1212
modeledMethods: ModeledMethod[];
1313
showMultipleModels: boolean;
14-
onChange: (modeledMethod: ModeledMethod) => void;
14+
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
1515
};
1616

1717
const SingleMethodModelingInputs = styled(MethodModelingInputs)`
@@ -24,9 +24,9 @@ export const ModeledMethodsPanel = ({
2424
showMultipleModels,
2525
onChange,
2626
}: ModeledMethodsPanelProps) => {
27-
const handleMultipleChange = useCallback(
28-
(modeledMethods: ModeledMethod[]) => {
29-
onChange(modeledMethods[0]);
27+
const handleSingleChange = useCallback(
28+
(modeledMethod: ModeledMethod) => {
29+
onChange(modeledMethod.signature, [modeledMethod]);
3030
},
3131
[onChange],
3232
);
@@ -36,7 +36,7 @@ export const ModeledMethodsPanel = ({
3636
<SingleMethodModelingInputs
3737
method={method}
3838
modeledMethod={convertToLegacyModeledMethod(modeledMethods)}
39-
onChange={onChange}
39+
onChange={handleSingleChange}
4040
/>
4141
);
4242
}
@@ -45,7 +45,7 @@ export const ModeledMethodsPanel = ({
4545
<MultipleModeledMethodsPanel
4646
method={method}
4747
modeledMethods={modeledMethods}
48-
onChange={handleMultipleChange}
48+
onChange={onChange}
4949
/>
5050
);
5151
};

extensions/ql-vscode/src/view/method-modeling/MultipleModeledMethodsPanel.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ModeledMethodAlert } from "./ModeledMethodAlert";
1212
export type MultipleModeledMethodsPanelProps = {
1313
method: Method;
1414
modeledMethods: ModeledMethod[];
15-
onChange: (modeledMethods: ModeledMethod[]) => void;
15+
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
1616
};
1717

1818
const Container = styled.div`
@@ -82,7 +82,7 @@ export const MultipleModeledMethodsPanel = ({
8282

8383
const newModeledMethods = [...modeledMethods, newModeledMethod];
8484

85-
onChange(newModeledMethods);
85+
onChange(method.signature, newModeledMethods);
8686
setSelectedIndex(newModeledMethods.length - 1);
8787
}, [onChange, modeledMethods, method]);
8888

@@ -96,21 +96,21 @@ export const MultipleModeledMethodsPanel = ({
9696
? selectedIndex - 1
9797
: selectedIndex;
9898

99-
onChange(newModeledMethods);
99+
onChange(method.signature, newModeledMethods);
100100
setSelectedIndex(newSelectedIndex);
101-
}, [onChange, modeledMethods, selectedIndex]);
101+
}, [onChange, modeledMethods, selectedIndex, method]);
102102

103103
const handleChange = useCallback(
104104
(modeledMethod: ModeledMethod) => {
105105
if (modeledMethods.length > 0) {
106106
const newModeledMethods = [...modeledMethods];
107107
newModeledMethods[selectedIndex] = modeledMethod;
108-
onChange(newModeledMethods);
108+
onChange(method.signature, newModeledMethods);
109109
} else {
110-
onChange([modeledMethod]);
110+
onChange(method.signature, [modeledMethod]);
111111
}
112112
},
113-
[modeledMethods, selectedIndex, onChange],
113+
[modeledMethods, selectedIndex, onChange, method],
114114
);
115115

116116
return (

extensions/ql-vscode/src/view/method-modeling/__tests__/MultipleModeledMethodsPanel.spec.tsx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
1414
reactRender(<MultipleModeledMethodsPanel {...props} />);
1515

1616
const method = createMethod();
17-
const onChange = jest.fn<void, [ModeledMethod[]]>();
17+
const onChange = jest.fn<void, [string, ModeledMethod[]]>();
1818

1919
describe("with no modeled methods", () => {
2020
const modeledMethods: ModeledMethod[] = [];
@@ -138,7 +138,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
138138

139139
await userEvent.click(screen.getByLabelText("Add modeling"));
140140

141-
expect(onChange).toHaveBeenCalledWith([
141+
expect(onChange).toHaveBeenCalledWith(method.signature, [
142142
...modeledMethods,
143143
{
144144
signature: method.signature,
@@ -275,7 +275,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
275275

276276
await userEvent.selectOptions(modelTypeDropdown, "source");
277277

278-
expect(onChange).toHaveBeenCalledWith([
278+
expect(onChange).toHaveBeenCalledWith(method.signature, [
279279
{
280280
signature: method.signature,
281281
packageName: method.packageName,
@@ -307,7 +307,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
307307

308308
await userEvent.selectOptions(modelTypeDropdown, "sink");
309309

310-
expect(onChange).toHaveBeenCalledWith([
310+
expect(onChange).toHaveBeenCalledWith(method.signature, [
311311
...modeledMethods.slice(0, 1),
312312
{
313313
signature: method.signature,
@@ -333,7 +333,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
333333

334334
await userEvent.click(screen.getByLabelText("Delete modeling"));
335335

336-
expect(onChange).toHaveBeenCalledWith(modeledMethods.slice(1));
336+
expect(onChange).toHaveBeenCalledWith(
337+
method.signature,
338+
modeledMethods.slice(1),
339+
);
337340
});
338341

339342
it("can add modeling", async () => {
@@ -345,7 +348,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
345348

346349
await userEvent.click(screen.getByLabelText("Add modeling"));
347350

348-
expect(onChange).toHaveBeenCalledWith([
351+
expect(onChange).toHaveBeenCalledWith(method.signature, [
349352
...modeledMethods,
350353
{
351354
signature: method.signature,
@@ -557,7 +560,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
557560

558561
await userEvent.click(screen.getByLabelText("Delete modeling"));
559562

560-
expect(onChange).toHaveBeenCalledWith(modeledMethods.slice(1));
563+
expect(onChange).toHaveBeenCalledWith(
564+
method.signature,
565+
modeledMethods.slice(1),
566+
);
561567
});
562568

563569
it("can delete second modeling", async () => {
@@ -570,7 +576,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
570576
await userEvent.click(screen.getByLabelText("Next modeling"));
571577
await userEvent.click(screen.getByLabelText("Delete modeling"));
572578

573-
expect(onChange).toHaveBeenCalledWith(modeledMethods.slice(0, 1));
579+
expect(onChange).toHaveBeenCalledWith(
580+
method.signature,
581+
modeledMethods.slice(0, 1),
582+
);
574583
});
575584

576585
it("can add modeling after deleting second modeling", async () => {
@@ -583,7 +592,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
583592
await userEvent.click(screen.getByLabelText("Next modeling"));
584593
await userEvent.click(screen.getByLabelText("Delete modeling"));
585594

586-
expect(onChange).toHaveBeenCalledWith(modeledMethods.slice(0, 1));
595+
expect(onChange).toHaveBeenCalledWith(
596+
method.signature,
597+
modeledMethods.slice(0, 1),
598+
);
587599

588600
rerender(
589601
<MultipleModeledMethodsPanel
@@ -596,7 +608,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
596608
onChange.mockReset();
597609
await userEvent.click(screen.getByLabelText("Add modeling"));
598610

599-
expect(onChange).toHaveBeenCalledWith([
611+
expect(onChange).toHaveBeenCalledWith(method.signature, [
600612
...modeledMethods.slice(0, 1),
601613
{
602614
signature: method.signature,

0 commit comments

Comments
 (0)