Skip to content

Commit 478c095

Browse files
committed
Add empty data extension editor view
This adds an empty data extension editor view which is only available behind the `codeQL.dataExtensions.editor` and `codeQL.canary` settings.
1 parent 35cb113 commit 478c095

File tree

11 files changed

+110
-2
lines changed

11 files changed

+110
-2
lines changed

CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
**/* @github/codeql-vscode-reviewers
22
**/variant-analysis/ @github/code-scanning-secexp-reviewers
33
**/databases/ @github/code-scanning-secexp-reviewers
4+
**/data-extensions-editor/ @github/code-scanning-secexp-reviewers

extensions/ql-vscode/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,10 @@
703703
"title": "CodeQL: Go to QL Code",
704704
"enablement": "codeql.hasQLSource"
705705
},
706+
{
707+
"command": "codeQL.openDataExtensionsEditor",
708+
"title": "CodeQL: Open Data Extensions Editor"
709+
},
706710
{
707711
"command": "codeQL.mockGitHubApiServer.startRecording",
708712
"title": "CodeQL: Mock GitHub API Server: Start Scenario Recording"
@@ -1086,6 +1090,10 @@
10861090
"command": "codeQL.viewCfgContextEditor",
10871091
"when": "false"
10881092
},
1093+
{
1094+
"command": "codeQL.openDataExtensionsEditor",
1095+
"when": "config.codeQL.canary && config.codeQL.dataExtensions.editor"
1096+
},
10891097
{
10901098
"command": "codeQLVariantAnalysisRepositories.openConfigFile",
10911099
"when": "false"

extensions/ql-vscode/src/common/commands.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@ export type PackagingCommands = {
241241
"codeQL.downloadPacks": () => Promise<void>;
242242
};
243243

244+
export type DataExtensionsEditorCommands = {
245+
"codeQL.openDataExtensionsEditor": () => Promise<void>;
246+
};
247+
244248
export type EvalLogViewerCommands = {
245249
"codeQLEvalLogViewer.clear": () => Promise<void>;
246250
};
@@ -273,6 +277,7 @@ export type AllExtensionCommands = BaseCommands &
273277
AstCfgCommands &
274278
AstViewerCommands &
275279
PackagingCommands &
280+
DataExtensionsEditorCommands &
276281
EvalLogViewerCommands &
277282
SummaryLanguageSupportCommands &
278283
Partial<TestUICommands> &
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { ExtensionContext } from "vscode";
2+
import { DataExtensionsEditorView } from "./data-extensions-editor-view";
3+
import { DataExtensionsEditorCommands } from "../common/commands";
4+
5+
export class DataExtensionsEditorModule {
6+
public constructor(private readonly ctx: ExtensionContext) {}
7+
8+
public getCommands(): DataExtensionsEditorCommands {
9+
return {
10+
"codeQL.openDataExtensionsEditor": async () => {
11+
const view = new DataExtensionsEditorView(this.ctx);
12+
await view.openView();
13+
},
14+
};
15+
}
16+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { ExtensionContext, ViewColumn } from "vscode";
2+
import { AbstractWebview, WebviewPanelConfig } from "../abstract-webview";
3+
import {
4+
FromDataExtensionsEditorMessage,
5+
ToDataExtensionsEditorMessage,
6+
} from "../pure/interface-types";
7+
8+
export class DataExtensionsEditorView extends AbstractWebview<
9+
ToDataExtensionsEditorMessage,
10+
FromDataExtensionsEditorMessage
11+
> {
12+
public constructor(ctx: ExtensionContext) {
13+
super(ctx);
14+
}
15+
16+
public async openView() {
17+
const panel = await this.getPanel();
18+
panel.reveal(undefined, true);
19+
20+
await this.waitForPanelLoaded();
21+
}
22+
23+
protected async getPanelConfig(): Promise<WebviewPanelConfig> {
24+
return {
25+
viewId: "data-extensions-editor",
26+
title: "Data Extensions Editor",
27+
viewColumn: ViewColumn.Active,
28+
preserveFocus: true,
29+
view: "data-extensions-editor",
30+
};
31+
}
32+
33+
protected onPanelDispose(): void {
34+
// Nothing to do here
35+
}
36+
37+
protected async onMessage(
38+
msg: FromDataExtensionsEditorMessage,
39+
): Promise<void> {
40+
switch (msg.t) {
41+
case "viewLoaded":
42+
await this.onWebViewLoaded();
43+
44+
break;
45+
default:
46+
throw new Error("Unexpected message type");
47+
}
48+
}
49+
50+
protected async onWebViewLoaded() {
51+
super.onWebViewLoaded();
52+
}
53+
}

extensions/ql-vscode/src/extension.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ import { getAstCfgCommands } from "./ast-cfg-commands";
120120
import { getQueryEditorCommands } from "./query-editor";
121121
import { App } from "./common/app";
122122
import { registerCommandWithErrorHandling } from "./common/vscode/commands";
123+
import { DataExtensionsEditorModule } from "./data-extensions-editor/data-extensions-editor-module";
123124

124125
/**
125126
* extension.ts
@@ -860,6 +861,8 @@ async function activateWithInstalledDistribution(
860861
);
861862
ctx.subscriptions.push(localQueries);
862863

864+
const dataExtensionsEditorModule = new DataExtensionsEditorModule(ctx);
865+
863866
void extLogger.log("Initializing QLTest interface.");
864867
const testExplorerExtension = extensions.getExtension<TestHub>(
865868
testExplorerExtensionId,
@@ -922,6 +925,7 @@ async function activateWithInstalledDistribution(
922925
...getPackagingCommands({
923926
cliServer,
924927
}),
928+
...dataExtensionsEditorModule.getCommands(),
925929
...evalLogViewer.getCommands(),
926930
...summaryLanguageSupport.getCommands(),
927931
...testUiCommands,

extensions/ql-vscode/src/interface-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ export type WebviewView =
113113
| "results"
114114
| "compare"
115115
| "variant-analysis"
116-
| "data-flow-paths";
116+
| "data-flow-paths"
117+
| "data-extensions-editor";
117118

118119
export interface WebviewMessage {
119120
t: string;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,7 @@ export interface SetDataFlowPathsMessage {
478478
export type ToDataFlowPathsMessage = SetDataFlowPathsMessage;
479479

480480
export type FromDataFlowPathsMessage = CommonFromViewMessages;
481+
482+
export type ToDataExtensionsEditorMessage = never;
483+
484+
export type FromDataExtensionsEditorMessage = ViewLoadedMsg;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as React from "react";
2+
3+
export function DataExtensionsEditor(): JSX.Element {
4+
return <div>Data extensions editor</div>;
5+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as React from "react";
2+
import { WebviewDefinition } from "../webview-definition";
3+
import { DataExtensionsEditor } from "./DataExtensionsEditor";
4+
5+
const definition: WebviewDefinition = {
6+
component: <DataExtensionsEditor />,
7+
};
8+
9+
export default definition;

0 commit comments

Comments
 (0)