Skip to content

Commit 3628f4b

Browse files
authored
Merge pull request #2266 from github/koesie10/data-extension-editor-jump-to-usage
Add link to example usage in data extensions editor
2 parents 84fd198 + b3ce642 commit 3628f4b

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
ExtensionContext,
44
Uri,
55
ViewColumn,
6+
window,
67
workspace,
78
} from "vscode";
89
import { AbstractWebview, WebviewPanelConfig } from "../abstract-webview";
@@ -25,6 +26,8 @@ import {
2526
import { DatabaseItem } from "../local-databases";
2627
import { CodeQLCliServer } from "../cli";
2728
import { asError, assertNever, getErrorMessage } from "../pure/helpers-pure";
29+
import { ResolvableLocationValue } from "../pure/bqrs-cli-types";
30+
import { showResolvableLocation } from "../interface-utils";
2831
import { decodeBqrsToExternalApiUsages } from "./bqrs";
2932
import { redactableError } from "../pure/errors";
3033
import { createDataExtensionYaml, loadDataExtensionYaml } from "./yaml";
@@ -73,6 +76,10 @@ export class DataExtensionsEditorView extends AbstractWebview<
7376
case "viewLoaded":
7477
await this.onWebViewLoaded();
7578

79+
break;
80+
case "jumpToUsage":
81+
await this.jumpToUsage(msg.location);
82+
7683
break;
7784
case "saveModeledMethods":
7885
await this.saveModeledMethods(
@@ -96,6 +103,26 @@ export class DataExtensionsEditorView extends AbstractWebview<
96103
]);
97104
}
98105

106+
protected async jumpToUsage(
107+
location: ResolvableLocationValue,
108+
): Promise<void> {
109+
try {
110+
await showResolvableLocation(location, this.databaseItem);
111+
} catch (e) {
112+
if (e instanceof Error) {
113+
if (e.message.match(/File not found/)) {
114+
void window.showErrorMessage(
115+
"Original file of this result is not in the database's source archive.",
116+
);
117+
} else {
118+
void extLogger.log(`Unable to handleMsgFromView: ${e.message}`);
119+
}
120+
} else {
121+
void extLogger.log(`Unable to handleMsgFromView: ${e}`);
122+
}
123+
}
124+
}
125+
99126
protected async saveModeledMethods(
100127
externalApiUsages: ExternalApiUsage[],
101128
modeledMethods: Record<string, ModeledMethod>,

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,11 @@ export interface ShowProgressMessage {
493493
message: string;
494494
}
495495

496+
export interface JumpToUsageMessage {
497+
t: "jumpToUsage";
498+
location: ResolvableLocationValue;
499+
}
500+
496501
export interface SetExistingModeledMethods {
497502
t: "setExistingModeledMethods";
498503
existingModeledMethods: Record<string, ModeledMethod>;
@@ -511,4 +516,5 @@ export type ToDataExtensionsEditorMessage =
511516

512517
export type FromDataExtensionsEditorMessage =
513518
| ViewLoadedMsg
519+
| JumpToUsageMessage
514520
| SaveModeledMethods;

extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import * as React from "react";
99
import { useCallback, useMemo } from "react";
1010
import styled from "styled-components";
11+
import { vscode } from "../vscode-api";
1112

1213
import { ExternalApiUsage } from "../../data-extensions-editor/external-api-usage";
1314
import {
@@ -31,6 +32,13 @@ const SupportSpan = styled.span<SupportedUnsupportedSpanProps>`
3132
color: ${(props) => (props.supported ? "green" : "red")};
3233
`;
3334

35+
const UsagesButton = styled.button`
36+
color: var(--vscode-editor-foreground);
37+
background-color: transparent;
38+
border: none;
39+
cursor: pointer;
40+
`;
41+
3442
type Props = {
3543
externalApiUsage: ExternalApiUsage;
3644
modeledMethod: ModeledMethod | undefined;
@@ -115,6 +123,13 @@ export const MethodRow = ({
115123
[onChange, externalApiUsage, modeledMethod],
116124
);
117125

126+
const jumpToUsage = useCallback(() => {
127+
vscode.postMessage({
128+
t: "jumpToUsage",
129+
location: externalApiUsage.usages[0].url,
130+
});
131+
}, [externalApiUsage]);
132+
118133
return (
119134
<VSCodeDataGridRow>
120135
<VSCodeDataGridCell gridColumn={1}>
@@ -129,7 +144,9 @@ export const MethodRow = ({
129144
</SupportSpan>
130145
</VSCodeDataGridCell>
131146
<VSCodeDataGridCell gridColumn={3}>
132-
{externalApiUsage.usages.length}
147+
<UsagesButton onClick={jumpToUsage}>
148+
{externalApiUsage.usages.length}
149+
</UsagesButton>
133150
</VSCodeDataGridCell>
134151
<VSCodeDataGridCell gridColumn={4}>
135152
{(!externalApiUsage.supported ||

0 commit comments

Comments
 (0)