Skip to content

Commit 8d5574e

Browse files
Merge pull request #2982 from github/robertbrignull/add-remove-models
Implement onClick for the add/remove model buttons in the model editor
2 parents fca68ed + 46e7dda commit 8d5574e

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,33 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
126126
[method, modeledMethods, onChange],
127127
);
128128

129+
const removeModelClickedHandlers = useMemo(
130+
() =>
131+
modeledMethods.map((_, index) => () => {
132+
const newModeledMethods = [...modeledMethods];
133+
newModeledMethods.splice(index, 1);
134+
onChange(method.signature, newModeledMethods);
135+
}),
136+
[method, modeledMethods, onChange],
137+
);
138+
139+
const handleAddModelClick = useCallback(() => {
140+
const newModeledMethod: ModeledMethod = {
141+
type: "none",
142+
input: "",
143+
output: "",
144+
kind: "",
145+
provenance: "manual",
146+
signature: method.signature,
147+
packageName: method.packageName,
148+
typeName: method.typeName,
149+
methodName: method.methodName,
150+
methodParameters: method.methodParameters,
151+
};
152+
const newModeledMethods = [...modeledMethods, newModeledMethod];
153+
onChange(method.signature, newModeledMethods);
154+
}, [method, modeledMethods, onChange]);
155+
129156
const jumpToMethod = useCallback(
130157
() => sendJumpToMethodMessage(method),
131158
[method],
@@ -228,6 +255,7 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
228255
key={index}
229256
appearance="icon"
230257
aria-label="Add new model"
258+
onClick={handleAddModelClick}
231259
disabled={addModelButtonDisabled}
232260
>
233261
<Codicon name="add" />
@@ -237,6 +265,7 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
237265
key={index}
238266
appearance="icon"
239267
aria-label="Remove model"
268+
onClick={removeModelClickedHandlers[index]}
240269
>
241270
<Codicon name="trash" />
242271
</CodiconRow>

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

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,84 @@ describe(MethodRow.name, () => {
358358
expect(removeButton?.getElementsByTagName("input")[0]).toBeEnabled();
359359
}
360360
});
361+
362+
it("can add a new model", async () => {
363+
render({
364+
modeledMethods: [modeledMethod],
365+
viewState: {
366+
...viewState,
367+
showMultipleModels: true,
368+
},
369+
});
370+
371+
onChange.mockReset();
372+
await userEvent.click(screen.getByLabelText("Add new model"));
373+
374+
expect(onChange).toHaveBeenCalledTimes(1);
375+
expect(onChange).toHaveBeenCalledWith(method.signature, [
376+
modeledMethod,
377+
{
378+
type: "none",
379+
input: "",
380+
output: "",
381+
kind: "",
382+
provenance: "manual",
383+
signature: method.signature,
384+
packageName: method.packageName,
385+
typeName: method.typeName,
386+
methodName: method.methodName,
387+
methodParameters: method.methodParameters,
388+
},
389+
]);
390+
});
391+
392+
it("can delete the first modeled method", async () => {
393+
render({
394+
modeledMethods: [
395+
{ ...modeledMethod, type: "source" },
396+
{ ...modeledMethod, type: "sink" },
397+
{ ...modeledMethod, type: "none" },
398+
{ ...modeledMethod, type: "summary" },
399+
],
400+
viewState: {
401+
...viewState,
402+
showMultipleModels: true,
403+
},
404+
});
405+
406+
onChange.mockReset();
407+
await userEvent.click(screen.getAllByLabelText("Remove model")[0]);
408+
409+
expect(onChange).toHaveBeenCalledTimes(1);
410+
expect(onChange).toHaveBeenCalledWith(method.signature, [
411+
{ ...modeledMethod, type: "sink" },
412+
{ ...modeledMethod, type: "none" },
413+
{ ...modeledMethod, type: "summary" },
414+
]);
415+
});
416+
417+
it("can delete a modeled method in the middle", async () => {
418+
render({
419+
modeledMethods: [
420+
{ ...modeledMethod, type: "source" },
421+
{ ...modeledMethod, type: "sink" },
422+
{ ...modeledMethod, type: "none" },
423+
{ ...modeledMethod, type: "summary" },
424+
],
425+
viewState: {
426+
...viewState,
427+
showMultipleModels: true,
428+
},
429+
});
430+
431+
onChange.mockReset();
432+
await userEvent.click(screen.getAllByLabelText("Remove model")[2]);
433+
434+
expect(onChange).toHaveBeenCalledTimes(1);
435+
expect(onChange).toHaveBeenCalledWith(method.signature, [
436+
{ ...modeledMethod, type: "source" },
437+
{ ...modeledMethod, type: "sink" },
438+
{ ...modeledMethod, type: "summary" },
439+
]);
440+
});
361441
});

0 commit comments

Comments
 (0)