This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
commit 6025f69658f36a5c96f2f3dc793e2e1e37379d54 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Wed Feb 15 10:50:59 2023 -0500 vscode extension for #658 --- karavan-vscode/package.json | 28 ++++++++++++++++++++ karavan-vscode/src/designerView.ts | 11 ++++++-- karavan-vscode/src/utils.ts | 14 ++++++++++ karavan-vscode/webview/App.tsx | 54 +++++++++++++++++++++++++++++--------- 4 files changed, 92 insertions(+), 15 deletions(-) diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json index a679ad3a..1c504e55 100644 --- a/karavan-vscode/package.json +++ b/karavan-vscode/package.json @@ -126,6 +126,34 @@ "scope": "machine", "order": 60 }, + "Karavan.supportedComponents": { + "type": "string", + "default": "", + "description": "Supported Components (*.json)", + "scope": "machine", + "order": 61 + }, + "Karavan.supportedDataformats": { + "type": "string", + "default": "", + "description": "Supported Dataformats (*.json)", + "scope": "machine", + "order": 62 + }, + "Karavan.supportedLanguages": { + "type": "string", + "default": "", + "description": "Supported Expression Languages (*.json)", + "scope": "machine", + "order": 62 + }, + "Karavan.supportedOnly": { + "type": "boolean", + "default": false, + "description": "Show Supported Only", + "scope": "machine", + "order": 64 + }, "Karavan.kameletsPath": { "type": "string", "default": "", diff --git a/karavan-vscode/src/designerView.ts b/karavan-vscode/src/designerView.ts index 541ce27f..7d9a2c31 100644 --- a/karavan-vscode/src/designerView.ts +++ b/karavan-vscode/src/designerView.ts @@ -154,18 +154,25 @@ export class DesignerView { // Read templates utils.readTemplates(this.context), // Read java classes - utils.readJavaCode(fullPath) + utils.readJavaCode(fullPath), + // Read supported components + utils.readSupportedComponents(), + utils.readSupportedOnlySettings() ]).then(results => { // Send Kamelets panel.webview.postMessage({ command: 'kamelets', kamelets: results[0] }); - // Send components + // Send all components panel.webview.postMessage({ command: 'components', components: results[1] }); // Send templates panel.webview.postMessage({ command: 'templates', templates: Object.fromEntries(results[2]) }); // Send java code panel.webview.postMessage({ command: 'javaCode', javaCode: Object.fromEntries(results[3]) }); + // Send supported components + if (results[4]) panel.webview.postMessage({ command: 'supportedComponents', components: results[4]}); + if (results[5] === true) panel.webview.postMessage({ command: 'supportedOnly'}); // Send integration this.sendIntegrationData(panel, filename, relativePath, fullPath, reread, yaml, tab); + }).catch(err => console.log(err)); } diff --git a/karavan-vscode/src/utils.ts b/karavan-vscode/src/utils.ts index 551db383..8f84c721 100644 --- a/karavan-vscode/src/utils.ts +++ b/karavan-vscode/src/utils.ts @@ -73,6 +73,20 @@ async function readBuildInKamelets(context: ExtensionContext) { return result; } +export async function readSupportedComponents() { + const supportedComponentsPath: string | undefined = workspace.getConfiguration().get("Karavan.supportedComponents"); + if (supportedComponentsPath && supportedComponentsPath.trim().length > 0) { + const filename = path.isAbsolute(supportedComponentsPath) ? supportedComponentsPath : path.resolve(supportedComponentsPath); + const file = await readFile(filename); + return Buffer.from(file).toString('utf8'); + } + return undefined; +} + +export async function readSupportedOnlySettings(): Promise<boolean> { + return workspace.getConfiguration().get("Karavan.supportedOnly") || false; +} + async function readFilesInDirByExtension(dir: string, extension: string): Promise<Map<string, string>> { const result = new Map<string, string>(); const dirs: [string, FileType][] = await readDirectory(dir); diff --git a/karavan-vscode/webview/App.tsx b/karavan-vscode/webview/App.tsx index 60fc68c7..80c03416 100644 --- a/karavan-vscode/webview/App.tsx +++ b/karavan-vscode/webview/App.tsx @@ -16,7 +16,7 @@ */ import * as React from "react"; import { - Page, PageSection, Spinner, + Page, PageSection, Spinner, Text, TextVariants } from "@patternfly/react-core"; import { KaravanDesigner } from "./designer/KaravanDesigner"; import vscode from "./vscode"; @@ -39,6 +39,7 @@ interface State { yaml: string key: string loaded: boolean + loadingMessages: string[] interval?: NodeJS.Timer scheduledYaml: string hasChanges: boolean @@ -58,6 +59,7 @@ class App extends React.Component<Props, State> { yaml: '', key: '', loaded: false, + loadingMessages: [], scheduledYaml: '', hasChanges: false, page: "designer", @@ -89,14 +91,36 @@ class App extends React.Component<Props, State> { switch (message.command) { case 'kamelets': KameletApi.saveKamelets(message.kamelets, true); + this.setState((prevState: State) => { + prevState.loadingMessages.push("Kamelets loaded"); + return {loadingMessages: prevState.loadingMessages} + }); break; case 'components': ComponentApi.saveComponents(message.components, true); + this.setState((prevState: State) => { + prevState.loadingMessages.push("Components loaded"); + return {loadingMessages: prevState.loadingMessages} + }); break; + case 'supportedComponents': + ComponentApi.saveSupportedComponents(message.components); + this.setState((prevState: State) => { + prevState.loadingMessages.push("Supported Components loaded"); + return {loadingMessages: prevState.loadingMessages} + }); + break; + case 'supportedOnly': + ComponentApi.setSupportedOnly(true); + break; case 'templates': const templates = message.templates; const map = new Map( Object.keys(templates).map(key => [key, templates[key]])); TemplateApi.saveTemplates(map, true); + this.setState((prevState: State) => { + prevState.loadingMessages.push("Templates loaded"); + return {loadingMessages: prevState.loadingMessages} + }); break; case 'javaCode': const javaCode = message.javaCode; @@ -152,21 +176,25 @@ class App extends React.Component<Props, State> { } public render() { + const {loadingMessages, filename, key, yaml, karavanDesignerRef, page, loaded, tab} = this.state; + const {dark} = this.props; return ( <Page className="karavan"> - {!this.state.loaded && - <PageSection variant={this.props.dark ? "dark" : "light"} className="loading-page"> + {!loaded && + <PageSection variant={dark ? "dark" : "light"} className="loading-page"> <Spinner className="progress-stepper" isSVG diameter="80px" aria-label="Loading..." /> + {loadingMessages.map(message => <Text component={TextVariants.h5}>{message}</Text>)} + <Text component={TextVariants.h5}>Loading...</Text> </PageSection> } - {this.state.loaded && this.state.page === "designer" && - <KaravanDesigner ref={this.state.karavanDesignerRef} - key={this.state.key} - filename={this.state.filename} - yaml={this.state.yaml} + {loaded && page === "designer" && + <KaravanDesigner ref={karavanDesignerRef} + key={key} + filename={filename} + yaml={yaml} onSave={(filename, yaml, propertyOnly) => this.save(filename, yaml, propertyOnly)} - tab={this.state.tab} - dark={this.props.dark} + tab={tab} + dark={dark} onSaveCustomCode={(name, code) => this.saveJavCode(name, code)} onGetCustomCode={(name, javaType) => { let code = TemplateApi.getJavaCode(name); @@ -175,9 +203,9 @@ class App extends React.Component<Props, State> { }} /> } - {this.state.loaded && this.state.page === "kamelets" && <KameletsPage dark={this.props.dark} />} - {this.state.loaded && this.state.page === "components" && <ComponentsPage dark={this.props.dark} />} - {this.state.loaded && this.state.page === "eip" && <EipPage dark={this.props.dark} />} + {loaded && page === "kamelets" && <KameletsPage dark={dark} />} + {loaded && page === "components" && <ComponentsPage dark={dark} />} + {loaded && page === "eip" && <EipPage dark={dark} />} </Page> ) }