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 d875aaf5718e0b602829ee660a9d6298940a5814
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Tue May 14 14:03:29 2024 -0400

    Improved container management ui
---
 karavan-app/pom.xml                                |  2 +-
 .../camel/karavan/api/ContainerResource.java       |  1 -
 .../karavan/service/ContainerStatusService.java    |  9 ++-
 .../org/apache/camel/karavan/shared/Constants.java |  1 +
 karavan-app/src/main/webui/src/api/KaravanApi.tsx  |  9 +++
 .../src/main/webui/src/api/NotificationService.ts  |  4 +-
 .../src/main/webui/src/api/ProjectService.ts       | 17 ++++++
 .../src/main/webui/src/editor/EditorToolbar.tsx    |  1 -
 karavan-app/src/main/webui/src/main/Main.tsx       | 10 +---
 .../src/main/webui/src/main/useMainHook.tsx        | 24 +-------
 .../src/main/webui/src/project/BuildToolbar.tsx    | 64 ----------------------
 .../project/{devmode.css => DevModeToolbar.css}    |  0
 .../src/main/webui/src/project/DevModeToolbar.tsx  | 49 ++++-------------
 .../src/main/webui/src/project/ProjectPage.tsx     |  7 +--
 .../src/main/webui/src/project/ProjectToolbar.tsx  | 18 +-----
 15 files changed, 58 insertions(+), 158 deletions(-)

diff --git a/karavan-app/pom.xml b/karavan-app/pom.xml
index bb52d843..8cd13ba3 100644
--- a/karavan-app/pom.xml
+++ b/karavan-app/pom.xml
@@ -38,7 +38,7 @@
         <camel-kamelet.version>4.5.0</camel-kamelet.version>
         <surefire-plugin.version>3.1.0</surefire-plugin.version>
         <jgit.version>3.1.0</jgit.version>
-        <quinoa.version>2.3.6</quinoa.version>
+        <quinoa.version>2.3.7</quinoa.version>
         <resources-plugin.version>3.3.0</resources-plugin.version>
         <docker-java.version>3.3.5</docker-java.version>
     </properties>
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
index 2cd59af9..3f13ae42 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
@@ -173,7 +173,6 @@ public class ContainerResource {
     @Path("/{projectId}/{env}")
     public List<ContainerStatus> 
getContainerStatusesByProjectAndEnv(@PathParam("projectId") String projectId, 
@PathParam("env") String env) throws Exception {
         return karavanCacheService.getContainerStatuses(projectId, 
env).stream()
-                .filter(podStatus -> Objects.equals(podStatus.getType(), 
ContainerStatus.ContainerType.project))
                 
.sorted(Comparator.comparing(ContainerStatus::getContainerName))
                 .collect(Collectors.toList());
     }
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
index 69d52e6c..50d6c978 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
@@ -94,12 +94,17 @@ public class ContainerStatusService {
                     .filter(cs -> 
!namesInDocker.contains(cs.getContainerName()))
                     .forEach(containerStatus -> {
                         
eventBus.publish(ContainerStatusService.CONTAINER_DELETED, 
JsonObject.mapFrom(containerStatus));
-                        
karavanCacheService.deleteContainerStatus(containerStatus);
-                        
karavanCacheService.deleteCamelStatuses(containerStatus.getProjectId(), 
containerStatus.getEnv());
                     });
         }
     }
 
