Link from alerts indicator to model alerts view (#3520)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)}>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const ModelAlertsIndicator = ({
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!evaluationRun || !modeledMethod) {
|
if (!evaluationRun?.variantAnalysis || !modeledMethod) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user