in apps/vs-code-designer/src/app/commands/workflows/openOverview.ts [36:183]
export async function openOverview(context: IAzureConnectorsContext, node: vscode.Uri | RemoteWorkflowTreeItem | undefined): Promise<void> {
let workflowFilePath: string;
let workflowName = '';
let workflowContent: any;
let baseUrl: string;
let apiVersion: string;
let accessToken: string;
let isLocal: boolean;
let callbackInfo: ICallbackUrlResponse | undefined;
let panelName = '';
let corsNotice: string | undefined;
let localSettings: Record<string, string> = {};
let isWorkflowRuntimeRunning: boolean;
let triggerName: string;
const workflowNode = getWorkflowNode(node);
const panelGroupKey = ext.webViewKey.overview;
if (workflowNode instanceof vscode.Uri) {
workflowFilePath = workflowNode.fsPath;
workflowName = basename(dirname(workflowFilePath));
panelName = `${vscode.workspace.name}-${workflowName}-overview`;
workflowContent = JSON.parse(readFileSync(workflowFilePath, 'utf8'));
baseUrl = `http://localhost:${ext.workflowRuntimePort}${managementApiPrefix}`;
apiVersion = '2019-10-01-edge-preview';
isLocal = true;
accessToken = '';
triggerName = getTriggerName(workflowContent.definition);
callbackInfo = await getLocalWorkflowCallbackInfo(context, workflowContent.definition, baseUrl, workflowName, triggerName, apiVersion);
const projectPath = await getLogicAppProjectRoot(context, workflowFilePath);
localSettings = projectPath ? (await getLocalSettingsJson(context, join(projectPath, localSettingsFileName))).Values || {} : {};
isWorkflowRuntimeRunning = !isNullOrUndefined(ext.workflowRuntimePort);
} else if (workflowNode instanceof RemoteWorkflowTreeItem) {
workflowName = workflowNode.name;
panelName = `${workflowNode.id}-${workflowName}-overview`;
workflowContent = workflowNode.workflowFileContent;
accessToken = await workflowNode.subscription.credentials.getToken();
baseUrl = getWorkflowManagementBaseURI(workflowNode);
apiVersion = workflowAppApiVersion;
triggerName = getTriggerName(workflowContent.definition);
callbackInfo = await workflowNode.getCallbackUrl(workflowNode, baseUrl, triggerName, apiVersion);
corsNotice = localize('CorsNotice', 'To view runs, set "*" to allowed origins in the CORS setting.');
isLocal = false;
isWorkflowRuntimeRunning = true;
}
const existingPanel: vscode.WebviewPanel | undefined = tryGetWebviewPanel(panelGroupKey, panelName);
if (existingPanel) {
if (!existingPanel.active) {
existingPanel.reveal(vscode.ViewColumn.Active);
}
return;
}
const options: vscode.WebviewOptions & vscode.WebviewPanelOptions = {
enableScripts: true,
retainContextWhenHidden: true,
};
const { name, kind, operationOptions, statelessRunMode } = getStandardAppData(workflowName, workflowContent);
const workflowProps = {
name,
stateType: getWorkflowStateType(name, kind, localSettings),
operationOptions,
statelessRunMode,
callbackInfo,
triggerName,
definition: workflowContent.definition,
};
const panel: vscode.WebviewPanel = vscode.window.createWebviewPanel(
'workflowOverview',
`${workflowName}-overview`,
vscode.ViewColumn.Active,
options
);
panel.iconPath = {
light: vscode.Uri.file(path.join(ext.context.extensionPath, 'assets', 'light', 'Codeless.svg')),
dark: vscode.Uri.file(path.join(ext.context.extensionPath, 'assets', 'dark', 'Codeless.svg')),
};
panel.webview.html = await getWebViewHTML('vs-code-react', panel);
let interval: NodeJS.Timeout;
panel.webview.onDidReceiveMessage(async (message) => {
switch (message.command) {
case ExtensionCommand.loadRun: {
openMonitoringView(context, workflowNode, message.item.id, workflowFilePath);
break;
}
case ExtensionCommand.initialize: {
panel.webview.postMessage({
command: ExtensionCommand.initialize_frame,
data: {
apiVersion: apiVersion,
baseUrl: baseUrl,
corsNotice,
accessToken: accessToken,
workflowProperties: workflowProps,
project: ProjectName.overview,
hostVersion: ext.extensionVersion,
isLocal: isLocal,
isWorkflowRuntimeRunning: isWorkflowRuntimeRunning,
},
});
// Just shipping the access Token every 5 seconds is easier and more
// performant that asking for it every time and waiting.
interval = setInterval(async () => {
const updatedAccessToken = await getAuthorizationToken();
if (updatedAccessToken !== accessToken) {
accessToken = updatedAccessToken;
panel.webview.postMessage({
command: ExtensionCommand.update_access_token,
data: {
accessToken,
},
});
}
}, 5000);
break;
}
case ExtensionCommand.createUnitTest: {
await createUnitTest(context, workflowNode as vscode.Uri, message.runId);
break;
}
case ExtensionCommand.saveBlankUnitTest: {
await saveBlankUnitTest(this.context as IAzureConnectorsContext, vscode.Uri.file(this.workflowFilePath), message.definition);
break;
}
default:
break;
}
}, ext.context.subscriptions);
panel.onDidDispose(
() => {
removeWebviewPanelFromCache(panelGroupKey, panelName);
clearInterval(interval);
},
null,
ext.context.subscriptions
);
cacheWebviewPanel(panelGroupKey, panelName, panel);
}