+    @ConsumeEvent(value = CONTAINER_DELETED, blocking = true, ordered = true)
+    public void cleanContainersStatus(JsonObject data) {
+        ContainerStatus containerStatus = data.mapTo(ContainerStatus.class);
+        karavanCacheService.deleteContainerStatus(containerStatus);
+        
karavanCacheService.deleteCamelStatuses(containerStatus.getProjectId(), 
containerStatus.getEnv());
+    }
+
     private boolean checkTransit(ContainerStatus cs) {
         if (cs.getContainerId() == null && cs.getInTransit()) {
             return Instant.parse(cs.getInitDate()).until(Instant.now(), 
ChronoUnit.SECONDS) < 10;
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java
index c2b9c1ac..55225dfa 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java
@@ -49,6 +49,7 @@ public class Constants {
     public static final String NOTIFICATION_HEADER_CLASS_NAME = "className";
 
     public static final String NOTIFICATION_EVENT_COMMIT = "commit";
+    public static final String NOTIFICATION_EVENT_CONTAINER_STATUS = 
"container_status";
 
     public enum CamelRuntime {
         CAMEL_MAIN("camel-main"),
diff --git a/karavan-app/src/main/webui/src/api/KaravanApi.tsx 
b/karavan-app/src/main/webui/src/api/KaravanApi.tsx
index 7e97b1f6..99e1625b 100644
--- a/karavan-app/src/main/webui/src/api/KaravanApi.tsx
+++ b/karavan-app/src/main/webui/src/api/KaravanApi.tsx
@@ -529,6 +529,15 @@ export class KaravanApi {
         });
     }
 
+    static async getContainerStatus(projectId: string, env: string, after: 
(res: AxiosResponse<ContainerStatus[]>) => void) {
+        instance.get('/ui/container/' + projectId + "/" + env)
+            .then(res => {
+                after(res);
+            }).catch(err => {
+                after(err);
+        });
+    }
+
     static async getAllDeploymentStatuses(after: (statuses: 
DeploymentStatus[]) => void) {
         instance.get('/ui/infrastructure/deployment')
             .then(res => {
diff --git a/karavan-app/src/main/webui/src/api/NotificationService.ts 
b/karavan-app/src/main/webui/src/api/NotificationService.ts
index 2008c652..75fb501b 100644
--- a/karavan-app/src/main/webui/src/api/NotificationService.ts
+++ b/karavan-app/src/main/webui/src/api/NotificationService.ts
@@ -16,9 +16,8 @@
  */
 
 import {Subject} from "rxjs";
-import {ProjectEventBus} from "./ProjectEventBus";
 import {unstable_batchedUpdates} from "react-dom";
-import {useLogStore, useProjectStore} from "./ProjectStore";
+import {useProjectStore} from "./ProjectStore";
 import {ProjectService} from "./ProjectService";
 
 export class KaravanEvent {
@@ -42,7 +41,6 @@ export const NotificationEventBus = {
 
 console.log("Start Notification subscriber");
 const sub = NotificationEventBus.onEvent()?.subscribe((event: KaravanEvent) => 
{
-    // console.log('KaravanEvent', event);
     if (event.event === 'commit' && event.className === 'Project') {
         const projectId = event.data?.projectId;
         if (useProjectStore.getState().project?.projectId === projectId) {
diff --git a/karavan-app/src/main/webui/src/api/ProjectService.ts 
b/karavan-app/src/main/webui/src/api/ProjectService.ts
index f8f0207f..b0364415 100644
--- a/karavan-app/src/main/webui/src/api/ProjectService.ts
+++ b/karavan-app/src/main/webui/src/api/ProjectService.ts
@@ -174,6 +174,23 @@ export class ProjectService {
         });
     }
 
+    public static refreshContainerStatus(projectId: string, env: string) {
+        KaravanApi.getContainerStatus(projectId, env, (res) => {
+            if (res.status === 200) {
+                const oldContainers = useStatusesStore.getState().containers;
+                const newContainers = res.data;
+                const newMap = new Map<string, ContainerStatus>(
+                    newContainers.map(container => [container.containerName, 
container])
+                );
+                const containers =  oldContainers
+                    .filter(container => newMap.has(container.containerName))  
// Filter out old containers not in new
+                    .map(container => newMap.get(container.containerName)!)    
 // Replace with new containers
+                    .concat(newContainers.filter(container => 
!oldContainers.some(old => old.containerName === container.containerName)));
+                useStatusesStore.setState({containers: containers});
+            }
+        })
+    }
+
     public static refreshAllServicesStatuses() {
         KaravanApi.getAllServiceStatuses((statuses: ServiceStatus[]) => {
             useStatusesStore.setState({services: statuses});
diff --git a/karavan-app/src/main/webui/src/editor/EditorToolbar.tsx 
b/karavan-app/src/main/webui/src/editor/EditorToolbar.tsx
index 76d7ce03..4605f0bc 100644
--- a/karavan-app/src/main/webui/src/editor/EditorToolbar.tsx
+++ b/karavan-app/src/main/webui/src/editor/EditorToolbar.tsx
@@ -27,7 +27,6 @@ import '../designer/karavan.css';
 import {useAppConfigStore, useFileStore, useProjectStore} from 
"../api/ProjectStore";
 import {shallow} from "zustand/shallow";
 import {DevModeToolbar} from "../project/DevModeToolbar";
-import RefreshIcon from "@patternfly/react-icons/dist/esm/icons/sync-alt-icon";
 import {KaravanApi} from "../api/KaravanApi";
 import {EventBus} from "../designer/utils/EventBus";
 import UpdateIcon from "@patternfly/react-icons/dist/esm/icons/cog-icon";
diff --git a/karavan-app/src/main/webui/src/main/Main.tsx 
b/karavan-app/src/main/webui/src/main/Main.tsx
index 1b29db59..ed16b04b 100644
--- a/karavan-app/src/main/webui/src/main/Main.tsx
+++ b/karavan-app/src/main/webui/src/main/Main.tsx
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import React, {useEffect, useRef} from "react";
+import React, {useEffect} from "react";
 import {KaravanApi} from "../api/KaravanApi";
 import {
     Flex,
@@ -74,14 +74,6 @@ export function Main() {
         });
     }
 
-    function showSpinner() {
-        return KaravanApi.authType === undefined || readiness === undefined;
-    }
-
-    function showStepper() {
-        return readiness !== undefined && readiness.status !== true;
-    }
-
     function showMain() {
         return KaravanApi.authType !== undefined && readiness?.status === true 
&& isAuthorized;
     }
diff --git a/karavan-app/src/main/webui/src/main/useMainHook.tsx 
b/karavan-app/src/main/webui/src/main/useMainHook.tsx
index 6570e19d..28065047 100644
--- a/karavan-app/src/main/webui/src/main/useMainHook.tsx
+++ b/karavan-app/src/main/webui/src/main/useMainHook.tsx
@@ -16,11 +16,10 @@
  */
 
 import {KaravanApi} from "../api/KaravanApi";
-import {KameletApi} from "karavan-core/lib/api/KameletApi";
 import '../designer/karavan.css';
 import {ComponentApi} from "karavan-core/lib/api/ComponentApi";
-import {AppConfig, ContainerStatus, Project} from "../api/ProjectModels";
-import {useAppConfigStore, useProjectsStore, useStatusesStore} from 
"../api/ProjectStore";
+import {AppConfig, Project} from "../api/ProjectModels";
+import {useAppConfigStore, useProjectsStore} from "../api/ProjectStore";
 import {InfrastructureAPI} from "../designer/utils/InfrastructureAPI";
 import {shallow} from "zustand/shallow";
 import {ProjectService} from "../api/ProjectService";
@@ -29,17 +28,8 @@ export function useMainHook () {
 
     const [setConfig, isAuthorized] = useAppConfigStore((s) => [s.setConfig, 
s.isAuthorized], shallow)
     const [setProjects] = useProjectsStore((s) => [s.setProjects], shallow)
-    const [setContainers] = useStatusesStore((state) => [state.setContainers], 
shallow);
     const [selectedEnv, selectEnvironment] = useAppConfigStore((state) => 
[state.selectedEnv, state.selectEnvironment], shallow)
 
-    const getStatuses = () =>  {
-        if (isAuthorized || KaravanApi.authType === 'public') {
-            KaravanApi.getAllContainerStatuses((statuses: ContainerStatus[]) 
=> {
-                setContainers(statuses);
-            });
-        }
-    }
-
     const getData = () =>  {
         if (isAuthorized) {
             KaravanApi.getConfiguration((config: AppConfig) => {
@@ -70,13 +60,5 @@ export function useMainHook () {
         });
     }
 
-    async function updateSupportedComponents(): Promise<void> {
-        await new Promise(resolve => {
-            KaravanApi.getSupportedComponents(jsons => {
-                ComponentApi.saveSupportedComponents(jsons);
-            })
-        });
-    }
-
-    return { getData, getStatuses }
+    return { getData }
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/webui/src/project/BuildToolbar.tsx 
b/karavan-app/src/main/webui/src/project/BuildToolbar.tsx
deleted file mode 100644
index eb2dfb10..00000000
--- a/karavan-app/src/main/webui/src/project/BuildToolbar.tsx
+++ /dev/null
@@ -1,64 +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 {Badge, Button, Flex, FlexItem, Label, Spinner, Tooltip, 
TooltipPosition} from '@patternfly/react-core';
-import '../designer/karavan.css';
-import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, 
useStatusesStore} from "../api/ProjectStore";
-import {shallow} from "zustand/shallow";
-import UpIcon from "@patternfly/react-icons/dist/esm/icons/running-icon";
-import DownIcon from 
"@patternfly/react-icons/dist/esm/icons/error-circle-o-icon";
-import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon";
-
-interface Props {
-    reloadOnly?: boolean
-}
-
-export function BuildToolbar (props: Props) {
-
-    const [config] = useAppConfigStore((state) => [state.config], shallow)
-    const [status] = useDevModeStore((state) => [state.status], shallow)
-    const [project] = useProjectStore((state) => [state.project], shallow)
-    const [containers] = useStatusesStore((state) => [state.containers], 
shallow);
-    const [setShowLog] = useLogStore((s) => [s.setShowLog], shallow);
-
-    const containerStatus = containers.filter(c => c.containerName === 
project.projectId).at(0);
-    const isRunning = containerStatus?.state === 'running';
-    const inTransit = containerStatus?.inTransit;
-    const isLoading = status === 'wip';
-    const color = containerStatus?.state === 'running' ? "green" : "grey";
-    const icon = isRunning ? <UpIcon/> : <DownIcon/>;
-
-    return (<Flex className="toolbar" direction={{default: "row"}} 
alignItems={{default: "alignItemsCenter"}}>
-        <FlexItem>
-            <Button className="dev-action-button" 
style={{visibility:"hidden"}} size="sm" variant={"control"} 
icon={<DeleteIcon/>} onClick={() => {}}>
-            </Button>
-        </FlexItem>
-        {containerStatus?.containerId && <FlexItem>
-            <Label icon={icon} color={color}>
-                <Tooltip content={"Show log"} 
position={TooltipPosition.bottom}>
-                    <Button className="dev-action-button labeled-button" 
variant="link" isDisabled={!isRunning}
-                            onClick={e =>
-                                setShowLog( true, 'container', 
containerStatus.containerName)}>
-                        {containerStatus.containerName}
-                    </Button>
-                </Tooltip>
-                <Badge isRead>{containerStatus.type}</Badge>
-            </Label>
-        </FlexItem>}
-    </Flex>)
-}
\ No newline at end of file
diff --git a/karavan-app/src/main/webui/src/project/devmode.css 
b/karavan-app/src/main/webui/src/project/DevModeToolbar.css
similarity index 100%
rename from karavan-app/src/main/webui/src/project/devmode.css
rename to karavan-app/src/main/webui/src/project/DevModeToolbar.css
diff --git a/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx 
b/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
index e2b0bfe1..4cb70dea 100644
--- a/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
+++ b/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
@@ -16,20 +16,18 @@
  */
 
 import React, {useEffect, useState} from 'react';
-import {Badge, Button, Flex, FlexItem, Label, Spinner, Switch, Tooltip, 
TooltipPosition} from '@patternfly/react-core';
+import {Badge, Button, Flex, FlexItem, Label, Switch, Tooltip, 
TooltipPosition} from '@patternfly/react-core';
 import '../designer/karavan.css';
 import RocketIcon from "@patternfly/react-icons/dist/esm/icons/rocket-icon";
 import ReloadIcon from "@patternfly/react-icons/dist/esm/icons/bolt-icon";
 import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon";
-import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, 
useStatusesStore} from "../api/ProjectStore";
+import {useAppConfigStore, useLogStore, useProjectStore, useStatusesStore} 
from "../api/ProjectStore";
 import {ProjectService} from "../api/ProjectService";
 import {shallow} from "zustand/shallow";
 import UpIcon from "@patternfly/react-icons/dist/esm/icons/running-icon";
 import DownIcon from 
"@patternfly/react-icons/dist/esm/icons/error-circle-o-icon";
-import RefreshIcon from "@patternfly/react-icons/dist/esm/icons/sync-alt-icon";
-import StopIcon from "@patternfly/react-icons/dist/esm/icons/stop-icon";
 import {ContainerStatus} from "../api/ProjectModels";
-import "./devmode.css"
+import "./DevModeToolbar.css"
 
 interface Props {
     reloadOnly?: boolean
@@ -38,19 +36,16 @@ interface Props {
 export function DevModeToolbar(props: Props) {
 
     const [config] = useAppConfigStore((state) => [state.config], shallow)
-    const [status] = useDevModeStore((state) => [state.status], shallow)
     const [project, refreshTrace] = useProjectStore((state) => [state.project, 
state.refreshTrace], shallow)
     const [containers] = useStatusesStore((state) => [state.containers], 
shallow);
     const [verbose, setVerbose] = useState(false);
     const [setShowLog] = useLogStore((s) => [s.setShowLog], shallow);
-    const [poll, setPoll] = useState(false);
     const [currentContainerStatus, setCurrentContainerStatus] = 
useState<ContainerStatus>();
 
     const containerStatus = containers.filter(c => c.containerName === 
project.projectId).at(0);
     const commands = containerStatus?.commands || ['run'];
     const isRunning = containerStatus?.state === 'running';
     const inTransit = containerStatus?.inTransit;
-    const isLoading = status === 'wip';
     const color = containerStatus?.state === 'running' ? "green" : "grey";
     const icon = isRunning ? <UpIcon/> : <DownIcon/>;
     const inDevMode = containerStatus?.type === 'devmode';
@@ -60,39 +55,19 @@ export function DevModeToolbar(props: Props) {
             refreshContainer();
         }, 1300)
         return () => clearInterval(interval);
-    }, [poll, currentContainerStatus, containers]);
+    }, [currentContainerStatus, containers]);
 
     function refreshContainer(){
-        if (poll) {
-            ProjectService.refreshAllContainerStatuses();
-            ProjectService.refreshCamelStatus(project.projectId, 
config.environment);
-            ProjectService.refreshImages(project.projectId);
-            if (refreshTrace) {
-                ProjectService.refreshCamelTraces(project.projectId, 
config.environment);
-            }
-            if (currentContainerStatus && !containerStatus) {
-                setPoll(false);
-            }
-            setCurrentContainerStatus(containerStatus);
+        ProjectService.refreshContainerStatus(project.projectId, 
config.environment);
+        ProjectService.refreshCamelStatus(project.projectId, 
config.environment);
+        ProjectService.refreshImages(project.projectId);
+        if (refreshTrace) {
+            ProjectService.refreshCamelTraces(project.projectId, 
config.environment);
         }
+        setCurrentContainerStatus(containerStatus);
     }
 
     return (<Flex className="toolbar" direction={{default: "row"}} 
alignItems={{default: "alignItemsCenter"}}>
-        <FlexItem className="dev-action-button-place refresher">
-            {poll && <Spinner className="spinner" size="lg" 
aria-label="Refresh"/>}
-            <Tooltip content={poll ? "Stop refresh" : "Refresh auto"} 
position={TooltipPosition.bottom}>
-                <Button className="dev-action-button button"
-                        icon={poll ? <StopIcon/> : <RefreshIcon/>}
-                        variant={"link"}
-                        onClick={e => setPoll(!poll)}/>
-            </Tooltip>
-        </FlexItem>
-        {/*Replace with something else because Spinner is used fo refresh*/}
-        {/*{(inTransit || isLoading) &&*/}
-        {/*    <FlexItem>*/}
-        {/*        <Spinner size="lg" aria-label="spinner"/>*/}
-        {/*    </FlexItem>*/}
-        {/*}*/}
         {containerStatus?.containerId && <FlexItem>
             <Label icon={icon} color={color}>
                 <Tooltip content={"Show log"} 
position={TooltipPosition.bottom}>
@@ -122,7 +97,7 @@ export function DevModeToolbar(props: Props) {
                         icon={<RocketIcon/>}
                         onClick={() => {
                             ProjectService.startDevModeContainer(project, 
verbose);
-                            setPoll(true);
+                            // setPoll(true);
                         }}>
                     {"Run"}
                 </Button>
@@ -145,7 +120,7 @@ export function DevModeToolbar(props: Props) {
                         variant={"control"}
                         icon={<DeleteIcon/>}
                         onClick={() => {
-                            setPoll(true);
+                            // setPoll(true);
                             ProjectService.deleteDevModeContainer(project);
                         }}>
                 </Button>
diff --git a/karavan-app/src/main/webui/src/project/ProjectPage.tsx 
b/karavan-app/src/main/webui/src/project/ProjectPage.tsx
index 0773203d..d96daa32 100644
--- a/karavan-app/src/main/webui/src/project/ProjectPage.tsx
+++ b/karavan-app/src/main/webui/src/project/ProjectPage.tsx
@@ -25,7 +25,7 @@ import '../designer/karavan.css';
 import {ProjectToolbar} from "./ProjectToolbar";
 import {ProjectLogPanel} from "./log/ProjectLogPanel";
 import {Project, ProjectType} from "../api/ProjectModels";
-import {useAppConfigStore, useFilesStore, useFileStore, useProjectsStore, 
useProjectStore} from "../api/ProjectStore";
+import {useFilesStore, useFileStore, useProjectsStore, useProjectStore} from 
"../api/ProjectStore";
 import {MainToolbar} from "../designer/MainToolbar";
 import {ProjectTitle} from "./ProjectTitle";
 import {ProjectPanel} from "./ProjectPanel";
@@ -41,8 +41,8 @@ export function ProjectPage() {
     const {file, operation} = useFileStore();
     const [files] = useFilesStore((s) => [s.files], shallow);
     const [projects] = useProjectsStore((state) => [state.projects], shallow)
-    const [project, setProject, tabIndex, setTabIndex, refreshTrace] =
-        useProjectStore((s) => [s.project, s.setProject, s.tabIndex, 
s.setTabIndex, s.refreshTrace], shallow);
+    const [project, setProject, tabIndex, setTabIndex] =
+        useProjectStore((s) => [s.project, s.setProject, s.tabIndex, 
s.setTabIndex], shallow);
 
     let {projectId} = useParams();
 
@@ -61,7 +61,6 @@ export function ProjectPage() {
     useEffect(() => {
         const interval = setInterval(() => {
             if (tabIndex === 'build' || tabIndex === 'container') {
-                ProjectService.refreshAllContainerStatuses();
                 ProjectService.refreshAllDeploymentStatuses();
                 ProjectService.refreshImages(project.projectId);
             }
diff --git a/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx 
b/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
index ef5f9ba5..d1bd8434 100644
--- a/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
+++ b/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
@@ -17,8 +17,6 @@
 
 import React, {useEffect} from 'react';
 import {
-    Flex,
-    FlexItem,
     Toolbar,
     ToolbarContent,
 } from '@patternfly/react-core';
@@ -26,12 +24,11 @@ import '../designer/karavan.css';
 import {DevModeToolbar} from "./DevModeToolbar";
 import {useFileStore, useProjectStore} from "../api/ProjectStore";
 import {shallow} from "zustand/shallow";
-import {BuildToolbar} from "./BuildToolbar";
 import {EditorToolbar} from "../editor/EditorToolbar";
 
 export function ProjectToolbar() {
 
-    const [project, tabIndex] = useProjectStore((s) => [s.project, 
s.tabIndex], shallow)
+    const [project] = useProjectStore((s) => [s.project, s.tabIndex], shallow)
     const [file] = useFileStore((state) => [state.file], shallow)
 
     useEffect(() => {
@@ -45,8 +42,7 @@ export function ProjectToolbar() {
     function getProjectToolbar() {
         return (<Toolbar id="toolbar-group-types">
             <ToolbarContent>
-                {isRunnable() && <DevModeToolbar/>}
-                {isBuildContainer() && <BuildToolbar/>}
+                {!isKameletsProject() && !isTemplatesProject() && 
!isServicesProject() && <DevModeToolbar/>}
             </ToolbarContent>
         </Toolbar>)
     }
@@ -63,13 +59,5 @@ export function ProjectToolbar() {
         return project.projectId === 'services';
     }
 
-    function isRunnable(): boolean {
-        return !isKameletsProject() && !isTemplatesProject() && 
!isServicesProject() && !['build', 'container'].includes(tabIndex.toString());
-    }
-
-    function isBuildContainer(): boolean {
-        return !isKameletsProject() && !isTemplatesProject() && 
!isServicesProject() && ['build', 'container'].includes(tabIndex.toString());
-    }
-
-    return isFile() ? <EditorToolbar/> : getProjectToolbar()
+    return isFile() ? <EditorToolbar/> : getProjectToolbar();
 }

Reply via email to