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 335386d7 reload kamelets on file editor route #1134 (#1140)
335386d7 is described below

commit 335386d79922cd6117db390136f58b7b309fb6e1
Author: Vidhya Sagar <[email protected]>
AuthorDate: Tue Feb 27 00:47:41 2024 +0800

    reload kamelets on file editor route #1134 (#1140)
    
    * reload kamelets on file editor route
    
    * reload kamelets in file editor
    
    * Saving custom kamelet in KameletApi.ts file
    
    * merge issue fix
    
    ---------
    
    Co-authored-by: induja <[email protected]>
---
 .../src/main/webui/src/designer/karavan.css        |  7 +++++-
 .../main/webui/src/designer/route/DslSelector.tsx  | 21 ++++++++++++++---
 .../src/main/webui/src/project/FileEditor.tsx      |  9 +++++++-
 .../webui/src/project/files/DeleteFileModal.tsx    |  8 ++++++-
 karavan-core/src/core/api/KameletApi.ts            | 27 +++++++++++++++++++++-
 karavan-designer/src/designer/karavan.css          |  7 +++++-
 .../src/designer/route/DslSelector.tsx             | 21 ++++++++++++++---
 .../camel/karavan/generator/KaravanGenerator.java  |  2 +-
 8 files changed, 90 insertions(+), 12 deletions(-)

diff --git a/karavan-app/src/main/webui/src/designer/karavan.css 
b/karavan-app/src/main/webui/src/designer/karavan.css
index 78b2a135..6184b230 100644
--- a/karavan-app/src/main/webui/src/designer/karavan.css
+++ b/karavan-app/src/main/webui/src/designer/karavan.css
@@ -558,12 +558,17 @@
 }
 
 .dsl-modal .search {
-    width: 300px;
+    width: 350px;
     position: absolute;
     top: 24px;
     right: 72px;
+    display:flex;
+    justify-content:flex-end;
 }
 
