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 39aaee32fcda6048d4ed6e03f90fd18f63beddb4
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Feb 1 16:58:01 2024 -0500

    Web app #1094
---
 .../src/main/webui/src/designer/DesignerStore.ts   | 15 ++++++-
 .../main/webui/src/designer/KaravanDesigner.tsx    |  7 +++-
 .../property/property/ComponentPropertyField.tsx   |  6 +--
 .../src/main/webui/src/project/FileEditor.tsx      | 14 +++++--
 .../src/main/webui/src/util/CodeUtils.ts           | 46 ++++++++++++++++++++++
 .../src/main/webui/src/util/StringUtils.ts         | 25 ------------
 6 files changed, 77 insertions(+), 36 deletions(-)

diff --git 
a/karavan-web/karavan-app/src/main/webui/src/designer/DesignerStore.ts 
b/karavan-web/karavan-app/src/main/webui/src/designer/DesignerStore.ts
index fe198a7f..8a836e5f 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/DesignerStore.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/DesignerStore.ts
@@ -19,6 +19,7 @@ import {CamelElement, Integration} from 
"karavan-core/lib/model/IntegrationDefin
 import {DslPosition, EventBus} from "./utils/EventBus";
 import {createWithEqualityFn} from "zustand/traditional";
 import {shallow} from "zustand/shallow";
+import {RegistryBeanDefinition} from 
"karavan-core/src/core/model/CamelDefinition";
 
 interface IntegrationState {
     integration: Integration;
@@ -169,7 +170,8 @@ type DesignerState = {
     top: number,
     left: number,
     moveElements: [string | undefined, string | undefined],
-    propertyPlaceholders: string[];
+    propertyPlaceholders: string[],
+    beans: RegistryBeanDefinition[]
 }
 
 const designerState: DesignerState = {
@@ -188,7 +190,8 @@ const designerState: DesignerState = {
     top: 0,
     left: 0,
     moveElements: [undefined, undefined],
-    propertyPlaceholders: []
+    propertyPlaceholders: [],
+    beans: []
 };
 
 type DesignerAction = {
@@ -206,6 +209,7 @@ type DesignerAction = {
     setNotification: (notificationBadge: boolean, notificationMessage: 
[string, string]) => void;
     setMoveElements: (moveElements: [string | undefined, string | undefined]) 
=> void;
     setPropertyPlaceholders: (propertyPlaceholders: string[]) => void;
+    setBeans: (beans: RegistryBeanDefinition[]) => void;
 }
 
 export const useDesignerStore = createWithEqualityFn<DesignerState & 
DesignerAction>((set) => ({
@@ -268,4 +272,11 @@ export const useDesignerStore = 
createWithEqualityFn<DesignerState & DesignerAct
             return state;
         })
     },
+    setBeans: (beans: RegistryBeanDefinition[]) => {
+        set((state: DesignerState) => {
+            state.beans.length = 0;
+            state.beans.push(...beans);
+            return state;
+        })
+    },
 }), shallow)
\ No newline at end of file
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx 
b/karavan-web/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
index 7f201e4c..11bf8b6c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
@@ -41,6 +41,7 @@ import {BeansDesigner} from "./beans/BeansDesigner";
 import {CodeEditor} from "./editor/CodeEditor";
 import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
 import {KameletDesigner} from "./kamelet/KameletDesigner";
