showTable

tcmts.vscode.data_panel.showTable · #izgcj6r4 · term · runs anywhere

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

used by