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 d7e0cfd22813b17d10ced8efa90a685143075b84
Author: Marat Gubaidullin <marat.gubaidul...@gmail.com>
AuthorDate: Fri Nov 18 18:27:57 2022 -0500

    Show custom kamelets
---
 .../apache/camel/karavan/api/KameletResources.java | 19 ++++++++++++++++-
 .../apache/camel/karavan/api/ProjectResource.java  |  4 ++--
 karavan-app/src/main/webui/src/Main.tsx            |  3 +++
 karavan-app/src/main/webui/src/api/KaravanApi.tsx  | 11 ++++++++++
 .../src/main/webui/src/designer/karavan.css        | 24 +++++++++++++++-------
 .../src/main/webui/src/kamelets/KameletCard.tsx    |  9 +++++---
 karavan-core/src/core/api/KameletApi.ts            | 10 +++++++++
 karavan-designer/src/designer/karavan.css          | 19 ++++++++++-------
 karavan-designer/src/kamelets/KameletCard.tsx      |  9 +++++---
 9 files changed, 85 insertions(+), 23 deletions(-)

diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
index d06f15d..afb61d2 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
@@ -20,13 +20,16 @@ import org.apache.camel.karavan.model.Project;
 import org.apache.camel.karavan.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
 import org.apache.camel.karavan.service.InfinispanService;
+import org.yaml.snakeyaml.Yaml;
 
 import javax.inject.Inject;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Path("/api/kamelet")
@@ -40,7 +43,7 @@ public class KameletResources {
 
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String getCustomYamls() {
+    public String getKamelets() {
         StringBuilder kamelets = new 
StringBuilder(codeService.getResourceFile("/kamelets/kamelets.yaml"));
         List<ProjectFile> custom = 
infinispanService.getProjectFiles(Project.NAME_KAMELETS);
         if (custom.size() > 0) {
@@ -51,4 +54,18 @@ public class KameletResources {
         }
         return kamelets.toString();
     }
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/names")
+    public List<String> getCustomNames() {
+        Yaml yaml = new Yaml();
+        return 
infinispanService.getProjectFiles(Project.NAME_KAMELETS).stream()
+                .map(projectFile -> {
+                    Map<String, LinkedHashMap> obj = 
yaml.load(projectFile.getCode());
+                    LinkedHashMap<String, Object> metadata = 
obj.get("metadata");
+                    return metadata.get("name").toString();
+                })
+                .collect(Collectors.toList());
+    }
 }
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
index b2e12b6..c6620cf 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
@@ -48,8 +48,8 @@ public class ProjectResource {
     @Produces(MediaType.APPLICATION_JSON)
     public List<Project> getAll() throws Exception {
         return infinispanService.getProjects().stream()
-                .filter(project -> 
!project.getName().equalsIgnoreCase(Project.NAME_TEMPLATES))
-                .filter(project -> 
!project.getName().equalsIgnoreCase(Project.NAME_KAMELETS))
+                .filter(project -> 
!project.getProjectId().equalsIgnoreCase(Project.NAME_TEMPLATES))
+                .filter(project -> 
!project.getProjectId().equalsIgnoreCase(Project.NAME_KAMELETS))
                 .sorted(Comparator.comparing(Project::getProjectId))
                 .collect(Collectors.toList());
     }
diff --git a/karavan-app/src/main/webui/src/Main.tsx 
b/karavan-app/src/main/webui/src/Main.tsx
index b37908d..5975cd2 100644
--- a/karavan-app/src/main/webui/src/Main.tsx
+++ b/karavan-app/src/main/webui/src/Main.tsx
@@ -140,6 +140,9 @@ export class Main extends React.Component<Props, State> {
                 yamls.split("\n---\n").map(c => c.trim()).forEach(z => 
kamelets.push(z));
                 KameletApi.saveKamelets(kamelets, true);
             })
+            KaravanApi.getCustomKameletNames(names => {
+                KameletApi.saveCustomKameletNames(names);
+            })
         });
     }
 
diff --git a/karavan-app/src/main/webui/src/api/KaravanApi.tsx 
b/karavan-app/src/main/webui/src/api/KaravanApi.tsx
index e6e2003..c446efb 100644
--- a/karavan-app/src/main/webui/src/api/KaravanApi.tsx
+++ b/karavan-app/src/main/webui/src/api/KaravanApi.tsx
@@ -446,6 +446,17 @@ export class KaravanApi {
         });
     }
 
