Add title to model alerts view (#3465)

This commit is contained in:
Shati Patel
2024-03-14 11:46:36 +00:00
committed by GitHub
parent dd90e38b7a
commit 06f9f2c687
9 changed files with 79 additions and 7 deletions

View File

@@ -14,6 +14,7 @@ import type { Method } from "../model-editor/method";
import type { ModeledMethod } from "../model-editor/modeled-method"; import type { ModeledMethod } from "../model-editor/modeled-method";
import type { import type {
MethodModelingPanelViewState, MethodModelingPanelViewState,
ModelAlertsViewState,
ModelEditorViewState, ModelEditorViewState,
} from "../model-editor/shared/view-state"; } from "../model-editor/shared/view-state";
import type { Mode } from "../model-editor/shared/mode"; import type { Mode } from "../model-editor/shared/mode";
@@ -726,10 +727,11 @@ export type ToMethodModelingMessage =
| SetInProgressMessage | SetInProgressMessage
| SetProcessedByAutoModelMessage; | SetProcessedByAutoModelMessage;
interface SetModelAlertsMessage { interface SetModelAlertsViewStateMessage {
t: "setModelAlerts"; t: "setModelAlertsViewState";
viewState: ModelAlertsViewState;
} }
export type ToModelAlertsMessage = SetModelAlertsMessage; export type ToModelAlertsMessage = SetModelAlertsViewStateMessage;
export type FromModelAlertsMessage = CommonFromViewMessages; export type FromModelAlertsMessage = CommonFromViewMessages;

View File

@@ -14,6 +14,7 @@ import { showAndLogExceptionWithTelemetry } from "../../common/logging";
import type { ModelingEvents } from "../modeling-events"; import type { ModelingEvents } from "../modeling-events";
import type { ModelingStore } from "../modeling-store"; import type { ModelingStore } from "../modeling-store";
import type { DatabaseItem } from "../../databases/local-databases"; import type { DatabaseItem } from "../../databases/local-databases";
import type { ExtensionPack } from "../shared/extension-pack";
export class ModelAlertsView extends AbstractWebview< export class ModelAlertsView extends AbstractWebview<
ToModelAlertsMessage, ToModelAlertsMessage,
@@ -26,6 +27,7 @@ export class ModelAlertsView extends AbstractWebview<
private readonly modelingEvents: ModelingEvents, private readonly modelingEvents: ModelingEvents,
private readonly modelingStore: ModelingStore, private readonly modelingStore: ModelingStore,
private readonly dbItem: DatabaseItem, private readonly dbItem: DatabaseItem,
private readonly extensionPack: ExtensionPack,
) { ) {
super(app); super(app);
@@ -37,6 +39,7 @@ export class ModelAlertsView extends AbstractWebview<
panel.reveal(undefined, true); panel.reveal(undefined, true);
await this.waitForPanelLoaded(); await this.waitForPanelLoaded();
await this.setViewState();
} }
protected async getPanelConfig(): Promise<WebviewPanelConfig> { protected async getPanelConfig(): Promise<WebviewPanelConfig> {
@@ -75,6 +78,15 @@ export class ModelAlertsView extends AbstractWebview<
} }
} }
private async setViewState(): Promise<void> {
await this.postMessage({
t: "setModelAlertsViewState",
viewState: {
title: this.extensionPack.name,
},
});
}
public async focusView(): Promise<void> { public async focusView(): Promise<void> {
this.panel?.reveal(); this.panel?.reveal();
} }

View File

@@ -132,6 +132,7 @@ export class ModelEditorView extends AbstractWebview<
this.variantAnalysisManager, this.variantAnalysisManager,
databaseItem, databaseItem,
language, language,
this.extensionPack,
this.updateModelEvaluationRun.bind(this), this.updateModelEvaluationRun.bind(this),
); );
this.push(this.modelEvaluator); this.push(this.modelEvaluator);

View File

@@ -19,6 +19,7 @@ import { CancellationTokenSource } from "vscode";
import type { QlPackDetails } from "../variant-analysis/ql-pack-details"; import type { QlPackDetails } from "../variant-analysis/ql-pack-details";
import type { App } from "../common/app"; import type { App } from "../common/app";
import { ModelAlertsView } from "./model-alerts/model-alerts-view"; import { ModelAlertsView } from "./model-alerts/model-alerts-view";
import type { ExtensionPack } from "./shared/extension-pack";
export class ModelEvaluator extends DisposableObject { export class ModelEvaluator extends DisposableObject {
// Cancellation token source to allow cancelling of the current run // Cancellation token source to allow cancelling of the current run
@@ -34,6 +35,7 @@ export class ModelEvaluator extends DisposableObject {
private readonly variantAnalysisManager: VariantAnalysisManager, private readonly variantAnalysisManager: VariantAnalysisManager,
private readonly dbItem: DatabaseItem, private readonly dbItem: DatabaseItem,
private readonly language: QueryLanguage, private readonly language: QueryLanguage,
private readonly extensionPack: ExtensionPack,
private readonly updateView: ( private readonly updateView: (
run: ModelEvaluationRunState, run: ModelEvaluationRunState,
) => Promise<void>, ) => Promise<void>,
@@ -120,6 +122,7 @@ export class ModelEvaluator extends DisposableObject {
this.modelingEvents, this.modelingEvents,
this.modelingStore, this.modelingStore,
this.dbItem, this.dbItem,
this.extensionPack,
); );
await view.showView(); await view.showView();
} }

