| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| import * as vscode from 'vscode'; |
| import * as path from 'path'; |
| import * as fs from 'fs'; |
| import { WEBVIEW_TEMPLATE_PATH } from '../../constant/path'; |
| import { Limits } from 'openwhisk'; |
| |
| 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 |
| ); |
| } |
| }); |
| } |