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 9eca7d1 Select bean component (#186)
9eca7d1 is described below
commit 9eca7d1b1a4082aec7206cabcf7f70fddbfc14cf
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Fri Feb 11 10:57:47 2022 -0500
Select bean component (#186)
* Beans in Component configuration
* Basic bean config for components
---
karavan-core/src/core/api/ComponentApi.ts | 3 +-
karavan-demo/integrations/docker-compose.yml | 118 +++++++-------
karavan-demo/integrations/sql-to-kafka.yaml | 19 +++
karavan-demo/integrations/sql-to-log.yaml | 27 ++++
karavan-demo/integrations/timer-yaml.yaml | 11 --
karavan-designer/public/components/sql.json | 2 +-
.../kamelets/insert-field-action.kamelet.yaml | 12 +-
karavan-designer/src/App.tsx | 6 +-
.../src/designer/field/ComponentParameterField.tsx | 120 --------------
.../src/designer/route/DslProperties.tsx | 4 +-
.../route/property/ComponentParameterField.tsx | 173 +++++++++++++++++++++
.../{field => route/property}/DataFormatField.tsx | 2 +-
.../{field => route/property}/DslPropertyField.tsx | 6 +-
.../{field => route/property}/ExpressionField.tsx | 4 +-
.../property}/KameletPropertyField.tsx | 2 +-
.../{field => route/property}/ObjectField.tsx | 2 +-
16 files changed, 300 insertions(+), 211 deletions(-)
diff --git a/karavan-core/src/core/api/ComponentApi.ts
b/karavan-core/src/core/api/ComponentApi.ts
index 347ddd1..f598d5a 100644
--- a/karavan-core/src/core/api/ComponentApi.ts
+++ b/karavan-core/src/core/api/ComponentApi.ts
@@ -174,8 +174,7 @@ export const ComponentApi = {
prop.enum = value.enum;
prop.kind = value.kind;
if (value.defaultValue) prop.defaultValue =
value.defaultValue
- if (!value.deprecated && value.type !== 'object')
properties.push(prop);
- if (!value.deprecated && value.type === 'object' &&
value.enum) properties.push(prop);
+ if (!value.deprecated) properties.push(prop);
})
}
} finally {
diff --git a/karavan-demo/integrations/docker-compose.yml
b/karavan-demo/integrations/docker-compose.yml
index 24e861a..4693a45 100644
--- a/karavan-demo/integrations/docker-compose.yml
+++ b/karavan-demo/integrations/docker-compose.yml
@@ -2,57 +2,57 @@
version: '3.8'
services:
- mongo:
- image: mongo
- restart: always
- ports:
- - 27017:27017
- environment:
- MONGO_INITDB_ROOT_USERNAME: root
- MONGO_INITDB_ROOT_PASSWORD: example
- networks:
- - karavan-demo
+ # mongo:
+ # image: mongo
+ # restart: always
+ # ports:
+ # - 27017:27017
+ # environment:
+ # MONGO_INITDB_ROOT_USERNAME: root
+ # MONGO_INITDB_ROOT_PASSWORD: example
+ # networks:
+ # - karavan-demo
- zookeeper:
- container_name: zookeeper
- image: confluentinc/cp-zookeeper:latest
- ports:
- - "2181:2181"
- environment:
- ZOOKEEPER_CLIENT_PORT: 2181
- ZOOKEEPER_TICK_TIME: 2000
- networks:
- - karavan-demo
+ # zookeeper:
+ # container_name: zookeeper
+ # image: confluentinc/cp-zookeeper:latest
+ # ports:
+ # - "2181:2181"
+ # environment:
+ # ZOOKEEPER_CLIENT_PORT: 2181
+ # ZOOKEEPER_TICK_TIME: 2000
+ # networks:
+ # - karavan-demo
- kafka:
- container_name: kafka
- image: confluentinc/cp-kafka:latest
- depends_on:
- - zookeeper
- ports:
- - "9092:9092"
- environment:
- KAFKA_BROKER_ID: 1
- KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
- KAFKA_ADVERTISED_LISTENERS:
PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:
PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
- KAFKA_CREATE_TOPICS: "events:1:1"
- networks:
- - karavan-demo
+ # kafka:
+ # container_name: kafka
+ # image: confluentinc/cp-kafka:latest
+ # depends_on:
+ # - zookeeper
+ # ports:
+ # - "9092:9092"
+ # environment:
+ # KAFKA_BROKER_ID: 1
+ # KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+ # KAFKA_ADVERTISED_LISTENERS:
PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
+ # KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:
PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
+ # KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
+ # KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+ # KAFKA_CREATE_TOPICS: "events:1:1"
+ # networks:
+ # - karavan-demo
- activemq:
- image: registry.redhat.io/amq7/amq-broker:latest
- container_name: activemq
- environment:
- - AMQ_USER=admin
- - AMQ_PASSWORD=admin
- ports:
- - "61616:61616"
- - "8161:8161"
- networks:
- - karavan-demo
+ # activemq:
+ # image: registry.redhat.io/amq7/amq-broker:latest
+ # container_name: activemq
+ # environment:
+ # - AMQ_USER=admin
+ # - AMQ_PASSWORD=admin
+ # ports:
+ # - "61616:61616"
+ # - "8161:8161"
+ # networks:
+ # - karavan-demo
postgres:
image: postgres
@@ -70,17 +70,17 @@ services:
networks:
- karavan-demo
- # pgadmin:
- # container_name: pgadmin
- # image: dpage/pgadmin4
- # restart: always
- # environment:
- # PGADMIN_DEFAULT_EMAIL: [email protected]
- # PGADMIN_DEFAULT_PASSWORD: root
- # ports:
- # - "5050:80"
- # networks:
- # - karavan-demo
+ pgadmin:
+ container_name: pgadmin
+ image: dpage/pgadmin4
+ restart: always
+ environment:
+ PGADMIN_DEFAULT_EMAIL: [email protected]
+ PGADMIN_DEFAULT_PASSWORD: root
+ ports:
+ - "5050:80"
+ networks:
+ - karavan-demo
# mysql:
# image: mysql
diff --git a/karavan-demo/integrations/sql-to-kafka.yaml
b/karavan-demo/integrations/sql-to-kafka.yaml
new file mode 100644
index 0000000..527429b
--- /dev/null
+++ b/karavan-demo/integrations/sql-to-kafka.yaml
@@ -0,0 +1,19 @@
+- route:
+ from:
+ uri: "sql:SELECT * FROM table1"
+ parameters:
+ dataSource: "datasource"
+ steps:
+ - marshal:
+ json:
+ library: Jackson
+ - log: "${body}"
+- beans:
+ - name: datasource
+ type: "org.apache.commons.dbcp2.BasicDataSource"
+ properties:
+ username: postgres
+ password: postgres
+ url: jdbc:postgresql:localhost:5432:demo
+ driverClassName: org.postgresql.Driver
+
diff --git a/karavan-demo/integrations/sql-to-log.yaml
b/karavan-demo/integrations/sql-to-log.yaml
new file mode 100644
index 0000000..c657a25
--- /dev/null
+++ b/karavan-demo/integrations/sql-to-log.yaml
@@ -0,0 +1,27 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+ name: sql-to-log.yaml
+spec:
+ dependencies:
+ - "mvn:org.postgresql:postgresql:42.2.14"
+ - "mvn:org.apache.commons:commons-dbcp2:2.9.0"
+ flows:
+ - route:
+ from:
+ uri: "sql:SELECT * FROM table1"
+ parameters:
+ dataSource: "datasource"
+ steps:
+ - marshal:
+ json:
+ library: Jackson
+ - log: "${body}"
+ - beans:
+ - name: datasource
+ type: "org.apache.commons.dbcp2.BasicDataSource"
+ properties:
+ username: postgres
+ password: postgres
+ url: jdbc:postgresql:localhost:5432:demo
+ driverClassName: org.postgresql.Driver
diff --git a/karavan-demo/integrations/timer-yaml.yaml
b/karavan-demo/integrations/timer-yaml.yaml
deleted file mode 100644
index d725e86..0000000
--- a/karavan-demo/integrations/timer-yaml.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- route:
- from:
- uri: kamelet:timer-source
- steps:
- - log:
- message: ${body}
- loggingLevel: INFO
- logName: demo
- parameters:
- period: 3000
- message: Hello world
diff --git a/karavan-designer/public/components/sql.json
b/karavan-designer/public/components/sql.json
index 5a476eb..cad3841 100644
--- a/karavan-designer/public/components/sql.json
+++ b/karavan-designer/public/components/sql.json
@@ -1 +1 @@
-{"component":{"kind":"component","name":"sql","title":"SQL","description":"Perform
SQL queries using Spring
JDBC.","deprecated":false,"firstVersion":"1.4.0","label":"database,sql","javaType":"org.apache.camel.component.sql.SqlComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-sql","version":"3.12.0","scheme":"sql","extendsScheme":"","syntax":"sql:query","async":false,"api":false,"consumerOnly":false,"producerOnly":false,"lenientProperties":false},"propert
[...]
\ No newline at end of file
+{"component":{"kind":"component","name":"sql","title":"SQL","description":"Perform
SQL queries using Spring
JDBC.","deprecated":false,"firstVersion":"1.4.0","label":"database,sql","javaType":"org.apache.camel.component.sql.SqlComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-sql","version":"3.15.0","scheme":"sql","extendsScheme":"","syntax":"sql:query","async":false,"api":false,"consumerOnly":false,"producerOnly":false,"lenientProperties":false},"propert
[...]
\ No newline at end of file
diff --git a/karavan-designer/public/kamelets/insert-field-action.kamelet.yaml
b/karavan-designer/public/kamelets/insert-field-action.kamelet.yaml
index 951795d..f40116f 100644
--- a/karavan-designer/public/kamelets/insert-field-action.kamelet.yaml
+++ b/karavan-designer/public/kamelets/insert-field-action.kamelet.yaml
@@ -1,7 +1,7 @@
apiVersion: camel.apache.org/v1alpha1
kind: Kamelet
metadata:
- name: insert-field-action
+ name: insert-property-action
labels:
camel.apache.org/kamelet.type: "action"
annotations:
@@ -22,16 +22,16 @@ spec:
No headers mapping supported, only constant values.
required:
- - field
+ - property
- value
properties:
field:
title: Field
- description: The name of the field to be added
+ description: The name of the property to be added
type: string
value:
title: Value
- description: The value of the field
+ description: The value of the property
type: string
type: object
dependencies:
@@ -55,8 +55,8 @@ spec:
library: Jackson
unmarshalTypeName: com.fasterxml.jackson.databind.JsonNode
- set-property:
- name: "field"
- constant: "{{field}}"
+ name: "property"
+ constant: "{{property}}"
- set-property:
name: "value"
constant: "{{value}}"
diff --git a/karavan-designer/src/App.tsx b/karavan-designer/src/App.tsx
index c504245..bb4ab23 100644
--- a/karavan-designer/src/App.tsx
+++ b/karavan-designer/src/App.tsx
@@ -84,7 +84,7 @@ class App extends React.Component<Props, State> {
' - beans:\n' +
' - name: myNested\n' +
' type: ${MyBean.class.name}\n' +
- ' properties:\n' +
+ ' property:\n' +
' field1: \'value1\'\n' +
' field2: \'value2\'\n' +
' nested:\n' +
@@ -92,7 +92,7 @@ class App extends React.Component<Props, State> {
' bar: \'valueBar\'\n' +
' - name: myProps\n' +
' type: ${MyBean.class.name}\n' +
- ' properties:\n' +
+ ' property:\n' +
' field1: \'f1_p\'\n' +
' field2: \'f2_p\'\n' +
' nested.foo: \'nf1_p\'\n' +
@@ -110,7 +110,7 @@ class App extends React.Component<Props, State> {
"http-secured-source.kamelet.yaml",
"http-sink.kamelet.yaml",
"http-source.kamelet.yaml",
- "insert-field-action.kamelet.yaml",
+ "insert-property-action.kamelet.yaml",
"insert-header-action.kamelet.yaml",
"kafka-not-secured-sink.kamelet.yaml",
"kafka-not-secured-source.kamelet.yaml",
diff --git a/karavan-designer/src/designer/field/ComponentParameterField.tsx
b/karavan-designer/src/designer/field/ComponentParameterField.tsx
deleted file mode 100644
index 85cce99..0000000
--- a/karavan-designer/src/designer/field/ComponentParameterField.tsx
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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 React from 'react';
-import {
- FormGroup,
- TextInput,
- Popover,
- Switch,
- Select,
- SelectVariant,
- SelectDirection,
- SelectOption,
-} from '@patternfly/react-core';
-import '../karavan.css';
-import "@patternfly/patternfly/patternfly.css";
-import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
-import {ComponentProperty} from "karavan-core/lib/model/ComponentModels";
-
-interface Props {
- property: ComponentProperty,
- value: any,
- onParameterChange?: (parameter: string, value: string | number | boolean |
any, pathParameter?: boolean) => void
-}
-
-interface State {
- selectIsOpen: boolean
-}
-
-export class ComponentParameterField extends React.Component<Props, State> {
-
- public state: State = {
- selectIsOpen: false,
- }
-
- openSelect = () => {
- this.setState({selectIsOpen: true});
- }
-
- parametersChanged = (parameter: string, value: string | number | boolean |
any, pathParameter?: boolean) => {
- this.props.onParameterChange?.call(this, parameter, value,
pathParameter);
- this.setState({selectIsOpen: false});
- }
-
- render() {
- const property: ComponentProperty = this.props.property;
- const value = this.props.value;
- const prefix = "parameters";
- const id = prefix + "-" + property.name;
- const selectOptions: JSX.Element[] = []
- if (property.enum && property.enum.length > 0) {
- selectOptions.push(<SelectOption key={0} value={"Select ..."}
isPlaceholder/>);
- property.enum.forEach(v => selectOptions.push(<SelectOption
key={v} value={v}/>));
- }
- return (
- <FormGroup
- key={id}
- label={property.displayName}
- fieldId={id}
- isRequired={property.kind === 'path' || property.required}
- labelIcon={
- <Popover
- position={"left"}
- headerContent={property.displayName}
- bodyContent={property.description}
- footerContent={property.defaultValue !== undefined ?
"Default: " + property.defaultValue : undefined}>
- <button type="button" aria-label="More info"
onClick={e => e.preventDefault()}
- className="pf-c-form__group-label-help">
- <HelpIcon noVerticalAlign/>
- </button>
- </Popover>
- }>
- {['string', 'duration', 'integer', 'int',
'number'].includes(property.type) && property.enum === undefined &&
- <TextInput
- className="text-field" isRequired
- type={['integer', 'int', 'number'].includes(property.type)
? 'number' : (property.secret ? "password" : "text")}
- id={id} name={id}
- value={value !== undefined ? value : property.defaultValue}
- onChange={e => this.parametersChanged(property.name,
['integer', 'int', 'number'].includes(property.type) ? Number(e) : e,
property.kind === 'path')}/>
- }
- {['string', 'object'].includes(property.type) && property.enum
&&
- <Select
- variant={SelectVariant.single}
- aria-label={property.name}
- onToggle={isExpanded => {
- this.openSelect()
- }}
- onSelect={(e, value, isPlaceholder) =>
this.parametersChanged(property.name, (!isPlaceholder ? value : undefined),
property.kind === 'path')}
- selections={value !== undefined ? value.toString() :
property.defaultValue}
- isOpen={this.state.selectIsOpen}
- aria-labelledby={property.name}
- direction={SelectDirection.down}
- >
- {selectOptions}
- </Select>
- }
- {property.type === 'boolean' && <Switch
- id={id} name={id}
- value={value?.toString()}
- aria-label={id}
- isChecked={value !== undefined ? Boolean(value) === true :
Boolean(property.defaultValue) === true}
- onChange={e => this.parametersChanged(property.name,
!Boolean(value))}/>
- }
- </FormGroup>
- )
- }
-}
\ No newline at end of file
diff --git a/karavan-designer/src/designer/route/DslProperties.tsx
b/karavan-designer/src/designer/route/DslProperties.tsx
index c7fb57a..89e67e5 100644
--- a/karavan-designer/src/designer/route/DslProperties.tsx
+++ b/karavan-designer/src/designer/route/DslProperties.tsx
@@ -25,8 +25,8 @@ import {
} from '@patternfly/react-core';
import '../karavan.css';
import "@patternfly/patternfly/patternfly.css";
-import {DataFormatField} from "../field/DataFormatField";
-import {DslPropertyField} from "../field/DslPropertyField";
+import {DataFormatField} from "./property/DataFormatField";
+import {DslPropertyField} from "./property/DslPropertyField";
import {
CamelElement,
Integration,
diff --git
a/karavan-designer/src/designer/route/property/ComponentParameterField.tsx
b/karavan-designer/src/designer/route/property/ComponentParameterField.tsx
new file mode 100644
index 0000000..7b198b1
--- /dev/null
+++ b/karavan-designer/src/designer/route/property/ComponentParameterField.tsx
@@ -0,0 +1,173 @@
+/*
+ * 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 React from 'react';
+import {
+ FormGroup,
+ TextInput,
+ Popover,
+ Switch,
+ Select,
+ SelectVariant,
+ SelectDirection,
+ SelectOption,
+} from '@patternfly/react-core';
+import '../../karavan.css';
+import "@patternfly/patternfly/patternfly.css";
+import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
+import {ComponentProperty} from "karavan-core/lib/model/ComponentModels";
+import {CamelUi} from "../../utils/CamelUi";
+import {Integration} from "karavan-core/lib/model/CamelDefinition";
+
+const prefix = "parameters";
+
+interface Props {
+ property: ComponentProperty,
+ integration: Integration,
+ value: any,
+ onParameterChange?: (parameter: string, value: string | number | boolean |
any, pathParameter?: boolean) => void
+}
+
+interface State {
+ selectStatus: Map<string, boolean>
+}
+
+export class ComponentParameterField extends React.Component<Props, State> {
+
+ public state: State = {
+ selectStatus: new Map<string, boolean>(),
+ }
+
+ parametersChanged = (parameter: string, value: string | number | boolean |
any, pathParameter?: boolean) => {
+ this.props.onParameterChange?.call(this, parameter, value,
pathParameter);
+ this.setState({selectStatus: new Map<string, boolean>([[parameter,
false]])});
+ }
+
+ openSelect = (propertyName: string) => {
+ this.setState({selectStatus: new Map<string, boolean>([[propertyName,
true]])});
+ }
+
+ isSelectOpen = (propertyName: string): boolean => {
+ return this.state.selectStatus.has(propertyName) &&
this.state.selectStatus.get(propertyName) === true;
+ }
+
+ getSelectBean = (property: ComponentProperty, value: any) => {
+ const selectOptions: JSX.Element[] = [];
+ const beans = CamelUi.getBeans(this.props.integration);
+ if (beans) {
+ selectOptions.push(<SelectOption key={0} value={"Select..."}
isPlaceholder/>);
+ selectOptions.push(...beans.map((bean) => <SelectOption
key={bean.name} value={bean.name} description={bean.type}/>));
+ }
+ return (
+ <Select
+ variant={SelectVariant.single}
+ aria-label={property.name}
+ onToggle={isExpanded => {
+ this.openSelect(property.name)
+ }}
+ onSelect={(e, value, isPlaceholder) =>
this.parametersChanged(property.name, (!isPlaceholder ? value : undefined))}
+ selections={value}
+ isOpen={this.isSelectOpen(property.name)}
+ aria-labelledby={property.name}
+ direction={SelectDirection.down}
+ >
+ {selectOptions}
+ </Select>
+ )
+ }
+
+ getTextInput = (property: ComponentProperty, value: any) => {
+ const id = prefix + "-" + property.name;
+ return (
+ <TextInput
+ className="text-field" isRequired
+ type={['integer', 'int', 'number'].includes(property.type) ?
'number' : (property.secret ? "password" : "text")}
+ id={id} name={id}
+ value={value !== undefined ? value : property.defaultValue}
+ onChange={e => this.parametersChanged(property.name,
['integer', 'int', 'number'].includes(property.type) ? Number(e) : e,
property.kind === 'path')}/>
+ )
+ }
+
+ getSelect = (property: ComponentProperty, value: any) => {
+ const selectOptions: JSX.Element[] = []
+ if (property.enum && property.enum.length > 0) {
+ selectOptions.push(<SelectOption key={0} value={"Select ..."}
isPlaceholder/>);
+ property.enum.forEach(v => selectOptions.push(<SelectOption
key={v} value={v}/>));
+ }
+ return (
+ <Select
+ variant={SelectVariant.single}
+ aria-label={property.name}
+ onToggle={isExpanded => {
+ this.openSelect(property.name)
+ }}
+ onSelect={(e, value, isPlaceholder) =>
this.parametersChanged(property.name, (!isPlaceholder ? value : undefined),
property.kind === 'path')}
+ selections={value !== undefined ? value.toString() :
property.defaultValue}
+ isOpen={this.isSelectOpen(property.name)}
+ aria-labelledby={property.name}
+ direction={SelectDirection.down}
+ >
+ {selectOptions}
+ </Select>
+ )
+ }
+
+ getSwitch = (property: ComponentProperty, value: any) => {
+ const id = prefix + "-" + property.name;
+ return (
+ <Switch
+ id={id} name={id}
+ value={value?.toString()}
+ aria-label={id}
+ isChecked={value !== undefined ? Boolean(value) === true :
Boolean(property.defaultValue) === true}
+ onChange={e => this.parametersChanged(property.name,
!Boolean(value))}/>
+ )
+ }
+
+ render() {
+ const property: ComponentProperty = this.props.property;
+ const value = this.props.value;
+ const id = prefix + "-" + property.name;
+ return (
+ <FormGroup
+ key={id}
+ label={property.displayName}
+ fieldId={id}
+ isRequired={property.kind === 'path' || property.required}
+ labelIcon={
+ <Popover
+ position={"left"}
+ headerContent={property.displayName}
+ bodyContent={property.description}
+ footerContent={property.defaultValue !== undefined ?
"Default: " + property.defaultValue : undefined}>
+ <button type="button" aria-label="More info"
onClick={e => e.preventDefault()}
+ className="pf-c-form__group-label-help">
+ <HelpIcon noVerticalAlign/>
+ </button>
+ </Popover>
+ }>
+ {['string', 'duration', 'integer', 'int',
'number'].includes(property.type) && property.enum === undefined
+ && this.getTextInput(property, value)}
+ {['object'].includes(property.type) && !property.enum
+ && this.getSelectBean(property, value)}
+ {['string', 'object'].includes(property.type) && property.enum
+ && this.getSelect(property, value)}
+ {property.type === 'boolean'
+ && this.getSwitch(property, value)}
+ </FormGroup>
+ )
+ }
+}
\ No newline at end of file
diff --git a/karavan-designer/src/designer/field/DataFormatField.tsx
b/karavan-designer/src/designer/route/property/DataFormatField.tsx
similarity index 99%
rename from karavan-designer/src/designer/field/DataFormatField.tsx
rename to karavan-designer/src/designer/route/property/DataFormatField.tsx
index 7513eba..beb6ff4 100644
--- a/karavan-designer/src/designer/field/DataFormatField.tsx
+++ b/karavan-designer/src/designer/route/property/DataFormatField.tsx
@@ -22,7 +22,7 @@ import {
SelectDirection,
SelectOption,
} from '@patternfly/react-core';
-import '../karavan.css';
+import '../../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import {CamelMetadataApi, PropertyMeta} from
"karavan-core/lib/model/CamelMetadata";
import {CamelDefinitionApiExt} from
"karavan-core/lib/api/CamelDefinitionApiExt";
diff --git a/karavan-designer/src/designer/field/DslPropertyField.tsx
b/karavan-designer/src/designer/route/property/DslPropertyField.tsx
similarity index 98%
rename from karavan-designer/src/designer/field/DslPropertyField.tsx
rename to karavan-designer/src/designer/route/property/DslPropertyField.tsx
index c1941c9..841e3e1 100644
--- a/karavan-designer/src/designer/field/DslPropertyField.tsx
+++ b/karavan-designer/src/designer/route/property/DslPropertyField.tsx
@@ -25,7 +25,7 @@ import {
SelectDirection,
SelectOption, ExpandableSection, TextArea, Chip, TextInputGroup,
TextInputGroupMain, TextInputGroupUtilities, ChipGroup, Button, Text, Tooltip
} from '@patternfly/react-core';
-import '../karavan.css';
+import '../../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
import DeleteIcon from
"@patternfly/react-icons/dist/js/icons/times-circle-icon";
@@ -33,7 +33,7 @@ import {CamelUtil} from "karavan-core/lib/api/CamelUtil";
import { PropertyMeta} from "karavan-core/lib/model/CamelMetadata";
import {CamelDefinitionApiExt} from
"karavan-core/lib/api/CamelDefinitionApiExt";
import {ExpressionField} from "./ExpressionField";
-import {CamelUi} from "../utils/CamelUi";
+import {CamelUi} from "../../utils/CamelUi";
import {ComponentParameterField} from "./ComponentParameterField";
import {CamelElement, DataFormatDefinition, Integration} from
"karavan-core/lib/model/CamelDefinition";
import {KameletPropertyField} from "./KameletPropertyField";
@@ -268,6 +268,7 @@ export class DslPropertyField extends
React.Component<Props, State> {
<ComponentParameterField
key={kp.name}
property={kp}
+ integration={this.props.integration}
value={CamelDefinitionApiExt.getParametersValue(this.props.element, kp.name,
kp.kind === 'path')}
onParameterChange={this.props.onParameterChange}
/>)}
@@ -291,6 +292,7 @@ export class DslPropertyField extends
React.Component<Props, State> {
<div className="parameters">
{CamelUi.getComponentProperties(this.props.element,
true).map(kp =>
<ComponentParameterField
+ integration={this.props.integration}
key={kp.name}
property={kp}
value={CamelDefinitionApiExt.getParametersValue(this.props.element, kp.name,
kp.kind === 'path')}
diff --git a/karavan-designer/src/designer/field/ExpressionField.tsx
b/karavan-designer/src/designer/route/property/ExpressionField.tsx
similarity index 98%
rename from karavan-designer/src/designer/field/ExpressionField.tsx
rename to karavan-designer/src/designer/route/property/ExpressionField.tsx
index cc9608f..5fc1c0e 100644
--- a/karavan-designer/src/designer/field/ExpressionField.tsx
+++ b/karavan-designer/src/designer/route/property/ExpressionField.tsx
@@ -23,7 +23,7 @@ import {
SelectDirection,
SelectOption,
} from '@patternfly/react-core';
-import '../karavan.css';
+import '../../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
import {CamelMetadataApi, Languages, PropertyMeta} from
"karavan-core/lib/model/CamelMetadata";
@@ -31,7 +31,7 @@ import {CamelDefinitionApiExt} from
"karavan-core/lib/api/CamelDefinitionApiExt"
import {CamelElement, ExpressionDefinition, Integration} from
"karavan-core/lib/model/CamelDefinition";
import {CamelDefinitionApi} from "karavan-core/lib/api/CamelDefinitionApi";
import {DslPropertyField} from "./DslPropertyField";
-import {CamelUi} from "../utils/CamelUi";
+import {CamelUi} from "../../utils/CamelUi";
interface Props {
property: PropertyMeta,
diff --git a/karavan-designer/src/designer/field/KameletPropertyField.tsx
b/karavan-designer/src/designer/route/property/KameletPropertyField.tsx
similarity index 99%
rename from karavan-designer/src/designer/field/KameletPropertyField.tsx
rename to karavan-designer/src/designer/route/property/KameletPropertyField.tsx
index 7e21e02..4e5c0f0 100644
--- a/karavan-designer/src/designer/field/KameletPropertyField.tsx
+++ b/karavan-designer/src/designer/route/property/KameletPropertyField.tsx
@@ -21,7 +21,7 @@ import {
Popover,
Switch,
} from '@patternfly/react-core';
-import '../karavan.css';
+import '../../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
import {Property} from "karavan-core/lib/model/KameletModels";
diff --git a/karavan-designer/src/designer/field/ObjectField.tsx
b/karavan-designer/src/designer/route/property/ObjectField.tsx
similarity index 99%
rename from karavan-designer/src/designer/field/ObjectField.tsx
rename to karavan-designer/src/designer/route/property/ObjectField.tsx
index 6af4d83..17c2526 100644
--- a/karavan-designer/src/designer/field/ObjectField.tsx
+++ b/karavan-designer/src/designer/route/property/ObjectField.tsx
@@ -15,7 +15,7 @@
* limitations under the License.
*/
import React from 'react';
-import '../karavan.css';
+import '../../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import {DslPropertyField} from "./DslPropertyField";
import {