Add title to model alerts view (#3465)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,3 +19,7 @@ export interface MethodModelingPanelViewState {
|
|||||||
language: QueryLanguage | undefined;
|
language: QueryLanguage | undefined;
|
||||||
modelConfig: ModelConfig;
|
modelConfig: ModelConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ModelAlertsViewState {
|
||||||
|
title: string;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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" },
|
||||||
|
};
|
||||||
@@ -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>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user