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 1e55ca92c12c4e5bb47a2089bde6bb93e5aab69c
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Feb 29 18:24:54 2024 -0500

    Fixed #1152
---
 karavan-app/src/main/webui/package-lock.json       |   2 +-
 .../main/webui/src/designer/route/DslSelector.tsx  |  65 +++++++----
 .../src/designer/route/DslSelector.tsx             |  71 +++++++-----
 karavan-space/src/designer/karavan.css             | 106 ------------------
 karavan-space/src/designer/route/DslSelector.css   | 122 +++++++++++++++++++++
 karavan-space/src/designer/route/DslSelector.tsx   |  89 ++++++++++-----
 .../src/knowledgebase/KnowledgebasePage.tsx        |  10 +-
 .../src/knowledgebase/kamelets/KameletCard.tsx     |  12 +-
 8 files changed, 286 insertions(+), 191 deletions(-)

diff --git a/karavan-app/src/main/webui/package-lock.json 
b/karavan-app/src/main/webui/package-lock.json
index 847ccf24..23163150 100644
--- a/karavan-app/src/main/webui/package-lock.json
+++ b/karavan-app/src/main/webui/package-lock.json
@@ -77,7 +77,7 @@
       }
     },
     "../../../../karavan-core": {
-      "version": "4.4.0",
+      "version": "4.4.1",
       "license": "Apache-2.0",
       "dependencies": {
         "@types/js-yaml": "^4.0.7",
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 7edfd421..14a4bb2b 100644
--- a/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
+++ b/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
@@ -129,26 +129,41 @@ export function DslSelector (props: Props) {
         }
     }
 
+    function filterElements(elements: DslMetaModel[]):DslMetaModel[] {
+        return elements.filter((dsl: DslMetaModel) => CamelUi.checkFilter(dsl, 
filter))
+            .filter((dsl: DslMetaModel) => {
+                if (!isEip || selectedLabels.length === 0) {
+                    return true;
+                } else {
+                    return dsl.labels.split(",").some(r => 
selectedLabels.includes(r));
+                }
+            });
+    }
+
     const isEip = selectorTabIndex === 'eip';
     const title = parentDsl === undefined ? "Select source" : "Select step";
     const navigation: string = selectorTabIndex ? selectorTabIndex.toString() 
: '';
     const blockedComponents = ComponentApi.getBlockedComponentNames();
     const blockedKamelets = KameletApi.getBlockedKameletNames();
     const elements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
navigation, showSteps);
-    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) => {
-            if (!isEip || selectedLabels.length === 0) {
-                return true;
-            } else {
-                return dsl.labels.split(",").some(r => 
selectedLabels.includes(r));
-            }
-        });
+
+    const eipElements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
'eip', showSteps);
+    const componentElements = 
CamelUi.getSelectorModelsForParentFiltered(parentDsl, 'component', showSteps)
+                                                    .filter(dsl => 
(!blockedComponents.includes(dsl.uri || dsl.name)));
+    let kameletElements = 
CamelUi.getSelectorModelsForParentFiltered(parentDsl, 'kamelet', showSteps)
+                                                    .filter(dsl => 
(!blockedKamelets.includes(dsl.name)));
+    if (customOnly) kameletElements = kameletElements.filter(k => 
KameletApi.getCustomKameletNames().includes(k.name));
+
+    const filteredEipElements = filterElements(eipElements);
+    const filteredComponentElements = filterElements(componentElements);
+    const filteredKameletElements = filterElements(kameletElements);
+
+    const eipLabels = [...new Set(eipElements.map(e => 
e.labels).join(",").split(",").filter(e => e !== 'eip'))];
+
+
+    const filteredElement = navigation === 'component'
+        ? filteredComponentElements
+        : (navigation === 'kamelet' ? filteredKameletElements : 
filteredEipElements);
 
     return (
         <Modal
@@ -166,17 +181,23 @@ export function DslSelector (props: Props) {
                     <FlexItem>
                         <Tabs style={{overflow: 'hidden'}} 
activeKey={selectorTabIndex}
                               onSelect={selectTab}>
-                            {parentDsl !== undefined &&
+                            {parentDsl !== undefined && 
filteredEipElements?.length > 0 &&
                                 <Tab eventKey={"eip"} key={"tab-eip"}
-                                     title={<TabTitleText>Integration 
Patterns</TabTitleText>}>
+                                     title={<TabTitleText>{`Integration 
Patterns (${filteredEipElements?.length})`}</TabTitleText>}>
+                                </Tab>
+                            }
+                            {filteredKameletElements?.length > 0 &&
+                                <Tab eventKey={'kamelet'} key={"tab-kamelet"}
+                                  title={
+                                      <TabTitleText>{`Kamelets 
(${filteredKameletElements?.length})`}</TabTitleText>}>
+                                </Tab>
+                            }
+                            {filteredComponentElements?.length > 0 &&
+                                <Tab eventKey={'component'} 
key={'tab-component'}
+                                  title={
+                                      <TabTitleText>{`Components 
(${filteredComponentElements?.length})`}</TabTitleText>}>
                                 </Tab>
                             }
-                            <Tab eventKey={'kamelet'} key={"tab-kamelet"}
-                                 title={<TabTitleText>Kamelets</TabTitleText>}>
-                            </Tab>
-                            <Tab eventKey={'component'} key={'tab-component'}
-                                 
title={<TabTitleText>Components</TabTitleText>}>
-                            </Tab>
                         </Tabs>
                     </FlexItem>
                 </Flex>
diff --git a/karavan-designer/src/designer/route/DslSelector.tsx 
b/karavan-designer/src/designer/route/DslSelector.tsx
index 7edfd421..68e62e22 100644
--- a/karavan-designer/src/designer/route/DslSelector.tsx
+++ b/karavan-designer/src/designer/route/DslSelector.tsx
@@ -68,7 +68,7 @@ export function DslSelector (props: Props) {
     function searchInput() {
         return (
             <Flex className="search">
-              {selectorTabIndex === 'kamelet' && <FlexItem>
+                {selectorTabIndex === 'kamelet' && <FlexItem>
                     <Switch
                         label="Custom only"
                         id="switch"
@@ -84,7 +84,7 @@ export function DslSelector (props: Props) {
             </Flex>
         )
     }
-    
+
     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);
@@ -96,7 +96,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>}
+                    {isCustom && <Badge className="custom">custom</Badge>}
                 </CardHeader>
                 <CardHeader>
                     {CamelUi.getIconForDsl(dsl)}
@@ -129,26 +129,41 @@ export function DslSelector (props: Props) {
         }
     }
 
+    function filterElements(elements: DslMetaModel[]):DslMetaModel[] {
+        return elements.filter((dsl: DslMetaModel) => CamelUi.checkFilter(dsl, 
filter))
+            .filter((dsl: DslMetaModel) => {
+                if (!isEip || selectedLabels.length === 0) {
+                    return true;
+                } else {
+                    return dsl.labels.split(",").some(r => 
selectedLabels.includes(r));
+                }
+            });
+    }
+
     const isEip = selectorTabIndex === 'eip';
     const title = parentDsl === undefined ? "Select source" : "Select step";
     const navigation: string = selectorTabIndex ? selectorTabIndex.toString() 
: '';
     const blockedComponents = ComponentApi.getBlockedComponentNames();
     const blockedKamelets = KameletApi.getBlockedKameletNames();
     const elements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
navigation, showSteps);
-    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) => {
-            if (!isEip || selectedLabels.length === 0) {
-                return true;
-            } else {
-                return dsl.labels.split(",").some(r => 
selectedLabels.includes(r));
-            }
-        });
+
+    const eipElements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
'eip', showSteps);
+    const componentElements = 
CamelUi.getSelectorModelsForParentFiltered(parentDsl, 'component', showSteps)
+        .filter(dsl => (!blockedComponents.includes(dsl.uri || dsl.name)));
+    let kameletElements = 
CamelUi.getSelectorModelsForParentFiltered(parentDsl, 'kamelet', showSteps)
+        .filter(dsl => (!blockedKamelets.includes(dsl.name)));
+    if (customOnly) kameletElements = kameletElements.filter(k => 
KameletApi.getCustomKameletNames().includes(k.name));
+
+    const filteredEipElements = filterElements(eipElements);
+    const filteredComponentElements = filterElements(componentElements);
+    const filteredKameletElements = filterElements(kameletElements);
+
+    const eipLabels = [...new Set(eipElements.map(e => 
e.labels).join(",").split(",").filter(e => e !== 'eip'))];
+
+
+    const filteredElement = navigation === 'component'
+        ? filteredComponentElements
+        : (navigation === 'kamelet' ? filteredKameletElements : 
filteredEipElements);
 
     return (
         <Modal
@@ -166,17 +181,23 @@ export function DslSelector (props: Props) {
                     <FlexItem>
                         <Tabs style={{overflow: 'hidden'}} 
activeKey={selectorTabIndex}
                               onSelect={selectTab}>
-                            {parentDsl !== undefined &&
+                            {parentDsl !== undefined && 
filteredEipElements?.length > 0 &&
                                 <Tab eventKey={"eip"} key={"tab-eip"}
-                                     title={<TabTitleText>Integration 
Patterns</TabTitleText>}>
+                                     title={<TabTitleText>{`Integration 
Patterns (${filteredEipElements?.length})`}</TabTitleText>}>
+                                </Tab>
+                            }
+                            {filteredKameletElements?.length > 0 &&
+                                <Tab eventKey={'kamelet'} key={"tab-kamelet"}
+                                     title={
+                                         <TabTitleText>{`Kamelets 
(${filteredKameletElements?.length})`}</TabTitleText>}>
+                                </Tab>
+                            }
+                            {filteredComponentElements?.length > 0 &&
+                                <Tab eventKey={'component'} 
key={'tab-component'}
+                                     title={
+                                         <TabTitleText>{`Components 
(${filteredComponentElements?.length})`}</TabTitleText>}>
                                 </Tab>
                             }
-                            <Tab eventKey={'kamelet'} key={"tab-kamelet"}
-                                 title={<TabTitleText>Kamelets</TabTitleText>}>
-                            </Tab>
-                            <Tab eventKey={'component'} key={'tab-component'}
-                                 
title={<TabTitleText>Components</TabTitleText>}>
-                            </Tab>
                         </Tabs>
                     </FlexItem>
                 </Flex>
diff --git a/karavan-space/src/designer/karavan.css 
b/karavan-space/src/designer/karavan.css
index 78b2a135..9e5826a8 100644
--- a/karavan-space/src/designer/karavan.css
+++ b/karavan-space/src/designer/karavan.css
@@ -525,112 +525,6 @@
     margin-top: 16px;
 }
 
-.dsl-modal {
-    height: 80%;
-    color: var(--pf-v5-global--Color--100);
-}
-
-.dsl-modal .dsl-card {
-    cursor: pointer;
-}
-
-.dsl-modal .dsl-card .pf-v5-c-card__header-main {
-    display: flex;
-    flex-direction: row;
-}
-
-.dsl-modal .dsl-card .header-labels .pf-v5-c-card__header-main {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-}
-
-.dsl-modal .dsl-card .icon {
-    height: 20px;
-    width: auto;
-    border: none;
-    margin-right: 6px;
-    -webkit-user-select: none;
-    -khtml-user-select: none;
-    -moz-user-select: none;
-    -o-user-select: none;
-    user-select: none;
-}
-
-.dsl-modal .search {
-    width: 300px;
-    position: absolute;
-    top: 24px;
-    right: 72px;
-}
-
-
-.dsl-modal .search .pf-v5-c-form__group-label {
-    padding: 0;
-    margin: auto;
-}
-
-.dsl-modal .search .text-field {
-    height: auto;
-}
-
-.dsl-modal .pf-v5-c-form.pf-v5-m-horizontal .pf-v5-c-form__group {
-    display: contents;
-}
-
-.dsl-modal .pf-v5-c-card__body {
-    padding-bottom: 0;
-    height: 54px;
-}
-
-
-.dsl-modal .dsl-card p {
-    overflow: hidden;
-    display: -webkit-box;
-    -webkit-line-clamp: 2;
-    -webkit-box-orient: vertical;
-}
-.dsl-modal .pf-v5-c-card__footer {
-    padding-bottom: 1em;
-}
-
-.dsl-modal .footer {
-    display: flex;
-    flex-direction: row;
-    margin-top: 6px;
-    flex-wrap: wrap;
-}
-
-.dsl-modal .dsl-card .header-labels {
-    padding: 5px;
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-}
-
-.dsl-modal .dsl-card .footer-labels {
-    padding: 5px;
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-}
-
-.dsl-modal .version,
-.dsl-modal .support-type,
-.dsl-modal .support-level {
-    white-space: nowrap;
-}
-
-.dsl-modal .labels {
-    opacity: 0.5;
-    font-weight: 200;
-    text-wrap: nowrap;
-}
-
-.dsl-modal .dsl-card:hover .labels {
-    opacity: 1;
-}
-
 .move-modal {
     width: 270px !important;
 }
diff --git a/karavan-space/src/designer/route/DslSelector.css 
b/karavan-space/src/designer/route/DslSelector.css
new file mode 100644
index 00000000..4bca7774
--- /dev/null
+++ b/karavan-space/src/designer/route/DslSelector.css
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ */
+
+.dsl-modal {
+    height: 80%;
+    color: var(--pf-v5-global--Color--100);
+}
+
+.dsl-modal .dsl-card {
+    cursor: pointer;
+}
+
+.dsl-modal .dsl-card .pf-v5-c-card__header-main {
+    display: flex;
+    flex-direction: row;
+}
+
+.dsl-modal .dsl-card .header-labels .pf-v5-c-card__header-main {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+}
+
+.dsl-modal .dsl-card .icon {
+    height: 20px;
+    width: auto;
+    border: none;
+    margin-right: 6px;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    user-select: none;
+}
+
+.dsl-modal .search {
+    position: absolute;
+    top: 24px;
+    right: 72px;
+    display:flex;
+    justify-content:flex-end;
+}
+
+.dsl-modal .search .pf-v5-c-form__group-label {
+    padding: 0;
+    margin: auto;
+}
+
+.dsl-modal .search .text-field {
+    height: auto;
+}
+
+.dsl-modal .pf-v5-c-form.pf-v5-m-horizontal .pf-v5-c-form__group {
+    display: contents;
+}
+
+.dsl-modal .pf-v5-c-card__body {
+    padding-bottom: 0;
+    height: 54px;
+}
+
+
+.dsl-modal .dsl-card p {
+    overflow: hidden;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+}
+.dsl-modal .pf-v5-c-card__footer {
+    padding-bottom: 1em;
+}
+
+.dsl-modal .footer {
+    display: flex;
+    flex-direction: row;
+    margin-top: 6px;
+    flex-wrap: wrap;
+}
+
+.dsl-modal .dsl-card .header-labels {
+    padding: 5px;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+}
+
+.dsl-modal .dsl-card .footer-labels {
+    padding: 5px;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+}
+
+.dsl-modal .version,
+.dsl-modal .support-type,
+.dsl-modal .support-level {
+    white-space: nowrap;
+}
+
+.dsl-modal .labels {
+    opacity: 0.5;
+    font-weight: 200;
+    text-wrap: nowrap;
+}
+
+.dsl-modal .dsl-card:hover .labels {
+    opacity: 1;
+}
diff --git a/karavan-space/src/designer/route/DslSelector.tsx 
b/karavan-space/src/designer/route/DslSelector.tsx
index 3bc6bb7d..68e62e22 100644
--- a/karavan-space/src/designer/route/DslSelector.tsx
+++ b/karavan-space/src/designer/route/DslSelector.tsx
@@ -19,9 +19,9 @@ 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 './DslSelector.css';
 import {CamelUi} from "../utils/CamelUi";
 import {DslMetaModel} from "../utils/DslMetaModel";
 import {useDesignerStore, useSelectorStore} from "../DesignerStore";
@@ -48,6 +48,7 @@ export function DslSelector (props: Props) {
 
 
     const [filter, setFilter] = useState<string>('');
+    const [customOnly, setCustomOnly] = useState<boolean>(false);
 
     useEffect(() => {
     }, [selectedLabels]);
@@ -66,18 +67,27 @@ export function DslSelector (props: Props) {
 
     function searchInput() {
         return (
-            <Form isHorizontal className="search" autoComplete="off">
-                <FormGroup fieldId="search">
-                    <TextInput className="text-field" type="text" id="search" 
name="search"
+            <Flex className="search">
+                {selectorTabIndex === 'kamelet' && <FlexItem>
+                    <Switch
+                        label="Custom only"
+                        id="switch"
+                        isChecked={customOnly}
+                        onChange={(_event, checked) => setCustomOnly(checked)}
+                    />
+                </FlexItem>}
+                <FlexItem>
+                    <TextInput className="text-field" type="text" id="search" 
name="search" autoComplete={"off"}
                                value={filter}
                                onChange={(_, value) => setFilter(value)}/>
-                </FormGroup>
-            </Form>
+                </FlexItem>
+            </Flex>
         )
     }
 
     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 +96,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)}
@@ -118,25 +129,41 @@ export function DslSelector (props: Props) {
         }
     }
 
+    function filterElements(elements: DslMetaModel[]):DslMetaModel[] {
+        return elements.filter((dsl: DslMetaModel) => CamelUi.checkFilter(dsl, 
filter))
+            .filter((dsl: DslMetaModel) => {
+                if (!isEip || selectedLabels.length === 0) {
+                    return true;
+                } else {
+                    return dsl.labels.split(",").some(r => 
selectedLabels.includes(r));
+                }
+            });
+    }
+
     const isEip = selectorTabIndex === 'eip';
     const title = parentDsl === undefined ? "Select source" : "Select step";
     const navigation: string = selectorTabIndex ? selectorTabIndex.toString() 
: '';
     const blockedComponents = ComponentApi.getBlockedComponentNames();
     const blockedKamelets = KameletApi.getBlockedKameletNames();
     const elements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
navigation, showSteps);
-    const 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'))];
-    const filteredElement = allowedElements
-        .filter((dsl: DslMetaModel) => CamelUi.checkFilter(dsl, filter))
-        .filter((dsl: DslMetaModel) => {
-            if (!isEip || selectedLabels.length === 0) {
-                return true;
-            } else {
-                return dsl.labels.split(",").some(r => 
selectedLabels.includes(r));
-            }
-        });
+
+    const eipElements = CamelUi.getSelectorModelsForParentFiltered(parentDsl, 
'eip', showSteps);
+    const componentElements = 
CamelUi.getSelectorModelsForParentFiltered(parentDsl, 'component', showSteps)
+        .filter(dsl => (!blockedComponents.includes(dsl.uri || dsl.name)));
+    let kameletElements = 
CamelUi.getSelectorModelsForParentFiltered(parentDsl, 'kamelet', showSteps)
+        .filter(dsl => (!blockedKamelets.includes(dsl.name)));
+    if (customOnly) kameletElements = kameletElements.filter(k => 
KameletApi.getCustomKameletNames().includes(k.name));
+
+    const filteredEipElements = filterElements(eipElements);
+    const filteredComponentElements = filterElements(componentElements);
+    const filteredKameletElements = filterElements(kameletElements);
+
+    const eipLabels = [...new Set(eipElements.map(e => 
e.labels).join(",").split(",").filter(e => e !== 'eip'))];
+
+
+    const filteredElement = navigation === 'component'
+        ? filteredComponentElements
+        : (navigation === 'kamelet' ? filteredKameletElements : 
filteredEipElements);
 
     return (
         <Modal
@@ -154,17 +181,23 @@ export function DslSelector (props: Props) {
                     <FlexItem>
                         <Tabs style={{overflow: 'hidden'}} 
activeKey={selectorTabIndex}
                               onSelect={selectTab}>
-                            {parentDsl !== undefined &&
+                            {parentDsl !== undefined && 
filteredEipElements?.length > 0 &&
                                 <Tab eventKey={"eip"} key={"tab-eip"}
-                                     title={<TabTitleText>Integration 
Patterns</TabTitleText>}>
+                                     title={<TabTitleText>{`Integration 
Patterns (${filteredEipElements?.length})`}</TabTitleText>}>
+                                </Tab>
+                            }
+                            {filteredKameletElements?.length > 0 &&
+                                <Tab eventKey={'kamelet'} key={"tab-kamelet"}
+                                     title={
+                                         <TabTitleText>{`Kamelets 
(${filteredKameletElements?.length})`}</TabTitleText>}>
+                                </Tab>
+                            }
+                            {filteredComponentElements?.length > 0 &&
+                                <Tab eventKey={'component'} 
key={'tab-component'}
+                                     title={
+                                         <TabTitleText>{`Components 
(${filteredComponentElements?.length})`}</TabTitleText>}>
                                 </Tab>
                             }
-                            <Tab eventKey={'kamelet'} key={"tab-kamelet"}
-                                 title={<TabTitleText>Kamelets</TabTitleText>}>
-                            </Tab>
-                            <Tab eventKey={'component'} key={'tab-component'}
-                                 
title={<TabTitleText>Components</TabTitleText>}>
-                            </Tab>
                         </Tabs>
                     </FlexItem>
                 </Flex>
diff --git a/karavan-space/src/knowledgebase/KnowledgebasePage.tsx 
b/karavan-space/src/knowledgebase/KnowledgebasePage.tsx
index 86b777e5..f1630450 100644
--- a/karavan-space/src/knowledgebase/KnowledgebasePage.tsx
+++ b/karavan-space/src/knowledgebase/KnowledgebasePage.tsx
@@ -51,20 +51,22 @@ export const KnowledgebasePage = (props: Props) => {
     function getTools() {
         return <Toolbar id="toolbar-group-types">
             <ToolbarContent>
-                {tab === 'kamelets' && <ToolbarItem>
+                <Flex>
+                {tab === 'kamelets' && <FlexItem>
                     <Switch
                         label="Custom only"
                         isChecked={customOnly}
                         onChange={(_event, checked) => setCustomOnly(checked)}
                     />
-                </ToolbarItem>}
-                <ToolbarItem>
+                </FlexItem>}
+                <FlexItem>
                     <TextInput className="text-field" type="search" 
id="search" name="search"
                                value={filter}
                                onChange={(_event, value) => setFilter(value)}
                                autoComplete="off"
                                placeholder="Search by name"/>
-                </ToolbarItem>
+                </FlexItem>
+                </Flex>
             </ToolbarContent>
         </Toolbar>
     }
diff --git a/karavan-space/src/knowledgebase/kamelets/KameletCard.tsx 
b/karavan-space/src/knowledgebase/kamelets/KameletCard.tsx
index c773035c..d0784c02 100644
--- a/karavan-space/src/knowledgebase/kamelets/KameletCard.tsx
+++ b/karavan-space/src/knowledgebase/kamelets/KameletCard.tsx
@@ -16,7 +16,7 @@
  */
 import React, { useEffect, useState } from 'react';
 import {
-    CardHeader, Card, CardTitle, CardBody, CardFooter, Badge, Checkbox
+    CardHeader, Card, CardTitle, CardBody, CardFooter, Badge, Checkbox, Flex, 
FlexItem
 } from '@patternfly/react-core';
 import '../../designer/karavan.css';
 import {KameletModel} from "karavan-core/lib/model/KameletModels";
@@ -38,7 +38,7 @@ export function KameletCard(props: Props) {
     useEffect(() => {
         setBlockedKamelets(KameletApi.getBlockedKameletNames());
     }, []);
-    
+
     const kamelet = props.kamelet;
     const isCustom = 
KameletApi.getCustomKameletNames().includes(kamelet.metadata.name);
 
@@ -60,10 +60,12 @@ export function KameletCard(props: Props) {
                onClick={event => click(event)}
         >
             <CardHeader className="header-labels">
-                {isCustom && <Badge className="custom">custom</Badge>}
-                <Badge isRead className="support-level 
labels">{kamelet.metadata.annotations["camel.apache.org/kamelet.support.level"]}</Badge>
+                <Flex gap={{default:'gapNone'}}>
+                    <Badge isRead className="support-level 
labels">{kamelet.metadata.annotations["camel.apache.org/kamelet.support.level"]}</Badge>
+                    {isCustom && <Badge className="custom 
labels">custom</Badge>}
+                </Flex>
                 {showBlockCheckbox && <Checkbox id={kamelet.metadata.name} 
className="block-checkbox labels" isChecked={!isblockedKamelet}
-                           onChange={(_, checked) => selectKamelet(_, 
checked)}/>}
+                                                onChange={(_, checked) => 
selectKamelet(_, checked)}/>}
             </CardHeader>
             <CardHeader>
                 {CamelUi.getIconFromSource(kamelet.icon())}

Reply via email to