Skip to content

Commit 06f9f2c

Browse files
authored
Add title to model alerts view (#3465)
1 parent dd90e38 commit 06f9f2c

File tree

9 files changed

+79
-7
lines changed

9 files changed

+79
-7
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type { Method } from "../model-editor/method";
1414
import type { ModeledMethod } from "../model-editor/modeled-method";
1515
import type {
1616
MethodModelingPanelViewState,
17+
ModelAlertsViewState,
1718
ModelEditorViewState,
1819
} from "../model-editor/shared/view-state";
1920
import type { Mode } from "../model-editor/shared/mode";
@@ -726,10 +727,11 @@ export type ToMethodModelingMessage =
726727
| SetInProgressMessage
727728
| SetProcessedByAutoModelMessage;
728729

729-
interface SetModelAlertsMessage {
730-
t: "setModelAlerts";
730+
interface SetModelAlertsViewStateMessage {
731+
t: "setModelAlertsViewState";
732+
viewState: ModelAlertsViewState;
731733
}
732734

733-
export type ToModelAlertsMessage = SetModelAlertsMessage;
735+
export type ToModelAlertsMessage = SetModelAlertsViewStateMessage;
734736

735737
export type FromModelAlertsMessage = CommonFromViewMessages;

extensions/ql-vscode/src/model-editor/model-alerts/model-alerts-view.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { showAndLogExceptionWithTelemetry } from "../../common/logging";
1414
import type { ModelingEvents } from "../modeling-events";
1515
import type { ModelingStore } from "../modeling-store";
1616
import type { DatabaseItem } from "../../databases/local-databases";
17+
import type { ExtensionPack } from "../shared/extension-pack";
1718

1819
export class ModelAlertsView extends AbstractWebview<
1920
ToModelAlertsMessage,
@@ -26,6 +27,7 @@ export class ModelAlertsView extends AbstractWebview<
2627
private readonly modelingEvents: ModelingEvents,
2728
private readonly modelingStore: ModelingStore,
2829
private readonly dbItem: DatabaseItem,
30+
private readonly extensionPack: ExtensionPack,
2931
) {
3032
super(app);
3133

@@ -37,6 +39,7 @@ export class ModelAlertsView extends AbstractWebview<
3739
panel.reveal(undefined, true);
3840

3941
await this.waitForPanelLoaded();
42+
await this.setViewState();
4043
}
4144

4245
protected async getPanelConfig(): Promise<WebviewPanelConfig> {
@@ -75,6 +78,15 @@ export class ModelAlertsView extends AbstractWebview<
7578
}
7679
}
7780

81+
private async setViewState(): Promise<void> {
82+
await this.postMessage({
83+
t: "setModelAlertsViewState",
84+
viewState: {
85+
title: this.extensionPack.name,
86+
},
87+
});
88+
}
89+
7890
public async focusView(): Promise<void> {
7991
this.panel?.reveal();
8092
}

extensions/ql-vscode/src/model-editor/model-editor-view.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export class ModelEditorView extends AbstractWebview<
132132
this.variantAnalysisManager,
133133
databaseItem,
134134
language,
135+
this.extensionPack,
135136
this.updateModelEvaluationRun.bind(this),
136137
);
137138
this.push(this.modelEvaluator);

extensions/ql-vscode/src/model-editor/model-evaluator.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { CancellationTokenSource } from "vscode";
1919
import type { QlPackDetails } from "../variant-analysis/ql-pack-details";
2020
import type { App } from "../common/app";
2121
import { ModelAlertsView } from "./model-alerts/model-alerts-view";
22+
import type { ExtensionPack } from "./shared/extension-pack";
2223