+import {RegistryBeanDefinition} from "karavan-core/lib/model/CamelDefinition";
 
 interface Props {
     onSave: (filename: string, yaml: string, propertyOnly: boolean) => void
@@ -54,14 +55,15 @@ interface Props {
     showCodeTab: boolean
     tab?: "routes" | "rest" | "beans"
     propertyPlaceholders: string[]
+    beans: RegistryBeanDefinition[]
 }
 
 export function KaravanDesigner(props: Props) {
 
     const [tab, setTab] = useState<string>('routes');
-    const [setDark, hideLogDSL, setHideLogDSL, setSelectedStep, reset, badge, 
message, setPropertyPlaceholders] =
+    const [setDark, hideLogDSL, setHideLogDSL, setSelectedStep, reset, badge, 
message, setPropertyPlaceholders, setBeans] =
         useDesignerStore((s) =>
-        [s.setDark, s.hideLogDSL, s.setHideLogDSL, s.setSelectedStep, s.reset, 
s.notificationBadge, s.notificationMessage, s.setPropertyPlaceholders], shallow)
+        [s.setDark, s.hideLogDSL, s.setHideLogDSL, s.setSelectedStep, s.reset, 
s.notificationBadge, s.notificationMessage, s.setPropertyPlaceholders, 
s.setBeans], shallow)
     const [integration, setIntegration] = useIntegrationStore((s) =>
         [s.integration, s.setIntegration], shallow)
 
@@ -87,6 +89,7 @@ export function KaravanDesigner(props: Props) {
         reset();
         setDark(props.dark);
         setPropertyPlaceholders(props.propertyPlaceholders)
+        setBeans(props.beans)
         setHideLogDSL(props.hideLogDSL === true);
         return () => {
             sub?.unsubscribe();
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
 
b/karavan-web/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
index 402aaf8b..1287c18a 100644
--- 
a/karavan-web/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
+++ 
b/karavan-web/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
@@ -71,8 +71,8 @@ export function ComponentPropertyField(props: Props) {
     const {onParametersChange, getInternalComponentName} = usePropertiesHook();
 
     const [integration] = useIntegrationStore((state) => [state.integration], 
shallow)
-    const [dark, setSelectedStep, propertyPlaceholders] = useDesignerStore((s) 
=>
-        [s.dark, s.setSelectedStep, s.propertyPlaceholders], shallow)
+    const [dark, setSelectedStep, beans] = useDesignerStore((s) =>
+        [s.dark, s.setSelectedStep, s.beans], shallow)
 
     const [selectStatus, setSelectStatus] = useState<Map<string, boolean>>(new 
Map<string, boolean>());
     const [showEditor, setShowEditor] = useState<boolean>(false);
@@ -82,7 +82,6 @@ export function ComponentPropertyField(props: Props) {
     const [id, setId] = useState<string>(prefix + "-" + props.property.name);
 
     const ref = useRef<any>(null);
-    const [isOpenPlaceholdersDropdown, setOpenPlaceholdersDropdown] = 
useState<boolean>(false);
 
 
     function parametersChanged(parameter: string, value: string | number | 
boolean | any, pathParameter?: boolean, newRoute?: RouteToCreate) {
@@ -100,7 +99,6 @@ export function ComponentPropertyField(props: Props) {
 
     function getSelectBean(property: ComponentProperty, value: any) {
         const selectOptions: JSX.Element[] = [];
-        const beans = CamelUi.getBeans(integration);
         if (beans) {
             selectOptions.push(<SelectOption key={0} value={"Select..."} 
isPlaceholder/>);
             selectOptions.push(...beans.map((bean) => <SelectOption 
key={bean.name} value={beanPrefix + bean.name}
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/FileEditor.tsx 
b/karavan-web/karavan-app/src/main/webui/src/project/FileEditor.tsx
index e5bece48..c3282166 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/FileEditor.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/FileEditor.tsx
@@ -23,8 +23,8 @@ import {useFilesStore, useFileStore} from 
"../api/ProjectStore";
 import {KaravanDesigner} from "../designer/KaravanDesigner";
 import {ProjectService} from "../api/ProjectService";
 import {shallow} from "zustand/shallow";
-import {KaravanApi} from "../api/KaravanApi";
-import {getPropertyCode, getPropertyPlaceholders} from "../util/StringUtils";
+import {CodeUtils} from "../util/CodeUtils";
+import {RegistryBeanDefinition} from 
"karavan-core/src/core/model/CamelDefinition";
 
 interface Props {
     projectId: string
@@ -41,14 +41,21 @@ export function FileEditor (props: Props) {
     const [file, designerTab] = useFileStore((s) => [s.file, s.designerTab], 
shallow )
     const [files] = useFilesStore((s) => [s.files], shallow);
     const [propertyPlaceholders, setPropertyPlaceholders] = 
useState<string[]>([]);
+    const [beans, setBeans] = useState<RegistryBeanDefinition[]>([]);
 
     useEffect(() => {
-        const pp = getPropertyPlaceholders(files);
+        const pp = CodeUtils.getPropertyPlaceholders(files);
         setPropertyPlaceholders(prevState => {
             prevState.length = 0;
             prevState.push(...pp);
             return prevState;
         })
+        const bs = CodeUtils.getBeans(files);
+        setBeans(prevState => {
+            prevState.length = 0;
+            prevState.push(...bs);
+            return prevState;
+        })
     }, []);
 
     function save (name: string, code: string) {
@@ -86,6 +93,7 @@ export function FileEditor (props: Props) {
                 onGetCustomCode={onGetCustomCode}
                 propertyPlaceholders={propertyPlaceholders}
                 onSavePropertyPlaceholder={onSavePropertyPlaceholder}
+                beans={beans}
             />
         )
     }
diff --git a/karavan-web/karavan-app/src/main/webui/src/util/CodeUtils.ts 
b/karavan-web/karavan-app/src/main/webui/src/util/CodeUtils.ts
new file mode 100644
index 00000000..3962ad18
--- /dev/null
+++ b/karavan-web/karavan-app/src/main/webui/src/util/CodeUtils.ts
@@ -0,0 +1,46 @@
+import {ProjectFile} from "../api/ProjectModels";
+import {RegistryBeanDefinition} from "karavan-core/lib/model/CamelDefinition";
+import {Integration} from "karavan-core/lib/model/IntegrationDefinition";
+import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml";
+import {CamelUi} from "../designer/utils/CamelUi";
+
+export class CodeUtils {
+
+    static getBeans(files: ProjectFile[]): RegistryBeanDefinition[] {
+        const result: RegistryBeanDefinition[] = [];
+        CodeUtils.getIntegrations(files).forEach(integration => {
+            const beans = CamelUi.getBeans(integration);
+            result.push(...beans);
+        })
+        return result;
+    }
+
+    static getIntegrations(files: ProjectFile[]): Integration[] {
+        return files
+            .filter(f => f.name.endsWith('.camel.yaml'))
+            .map(f => CamelDefinitionYaml.yamlToIntegration(f.name, f.code));
+    }
+
+    static getPropertyPlaceholders(files: ProjectFile[]): string[] {
+        const result: string[] = []
+        const code = CodeUtils.getPropertyCode(files);
+        if (code) {
+            const lines = code.split('\n').map((line) => line.trim());
+            lines
+                .filter(line => !line.startsWith("camel.") && 
!line.startsWith("jkube.") && !line.startsWith("jib."))
+                .filter(line => line !== undefined && line !== null && 
line.length > 0)
+                .forEach(line => {
+                    const parts = line.split("=");
+                    if (parts.length > 0) {
+                        result.push(parts[0]);
+                    }
+                })
+        }
+        return result;
+    }
+
+    static getPropertyCode(files: ProjectFile[]) {
+        const file = files.filter(f => f.name === 
'application.properties')?.at(0);
+        return file?.code;
+    }
+}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/util/StringUtils.ts 
b/karavan-web/karavan-app/src/main/webui/src/util/StringUtils.ts
index 026dc7a1..2a149781 100644
--- a/karavan-web/karavan-app/src/main/webui/src/util/StringUtils.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/util/StringUtils.ts
@@ -1,28 +1,3 @@
-import {ProjectFile} from "../api/ProjectModels";
-
 export function isEmpty(str: string) {
     return !str?.trim();
 }
-
-export function getPropertyPlaceholders(files: ProjectFile[]): string[] {
-    const result: string[] = []
-    const code = getPropertyCode(files);
-    if (code) {
-        const lines = code.split('\n').map((line) => line.trim());
-        lines
-            .filter(line => !line.startsWith("camel.") && 
!line.startsWith("jkube.") && !line.startsWith("jib."))
-            .filter(line => line !== undefined && line !== null && line.length 
> 0)
-            .forEach(line => {
-            const parts = line.split("=");
-            if (parts.length > 0) {
-                result.push(parts[0]);
-            }
-        })
-    }
-    return result;
-}
-
-export function getPropertyCode(files: ProjectFile[]) {
-    const file = files.filter(f => f.name === 'application.properties')?.at(0);
-    return file?.code;
-}
\ No newline at end of file

Reply via email to