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


The following commit(s) were added to refs/heads/main by this push:
     new 59b49ec  Saas feature35 (#430)
59b49ec is described below

commit 59b49ecc03346faa62a187098e6df81a66ac9b2e
Author: Marat Gubaidullin <marat.gubaidul...@gmail.com>
AuthorDate: Wed Jul 27 19:31:45 2022 -0400

    Saas feature35 (#430)
    
    * UI improvements
    
    * Fix issue with Salesforce component URI
---
 karavan-app/src/main/webapp/src/index.css          |  4 ++
 karavan-core/package-lock.json                     |  4 +-
 karavan-core/src/core/api/ComponentApi.ts          | 21 +++++----
 karavan-designer/src/App.tsx                       | 53 +++++++++++++---------
 karavan-designer/src/builder/BuilderPage.tsx       |  1 -
 karavan-designer/src/components/ComponentCard.tsx  |  2 +-
 karavan-designer/src/designer/KaravanDesigner.tsx  | 11 -----
 .../src/designer/beans/BeanProperties.tsx          |  1 -
 karavan-designer/src/designer/karavan.css          | 23 +++++++---
 .../src/designer/rest/RestMethodSelector.tsx       |  4 +-
 .../src/designer/route/DslConnections.tsx          | 34 +++++++-------
 karavan-designer/src/designer/route/DslElement.tsx | 11 ++---
 .../src/designer/route/DslSelector.tsx             |  8 +++-
 .../src/designer/route/RouteDesigner.tsx           |  2 +-
 .../designer/route/property/DslPropertyField.tsx   | 23 ++++++----
 .../route/property/KameletPropertyField.tsx        |  2 +-
 .../designer/route/property/KubernetesSelector.tsx |  2 -
 karavan-designer/src/designer/utils/EventBus.ts    |  8 +++-
 karavan-vscode/webview/builder/BuilderPage.tsx     |  1 -
 .../webview/components/ComponentCard.tsx           |  2 +-
 20 files changed, 122 insertions(+), 95 deletions(-)

diff --git a/karavan-app/src/main/webapp/src/index.css 
b/karavan-app/src/main/webapp/src/index.css
index c8c1f77..e01f438 100644
--- a/karavan-app/src/main/webapp/src/index.css
+++ b/karavan-app/src/main/webapp/src/index.css
@@ -189,6 +189,10 @@
   margin: 0;
 }
 
+.karavan .project-page  .pf-c-label__icon {
+  height: 16px;
+}
+
 .karavan .action-cell {
   padding: 0;
 }
diff --git a/karavan-core/package-lock.json b/karavan-core/package-lock.json
index bc87afc..43fcd08 100644
--- a/karavan-core/package-lock.json
+++ b/karavan-core/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "karavan-core",
-  "version": "0.0.16",
+  "version": "3.18.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "karavan-core",
-      "version": "0.0.16",
+      "version": "3.18.0",
       "license": "Apache-2.0",
       "dependencies": {
         "@types/js-yaml": "^4.0.5",
diff --git a/karavan-core/src/core/api/ComponentApi.ts 
b/karavan-core/src/core/api/ComponentApi.ts
index e656978..da15fb7 100644
--- a/karavan-core/src/core/api/ComponentApi.ts
+++ b/karavan-core/src/core/api/ComponentApi.ts
@@ -76,7 +76,11 @@ export const ComponentApi = {
             const syntaxSeparators = ComponentApi.getSyntaxSeparators(syntax + 
'');
             let newUri = uri === name ? name + syntaxSeparators.join('') : uri;
             result.set(name, name);
-            if (name === 'cxf') { // workaround for CXF component
+            if (name === 'salesforce') { // workaround for salesforce component
+                const parts = newUri.split(":");
+                if (parts.length === 2) result.set("operationName", 
parts.at(1) || '').set("topicName", '')
+                else if (parts.length === 3) result.set("operationName", 
parts.at(1) || '').set("topicName", parts.at(2) || '')
+            } else if (name === 'cxf') { // workaround for CXF component
                 const cxfParts = newUri.split(":");
                 const firstPart = cxfParts.at(1);
                 const secondPart = cxfParts.at(2);
@@ -94,7 +98,7 @@ export const ComponentApi = {
                 result.set("systemName", systemName);
                 result.set("objectPath", objectPath);
                 result.set("type", type);
-            } else { // workaround for CXF component end
+            } else { // workarounds end
                 syntaxParts.filter((x, i) => i > 0).forEach((part, index) => {
                     if (index < syntaxParts.length - 1) {
                         const startSeparator = syntaxSeparators[index];
@@ -173,20 +177,21 @@ export const ComponentApi = {
     buildComponentUri: (uri: string, pathParameter: string, 
pathParameterValue: string): string | undefined => {
         const name = ComponentApi.getComponentNameFromUri(uri);
         if (name) {
-            // workaround for CXF component start
-            if (name === 'cxf') {
+            if (name === 'cxf') { // workaround for CXF component start
                 if (pathParameter === 'beanId' && pathParameterValue && 
pathParameterValue.trim().length > 0) return "cxf:" + pathParameterValue;
                 if (pathParameter === 'address' && pathParameterValue && 
pathParameterValue.trim().length > 0) return "cxf:" + pathParameterValue;
-            } else { // workaround for CXF component end
+            } else { // workarounds end
                 const map = ComponentApi.getUriParts(uri);
                 map.set(pathParameter, pathParameterValue);
                 const separators = ComponentApi.getUriSeparators(uri);
                 const result: string[] = [];
                 Array.from(map.keys()).forEach((key, index) => {
-                    const val = map.get(key);
-                    result.push(val ? val : '');
-                    result.push(separators[index]);
+                    const val = map.get(key) || '';
+                    const separator = separators[index];
+                    result.push(val);
+                    if (separator) result.push(separators[index]);
                 });
+                if (result.at(result.length -1) === '') return result.slice(0, 
-2).join(''); // remove last colon
                 return result.join('');
             }
         }
diff --git a/karavan-designer/src/App.tsx b/karavan-designer/src/App.tsx
index 2b55658..af4a5a8 100644
--- a/karavan-designer/src/App.tsx
+++ b/karavan-designer/src/App.tsx
@@ -26,7 +26,6 @@ import {ComponentsPage} from "./components/ComponentsPage";
 import {EipPage} from "./eip/EipPage";
 import {BuilderPage} from "./builder/BuilderPage";
 import {ProjectModel, StepStatus} from "karavan-core/lib/model/ProjectModel";
-import {KubernetesAPI} from "./designer/utils/KubernetesAPI";
 
 interface Props {
     page: "designer" | "kamelets" | "components" | "eip" | "builder";
@@ -44,26 +43,37 @@ class App extends React.Component<Props, State> {
         name: 'demo.yaml',
         key: '',
         yaml:
-        'apiVersion: camel.apache.org/v1\n' +
-        'kind: Integration\n' +
-        'metadata:\n' +
-        '  name: postman.yaml\n' +
-        'spec:\n' +
-        '  flows:\n' +
-        '    - route:\n' +
-        '        from:\n' +
-        '          uri: kamelet:timer-source\n' +
-        '          steps:\n' +
-        '            - log:\n' +
-        '                message: ${body}\n' +
-        '            - aggregate: {}\n' +
-        '            - choice: {}\n' +
-        '            - split:\n' +
-        '                expression: {}\n' +
-        '            - saga: {}\n' +
-        '          parameters:\n' +
-        '            period: 2000\n' +
-        '            message: Hello World\n' +
+            'apiVersion: camel.apache.org/v1\n' +
+            'kind: Integration\n' +
+            'metadata:\n' +
+            '  name: postman.yaml\n' +
+            'spec:\n' +
+            '  flows:\n' +
+            '    - route:\n' +
+            '        from:\n' +
+            '          uri: kamelet:timer-source\n' +
+            '          steps:\n' +
+            '            - log:\n' +
+            '                message: ${body}\n' +
+            '            - aggregate: {}\n' +
+            '            - choice: {}\n' +
+            '            - split:\n' +
+            '                expression: {}\n' +
+            '            - saga: {}\n' +
+            '            - to:\n' +
+            '                uri: direct:hello-world\n' +
+            '            - to:\n' +
+            '                uri: salesforce:getSObject\n' +
+            '                parameters:\n' +
+            '                  sObjectId: xxx\n' +
+            '                  sObjectClass: Account\n' +
+            '          parameters:\n' +
+            '            period: 2000\n' +
+            '            message: Hello World\n' +
+            '    - route:\n' +
+            '        from:\n' +
+            '          uri: direct:hello-world\n' +
+            '        id: hello-world' +
             ''
     };
 
@@ -102,6 +112,7 @@ class App extends React.Component<Props, State> {
             "pg-replication-slot.json",
             "rest-api.json",
             "rest-openapi.json",
+            "salesforce.json",
             "kubernetes-service-accounts.json",
             "mvel.json"].forEach(name =>
             fetch("components/" + name)
diff --git a/karavan-designer/src/builder/BuilderPage.tsx 
b/karavan-designer/src/builder/BuilderPage.tsx
index 605521c..43c27d5 100644
--- a/karavan-designer/src/builder/BuilderPage.tsx
+++ b/karavan-designer/src/builder/BuilderPage.tsx
@@ -181,7 +181,6 @@ export class BuilderPage extends React.Component<Props, 
State> {
     }
 
     getHeader() {
-        const {project} = this.state;
         return (
             <PageSection className="tools-section" variant={this.props.dark ? 
PageSectionVariants.darker : PageSectionVariants.light}>
                 <Flex className="tools" direction={{default: 'row'}} 
justifyContent={{default: 'justifyContentSpaceBetween'}} spaceItems={{default: 
'spaceItemsLg'}}>
diff --git a/karavan-designer/src/components/ComponentCard.tsx 
b/karavan-designer/src/components/ComponentCard.tsx
index 6d465f3..1fe5269 100644
--- a/karavan-designer/src/components/ComponentCard.tsx
+++ b/karavan-designer/src/components/ComponentCard.tsx
@@ -16,7 +16,7 @@
  */
 import React from 'react';
 import {
-    CardHeader, Card, CardTitle, CardBody, CardActions, CardFooter,Badge
+    CardHeader, Card, CardTitle, CardBody, CardFooter,Badge
 } from '@patternfly/react-core';
 import '../designer/karavan.css';
 import {camelIcon, CamelUi} from "../designer/utils/CamelUi";
diff --git a/karavan-designer/src/designer/KaravanDesigner.tsx 
b/karavan-designer/src/designer/KaravanDesigner.tsx
index 20e9f60..664c86e 100644
--- a/karavan-designer/src/designer/KaravanDesigner.tsx
+++ b/karavan-designer/src/designer/KaravanDesigner.tsx
@@ -29,8 +29,6 @@ import {BeansDesigner} from "./beans/BeansDesigner";
 import {RestDesigner} from "./rest/RestDesigner";
 import {ErrorDesigner} from "./error/ErrorDesigner";
 import {ExceptionDesigner} from "./exception/ExceptionDesigner";
-import {DependenciesDesigner} from "./dependencies/DependenciesDesigner";
-import {TraitsDesigner} from "./traits/TraitsDesigner";
 import KaravanTour from "./KaravanTour";
 import WandIcon from "@patternfly/react-icons/dist/js/icons/magic-icon";
 import {getDesignerIcon} from "./utils/KaravanIcons";
@@ -139,11 +137,8 @@ export class KaravanDesigner extends 
React.Component<Props, State> {
                     <Tab data-tour="routes" eventKey='routes' 
title={this.getTab("Routes", "Integration flows", "routes")}></Tab>
                     <Tab eventKey='rest' title={this.getTab("REST", "REST 
services", "rest")}></Tab>
                     <Tab eventKey='beans' title={this.getTab("Beans", "Beans 
Configuration", "beans")}></Tab>
-                    {/*<Tab eventKey='dependencies' 
title={this.getTab("Dependencies", "Dependencies", "dependencies")}></Tab>*/}
-                    {/*<Tab eventKey='traits' title={this.getTab("Traits", 
"traits configuration", "traits")}></Tab>*/}
                     <Tab eventKey='error' title={this.getTab("Error", "Error 
Handler", "error")}></Tab>
                     <Tab eventKey='exception' title={this.getTab("Exceptions", 
"Exception Clauses per type", "exception")}></Tab>
-                    {/*<Tab eventKey='code' title={this.getTab("Code", "Code", 
"code")}></Tab>*/}
                 </Tabs>
                 {tab === 'routes' && <RouteDesigner 
integration={this.state.integration}
                                                     
showTour={this.state.showTour}
@@ -155,18 +150,12 @@ export class KaravanDesigner extends 
React.Component<Props, State> {
                 {tab === 'beans' && <BeansDesigner 
integration={this.state.integration}
                                                    onSave={(integration, 
propertyOnly) => this.save(integration, propertyOnly)}
                                                    dark={this.props.dark}/>}
-                {/*{tab === 'dependencies' && <DependenciesDesigner 
integration={this.state.integration}*/}
-                {/*                                                 
onSave={(integration, propertyOnly) => this.save(integration, propertyOnly)}*/}
-                {/*                                                 
dark={this.props.dark}/>}*/}
                 {tab === 'error' && <ErrorDesigner 
integration={this.state.integration}
                                                    onSave={(integration, 
propertyOnly) => this.save(integration, propertyOnly)}
                                                    dark={this.props.dark}/>}
                 {tab === 'exception' && <ExceptionDesigner 
integration={this.state.integration}
                                                            
onSave={(integration, propertyOnly) => this.save(integration, propertyOnly)}
                                                            
dark={this.props.dark}/>}
-                {/*{tab === 'traits' && <TraitsDesigner 
integration={this.state.integration}*/}
-                {/*                                           
onSave={(integration, propertyOnly) => this.save(integration, propertyOnly)}*/}
-                {/*                                           
dark={this.props.dark}/>}*/}
                 {this.getHelpWindow()}
             </PageSection>
         )
diff --git a/karavan-designer/src/designer/beans/BeanProperties.tsx 
b/karavan-designer/src/designer/beans/BeanProperties.tsx
index 87bfbbf..8f197bb 100644
--- a/karavan-designer/src/designer/beans/BeanProperties.tsx
+++ b/karavan-designer/src/designer/beans/BeanProperties.tsx
@@ -32,7 +32,6 @@ import DeleteIcon from 
"@patternfly/react-icons/dist/js/icons/times-icon";
 import AddIcon from "@patternfly/react-icons/dist/js/icons/plus-circle-icon";
 import {IntegrationHeader} from "../utils/KaravanComponents";
 import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon'
-import {PropertyMeta} from "karavan-core/lib/model/CamelMetadata";
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 
 interface Props {
diff --git a/karavan-designer/src/designer/karavan.css 
b/karavan-designer/src/designer/karavan.css
index edad6d2..f831c3b 100644
--- a/karavan-designer/src/designer/karavan.css
+++ b/karavan-designer/src/designer/karavan.css
@@ -360,7 +360,7 @@
 }
 
 .karavan .properties .pf-c-select__menu-item-description {
-   overflow-wrap: anywhere;
+    overflow-wrap: anywhere;
 }
 
 .karavan .properties .number {
@@ -516,9 +516,9 @@
 }
 
 .karavan .dsl-page .graph .connections .path {
-     stroke: var(--pf-global--Color--200);
-     stroke-width: 1;
-     fill: transparent;
+    stroke: var(--pf-global--Color--200);
+    stroke-width: 1;
+    fill: transparent;
 }
 
 .karavan .dsl-page .graph .connections .circle-outgoing,
@@ -533,14 +533,23 @@
     -webkit-animation: dashdraw .5s linear infinite;
     animation: dashdraw .5s linear infinite;
     stroke: var(--pf-global--Color--200);
-    strokeWidth: 1;
+    stroke-width: 1;
     fill: transparent;
 }
 
 .karavan .dsl-page .graph .connections .path-direct {
     stroke-dasharray: 0;
     stroke: var(--pf-global--Color--200);
-    strokeWidth: 1;
+    stroke-width: 0.7;
+    stroke-opacity: 0.7;
+    fill: transparent;
+}
+
+.karavan .dsl-page .graph .connections .path-direct-selected {
+    stroke-dasharray: 0;
+    stroke: var(--pf-global--active-color--100);
+    stroke-width: 1;
+    stroke-opacity: 1;
     fill: transparent;
 }
 
@@ -549,7 +558,7 @@
     stroke: var(--pf-global--Color--200);
     -webkit-animation: dashdraw .5s linear infinite;
     animation: dashdraw .5s linear infinite;
-    strokeWidth: 1;
+    stroke-width: 1;
     fill: transparent;
 }
 
diff --git a/karavan-designer/src/designer/rest/RestMethodSelector.tsx 
b/karavan-designer/src/designer/rest/RestMethodSelector.tsx
index 5e6baf5..316145c 100644
--- a/karavan-designer/src/designer/rest/RestMethodSelector.tsx
+++ b/karavan-designer/src/designer/rest/RestMethodSelector.tsx
@@ -17,9 +17,9 @@
 import React from 'react';
 import {
     Badge,
-    Card, CardBody, CardFooter, CardHeader, Form, FormGroup, Gallery, 
PageSection,
+    Card, CardBody, CardFooter, CardHeader, Gallery, PageSection,
     Tab, Tabs, TabTitleText,
-    Text, TextInput,
+    Text
 } from '@patternfly/react-core';
 import '../karavan.css';
 import {CamelUi} from "../utils/CamelUi";
diff --git a/karavan-designer/src/designer/route/DslConnections.tsx 
b/karavan-designer/src/designer/route/DslConnections.tsx
index 27361fc..25d3a2f 100644
--- a/karavan-designer/src/designer/route/DslConnections.tsx
+++ b/karavan-designer/src/designer/route/DslConnections.tsx
@@ -179,19 +179,19 @@ export class DslConnections extends 
React.Component<Props, State> {
         }
     }
 
-    getIntegrals(): [string, number][] {
-        let outs: [string, number][] = Array.from(this.state.steps.values())
+    getInternals(): [string, number, boolean][] {
+        let outs: [string, number, boolean][] = 
Array.from(this.state.steps.values())
             .filter(pos => outgoingDefinitions.includes(pos.step.dslName) && 
CamelUi.hasInternalUri(pos.step))
             .sort((pos1: DslPosition, pos2: DslPosition) => {
                 const y1 = pos1.headerRect.y + pos1.headerRect.height / 2;
                 const y2 = pos2.headerRect.y + pos2.headerRect.height / 2;
                 return y1 > y2 ? 1 : -1
             })
-            .map(pos => [pos.step.uuid, pos.headerRect.y - this.props.top]);
+            .map(pos => [pos.step.uuid, pos.headerRect.y - this.props.top, 
pos.isSelected]);
         return outs;
     }
 
-    getInternalLines(data: [string, number]) {
+    getInternalLines(data: [string, number, boolean]) {
         const pos = this.state.steps.get(data[0]);
         const uri = (pos?.step as any).uri;
         if (uri && uri.length && pos) {
@@ -199,8 +199,8 @@ export class DslConnections extends React.Component<Props, 
State> {
             const fromX = pos.headerRect.x + pos.headerRect.width / 2 - 
this.props.left;
             const fromY = pos.headerRect.y + pos.headerRect.height / 2 - 
this.props.top;
             const r = pos.headerRect.height / 2;
-            const className = CamelUi.hasDirectUri(pos.step) ? "path-direct" : 
"path-seda";
-            return this.getInternalLine(uri, key, className, fromX, fromY, r);
+            const className = (CamelUi.hasDirectUri(pos.step) ? "path-direct" 
: "path-seda") + (data[2] ? "-selected" : "");
+            return this.getInternalLine(uri, key, className, fromX, fromY, r, 
data[1]);
         } else if (pos?.step.dslName === 'SagaDefinition'){
             const saga = (pos?.step as SagaDefinition);
             const fromX = pos.headerRect.x + pos.headerRect.width / 2 - 
this.props.left;
@@ -210,18 +210,18 @@ export class DslConnections extends 
React.Component<Props, State> {
             if (saga.completion && (saga.completion.startsWith("direct") || 
saga.completion.startsWith("seda"))){
                 const key = pos.step.uuid + "-completion"
                 const className = saga.completion.startsWith("direct") ? 
"path-direct" : "path-seda";
-                result.push(this.getInternalLine(saga.completion, key, 
className, fromX, fromY, r));
+                result.push(this.getInternalLine(saga.completion, key, 
className, fromX, fromY, r, data[1]));
             }
             if (saga.compensation && (saga.compensation.startsWith("direct") 
|| saga.compensation.startsWith("seda"))){
                 const key = pos.step.uuid + "-compensation"
                 const className = saga.compensation.startsWith("direct") ? 
"path-direct" : "path-seda";
-                result.push(this.getInternalLine(saga.compensation, key, 
className, fromX, fromY, r));
+                result.push(this.getInternalLine(saga.compensation, key, 
className, fromX, fromY, r, data[1]));
             }
             return result;
         }
     }
 
-    getInternalLine(uri: string, key: string, className: string, fromX: 
number, fromY: number, r: number) {
+    getInternalLine(uri: string, key: string, className: string, fromX: 
number, fromY: number, r: number, i: number) {
         const target = Array.from(this.state.steps.values())
             .filter(s => s.step.dslName === 'FromDefinition')
             .filter(s => (s.step as any).uri && (s.step as any).uri === 
uri)[0];
@@ -229,6 +229,7 @@ export class DslConnections extends React.Component<Props, 
State> {
             const targetX = target.headerRect.x + target.headerRect.width / 2 
- this.props.left;
             const targetY = target.headerRect.y + target.headerRect.height / 2 
- this.props.top;
             const gap = 100;
+            const add = 0.2;
 
             // right
             if (targetX - fromX >= gap) {
@@ -237,7 +238,7 @@ export class DslConnections extends React.Component<Props, 
State> {
                 const endX = targetX - r * 2 + 4;
                 const endY = targetY;
 
-                const coefX = 24;
+                const coefX = 24 + (i * add);
                 const coefY = (targetY > fromY) ? 24 : -24;
 
                 const pointX1 = startX + coefX;
@@ -260,7 +261,7 @@ export class DslConnections extends React.Component<Props, 
State> {
                 const endX = targetX - r * 2 + 4;
                 const endY = targetY;
 
-                const coefX = -24;
+                const coefX = -24 - (i * add);
                 const coefY = (targetY > fromY) ? 24 : -24;
 
                 const pointX1 = startX + coefX;
@@ -283,7 +284,7 @@ export class DslConnections extends React.Component<Props, 
State> {
                 const endX = targetX + r * 2 - 4;
                 const endY = targetY;
 
-                const coefX = 24;
+                const coefX = 24 + (i * add);
                 const coefY = (targetY > fromY) ? 24 : -24;
 
                 const pointX1 = startX + coefX;
@@ -306,7 +307,7 @@ export class DslConnections extends React.Component<Props, 
State> {
                 const endX = targetX + r * 2 - 4;
                 const endY = targetY;
 
-                const coefX = -24;
+                const coefX = -24 - (i * add);
                 const coefY = (targetY > fromY) ? 24 : -24;
 
                 const pointX1 = startX + coefX;
@@ -327,7 +328,8 @@ export class DslConnections extends React.Component<Props, 
State> {
         }
     }
 
-    getInternalPath(key: string, className: string, startX: number, startY: 
number, pointX1: number, pointY1: number, pointX2: number, pointY2: number, 
pointLX: number, pointLY: number, pointX3: number, pointY3: number, pointX4: 
number, pointY4: number, endX: number, endY: number) {
+    getInternalPath(key: string, className: string, startX: number, startY: 
number, pointX1: number, pointY1: number, pointX2: number, pointY2: number, 
pointLX: number, pointLY: number,
+                    pointX3: number, pointY3: number, pointX4: number, 
pointY4: number, endX: number, endY: number) {
         return (
             <g key={key}>
                 <path d={`M ${startX} ${startY} 
@@ -367,7 +369,7 @@ export class DslConnections extends React.Component<Props, 
State> {
             if (parent) {
                 const startX = parent.headerRect.x + parent.headerRect.width / 
2 - this.props.left;
                 const startY = parent.headerRect.y + parent.headerRect.height 
- this.props.top;
-                if (!pos.inSteps || (pos.inSteps && pos.position === 0) && 
parent.step.dslName !== 'MulticastDefinition') {
+                if ((!pos.inSteps || (pos.inSteps && pos.position === 0)) && 
parent.step.dslName !== 'MulticastDefinition') {
                     return (
                         <path d={`M ${startX},${startY} C ${startX},${endY} 
${endX},${startY}   ${endX},${endY}`}
                               className="path" key={pos.step.uuid} 
markerEnd="url(#arrowhead)"/>
@@ -417,7 +419,7 @@ export class DslConnections extends React.Component<Props, 
State> {
                 {steps.map(pos => this.getArrow(pos))}
                 {this.getIncomings().map(p => this.getIncoming(p))}
                 {this.getOutgoings().map(p => this.getOutgoing(p))}
-                {this.getIntegrals().map(p => this.getInternalLines(p)).flat()}
+                {this.getInternals().map((p) => 
this.getInternalLines(p)).flat()}
             </svg>
         )
     }
diff --git a/karavan-designer/src/designer/route/DslElement.tsx 
b/karavan-designer/src/designer/route/DslElement.tsx
index d4f7f5d..9176a31 100644
--- a/karavan-designer/src/designer/route/DslElement.tsx
+++ b/karavan-designer/src/designer/route/DslElement.tsx
@@ -171,7 +171,7 @@ export class DslElement extends React.Component<Props, 
State> {
         return style;
     }
 
-    sendPosition = (el: HTMLDivElement | null) => {
+    sendPosition = (el: HTMLDivElement | null, isSelected: boolean) => {
         const node = ReactDOM.findDOMNode(this);
         if (node && el) {
             const header = Array.from(node.childNodes.values()).filter((n: 
any) => n.classList.contains("header"))[0];
@@ -179,7 +179,7 @@ export class DslElement extends React.Component<Props, 
State> {
                 const headerIcon: any = 
Array.from(header.childNodes.values()).filter((n: any) => 
n.classList.contains("header-icon"))[0];
                 const headerRect = headerIcon.getBoundingClientRect();
                 const rect = el.getBoundingClientRect();
-                EventBus.sendPosition("add", this.state.step, 
this.props.parent, rect, headerRect, this.props.position, this.props.inSteps);
+                EventBus.sendPosition("add", this.state.step, 
this.props.parent, rect, headerRect, this.props.position, this.props.inSteps, 
isSelected);
             }
         }
     }
@@ -194,7 +194,7 @@ export class DslElement extends React.Component<Props, 
State> {
         return (
             <div className={headerClasses} style={this.getHeaderStyle()} 
data-tour={step.dslName}>
                 {this.state.step.dslName !== 'RouteDefinition' &&
-                    <div ref={el => this.sendPosition(el)}
+                    <div ref={el => this.sendPosition(el, this.isSelected())}
                          data-tour={step.dslName + "-icon"}
                          className={"header-icon"}
                          style={this.isWide() ? {width: ""} : {}}>
@@ -214,7 +214,7 @@ export class DslElement extends React.Component<Props, 
State> {
 
     getHeaderTextWithTooltip = (step: CamelElement) => {
         const checkRequired = CamelUtil.checkRequired(step);
-        const title = CamelUi.getElementTitle(this.state.step);
+        const title = (step as any).description ? (step as any).description : 
CamelUi.getElementTitle(this.state.step);
         let className = this.hasWideChildrenElement() ? "text text-right" : 
"text text-bottom";
         if (!checkRequired[0]) className = className + " header-text-required";
         if (checkRequired[0]) return <Text className={className}>{title}</Text>
@@ -326,7 +326,6 @@ export class DslElement extends React.Component<Props, 
State> {
     }
 
     getAddStepButton() {
-        const tourClass = this.props.showTour ? "add-button-tour" : "";
         return (
             <Tooltip position={"bottom"}
                      content={<div>{"Add step to " + 
CamelUi.getTitle(this.state.step)}</div>}>
@@ -378,7 +377,7 @@ export class DslElement extends React.Component<Props, 
State> {
             <div key={"root" + element.uuid}
                  data-tour={this.props.parent ? "" : "route-created"}
                  className={this.isSelected() ? "step-element 
step-element-selected" : "step-element"}
-                 ref={el => this.sendPosition(el)}
+                 ref={el => this.sendPosition(el, this.isSelected())}
                  style={{
                      borderStyle: this.hasBorder() ? "dotted" : "none",
                      borderColor: this.isSelected() ? 
"var(--step-border-color-selected)" : "var(--step-border-color)",
diff --git a/karavan-designer/src/designer/route/DslSelector.tsx 
b/karavan-designer/src/designer/route/DslSelector.tsx
index 73b5c35..46af447 100644
--- a/karavan-designer/src/designer/route/DslSelector.tsx
+++ b/karavan-designer/src/designer/route/DslSelector.tsx
@@ -45,8 +45,14 @@ interface State {
 
 export class DslSelector extends React.Component<Props, State> {
 
+    getDefaultTabIndex = () => {
+        const x = CamelUi.getSelectorModelTypes(this.props.parentDsl, 
this.props.showSteps);
+        if (x.length > 0) return x[0][0]
+        else return '';
+    }
+
     public state: State = {
-        tabIndex: this.props.tabIndex ? this.props.tabIndex : 
CamelUi.getSelectorModelTypes(this.props.parentDsl, this.props.showSteps)[0][0],
+        tabIndex: this.props.tabIndex ? this.props.tabIndex : 
this.getDefaultTabIndex(),
     }
 
 
diff --git a/karavan-designer/src/designer/route/RouteDesigner.tsx 
b/karavan-designer/src/designer/route/RouteDesigner.tsx
index bae6794..51fa188 100644
--- a/karavan-designer/src/designer/route/RouteDesigner.tsx
+++ b/karavan-designer/src/designer/route/RouteDesigner.tsx
@@ -21,7 +21,7 @@ import {
     DrawerContent,
     DrawerContentBody,
     Button, Modal,
-    PageSection, Flex, FlexItem, Text
+    PageSection
 } from '@patternfly/react-core';
 import '../karavan.css';
 import {DslSelector} from "./DslSelector";
diff --git a/karavan-designer/src/designer/route/property/DslPropertyField.tsx 
b/karavan-designer/src/designer/route/property/DslPropertyField.tsx
index fb74c51..25f6f94 100644
--- a/karavan-designer/src/designer/route/property/DslPropertyField.tsx
+++ b/karavan-designer/src/designer/route/property/DslPropertyField.tsx
@@ -152,7 +152,7 @@ export class DslPropertyField extends 
React.Component<Props, State> {
 
     selectKubernetes = (value: string) => {
         const propertyName = this.state.kubernetesSelectorProperty;
-        if (propertyName){
+        if (propertyName) {
             if (value.startsWith("config") || value.startsWith("secret")) 
value = "{{" + value + "}}";
             this.propertyChanged(propertyName, value);
             this.setState({showKubernetesSelector: false, 
kubernetesSelectorProperty: undefined})
@@ -242,7 +242,7 @@ export class DslPropertyField extends 
React.Component<Props, State> {
     }
 
     getSwitch = (property: PropertyMeta, value: any) => {
-        const isChecked = value != undefined ? Boolean(value) : 
Boolean(property.defaultValue != undefined && property.defaultValue === 'true');
+        const isChecked = value !== undefined ? Boolean(value) : 
Boolean(property.defaultValue !== undefined && property.defaultValue === 
'true');
         return (
             <Switch
                 id={property.name} name={property.name}
@@ -476,15 +476,18 @@ export class DslPropertyField extends 
React.Component<Props, State> {
     getMainComponentParameters = (properties: ComponentProperty[]) => {
         return (
             <div className="parameters">
-                {properties.map(kp =>
-                    <ComponentParameterField
+                {properties.map(kp => {
+                    // console.log(kp);
+                    // 
console.log(CamelDefinitionApiExt.getParametersValue(this.props.element, 
kp.name, kp.kind === 'path'));
+                    return (<ComponentParameterField
                         key={kp.name}
                         property={kp}
                         element={this.props.element}
                         integration={this.props.integration}
                         
value={CamelDefinitionApiExt.getParametersValue(this.props.element, kp.name, 
kp.kind === 'path')}
                         onParameterChange={this.props.onParameterChange}
-                    />)}
+                    />)
+                })}
             </div>
         )
     }
@@ -524,7 +527,7 @@ export class DslPropertyField extends 
React.Component<Props, State> {
                     bodyContent={property.description}
                     footerContent={
                         <div>
-                            {property.defaultValue !== undefined && 
property.defaultValue.toString().trim().length >0 && <div>{"Default: " + 
property.defaultValue}</div>}
+                            {property.defaultValue !== undefined && 
property.defaultValue.toString().trim().length > 0 && <div>{"Default: " + 
property.defaultValue}</div>}
                             {property.required && <b>Required</b>}
                         </div>
                     }>
@@ -544,7 +547,7 @@ export class DslPropertyField extends 
React.Component<Props, State> {
         return ['string'].includes(property.type) && property.name !== 
'expression' && property.isArray && !property.enumVals;
     }
 
-    getComponentParameters (property: PropertyMeta) {
+    getComponentParameters(property: PropertyMeta) {
         const properties = 
CamelUtil.getComponentProperties(this.props.element);
         const propertiesMain = properties.filter(p => 
!p.label.includes("advanced") && !p.label.includes("security") && 
!p.label.includes("scheduler"));
         const propertiesAdvanced = properties.filter(p => 
p.label.includes("advanced"));
@@ -553,11 +556,11 @@ export class DslPropertyField extends 
React.Component<Props, State> {
         return (
             <>
                 {property.name === 'parameters' && 
this.getMainComponentParameters(propertiesMain)}
-                {property.name === 'parameters' && this.props.element && 
propertiesScheduler.length >0
+                {property.name === 'parameters' && this.props.element && 
propertiesScheduler.length > 0
                     && 
this.getExpandableComponentParameters(propertiesScheduler, "Scheduler 
parameters")}
-                {property.name === 'parameters' && this.props.element && 
propertiesSecurity.length >0
+                {property.name === 'parameters' && this.props.element && 
propertiesSecurity.length > 0
                     && 
this.getExpandableComponentParameters(propertiesSecurity, "Security 
parameters")}
-                {property.name === 'parameters' && this.props.element && 
propertiesAdvanced.length >0
+                {property.name === 'parameters' && this.props.element && 
propertiesAdvanced.length > 0
                     && 
this.getExpandableComponentParameters(propertiesAdvanced, "Advanced 
parameters")}
             </>
         )
diff --git 
a/karavan-designer/src/designer/route/property/KameletPropertyField.tsx 
b/karavan-designer/src/designer/route/property/KameletPropertyField.tsx
index eb2be0a..4bee8ce 100644
--- a/karavan-designer/src/designer/route/property/KameletPropertyField.tsx
+++ b/karavan-designer/src/designer/route/property/KameletPropertyField.tsx
@@ -19,7 +19,7 @@ import {
     FormGroup,
     TextInput,
     Popover,
-    Switch, InputGroup, Button, TextArea, Text, Tooltip, Modal,
+    Switch, InputGroup, Button, TextArea, Tooltip
 } from '@patternfly/react-core';
 import '../../karavan.css';
 import "@patternfly/patternfly/patternfly.css";
diff --git 
a/karavan-designer/src/designer/route/property/KubernetesSelector.tsx 
b/karavan-designer/src/designer/route/property/KubernetesSelector.tsx
index 99ee3ba..9791af2 100644
--- a/karavan-designer/src/designer/route/property/KubernetesSelector.tsx
+++ b/karavan-designer/src/designer/route/property/KubernetesSelector.tsx
@@ -24,8 +24,6 @@ import {
 import '../../karavan.css';
 import {TableComposable, Tbody, Td, Th, Thead, Tr} from 
"@patternfly/react-table";
 import {KubernetesAPI} from "../../utils/KubernetesAPI";
-import {CamelUi} from "../../utils/CamelUi";
-import {CamelUtil} from 
"../../../../../../../../karavan-core/lib/api/CamelUtil";
 
 interface Props {
     onSelect: (value: string) => void,
diff --git a/karavan-designer/src/designer/utils/EventBus.ts 
b/karavan-designer/src/designer/utils/EventBus.ts
index 285eb75..c0781e2 100644
--- a/karavan-designer/src/designer/utils/EventBus.ts
+++ b/karavan-designer/src/designer/utils/EventBus.ts
@@ -24,6 +24,7 @@ export class DslPosition {
     step: CamelElement = new CamelElement("");
     parent: CamelElement | undefined;
     inSteps: boolean = false;
+    isSelected: boolean = false;
     position: number = 0;
     rect: DOMRect = new DOMRect();
     headerRect: DOMRect = new DOMRect();
@@ -35,7 +36,8 @@ export class DslPosition {
                 rect: DOMRect,
                 headerRect:DOMRect,
                 position: number,
-                inSteps: boolean = false) {
+                inSteps: boolean = false,
+                isSelected: boolean = false) {
         this.command = command;
         this.step = step;
         this.parent = parent;
@@ -43,6 +45,7 @@ export class DslPosition {
         this.headerRect = headerRect;
         this.inSteps = inSteps;
         this.position = position;
+        this.isSelected = isSelected;
     }
 }
 
@@ -68,7 +71,8 @@ export const EventBus = {
                    rect: DOMRect,
                    headerRect: DOMRect,
                    position: number,
-                   inSteps: boolean = false) => positions.next(new 
DslPosition(command, step, parent, rect, headerRect, position, inSteps)),
+                   inSteps: boolean = false,
+                   isSelected: boolean = false) => positions.next(new 
DslPosition(command, step, parent, rect, headerRect, position, inSteps, 
isSelected)),
     onPosition: () => positions.asObservable(),
 
 
diff --git a/karavan-vscode/webview/builder/BuilderPage.tsx 
b/karavan-vscode/webview/builder/BuilderPage.tsx
index 605521c..43c27d5 100644
--- a/karavan-vscode/webview/builder/BuilderPage.tsx
+++ b/karavan-vscode/webview/builder/BuilderPage.tsx
@@ -181,7 +181,6 @@ export class BuilderPage extends React.Component<Props, 
State> {
     }
 
     getHeader() {
-        const {project} = this.state;
         return (
             <PageSection className="tools-section" variant={this.props.dark ? 
PageSectionVariants.darker : PageSectionVariants.light}>
                 <Flex className="tools" direction={{default: 'row'}} 
justifyContent={{default: 'justifyContentSpaceBetween'}} spaceItems={{default: 
'spaceItemsLg'}}>
diff --git a/karavan-vscode/webview/components/ComponentCard.tsx 
b/karavan-vscode/webview/components/ComponentCard.tsx
index 6d465f3..1fe5269 100644
--- a/karavan-vscode/webview/components/ComponentCard.tsx
+++ b/karavan-vscode/webview/components/ComponentCard.tsx
@@ -16,7 +16,7 @@
  */
 import React from 'react';
 import {
-    CardHeader, Card, CardTitle, CardBody, CardActions, CardFooter,Badge
+    CardHeader, Card, CardTitle, CardBody, CardFooter,Badge
 } from '@patternfly/react-core';
 import '../designer/karavan.css';
 import {camelIcon, CamelUi} from "../designer/utils/CamelUi";

Reply via email to