Skip to content

Commit 76c70fb

Browse files
wire webview messaging test and document basic table view setup parts (#8)
1 parent 9123866 commit 76c70fb

File tree

3 files changed

+107
-9
lines changed

3 files changed

+107
-9
lines changed

src/utils/fileUtils.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
import { Uri, Webview } from 'vscode';
22

3+
/**
4+
* Gets webview Uri for a given file or resource.
5+
*
6+
* @remarks This Uri can be used within a webview's HTML as a link to the
7+
* given file or resource.
8+
*
9+
* @param webview Reference to the extension webview
10+
* @param extensionUri Extension directory Uri
11+
* @param pathList File or resource path parts
12+
* @returns Webview Uri for requested file or resource
13+
*/
314
export function getUri(webview: Webview, extensionUri: Uri, pathList: string[]): Uri {
415
return webview.asWebviewUri(Uri.joinPath(extensionUri, ...pathList));
516
}

src/views/tableView.ts

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,63 @@ import {
1212

1313
import { getUri } from '../utils/fileUtils';
1414

15+
/**
16+
* Defines Table view class for managing state and behaviour of Table webview panels.
17+
*/
1518
export class TableView {
1619
public static currentView: TableView | undefined;
1720
private readonly _webviewPanel: WebviewPanel;
1821
private _disposables: Disposable[] = [];
1922

23+
/**
24+
* Creates new TableView instance for the initial table data rendering.
25+
*
26+
* @param webviewPanel Reference to the webview panel
27+
* @param extensionUri Extension directory Uri
28+
*/
2029
private constructor(webviewPanel: WebviewPanel, extensionUri: Uri) {
2130
this._webviewPanel = webviewPanel;
31+
32+
// dispose table view resources when table view panel is closed by the user or via vscode apis
2233
this._webviewPanel.onDidDispose(this.dispose, null, this._disposables);
34+
35+
// set table view html content for the webview panel
2336
this._webviewPanel.webview.html = this.getWebviewContent(this._webviewPanel.webview, extensionUri);
37+
38+
// add webview messaging and commands handler
39+
this.addWebviewMessageListener(this._webviewPanel.webview);
2440
}
2541

42+
/**
43+
* Reveals current table view or creates new table webview panel for table data display.
44+
*
45+
* @param extensionUri Extension directory Uri
46+
*/
2647
public static render(extensionUri: Uri) {
2748
if (TableView.currentView) {
49+
// show current table webview panel
2850
TableView.currentView._webviewPanel.reveal(ViewColumn.Active);
2951
}
3052
else {
31-
const webviewPanel = window.createWebviewPanel('tableView', 'Table View', {
32-
viewColumn: ViewColumn.Active,
53+
const webviewPanel = window.createWebviewPanel(
54+
'tableView', // webview panel type
55+
'Table View', // webview panel title
56+
{
57+
viewColumn: ViewColumn.Active, // use active view column for display
3358
preserveFocus: true
34-
}, { // weview panel options
35-
enableScripts: true,
36-
enableCommandUris: true
59+
},
60+
{ // weview panel options
61+
enableScripts: true, // enable JavaScript in webview
62+
enableCommandUris: true // ???
3763
}
3864
);
3965
TableView.currentView = new TableView(webviewPanel, extensionUri);
4066
}
4167
}
4268

69+
/**
70+
* Disposes table view resources when webview panel is closed.
71+
*/
4372
public dispose() {
4473
TableView.currentView = undefined;
4574
this._webviewPanel.dispose();
@@ -51,22 +80,34 @@ export class TableView {
5180
}
5281
}
5382

54-
private getWebviewContent(webview: Webview, extensionUri: Uri) {
55-
const toolkitUri: Uri = getUri(webview, extensionUri, [
83+
/**
84+
* Creates webview html content for the webview panel display.
85+
*
86+
* @param webview Reference to the extensions webview
87+
* @param extensionUri Extension directory Uri
88+
* @returns Html string for the webview content
89+
*/
90+
private getWebviewContent(webview: Webview, extensionUri: Uri): string {
91+
const webviewUiToolkitUri: Uri = getUri(webview, extensionUri, [
5692
'node_modules',
5793
'@vscode',
5894
'webview-ui-toolkit',
5995
'dist',
6096
'toolkit.js',
6197
]);
6298

99+
const tableViewUri: Uri = getUri(webview, extensionUri, ['web', 'scripts', 'tableView.js']);
100+
101+
// Tip: Install the es6-string-html VS Code extension
102+
// to enable html code highlighting below
63103
return /*html*/ `
64104
<!DOCTYPE html>
65105
<html lang="en">
66106
<head>
67107
<meta charset="UTF-8">
68108
<meta name="viewport" content="width=device-width, initial-scale=1.0">
69-
<script type="module" src="${toolkitUri}"></script>
109+
<script type="module" src="${webviewUiToolkitUri}"></script>
110+
<script type="module" src="${tableViewUri}"></script>
70111
<title>Table View</title>
71112
</head>
72113
<body>
@@ -76,4 +117,25 @@ export class TableView {
76117
</html>
77118
`;
78119
}
79-
}
120+
121+
/**
122+
* Adds webivew messaging support and executes commands
123+
* based on the message command received.
124+
*
125+
* @param webview Reference to the extension webview
126+
*/
127+
private addWebviewMessageListener(webview: Webview) {
128+
webview.onDidReceiveMessage((message: any) => {
129+
const command: string = message.command;
130+
const text = message.text;
131+
switch (command) {
132+
case 'hello':
133+
window.showInformationMessage(text);
134+
break;
135+
}
136+
},
137+
undefined, // args
138+
this._disposables
139+
);
140+
}
141+
}

web/scripts/tableView.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// initialize vscode api
2+
const vscode = acquireVsCodeApi();
3+
4+
// add page load handler
5+
window.addEventListener('load', initializeView);
6+
7+
/**
8+
* Initializes table webview.
9+
*/
10+
function initializeView() {
11+
const testButton = document.getElementById('test-button');
12+
testButton.addEventListener('click', onTestClick);
13+
}
14+
15+
/**
16+
* Handles test button click.
17+
*
18+
* @see https://code.visualstudio.com/api/extension-guides/webview#passing-messages-from-an-extension-to-a-webview
19+
*/
20+
function onTestClick() {
21+
vscode.postMessage({
22+
command: 'hello',
23+
text: 'Hey there partner! 🤠'
24+
});
25+
}

0 commit comments

Comments
 (0)