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>
     )
   }

Reply via email to