showTable
Open (or reveal) the viewer for a table. request sends a request to the language server.
import { html, PAGE, panels } from "#codebase/tcmts/vscode/data_panel"; import type { Query, Viewer } from "#codebase/tcmts/vscode/data_panel"; import type { Request } from "#codebase/tcmts/vscode/releases"; import * as vscode from "vscode"; export function showTable(table: string, request: Request, openUri: (uri: string) => unknown, icon?: vscode.Uri): void { const existing = panels.get(table); if (existing) { existing.panel.reveal(); return; } const panel = vscode.window.createWebviewPanel("tcm.table", `${table} (table)`, vscode.ViewColumn.Active, { enableScripts: true, retainContextWhenHidden: true }); const state: Viewer = { table, panel, query: { offset: 0, limit: PAGE, search: "", sort: undefined } }; panels.set(table, state); if (icon) panel.iconPath = icon; panel.onDidDispose(() => panels.delete(table)); const load = async () => { try { const [tables, page] = await Promise.all([request("tcm/data", {}), request("tcm/rows", { table, ...state.query })]); panel.webview.postMessage({ type: "data", info: (tables as { table: string }[]).find((t) => t.table === table) ?? { table, rows: 0, older: 0 }, page, query: state.query }); } catch (e) { panel.webview.postMessage({ type: "error", message: (e as Error).message }); } }; state.load = load; panel.webview.onDidReceiveMessage(async (m: { type: string; query?: Partial<Query>; uri?: string }) => { if (m.type === "query") { state.query = { ...state.query, ...m.query }; await load(); } else if (m.type === "openDefinition" && m.uri) openUri(m.uri); else if (m.type === "migrate") { await vscode.commands.executeCommand("tcm.migrateTable", { table }); await load(); } }); panel.webview.html = html(panel.webview); load(); }
uses
- tcmts.vscode.data_panel.PAGE
- tcmts.vscode.data_panel.Query
- tcmts.vscode.data_panel.Viewer
- tcmts.vscode.data_panel.html
- tcmts.vscode.data_panel.panels
- tcmts.vscode.releases.Request