Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 39 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "postgres-explorer",
"displayName": "PgStudio (PostgreSQL Explorer)",
"version": "1.0.0",
"version": "1.0.0-nightly",
"description": "PostgreSQL database explorer for VS Code with notebook support [Nightly]",
"publisher": "ric-v",
"private": false,
Expand Down Expand Up @@ -918,18 +918,26 @@
{
"command": "postgres-explorer.ddlViewer.openEditableCopy",
"title": "DDL Viewer: Open as Editable Copy",
"category": "PgStudio"
"category": "PgStudio",
"icon": "$(edit)"
},
{
"command": "postgres-explorer.ddlViewer.copyToClipboard",
"title": "DDL Viewer: Copy to Clipboard",
"category": "PgStudio"
"category": "PgStudio",
"icon": "$(copy)"
},
{
"command": "postgres-explorer.ddlViewer.executeRoutine",
"title": "DDL Viewer: Execute Routine Scaffold",
"category": "PgStudio"
},
{
"command": "postgres-explorer.ddlViewer.toggleEnabled",
"title": "DDL Viewer: Toggle SQL Preview",
"category": "PgStudio",
"icon": "$(file-code)"
},
{
"command": "postgres-explorer.switchConnection",
"title": "Switch Connection",
Expand Down Expand Up @@ -1674,6 +1682,11 @@
"type": "boolean",
"default": true,
"description": "Open the Definition Viewer automatically when selecting supported tree items."
},
"pgstudio.ddlViewer.enabled": {
"type": "boolean",
"default": true,
"description": "Enable SQL Preview (Definition Viewer) features and actions."
}
}
},
Expand Down Expand Up @@ -1713,6 +1726,11 @@
"when": "view == postgresExplorer",
"group": "navigation"
},
{
"command": "postgres-explorer.ddlViewer.toggleEnabled",
"when": "view == postgresExplorer",
"group": "navigation"
},
{
"command": "postgres-explorer.manageConnections",
"when": "view == postgresExplorer",
Expand Down Expand Up @@ -1749,6 +1767,23 @@
"group": "2_phase7"
}
],
"editor/title": [
{
"command": "postgres-explorer.ddlViewer.copyToClipboard",
"when": "resourceScheme == pgstudio-ddl",
"group": "navigation@1"
},
{
"command": "postgres-explorer.ddlViewer.toggleEnabled",
"when": "resourceScheme == pgstudio-ddl",
"group": "navigation@2"
},
{
"command": "postgres-explorer.ddlViewer.openEditableCopy",
"when": "resourceScheme == pgstudio-ddl",
"group": "navigation@3"
}
],
"view/item/context": [
{
"command": "postgres-explorer.notebooks.open",
Expand Down Expand Up @@ -2954,4 +2989,4 @@
"webpack": "^5.76.0",
"webpack-cli": "^5.0.0"
}
}
}
118 changes: 87 additions & 31 deletions src/services/DdlViewerService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ import { ConnectionManager } from './ConnectionManager';
import { createMetadata, getConnectionWithPassword } from '../commands/connection';

const DDL_VIEWER_SCHEME = 'pgstudio-ddl';
const DDL_VIEWER_ENABLED_CONFIG = 'pgstudio.ddlViewer.enabled';

function isDdlViewerEnabled(): boolean {
return vscode.workspace.getConfiguration().get<boolean>(DDL_VIEWER_ENABLED_CONFIG, true);
}