View File

@@ -19,3 +19,7 @@ export interface MethodModelingPanelViewState {
language: QueryLanguage | undefined; language: QueryLanguage | undefined;
modelConfig: ModelConfig; modelConfig: ModelConfig;
} }
export interface ModelAlertsViewState {
title: string;
}

View File

@@ -0,0 +1,17 @@
import type { Meta, StoryFn } from "@storybook/react";
import { ModelAlerts as ModelAlertsComponent } from "../../view/model-alerts/ModelAlerts";
export default {
title: "CodeQL Model Alerts/CodeQL Model Alerts",
component: ModelAlertsComponent,
} as Meta<typeof ModelAlertsComponent>;
const Template: StoryFn<typeof ModelAlertsComponent> = (args) => (
<ModelAlertsComponent {...args} />
);
export const ModelAlerts = Template.bind({});
ModelAlerts.args = {
initialViewState: { title: "codeql/sql2o-models" },
};

View File

@@ -1,10 +1,27 @@
import { useEffect } from "react"; import { useEffect, useState } from "react";
import { ModelAlertsHeader } from "./ModelAlertsHeader";
import type { ModelAlertsViewState } from "../../model-editor/shared/view-state";
import type { ToModelAlertsMessage } from "../../common/interface-types";
type Props = {
initialViewState?: ModelAlertsViewState;
};
export function ModelAlerts({ initialViewState }: Props): React.JSX.Element {
const [viewState, setViewState] = useState<ModelAlertsViewState | undefined>(
initialViewState,
);
export function ModelAlerts(): React.JSX.Element {
useEffect(() => { useEffect(() => {
const listener = (evt: MessageEvent) => { const listener = (evt: MessageEvent) => {
if (evt.origin === window.origin) { if (evt.origin === window.origin) {
// TODO: handle messages const msg: ToModelAlertsMessage = evt.data;
switch (msg.t) {
case "setModelAlertsViewState": {
setViewState(msg.viewState);
break;
}
}
} else { } else {
// sanitize origin // sanitize origin
const origin = evt.origin.replace(/\n|\r/g, ""); const origin = evt.origin.replace(/\n|\r/g, "");
@@ -18,5 +35,9 @@ export function ModelAlerts(): React.JSX.Element {
}; };
}, []); }, []);
return <>hello world</>; if (viewState === undefined) {
return <></>;
}
return <ModelAlertsHeader viewState={viewState}></ModelAlertsHeader>;
} }

View File

@@ -0,0 +1,8 @@
import type { ModelAlertsViewState } from "../../model-editor/shared/view-state";
import { ViewTitle } from "../common";
type Props = { viewState: ModelAlertsViewState };
export const ModelAlertsHeader = ({ viewState }: Props) => {
return <ViewTitle>Model evaluation results for {viewState.title}</ViewTitle>;
};

View File

@@ -7,6 +7,7 @@ import type { ModelEvaluationRun } from "../../../../src/model-editor/model-eval
import { ModelEvaluator } from "../../../../src/model-editor/model-evaluator"; import { ModelEvaluator } from "../../../../src/model-editor/model-evaluator";
import type { ModelingEvents } from "../../../../src/model-editor/modeling-events"; import type { ModelingEvents } from "../../../../src/model-editor/modeling-events";
import type { ModelingStore } from "../../../../src/model-editor/modeling-store"; import type { ModelingStore } from "../../../../src/model-editor/modeling-store";
import type { ExtensionPack } from "../../../../src/model-editor/shared/extension-pack";
import type { VariantAnalysisManager } from "../../../../src/variant-analysis/variant-analysis-manager"; import type { VariantAnalysisManager } from "../../../../src/variant-analysis/variant-analysis-manager";
import { createMockLogger } from "../../../__mocks__/loggerMock"; import { createMockLogger } from "../../../__mocks__/loggerMock";
import { createMockModelingEvents } from "../../../__mocks__/model-editor/modelingEventsMock"; import { createMockModelingEvents } from "../../../__mocks__/model-editor/modelingEventsMock";
@@ -23,6 +24,7 @@ describe("Model Evaluator", () => {
let variantAnalysisManager: VariantAnalysisManager; let variantAnalysisManager: VariantAnalysisManager;
let dbItem: DatabaseItem; let dbItem: DatabaseItem;
let language: QueryLanguage; let language: QueryLanguage;
let extensionPack: ExtensionPack;
let updateView: jest.Mock; let updateView: jest.Mock;
let getModelEvaluationRunMock = jest.fn(); let getModelEvaluationRunMock = jest.fn();
@@ -40,6 +42,7 @@ describe("Model Evaluator", () => {
}); });
dbItem = mockedObject<DatabaseItem>({}); dbItem = mockedObject<DatabaseItem>({});
language = QueryLanguage.Java; language = QueryLanguage.Java;
extensionPack = mockedObject<ExtensionPack>({});
updateView = jest.fn(); updateView = jest.fn();
modelEvaluator = new ModelEvaluator( modelEvaluator = new ModelEvaluator(
@@ -50,6 +53,7 @@ describe("Model Evaluator", () => {
variantAnalysisManager, variantAnalysisManager,
dbItem, dbItem,
language, language,
extensionPack,
updateView, updateView,
); );
}); });