Skip to content

Commit 3f614c4

Browse files
add perspectiveEditor.ts implementation and rework data view enums (#65)
1 parent a6f00ed commit 3f614c4

8 files changed

+154
-67
lines changed

src/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { statusBar } from './views/statusBar';
88

99
import { TableEditor } from './views/tableEditor';
1010
import { TableViewSerializer } from './views/tableViewSerializer';
11+
import { PerspectiveEditor } from './views/perspectiveEditor';
1112

1213
/**
1314
* Activates this extension per rules set in package.json.
@@ -29,8 +30,9 @@ export function activate(context: ExtensionContext) {
2930
// register table view serializer for restore on vscode reload
3031
context.subscriptions.push(TableViewSerializer.register(context));
3132

32-
// register custom table editor
33+
// register custom tabular data editors
3334
context.subscriptions.push(TableEditor.register(context));
35+
context.subscriptions.push(PerspectiveEditor.register(context));
3436

3537
window.onDidChangeActiveTextEditor((textEditor: TextEditor | undefined) => {
3638
// hide tabular data stats display on active editor change

src/views/dataViewTypes.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
/* eslint-disable @typescript-eslint/naming-convention */
2+
13
/**
24
* Defines tabular data view types for pluggable tabular.data.view config options.
35
*/
46
export const enum DataViewTypes {
5-
tabulatorTable = 'Tabulator',
6-
perspectiveViewer = 'Perspective'
7+
TabulatorTable = 'Tabulator',
8+
PerspectiveViewer = 'Perspective'
79
}

src/views/fileTypes.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
/* eslint-disable @typescript-eslint/naming-convention */
2+
13
/**
24
* Supported tabular data file types.
35
*/
46
export enum FileTypes {
5-
csv = '.csv',
6-
tsv = '.tsv',
7-
tab = '.tab'
7+
Csv = '.csv',
8+
Tsv = '.tsv',
9+
Tab = '.tab'
810
}

src/views/perspectiveEditor.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import {
2+
window,
3+
CancellationToken,
4+
CustomTextEditorProvider,
5+
Disposable,
6+
ExtensionContext,
7+
TextDocument,
8+
WebviewPanel
9+
} from 'vscode';
10+
11+
import { TableView } from './tableView';
12+
import { ViewTypes } from './viewTypes';
13+
import { DataViewTypes } from './dataViewTypes';
14+
15+
/**
16+
* Defines custom tabular data text editor provider for Perspective viewer.
17+
*
18+
* @see https://github.com/finos/perspective
19+
* @see https://code.visualstudio.com/api/references/vscode-api#CustomTextEditorProvider
20+
*/
21+
export class PerspectiveEditor implements CustomTextEditorProvider {
22+
23+
/**
24+
* Registers custom Table editor.
25+
*
26+
* @see https://code.visualstudio.com/api/references/vscode-api#window.registerCustomEditorProvider
27+
*
28+
* @param context Extension context.
29+
* @returns Disposable object for this editor.
30+
*/
31+
public static register(context: ExtensionContext): Disposable {
32+
return window.registerCustomEditorProvider(
33+
ViewTypes.PerspectiveEditor, new PerspectiveEditor(context), {
34+
webviewOptions: {
35+
enableFindWidget: true,
36+
retainContextWhenHidden: true
37+
}
38+
});
39+
}
40+
41+
/**
42+
* Creates new Perspective editor instance.
43+
*
44+
* @param context Extension context.
45+
*/
46+
constructor(private readonly context: ExtensionContext) {
47+
}
48+
49+
/**
50+
* Resolves a custom text eidtor for a given tabular data text document source,
51+
* and creates new TableView for that table data display.
52+
*
53+
* @param document Text document for the tabular data source to resolve.
54+
* @param webviewPanel Webview panel used to display the editor UI for this resource.
55+
* @param token A cancellation token that indicates the result is no longer needed.
56+
*/
57+
public async resolveCustomTextEditor(
58+
document: TextDocument,
59+
webviewPanel: WebviewPanel,
60+
token: CancellationToken
61+
): Promise<void> {
62+
// create new table view for the given tabular text data document and render it
63+
TableView.render(this.context.extensionUri, document.uri, webviewPanel, {
64+
view: DataViewTypes.PerspectiveViewer.toLowerCase()
65+
});
66+
}
67+
}

src/views/tableEditor.ts

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import {
2-
window,
3-
CancellationToken,
4-
CustomTextEditorProvider,
5-
Disposable,
6-
ExtensionContext,
7-
TextDocument,
8-
WebviewPanel
2+
window,
3+
CancellationToken,
4+
CustomTextEditorProvider,
5+
Disposable,
6+
ExtensionContext,
7+
TextDocument,
8+
WebviewPanel
99
} from 'vscode';
1010

1111
import { TableView } from './tableView';
@@ -18,46 +18,46 @@ import { ViewTypes } from './viewTypes';
1818
*/
1919
export class TableEditor implements CustomTextEditorProvider {
2020

21-
/**
22-
* Registers custom Table editor.
23-
*
24-
* @see https://code.visualstudio.com/api/references/vscode-api#window.registerCustomEditorProvider
25-
*
26-
* @param context Extension context.
27-
* @returns Disposable object for this editor.
28-
*/
29-
public static register(context: ExtensionContext): Disposable {
30-
return window.registerCustomEditorProvider(
31-
ViewTypes.tableEditor, new TableEditor(context), {
32-
webviewOptions: {
33-
enableFindWidget: true,
34-
retainContextWhenHidden: true
35-
}
36-
});
37-
}
21+
/**
22+
* Registers custom Table editor.
23+
*
24+
* @see https://code.visualstudio.com/api/references/vscode-api#window.registerCustomEditorProvider
25+
*
26+
* @param context Extension context.
27+
* @returns Disposable object for this editor.
28+
*/
29+
public static register(context: ExtensionContext): Disposable {
30+
return window.registerCustomEditorProvider(
31+
ViewTypes.TableEditor, new TableEditor(context), {
32+
webviewOptions: {
33+
enableFindWidget: true,
34+
retainContextWhenHidden: true
35+
}
36+
});
37+
}
3838

39-
/**
40-
* Creates new Table editor instance.
41-
*
42-
* @param context Extension context.
43-
*/
44-
constructor(private readonly context: ExtensionContext) {
45-
}
39+
/**
40+
* Creates new Table editor instance.
41+
*
42+
* @param context Extension context.
43+
*/
44+
constructor(private readonly context: ExtensionContext) {
45+
}
4646

47-
/**
48-
* Resolves a custom text eidtor for a given tabular data text document source,
49-
* and creates new TableView for that table data display.
50-
*
51-
* @param document Text document for the tabular data source to resolve.
52-
* @param webviewPanel Webview panel used to display the editor UI for this resource.
53-
* @param token A cancellation token that indicates the result is no longer needed.
54-
*/
55-
public async resolveCustomTextEditor(
56-
document: TextDocument,
57-
webviewPanel: WebviewPanel,
58-
token: CancellationToken
59-
): Promise<void> {
60-
// create new table view for the given tabular text data document and render it
61-
TableView.render(this.context.extensionUri, document.uri, webviewPanel);
62-
}
47+
/**
48+
* Resolves a custom text eidtor for a given tabular data text document source,
49+
* and creates new TableView for that table data display.
50+
*
51+
* @param document Text document for the tabular data source to resolve.
52+
* @param webviewPanel Webview panel used to display the editor UI for this resource.
53+
* @param token A cancellation token that indicates the result is no longer needed.
54+
*/
55+
public async resolveCustomTextEditor(
56+
document: TextDocument,
57+
webviewPanel: WebviewPanel,
58+
token: CancellationToken
59+
): Promise<void> {
60+
// create new table view for the given tabular text data document and render it
61+
TableView.render(this.context.extensionUri, document.uri, webviewPanel);
62+
}
6363
}

src/views/tableView.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export class TableView {
115115
private static createWebviewPanel(documentUri: Uri): WebviewPanel {
116116
// create new webview panel for the table view
117117
return window.createWebviewPanel(
118-
ViewTypes.tableView, // webview panel view type
118+
ViewTypes.TableView, // webview panel view type
119119
fileUtils.getFileName(documentUri), // webview panel title
120120
{
121121
viewColumn: ViewColumn.Active, // use active view column for display
@@ -155,7 +155,7 @@ export class TableView {
155155
statusBar.showFileStats(this._fileInfo);
156156

157157
// configure webview panel
158-
this.configure();
158+
this.configure(this._tableConfig);
159159

160160
// add it to the tracked table webviews
161161
TableView._views.set(this.viewUri.toString(true), this);
@@ -201,11 +201,14 @@ export class TableView {
201201

202202
/**
203203
* Configures webview html for tabular data view display,
204-
* and adds webview message request handlers for data updates.
204+
* and registers webview message request handlers for data updates.
205+
*
206+
* @param tableConfig Table view config.
205207
*/
206-
public configure(): void {
208+
public configure(tableConfig: any): void {
207209
// set table view html content for the webview panel
208-
this.webviewPanel.webview.html = this.getWebviewContent(this.webviewPanel.webview, this._extensionUri);
210+
this.webviewPanel.webview.html =
211+
this.getWebviewContent(this.webviewPanel.webview, this._extensionUri, tableConfig);
209212

210213
// process webview messages
211214
this.webviewPanel.webview.onDidReceiveMessage((message: any) => {
@@ -554,11 +557,11 @@ export class TableView {
554557
get delimiter(): string {
555558
let delimiter: string = '';
556559
switch (this._fileInfo.fileExtension) {
557-
case FileTypes.csv:
560+
case FileTypes.Csv:
558561
delimiter = ',';
559562
break;
560-
case FileTypes.tsv:
561-
case FileTypes.tab:
563+
case FileTypes.Tsv:
564+
case FileTypes.Tab:
562565
delimiter = '\t';
563566
break;
564567
}
@@ -605,9 +608,11 @@ export class TableView {
605608
*
606609
* @param webview Reference to the extensions webview.
607610
* @param extensionUri Extension directory Uri.
608-
* @returns Html string for the webview content.
611+
* @param tableConfig Table view config.
612+
*
613+
* @returns Html string for the webview content display.
609614
*/
610-
private getWebviewContent(webview: Webview, extensionUri: Uri): string {
615+
private getWebviewContent(webview: Webview, extensionUri: Uri, tableConfig: any): string {
611616
// create webview UI toolkit Uri
612617
const webviewUiToolkitUri: Uri =
613618
fileUtils.getWebviewUri(webview, extensionUri, ['web', 'scripts', 'toolkit.min.js']);
@@ -618,8 +623,14 @@ export class TableView {
618623
const tableViewStylesUri: Uri =
619624
fileUtils.getWebviewUri(webview, extensionUri, ['web', 'styles', 'table-view.css']);
620625

626+
// determine tabular data view type from config
627+
let viewType = this.dataViewType.toLowerCase();
628+
if (tableConfig?.view === 'perspective') {
629+
// user perspective data view type override
630+
viewType = 'perspective';
631+
}
632+
621633
// create data view script and styles Uris
622-
const viewType = this.dataViewType.toLowerCase();
623634
const viewImports = config.viewImports[viewType];
624635
const dataViewScriptUri: Uri =
625636
fileUtils.getWebviewUri(webview, extensionUri, ['web', 'scripts', `${viewType}.js`]);

src/views/tableViewSerializer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class TableViewSerializer implements WebviewPanelSerializer {
2222
* @returns Disposable object for this webview panel serializer.
2323
*/
2424
public static register(context: ExtensionContext): Disposable {
25-
return window.registerWebviewPanelSerializer(ViewTypes.tableView,
25+
return window.registerWebviewPanelSerializer(ViewTypes.TableView,
2626
new TableViewSerializer(context.extensionUri));
2727
}
2828

src/views/viewTypes.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
/* eslint-disable @typescript-eslint/naming-convention */
2+
13
/**
24
* Tabular data view types.
35
*/
46
export const enum ViewTypes {
5-
tableView = 'tabular.data.tableView',
6-
tableEditor = 'tabular.data.tableEditor'
7+
TableView = 'tabular.data.tableView',
8+
TableEditor = 'tabular.data.tableEditor',
9+
PerspectiveEditor = 'tabular.data.perspectiveEditor'
710
}

0 commit comments

Comments
 (0)