2324
export class ModelEvaluator extends DisposableObject {
2425
// Cancellation token source to allow cancelling of the current run
@@ -34,6 +35,7 @@ export class ModelEvaluator extends DisposableObject {
3435
private readonly variantAnalysisManager: VariantAnalysisManager,
3536
private readonly dbItem: DatabaseItem,
3637
private readonly language: QueryLanguage,
38+
private readonly extensionPack: ExtensionPack,
3739
private readonly updateView: (
3840
run: ModelEvaluationRunState,
3941
) => Promise<void>,
@@ -120,6 +122,7 @@ export class ModelEvaluator extends DisposableObject {
120122
this.modelingEvents,
121123
this.modelingStore,
122124
this.dbItem,
125+
this.extensionPack,
123126
);
124127
await view.showView();
125128
}

extensions/ql-vscode/src/model-editor/shared/view-state.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ export interface MethodModelingPanelViewState {
1919
language: QueryLanguage | undefined;
2020
modelConfig: ModelConfig;
2121
}
22+
23+
export interface ModelAlertsViewState {
24+
title: string;
25+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { Meta, StoryFn } from "@storybook/react";
2+
3+
import { ModelAlerts as ModelAlertsComponent } from "../../view/model-alerts/ModelAlerts";
4+
5+
export default {
6+
title: "CodeQL Model Alerts/CodeQL Model Alerts",
7+
component: ModelAlertsComponent,
8+
} as Meta<typeof ModelAlertsComponent>;
9+
10+
const Template: StoryFn<typeof ModelAlertsComponent> = (args) => (
11+
<ModelAlertsComponent {...args} />
12+
);
13+
14+
export const ModelAlerts = Template.bind({});
15+
ModelAlerts.args = {
16+
initialViewState: { title: "codeql/sql2o-models" },
17+
};

extensions/ql-vscode/src/view/model-alerts/ModelAlerts.tsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,27 @@
1-
import { useEffect } from "react";
1+
import { useEffect, useState } from "react";
2+
import { ModelAlertsHeader } from "./ModelAlertsHeader";
3+
import type { ModelAlertsViewState } from "../../model-editor/shared/view-state";
4+
import type { ToModelAlertsMessage } from "../../common/interface-types";
5+
6+
type Props = {
7+
initialViewState?: ModelAlertsViewState;
8+
};
9+
10+
export function ModelAlerts({ initialViewState }: Props): React.JSX.Element {
11+
const [viewState, setViewState] = useState<ModelAlertsViewState | undefined>(
12+
initialViewState,
13+
);
214

3-
export function ModelAlerts(): React.JSX.Element {
415
useEffect(() => {
516
const listener = (evt: MessageEvent) => {
617
if (evt.origin === window.origin) {
7-
// TODO: handle messages
18+
const msg: ToModelAlertsMessage = evt.data;
19+
switch (msg.t) {
20+
case "setModelAlertsViewState": {
21+
setViewState(msg.viewState);
22+
break;
23+
}
24+
}
825
} else {
926
// sanitize origin
1027
const origin = evt.origin.replace(/\n|\r/g, "");
@@ -18,5 +35,9 @@ export function ModelAlerts(): React.JSX.Element {
1835
};
1936
}, []);
2037

21-
return <>hello world</>;
38+
if (viewState === undefined) {
39+
return <></>;
40+
}
41+
42+
return <ModelAlertsHeader viewState={viewState}></ModelAlertsHeader>;
2243
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { ModelAlertsViewState } from "../../model-editor/shared/view-state";
2+
import { ViewTitle } from "../common";
3+
4+
type Props = { viewState: ModelAlertsViewState };
5+
6+
export const ModelAlertsHeader = ({ viewState }: Props) => {
7+
return <ViewTitle>Model evaluation results for {viewState.title}</ViewTitle>;
8+
};

extensions/ql-vscode/test/vscode-tests/activated-extension/model-editor/model-evaluator.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { ModelEvaluationRun } from "../../../../src/model-editor/model-eval
77
import { ModelEvaluator } from "../../../../src/model-editor/model-evaluator";
88
import type { ModelingEvents } from "../../../../src/model-editor/modeling-events";
99
import type { ModelingStore } from "../../../../src/model-editor/modeling-store";
10+
import type { ExtensionPack } from "../../../../src/model-editor/shared/extension-pack";
1011
import type { VariantAnalysisManager } from "../../../../src/variant-analysis/variant-analysis-manager";
1112
import { createMockLogger } from "../../../__mocks__/loggerMock";
1213
import { createMockModelingEvents } from "../../../__mocks__/model-editor/modelingEventsMock";
@@ -23,6 +24,7 @@ describe("Model Evaluator", () => {
2324
let variantAnalysisManager: VariantAnalysisManager;
2425
let dbItem: DatabaseItem;
2526
let language: QueryLanguage;
27+
let extensionPack: ExtensionPack;
2628
let updateView: jest.Mock;
2729
let getModelEvaluationRunMock = jest.fn();
2830

@@ -40,6 +42,7 @@ describe("Model Evaluator", () => {
4042
});
4143
dbItem = mockedObject<DatabaseItem>({});
4244
language = QueryLanguage.Java;
45+
extensionPack = mockedObject<ExtensionPack>({});
4346
updateView = jest.fn();
4447

4548
modelEvaluator = new ModelEvaluator(
@@ -50,6 +53,7 @@ describe("Model Evaluator", () => {
5053
variantAnalysisManager,
5154
dbItem,
5255
language,
56+
extensionPack,
5357
updateView,
5458
);
5559
});

0 commit comments

Comments
 (0)