Link from alerts indicator to model alerts view (#3520)

This commit is contained in:
Shati Patel
2024-03-28 10:31:29 +00:00
committed by GitHub
parent fcf74b337f
commit 45e20f405b
5 changed files with 63 additions and 4 deletions

View File

@@ -752,10 +752,16 @@ interface StopEvaluationRunMessage {
t: "stopEvaluationRun"; t: "stopEvaluationRun";
} }
interface RevealModelMessage {
t: "revealModel";
modeledMethod: ModeledMethod;
}
export type ToModelAlertsMessage = export type ToModelAlertsMessage =
| SetModelAlertsViewStateMessage | SetModelAlertsViewStateMessage
| SetVariantAnalysisMessage | SetVariantAnalysisMessage
| SetRepoResultsMessage; | SetRepoResultsMessage
| RevealModelMessage;
export type FromModelAlertsMessage = export type FromModelAlertsMessage =
| CommonFromViewMessages | CommonFromViewMessages

View File

@@ -20,6 +20,7 @@ import type {
VariantAnalysisScannedRepositoryResult, VariantAnalysisScannedRepositoryResult,
} from "../../variant-analysis/shared/variant-analysis"; } from "../../variant-analysis/shared/variant-analysis";
import type { AppEvent, AppEventEmitter } from "../../common/events"; import type { AppEvent, AppEventEmitter } from "../../common/events";
import type { ModeledMethod } from "../modeled-method";
import type { MethodSignature } from "../method"; import type { MethodSignature } from "../method";
export class ModelAlertsView extends AbstractWebview< export class ModelAlertsView extends AbstractWebview<
@@ -179,6 +180,14 @@ export class ModelAlertsView extends AbstractWebview<
} }
}), }),
); );
this.push(
this.modelingEvents.onRevealInModelAlertsView(async (event) => {
if (event.dbUri === this.dbItem.databaseUri.toString()) {
await this.revealMethod(event.modeledMethod);
}
}),
);
} }
private async stopEvaluationRun() { private async stopEvaluationRun() {
@@ -195,4 +204,15 @@ export class ModelAlertsView extends AbstractWebview<
method, method,
); );
} }
private async revealMethod(method: ModeledMethod): Promise<void> {
const panel = await this.getPanel();
panel?.reveal();
await this.postMessage({
t: "revealModel",
modeledMethod: method,
});
}
} }

View File

@@ -17,6 +17,7 @@ import {
filterAndSort, filterAndSort,
} from "../../model-editor/shared/model-alerts-filter-sort"; } from "../../model-editor/shared/model-alerts-filter-sort";
import type { ModelAlertsFilterSortState } from "../../model-editor/shared/model-alerts-filter-sort"; import type { ModelAlertsFilterSortState } from "../../model-editor/shared/model-alerts-filter-sort";
import type { ModeledMethod } from "../../model-editor/modeled-method";
type Props = { type Props = {
initialViewState?: ModelAlertsViewState; initialViewState?: ModelAlertsViewState;
@@ -62,6 +63,10 @@ export function ModelAlerts({
const [filterSortValue, setFilterSortValue] = const [filterSortValue, setFilterSortValue] =
useState<ModelAlertsFilterSortState>(defaultFilterSortState); useState<ModelAlertsFilterSortState>(defaultFilterSortState);
const [revealedModel, setRevealedModel] = useState<ModeledMethod | null>(
null,
);
useEffect(() => { useEffect(() => {
const listener = (evt: MessageEvent) => { const listener = (evt: MessageEvent) => {
if (evt.origin === window.origin) { if (evt.origin === window.origin) {
@@ -87,6 +92,10 @@ export function ModelAlerts({
}); });
break; break;
} }
case "revealModel": {
setRevealedModel(msg.modeledMethod);
break;
}
} }
} else { } else {
// sanitize origin // sanitize origin
@@ -146,7 +155,11 @@ export function ModelAlerts({
// but we don't have a unique identifier for models. In the future, // but we don't have a unique identifier for models. In the future,
// we may need to consider coming up with unique identifiers for models // we may need to consider coming up with unique identifiers for models
// and using those as keys. // and using those as keys.
<ModelAlertsResults key={i} modelAlerts={alerts} /> <ModelAlertsResults
key={i}
modelAlerts={alerts}
revealedModel={revealedModel}
/>
))} ))}
</div> </div>
</div> </div>

View File

@@ -1,13 +1,15 @@
import { styled } from "styled-components"; import { styled } from "styled-components";
import type { ModelAlerts } from "../../model-editor/model-alerts/model-alerts"; import type { ModelAlerts } from "../../model-editor/model-alerts/model-alerts";
import { Codicon } from "../common"; import { Codicon } from "../common";
import { useCallback, useState } from "react";
import { VSCodeBadge, VSCodeLink } from "@vscode/webview-ui-toolkit/react"; import { VSCodeBadge, VSCodeLink } from "@vscode/webview-ui-toolkit/react";
import { useCallback, useEffect, useRef, useState } from "react";
import { formatDecimal } from "../../common/number"; import { formatDecimal } from "../../common/number";
import AnalysisAlertResult from "../variant-analysis/AnalysisAlertResult"; import AnalysisAlertResult from "../variant-analysis/AnalysisAlertResult";
import { MethodName } from "../model-editor/MethodName"; import { MethodName } from "../model-editor/MethodName";
import { ModelDetails } from "./ModelDetails"; import { ModelDetails } from "./ModelDetails";
import { vscode } from "../vscode-api"; import { vscode } from "../vscode-api";
import { createModeledMethodKey } from "../../model-editor/modeled-method";
import type { ModeledMethod } from "../../model-editor/modeled-method";
// This will ensure that these icons have a className which we can use in the TitleContainer // This will ensure that these icons have a className which we can use in the TitleContainer
const ExpandCollapseCodicon = styled(Codicon)``; const ExpandCollapseCodicon = styled(Codicon)``;
@@ -59,10 +61,12 @@ const Alert = styled.li`
interface Props { interface Props {
modelAlerts: ModelAlerts; modelAlerts: ModelAlerts;
revealedModel: ModeledMethod | null;
} }
export const ModelAlertsResults = ({ export const ModelAlertsResults = ({
modelAlerts, modelAlerts,
revealedModel,
}: Props): React.JSX.Element => { }: Props): React.JSX.Element => {
const [isExpanded, setExpanded] = useState(true); const [isExpanded, setExpanded] = useState(true);
const viewInModelEditor = useCallback( const viewInModelEditor = useCallback(
@@ -73,6 +77,22 @@ export const ModelAlertsResults = ({
}), }),
[modelAlerts.model], [modelAlerts.model],
); );
const ref = useRef<HTMLElement>();
useEffect(() => {
if (
revealedModel &&
createModeledMethodKey(modelAlerts.model) ===
createModeledMethodKey(revealedModel)
) {
ref.current?.scrollIntoView({
behavior: "smooth",
block: "center",
});
}
}, [modelAlerts.model, revealedModel]);
return ( return (
<div> <div>
<TitleContainer onClick={() => setExpanded(!isExpanded)}> <TitleContainer onClick={() => setExpanded(!isExpanded)}>

View File

@@ -24,7 +24,7 @@ export const ModelAlertsIndicator = ({
return null; return null;
} }
if (!evaluationRun || !modeledMethod) { if (!evaluationRun?.variantAnalysis || !modeledMethod) {
return null; return null;
} }