+    static async getCustomKameletNames(after: (names: []) => void) {
+        instance.get('/api/kamelet/names')
+            .then(res => {
+                if (res.status === 200) {
+                    after(res.data);
+                }
+            }).catch(err => {
+            console.log(err);
+        });
+    }
+
     static async getComponents(after: (json: string) => void) {
         instance.get('/api/component')
             .then(res => {
diff --git a/karavan-app/src/main/webui/src/designer/karavan.css 
b/karavan-app/src/main/webui/src/designer/karavan.css
index 77ff41e..17b9f6b 100644
--- a/karavan-app/src/main/webui/src/designer/karavan.css
+++ b/karavan-app/src/main/webui/src/designer/karavan.css
@@ -125,7 +125,16 @@
 }
 
 .kamelets-page .kamelet-card .pf-c-card__header {
-    padding-right: 6px;
+    /*padding-right: 6px;*/
+}
+
+.kamelets-page .kamelet-card .pf-c-card__header .custom {
+    margin-left: auto;
+}
+
+.kamelets-page .kamelet-card .pf-c-card__title {
+    font-size: 15px;
+    font-weight: 400;
 }
 
 .kamelets-page .kamelet-card .pf-c-card__body {
@@ -145,6 +154,13 @@
     user-select: none;
 }
 
+.karavan .kamelets-page .kamelet-card .pf-c-card__footer {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+}
+
+
 /*kamelet modal*/
 .kamelet-modal-card .pf-c-card__header {
     padding-right: 6px;
@@ -1133,12 +1149,6 @@
     margin-right: auto;
 }
 
-/*Catalogues*/
-.karavan .kamelets-page .kamelet-card .pf-c-card__footer {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-}
 
 .karavan .tools-section .tools .header {
     display: flex;
diff --git a/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx 
b/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx
index 20d4388..5d4faaf 100644
--- a/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx
+++ b/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx
@@ -21,6 +21,7 @@ import {
 import '../designer/karavan.css';
 import {KameletModel} from "karavan-core/lib/model/KameletModels";
 import {CamelUi} from "../designer/utils/CamelUi";
+import {KameletApi} from "karavan-core/lib/api/KameletApi";
 
 interface Props {
     kamelet: KameletModel,
@@ -44,19 +45,21 @@ export class KameletCard extends React.Component<Props, 
State> {
 
     render() {
         const kamelet = this.state.kamelet;
+        const isCustom = 
KameletApi.getCustomKameletNames().includes(kamelet.metadata.name);
         return (
             <Card isHoverable isCompact key={kamelet.metadata.name} 
className="kamelet-card"
-                onClick={event => this.click(event)}
+                  onClick={event => this.click(event)}
             >
                 <CardHeader>
                     {CamelUi.getIconFromSource(kamelet.icon())}
+                    {isCustom && <Badge className="custom">custom</Badge>}
                 </CardHeader>
                 <CardTitle>{kamelet.spec.definition.title}</CardTitle>
                 <CardBody>{kamelet.spec.definition.description}</CardBody>
                 <CardFooter>
                     {/*<div style={{justifyContent: "space-between"}}>*/}
-                        <Badge isRead 
className="labels">{kamelet.metadata.labels["camel.apache.org/kamelet.type"].toLowerCase()}</Badge>
-                        <Badge isRead 
className="version">{kamelet.metadata.annotations["camel.apache.org/catalog.version"].toLowerCase()}</Badge>
+                    <Badge isRead 
className="labels">{kamelet.metadata.labels["camel.apache.org/kamelet.type"].toLowerCase()}</Badge>
+                    <Badge isRead 
className="version">{kamelet.metadata.annotations["camel.apache.org/catalog.version"].toLowerCase()}</Badge>
                     {/*</div>*/}
                 </CardFooter>
             </Card>
diff --git a/karavan-core/src/core/api/KameletApi.ts 
b/karavan-core/src/core/api/KameletApi.ts
index d29bf32..ea1bd47 100644
--- a/karavan-core/src/core/api/KameletApi.ts
+++ b/karavan-core/src/core/api/KameletApi.ts
@@ -20,9 +20,19 @@ import {Component} from "../model/ComponentModels";
 import {Components} from "./ComponentApi";
 
 export const Kamelets: KameletModel[] = [];
+export const CustomNames: string[] = [];
 
 export const KameletApi = {
 
+    getCustomKameletNames: (): string [] => {
+        return CustomNames;
+    },
+
+    saveCustomKameletNames: (names: string[]) => {
+        CustomNames.length = 0;
+        CustomNames.push(...names);
+    },
+
     getKameletProperties: (kameletName: string): Property[] => {
         const kamelet: KameletModel | undefined = 
KameletApi.findKameletByName(kameletName);
         const properties: Property[] = [];
diff --git a/karavan-designer/src/designer/karavan.css 
b/karavan-designer/src/designer/karavan.css
index ae823fb..17b9f6b 100644
--- a/karavan-designer/src/designer/karavan.css
+++ b/karavan-designer/src/designer/karavan.css
@@ -125,7 +125,11 @@
 }
 
 .kamelets-page .kamelet-card .pf-c-card__header {
-    padding-right: 6px;
+    /*padding-right: 6px;*/
+}
+
+.kamelets-page .kamelet-card .pf-c-card__header .custom {
+    margin-left: auto;
 }
 
 .kamelets-page .kamelet-card .pf-c-card__title {
@@ -150,6 +154,13 @@
     user-select: none;
 }
 
+.karavan .kamelets-page .kamelet-card .pf-c-card__footer {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+}
+
+
 /*kamelet modal*/
 .kamelet-modal-card .pf-c-card__header {
     padding-right: 6px;
@@ -1138,12 +1149,6 @@
     margin-right: auto;
 }
 
-/*Catalogues*/
-.karavan .kamelets-page .kamelet-card .pf-c-card__footer {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-}
 
 .karavan .tools-section .tools .header {
     display: flex;
diff --git a/karavan-designer/src/kamelets/KameletCard.tsx 
b/karavan-designer/src/kamelets/KameletCard.tsx
index 20d4388..5d4faaf 100644
--- a/karavan-designer/src/kamelets/KameletCard.tsx
+++ b/karavan-designer/src/kamelets/KameletCard.tsx
@@ -21,6 +21,7 @@ import {
 import '../designer/karavan.css';
 import {KameletModel} from "karavan-core/lib/model/KameletModels";
 import {CamelUi} from "../designer/utils/CamelUi";
+import {KameletApi} from "karavan-core/lib/api/KameletApi";
 
 interface Props {
     kamelet: KameletModel,
@@ -44,19 +45,21 @@ export class KameletCard extends React.Component<Props, 
State> {
 
     render() {
         const kamelet = this.state.kamelet;
+        const isCustom = 
KameletApi.getCustomKameletNames().includes(kamelet.metadata.name);
         return (
             <Card isHoverable isCompact key={kamelet.metadata.name} 
className="kamelet-card"
-                onClick={event => this.click(event)}
+                  onClick={event => this.click(event)}
             >
                 <CardHeader>
                     {CamelUi.getIconFromSource(kamelet.icon())}
+                    {isCustom && <Badge className="custom">custom</Badge>}
                 </CardHeader>
                 <CardTitle>{kamelet.spec.definition.title}</CardTitle>
                 <CardBody>{kamelet.spec.definition.description}</CardBody>
                 <CardFooter>
                     {/*<div style={{justifyContent: "space-between"}}>*/}
-                        <Badge isRead 
className="labels">{kamelet.metadata.labels["camel.apache.org/kamelet.type"].toLowerCase()}</Badge>
-                        <Badge isRead 
className="version">{kamelet.metadata.annotations["camel.apache.org/catalog.version"].toLowerCase()}</Badge>
+                    <Badge isRead 
className="labels">{kamelet.metadata.labels["camel.apache.org/kamelet.type"].toLowerCase()}</Badge>
+                    <Badge isRead 
className="version">{kamelet.metadata.annotations["camel.apache.org/catalog.version"].toLowerCase()}</Badge>
                     {/*</div>*/}
                 </CardFooter>
             </Card>

Reply via email to