type DdlObjectType =
| 'database'
Expand Down Expand Up @@ -131,6 +136,13 @@ class DdlViewerCodeLensProvider implements vscode.CodeLensProvider {

const codeLenses: vscode.CodeLens[] = [];
const range = new vscode.Range(0, 0, 0, 0);
const isEnabled = isDdlViewerEnabled();

codeLenses.push(new vscode.CodeLens(range, {
title: isEnabled ? 'Disable SQL Preview' : 'Enable SQL Preview',
command: 'postgres-explorer.ddlViewer.toggleEnabled',
arguments: [!isEnabled]
}));

codeLenses.push(new vscode.CodeLens(range, {
title: 'Open as Editable Copy',
Expand Down Expand Up @@ -171,6 +183,14 @@ class DdlContentProvider implements vscode.TextDocumentContentProvider {
this._onDidChange.fire(uri);
}

public refreshAllOpenDdlDocuments(): void {
for (const doc of vscode.workspace.textDocuments) {
if (doc.uri.scheme === DDL_VIEWER_SCHEME) {
this._onDidChange.fire(doc.uri);
}
}
}

public getCachedContent(uri: vscode.Uri): string | undefined {
return this.contentCache.get(uri.toString());
}
Expand Down Expand Up @@ -1475,8 +1495,7 @@ export class DdlViewerService implements vscode.Disposable {
private readonly provider = new DdlContentProvider();
private readonly codeLensProvider = new DdlViewerCodeLensProvider();
private readonly disposables: vscode.Disposable[] = [];
private ddlViewColumn: vscode.ViewColumn | undefined;
private initialized = false;
private lastPreviewTarget: DdlViewerTarget | undefined;

constructor(
private readonly context: vscode.ExtensionContext,
Expand All @@ -1485,7 +1504,17 @@ export class DdlViewerService implements vscode.Disposable {
this.disposables.push(
vscode.workspace.registerTextDocumentContentProvider(DDL_VIEWER_SCHEME, this.provider),
vscode.languages.registerCodeLensProvider({ scheme: DDL_VIEWER_SCHEME }, this.codeLensProvider),
vscode.workspace.onDidChangeConfiguration((event) => {
if (event.affectsConfiguration(DDL_VIEWER_ENABLED_CONFIG)) {
this.codeLensProvider.refresh();
this.refreshOpenPreviewDocuments();
}
}),
this.treeView.onDidChangeSelection(async (event) => {
if (!isDdlViewerEnabled()) {
return;
}

if (!vscode.workspace.getConfiguration().get<boolean>('pgstudio.ddlViewer.openOnSelection', true)) {
return;
}
Expand All @@ -1505,51 +1534,61 @@ export class DdlViewerService implements vscode.Disposable {
}
await this.openForItem(selected, false);
}),
vscode.commands.registerCommand('postgres-explorer.ddlViewer.openEditableCopy', async (uri: vscode.Uri) => {
await this.openEditableCopy(uri);
vscode.commands.registerCommand('postgres-explorer.ddlViewer.openEditableCopy', async (uri?: vscode.Uri) => {
const targetUri = this.resolveDdlUri(uri);
if (!targetUri) {
vscode.window.showInformationMessage('Open a SQL Preview tab first.');
return;
}
await this.openEditableCopy(targetUri);
}),
vscode.commands.registerCommand('postgres-explorer.ddlViewer.copyToClipboard', async (uri: vscode.Uri) => {
await this.copyToClipboard(uri);
vscode.commands.registerCommand('postgres-explorer.ddlViewer.copyToClipboard', async (uri?: vscode.Uri) => {
const targetUri = this.resolveDdlUri(uri);
if (!targetUri) {
vscode.window.showInformationMessage('Open a SQL Preview tab first.');
return;
}
await this.copyToClipboard(targetUri);
}),
vscode.commands.registerCommand('postgres-explorer.ddlViewer.executeRoutine', async (uri: vscode.Uri) => {
await this.openRoutineExecuteScaffold(uri);
}),
vscode.commands.registerCommand('postgres-explorer.ddlViewer.toggleEnabled', async (forceState?: boolean) => {
const current = isDdlViewerEnabled();
const nextState = typeof forceState === 'boolean' ? forceState : !current;
await vscode.workspace.getConfiguration().update(DDL_VIEWER_ENABLED_CONFIG, nextState, vscode.ConfigurationTarget.Global);
this.codeLensProvider.refresh();
this.refreshOpenPreviewDocuments();
vscode.window.showInformationMessage(`SQL Preview ${nextState ? 'enabled' : 'disabled'}.`);
})
);
}

public async openForItem(item: DatabaseTreeItem, fromSelection: boolean): Promise<void> {
if (!isDdlViewerEnabled()) {
if (!fromSelection) {
vscode.window.showInformationMessage('SQL Preview is disabled. Enable it from settings or from a preview tab action.');
}
return;
}

const target = this.toTarget(item);
const uri = this.createUri(target);
this.provider.refresh(uri);
this.codeLensProvider.refresh();
this.lastPreviewTarget = target;

const openOptions: vscode.TextDocumentShowOptions = {
preserveFocus: true,
preview: true,
viewColumn: this.initialized ? this.ddlViewColumn ?? vscode.ViewColumn.Beside : vscode.ViewColumn.Beside
};
await this.provider.provideTextDocumentContent(uri);
this.provider.refresh(uri);

const doc = await vscode.workspace.openTextDocument(uri);
const editor = await vscode.window.showTextDocument(doc, openOptions);

if (editor.document.languageId !== 'sql') {
await vscode.languages.setTextDocumentLanguage(editor.document, 'sql');
if (doc.languageId !== 'sql') {
await vscode.languages.setTextDocumentLanguage(doc, 'sql');
}

if (!this.initialized) {
this.initialized = true;
this.ddlViewColumn = editor.viewColumn;
} else if (editor.viewColumn) {
this.ddlViewColumn = editor.viewColumn;
}

if (!fromSelection) {
await vscode.window.showTextDocument(doc, {
preserveFocus: true,
preview: true,
viewColumn: this.ddlViewColumn
});
}
await vscode.window.showTextDocument(doc, {
viewColumn: vscode.ViewColumn.Beside,
preserveFocus: fromSelection,
preview: fromSelection
});
}

public dispose(): void {
Expand All @@ -1559,6 +1598,23 @@ export class DdlViewerService implements vscode.Disposable {
}
}

private refreshOpenPreviewDocuments(): void {
this.provider.refreshAllOpenDdlDocuments();
}

private resolveDdlUri(uri?: vscode.Uri): vscode.Uri | undefined {
if (uri?.scheme === DDL_VIEWER_SCHEME) {
return uri;
}

const activeUri = vscode.window.activeTextEditor?.document.uri;
if (activeUri?.scheme === DDL_VIEWER_SCHEME) {
return activeUri;
}

return undefined;
}

private createUri(target: DdlViewerTarget): vscode.Uri {
const objectDisplay = toObjectDisplayName(target);
const fileName = `[definition] ${objectDisplay}.pgsql`;
Expand Down