in src/commands/common/openMetadataEditor.ts [23:77]
export async function openMetadataEditor(
viewType: string,
tabTitle: string,
context: vscode.ExtensionContext,
parameters: Record<string, any>,
annotations: Record<string, any>,
limits: Limits | undefined,
update: (parameter: object, annotation: object, limits: Limits | undefined) => Promise<void>
): Promise<void> {
const panel = vscode.window.createWebviewPanel(viewType, tabTitle, vscode.ViewColumn.One, {
enableScripts: true,
retainContextWhenHidden: true,
});
const nodeModulesDiskPath = vscode.Uri.file(path.join(context.extensionPath, 'node_modules'));
const nodeModulePath = panel.webview.asWebviewUri(nodeModulesDiskPath);
const webviewTemplateDiskPath = vscode.Uri.file(WEBVIEW_TEMPLATE_PATH);
const webviewTemplatePath = panel.webview.asWebviewUri(webviewTemplateDiskPath);
// render webview html
const html = await fs.promises.readFile(
path.resolve(WEBVIEW_TEMPLATE_PATH, 'metadataEditor.html'),
'utf-8'
);
// set container className
let className = '';
if (limits) {
className += 'has-limits';
}
panel.webview.html = html
.replace(/{{nodeModulePath}}/gi, nodeModulePath.toString())
.replace(/{{webviewTemplatePath}}/gi, webviewTemplatePath.toString())
.replace(/{{className}}/gi, className)
.replace(/{{title}}/gi, tabTitle);
// add message litener
panel.webview.onDidReceiveMessage(async (message) => {
if (message.command === 'initialized') {
panel.webview.postMessage({
command: 'setEditor',
parameters: JSON.stringify(parameters),
annotations: JSON.stringify(annotations),
limits: limits,
});
} else if (message.command === 'update') {
await update(
JSON.parse(message.parameters),
JSON.parse(message.annotations),
message.limits
);
}
});
}