+.dsl-modal .search .pf-v5-c-form__group{
+    grid-template-columns:auto !important;
+}
 
 .dsl-modal .search .pf-v5-c-form__group-label {
     padding: 0;
diff --git a/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx 
b/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
index 3bc6bb7d..d5613b70 100644
--- a/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
+++ b/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
@@ -19,7 +19,7 @@ import {
     Badge,
     Card, CardBody, CardFooter, CardHeader, Flex, FlexItem, Form, FormGroup, 
Gallery, Modal, PageSection,
     Tab, Tabs, TabTitleText,
-    Text, TextInput, ToggleGroup, ToggleGroupItem,
+    Text, TextInput, ToggleGroup, ToggleGroupItem,Switch
 } from '@patternfly/react-core';
 import '../karavan.css';
 import {CamelUi} from "../utils/CamelUi";
@@ -48,6 +48,7 @@ export function DslSelector (props: Props) {
 
 
     const [filter, setFilter] = useState<string>('');
+    const [customOnly, setCustomOnly] = useState<boolean>(false);
 
     useEffect(() => {
     }, [selectedLabels]);
@@ -67,6 +68,17 @@ export function DslSelector (props: Props) {
     function searchInput() {
         return (
             <Form isHorizontal className="search" autoComplete="off">
+              {selectorTabIndex === 'kamelet' &&   <FormGroup fieldId="switch">
+                
+                    <Switch
+                        label="Custom only"
+                        id="switch"
+                        isChecked={customOnly}
+                        onChange={(_event, checked) => setCustomOnly(checked)}
+                    />
+                </FormGroup>}
+                  
+                
                 <FormGroup fieldId="search">
                     <TextInput className="text-field" type="text" id="search" 
name="search"
                                value={filter}
@@ -75,9 +87,10 @@ export function DslSelector (props: Props) {
             </Form>
         )
     }
-
+    
     function getCard(dsl: DslMetaModel, index: number) {
         const labels = dsl.labels !== undefined ? 
dsl.labels.split(",").filter(label => label !== 'eip') : [];
+        const isCustom = KameletApi.getCustomKameletNames().includes(dsl.name);
         return (
             <Card key={dsl.dsl + index} isCompact className="dsl-card"
                   onClick={event => selectDsl(event, dsl)}>
@@ -86,6 +99,7 @@ export function DslSelector (props: Props) {
                     {['kamelet', 
'component'].includes(dsl.navigation.toLowerCase()) &&
                         <Badge isRead className="version 
labels">{dsl.version}</Badge>
                     }
+                     {isCustom && <Badge className="custom">custom</Badge>}
                 </CardHeader>
                 <CardHeader>
                     {CamelUi.getIconForDsl(dsl)}
@@ -124,10 +138,11 @@ export function DslSelector (props: Props) {
     const blockedComponents = ComponentApi.getBlockedComponentNames();
     const blockedKamelets = KameletApi.getBlockedKameletNames();
     const elements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
navigation, showSteps);
-    const allowedElements = selectorTabIndex === 'component' ?
+    let allowedElements = selectorTabIndex === 'component' ?
         elements.filter(dsl => (!blockedComponents.includes(dsl.uri || 
dsl.name))) :
         (selectorTabIndex === 'kamelet' ? elements.filter(dsl => 
(!blockedKamelets.includes(dsl.name))) : elements);
     const eipLabels = [...new Set(elements.map(e => 
e.labels).join(",").split(",").filter(e => e !== 'eip'))];
+    if (customOnly) allowedElements = allowedElements.filter(k => 
KameletApi.getCustomKameletNames().includes(k.name));
     const filteredElement = allowedElements
         .filter((dsl: DslMetaModel) => CamelUi.checkFilter(dsl, filter))
         .filter((dsl: DslMetaModel) => {
diff --git a/karavan-app/src/main/webui/src/project/FileEditor.tsx 
b/karavan-app/src/main/webui/src/project/FileEditor.tsx
index dcea5772..95a1a195 100644
--- a/karavan-app/src/main/webui/src/project/FileEditor.tsx
+++ b/karavan-app/src/main/webui/src/project/FileEditor.tsx
@@ -27,6 +27,7 @@ import {CodeUtils} from "../util/CodeUtils";
 import {RegistryBeanDefinition} from "karavan-core/lib/model/CamelDefinition";
 import {TopologyUtils} from "karavan-core/lib/api/TopologyUtils";
 import {IntegrationFile} from "karavan-core/lib/model/IntegrationDefinition";
+import { KameletApi } from 'karavan-core/lib/api/KameletApi';
 
 interface Props {
     projectId: string
@@ -60,7 +61,13 @@ export function FileEditor(props: Props) {
             prevState.length = 0;
             prevState.push(...bs);
             return prevState;
-        })
+        });
+        return () => {
+            //save custom kamelet on page unload
+            if (props.projectId.includes('kamelets') && file) {
+                KameletApi.saveKamelet(file?.code);
+            }
+          };
     }, []);
 
     function save(name: string, code: string) {
diff --git a/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx 
b/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx
index c89ba0ad..2428c305 100644
--- a/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx
+++ b/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx
@@ -24,6 +24,7 @@ import {
 import '../../designer/karavan.css';
 import {useFileStore} from "../../api/ProjectStore";
 import {ProjectService} from "../../api/ProjectService";
+import { KameletApi } from 'karavan-core/lib/api/KameletApi';
 
 export function DeleteFileModal () {
 
@@ -33,8 +34,13 @@ export function DeleteFileModal () {
         useFileStore.setState({operation: "none"})
     }
 
-    function confirmAndCloseModal () {
+    function isKameletsProject(): boolean {
+        return file?.name.includes ('kamelet.yaml') || false;
+    }
+
+    function confirmAndCloseModal() {
         if (file) ProjectService.deleteFile(file);
+        if (isKameletsProject()) KameletApi.removeKamelet(file?.code || '');
         useFileStore.setState({operation: "none"});
     }
 
diff --git a/karavan-core/src/core/api/KameletApi.ts 
b/karavan-core/src/core/api/KameletApi.ts
index acccea33..aec59ad1 100644
--- a/karavan-core/src/core/api/KameletApi.ts
+++ b/karavan-core/src/core/api/KameletApi.ts
@@ -32,6 +32,17 @@ export class KameletApi {
         CustomNames.push(...names);
     };
 
+    static saveCustomKameletName = (name: string) => {
+        CustomNames.push(name);
+    }
+
+    static removeCustomKameletName = (name: string) => {
+        const index = CustomNames.indexOf(name);
+        if (index > -1) {
+            CustomNames.splice(index,1);
+        }
+    }
+
     static getKameletProperties = (kameletName: string): Property[] => {
         const kamelet: KameletModel | undefined = 
KameletApi.findKameletByName(kameletName);
         const properties: Property[] = [];
@@ -95,8 +106,22 @@ export class KameletApi {
 
     static saveKamelet = (yaml: string): void => {
         const kamelet: KameletModel = KameletApi.yamlToKamelet(yaml);
-        if (Kamelets.findIndex((k: KameletModel) => k.metadata.name === 
kamelet.metadata.name) === -1) {
+        const kameletIndex = Kamelets.findIndex((k: KameletModel) => 
k.metadata.name === kamelet.metadata.name);
+        if (kameletIndex === -1) {
             Kamelets.push(kamelet);
+            KameletApi.saveCustomKameletName(kamelet.metadata.name);
+        }
+        else {
+            Kamelets.splice(kameletIndex, 1, kamelet)
+        }
+    };
+
+    static removeKamelet = (yaml: string): void => {
+        const kamelet: KameletModel = KameletApi.yamlToKamelet(yaml);
+        const kameletIndex = Kamelets.findIndex((k: KameletModel) => 
k.metadata.name === kamelet.metadata.name);
+        if (kameletIndex > -1) {
+            Kamelets.splice(kameletIndex,1);
+            KameletApi.removeCustomKameletName(kamelet.metadata.name);
         }
     };
     
diff --git a/karavan-designer/src/designer/karavan.css 
b/karavan-designer/src/designer/karavan.css
index 78b2a135..6184b230 100644
--- a/karavan-designer/src/designer/karavan.css
+++ b/karavan-designer/src/designer/karavan.css
@@ -558,12 +558,17 @@
 }
 
 .dsl-modal .search {
-    width: 300px;
+    width: 350px;
     position: absolute;
     top: 24px;
     right: 72px;
+    display:flex;
+    justify-content:flex-end;
 }
 
+.dsl-modal .search .pf-v5-c-form__group{
+    grid-template-columns:auto !important;
+}
 
 .dsl-modal .search .pf-v5-c-form__group-label {
     padding: 0;
diff --git a/karavan-designer/src/designer/route/DslSelector.tsx 
b/karavan-designer/src/designer/route/DslSelector.tsx
index 3bc6bb7d..d5613b70 100644
--- a/karavan-designer/src/designer/route/DslSelector.tsx
+++ b/karavan-designer/src/designer/route/DslSelector.tsx
@@ -19,7 +19,7 @@ import {
     Badge,
     Card, CardBody, CardFooter, CardHeader, Flex, FlexItem, Form, FormGroup, 
Gallery, Modal, PageSection,
     Tab, Tabs, TabTitleText,
-    Text, TextInput, ToggleGroup, ToggleGroupItem,
+    Text, TextInput, ToggleGroup, ToggleGroupItem,Switch
 } from '@patternfly/react-core';
 import '../karavan.css';
 import {CamelUi} from "../utils/CamelUi";
@@ -48,6 +48,7 @@ export function DslSelector (props: Props) {
 
 
     const [filter, setFilter] = useState<string>('');
+    const [customOnly, setCustomOnly] = useState<boolean>(false);
 
     useEffect(() => {
     }, [selectedLabels]);
@@ -67,6 +68,17 @@ export function DslSelector (props: Props) {
     function searchInput() {
         return (
             <Form isHorizontal className="search" autoComplete="off">
+              {selectorTabIndex === 'kamelet' &&   <FormGroup fieldId="switch">
+                
+                    <Switch
+                        label="Custom only"
+                        id="switch"
+                        isChecked={customOnly}
+                        onChange={(_event, checked) => setCustomOnly(checked)}
+                    />
+                </FormGroup>}
+                  
+                
                 <FormGroup fieldId="search">
                     <TextInput className="text-field" type="text" id="search" 
name="search"
                                value={filter}
@@ -75,9 +87,10 @@ export function DslSelector (props: Props) {
             </Form>
         )
     }
-
+    
     function getCard(dsl: DslMetaModel, index: number) {
         const labels = dsl.labels !== undefined ? 
dsl.labels.split(",").filter(label => label !== 'eip') : [];
+        const isCustom = KameletApi.getCustomKameletNames().includes(dsl.name);
         return (
             <Card key={dsl.dsl + index} isCompact className="dsl-card"
                   onClick={event => selectDsl(event, dsl)}>
@@ -86,6 +99,7 @@ export function DslSelector (props: Props) {
                     {['kamelet', 
'component'].includes(dsl.navigation.toLowerCase()) &&
                         <Badge isRead className="version 
labels">{dsl.version}</Badge>
                     }
+                     {isCustom && <Badge className="custom">custom</Badge>}
                 </CardHeader>
                 <CardHeader>
                     {CamelUi.getIconForDsl(dsl)}
@@ -124,10 +138,11 @@ export function DslSelector (props: Props) {
     const blockedComponents = ComponentApi.getBlockedComponentNames();
     const blockedKamelets = KameletApi.getBlockedKameletNames();
     const elements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
navigation, showSteps);
-    const allowedElements = selectorTabIndex === 'component' ?
+    let allowedElements = selectorTabIndex === 'component' ?
         elements.filter(dsl => (!blockedComponents.includes(dsl.uri || 
dsl.name))) :
         (selectorTabIndex === 'kamelet' ? elements.filter(dsl => 
(!blockedKamelets.includes(dsl.name))) : elements);
     const eipLabels = [...new Set(elements.map(e => 
e.labels).join(",").split(",").filter(e => e !== 'eip'))];
+    if (customOnly) allowedElements = allowedElements.filter(k => 
KameletApi.getCustomKameletNames().includes(k.name));
     const filteredElement = allowedElements
         .filter((dsl: DslMetaModel) => CamelUi.checkFilter(dsl, filter))
         .filter((dsl: DslMetaModel) => {
diff --git 
a/karavan-generator/src/main/java/org/apache/camel/karavan/generator/KaravanGenerator.java
 
b/karavan-generator/src/main/java/org/apache/camel/karavan/generator/KaravanGenerator.java
index c3950392..b6e518d3 100644
--- 
a/karavan-generator/src/main/java/org/apache/camel/karavan/generator/KaravanGenerator.java
+++ 
b/karavan-generator/src/main/java/org/apache/camel/karavan/generator/KaravanGenerator.java
@@ -21,7 +21,7 @@ public final class KaravanGenerator {
     public static void main(String[] args) throws Exception {
         String[] paths = new String[] {
                 "karavan-designer/public",
-                "karavan-web/karavan-app/src/main/resources",
+                "karavan-app/src/main/resources",
                 "karavan-vscode"
         };
         if (args.length > 0) {

Reply via email to