import * as vscode from "vscode"; import { getNonce } from "./getNonce"; import { apiBaseUrl } from "./constants"; export class WebviewPanelCostOfDelay { /** * Track the currently panel. Only allow a single panel to exist at a time. */ public static _site: string; public static _view: string; public static _title: string; public static currentPanel: WebviewPanelCostOfDelay | undefined; public static readonly viewType = "web-view-panel"; private _disposables: vscode.Disposable[] = []; public static createOrShow(extensionContext: vscode.ExtensionContext, site: string, view: string) { this._site = site; this._view = view; const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; const title = view === '' ? 'Cost of Delay (CoD)' : view === 'EFFORT' ? 'Effort' : view === 'LIVE' ? 'Cost of Delay (CoD) - Live Update' : view === 'HTML' ? 'Backlog (Bugs & Features with parents)' : view === 'WSJF' ? 'Weightest Shortest Job First calculation (WSJF)' : 'CoD'; this._title = title; // If we already have a panel, show it. if (WebviewPanelCostOfDelay.currentPanel) { WebviewPanelCostOfDelay.currentPanel._panel.reveal(column); WebviewPanelCostOfDelay.currentPanel._update(site, title, view); return; } // Otherwise, create a new panel. const panel = vscode.window.createWebviewPanel( WebviewPanelCostOfDelay.viewType, title, column || vscode.ViewColumn.One, { // Enable javascript in the webview enableScripts: true, enableFindWidget: true, // And restrict the webview to only loading content from our extension's `media` directory. localResourceRoots: [ vscode.Uri.joinPath(extensionContext.extensionUri, "media"), vscode.Uri.joinPath(extensionContext.extensionUri, "out/compiled"), ], } ); WebviewPanelCostOfDelay.currentPanel = new WebviewPanelCostOfDelay(extensionContext, panel, site, title, view); } public static kill() { WebviewPanelCostOfDelay.currentPanel?.dispose(); WebviewPanelCostOfDelay.currentPanel = undefined; } public static revive(panel: vscode.WebviewPanel, extensionContext: vscode.ExtensionContext) { WebviewPanelCostOfDelay.currentPanel = new WebviewPanelCostOfDelay(extensionContext, panel, this._site, this._title, this._view); } private constructor(private readonly _extensionContext: vscode.ExtensionContext, private readonly _panel: vscode.WebviewPanel, site: string, title: string, view: string) { // Set the webview's initial html content this._update(site, title, view); // Listen for when the panel is disposed // This happens when the user closes the panel or when the panel is closed programmatically this._panel.onDidDispose(() => this.dispose(), null, this._disposables); // Handle messages from the webview this._panel.webview.onDidReceiveMessage( (message) => { switch (message.command) { case "alert": vscode.window.showErrorMessage(message.text); return; default: vscode.window.showErrorMessage(message.text); break; } }, null, this._disposables ); } public dispose() { WebviewPanelCostOfDelay.currentPanel = undefined; // Clean up our resources this._panel.dispose(); while (this._disposables.length) { const x = this._disposables.pop(); if (x) { x.dispose(); } } } private async _update(site: string, title: string, view: string) { const webview = this._panel.webview; this._panel.webview.html = this._getHtmlForWebview(site, title, view, webview); webview.onDidReceiveMessage(async (message: string) => { vscode.window.showErrorMessage(message); }); } private _getHtmlForWebview(site: string, title: string, view: string, webview: vscode.Webview) { const baseUri = 'https://eaf-dev.mes.infineon.com'; const scriptUri = 'cod-1-123-0.js?v=2025-04-14-08-10'; // Use a nonce to only allow a specific script to be run. const nonce = getNonce(); if (view === 'HTML') { return ` Infineon - ${title} `; } else { const styleBootstrapUri = webview.asWebviewUri( vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "bootstrap.min.css") ); const styleCostOfDelayUri = webview.asWebviewUri( vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "cod.css") ); const scriptJQueryUri = webview.asWebviewUri( vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "jquery-1.6.4.min.js") ); const scriptSignalRUri = webview.asWebviewUri( vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "jquery.signalR-2.4.3.min.js") ); const scriptCostOfDelayUri = webview.asWebviewUri( vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "cost-of-delay.js") ); return ` Infineon - ${title}

 
`; } } }