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 c1265faf209f07d1543f3255d93b54808e193c6f Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Tue Sep 12 21:40:33 2023 -0400 Camel statuses for #885 --- .../karavan-app/src/main/webui/src/index.css | 34 ++++++++++++---- .../webui/src/knowledgebase/KnowledgebasePage.tsx | 23 ++++++++--- .../src/main/webui/src/project/ProjectPage.tsx | 47 ++++++++++++++++------ .../src/main/webui/src/project/ProjectPanel.tsx | 39 +++++++++--------- .../webui/src/project/dashboard/DashboardTab.tsx | 14 +++++-- .../webui/src/project/file/PropertiesTable.tsx | 2 +- 6 files changed, 107 insertions(+), 52 deletions(-) diff --git a/karavan-web/karavan-app/src/main/webui/src/index.css b/karavan-web/karavan-app/src/main/webui/src/index.css index 480fec25..b01376e6 100644 --- a/karavan-web/karavan-app/src/main/webui/src/index.css +++ b/karavan-web/karavan-app/src/main/webui/src/index.css @@ -136,6 +136,26 @@ font-size: 14px; } +.karavan .project-page { + display: flex; + flex-direction: column; + height: 100%; +} + +.karavan .project-page .scrollable-out { + display: flex; + flex-direction: column; + height: 100%; +} + +.karavan .project-page .scrollable-in { + overflow: auto; + flex-shrink: unset; + flex-grow: 1; + background-color: var(--pf-v5-global--BackgroundColor--light-300); + margin-bottom: 50px; +} + .karavan .project-page .project-title .pf-v5-l-flex.pf-m-column > * { margin-bottom: 0; } @@ -161,26 +181,26 @@ font-size: 14px; } -.karavan .project-page .project-development { +.karavan .project-page .dashboard-card { margin-bottom: 16px; } -.karavan .project-page .project-development .runner-toolbar { +.karavan .project-page .dashboard-card .runner-toolbar { line-height: 24px; row-gap: 24px; display: flex; flex-direction: column; justify-content: flex-start; } -.karavan .project-page .project-development .runner-toolbar .row { +.karavan .project-page .dashboard-card .runner-toolbar .row { line-height: 24px; height: 30px; } -.karavan .project-page .project-development .pf-v5-c-panel__header { +.karavan .project-page .dashboard-card .pf-v5-c-panel__header { padding: 0; } -.karavan .project-page .project-development .pf-v5-c-panel__main { +.karavan .project-page .dashboard-card .pf-v5-c-panel__main { max-height: 212px; } @@ -266,8 +286,8 @@ min-width: 0; } .karavan .project-page .project-properties .delete-button { - padding: 0 0 0 6px; - margin: 0; + padding: 0 0 0 0; + margin: 0 16px 0 0; } .karavan .project-page .pf-v5-c-label__icon { diff --git a/karavan-web/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx b/karavan-web/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx index 02c6b641..3078d21a 100644 --- a/karavan-web/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx @@ -16,7 +16,20 @@ */ import React, {useState} from 'react'; import '../designer/karavan.css'; -import {Flex, FlexItem, PageSection, Switch, Tab, Tabs, Text, TextContent, TextInput, Toolbar, ToolbarContent, ToolbarItem} from "@patternfly/react-core"; +import { + Flex, + FlexItem, + PageSection, + Switch, + Tab, + Tabs, + Text, + TextContent, + TextInput, + Toolbar, + ToolbarContent, + ToolbarItem +} from "@patternfly/react-core"; import {MainToolbar} from "../designer/MainToolbar"; import {KameletsTab} from "./kamelets/KameletsTab"; import {EipTab} from "./eip/EipTab"; @@ -75,11 +88,9 @@ export const KnowledgebasePage = (props: Props) => { </FlexItem> </Flex> </PageSection> - <> - {tab === 'kamelets' && <KameletsTab dark={props.dark} filter={filter} customOnly={customOnly}/>} - {tab === 'eip' && <EipTab dark={props.dark} filter={filter}/>} - {tab === 'components' && <ComponentsTab dark={props.dark} filter={filter}/>} - </> + {tab === 'kamelets' && <KameletsTab dark={props.dark} filter={filter} customOnly={customOnly}/>} + {tab === 'eip' && <EipTab dark={props.dark} filter={filter}/>} + {tab === 'components' && <ComponentsTab dark={props.dark} filter={filter}/>} </PageSection> ) diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx index 9a39a090..c53cd2ef 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx @@ -1,13 +1,13 @@ -import React, {useEffect, useState} from 'react'; +import React, {useEffect} from 'react'; import { Flex, FlexItem, - PageSection, + PageSection, Tab, Tabs, } from '@patternfly/react-core'; import '../designer/karavan.css'; import {ProjectToolbar} from "./ProjectToolbar"; import {ProjectLogPanel} from "./log/ProjectLogPanel"; -import {Project, ProjectFileTypes} from "../api/ProjectModels"; +import {Project} from "../api/ProjectModels"; import {useFileStore, useProjectsStore, useProjectStore} from "../api/ProjectStore"; import {MainToolbar} from "../designer/MainToolbar"; import {ProjectTitle} from "./ProjectTitle"; @@ -18,21 +18,19 @@ import {useParams} from "react-router-dom"; import {KaravanApi} from "../api/KaravanApi"; import {ProjectDataPoller} from "./ProjectDataPoller"; -export function ProjectPage () { +export function ProjectPage() { const {file, operation} = useFileStore(); - const [mode, setMode] = useState<"design" | "code">("design"); - const [key, setKey] = useState<string>(''); const [projects] = useProjectsStore((state) => [state.projects], shallow) - const [project, setProject] = useProjectStore((s) => [s.project, s.setProject], shallow ) - let { projectId } = useParams(); - const [tab, setTab] = useState<string | number>('files'); + const [project, setProject, tab, setTab] = useProjectStore((s) => [s.project, s.setProject, s.tabIndex, s.setTabIndex], shallow); + + let {projectId} = useParams(); useEffect(() => { const p = projects.filter(project => project.projectId === projectId).at(0); if (p) { setProject(p, "select"); - } else if (projectId){ + } else if (projectId) { KaravanApi.getProject(projectId, project1 => setProject(project1, "select")); } return () => { @@ -40,12 +38,35 @@ export function ProjectPage () { } }, []); + function isBuildIn(): boolean { + return ['kamelets', 'templates', 'services'].includes(project.projectId); + } + + function showTabs(): boolean { + return !isBuildIn() && !showFilePanel; + } + + const buildIn = isBuildIn(); + const showFilePanel = file !== undefined && operation === 'select'; return ( - <PageSection className="designer-page project-page" padding={{default: 'noPadding'}}> - <div className="tools-section"> + <PageSection className="project-page" padding={{default: 'noPadding'}}> + <PageSection className="tools-section" padding={{default: 'noPadding'}}> <MainToolbar title={<ProjectTitle/>} tools={<ProjectToolbar/>}/> - </div> + </PageSection> + <PageSection className="tools-section" padding={{default: 'noPadding'}}> + <Flex direction={{default: "column"}} spaceItems={{default: "spaceItemsNone"}}> + <FlexItem className="project-tabs"> + {showTabs() && <Tabs activeKey={tab} onSelect={(event, tabIndex) => setTab(tabIndex)}> + <Tab eventKey="files" title="Files"/> + <Tab eventKey="dashboard" title="Dashboard"/> + <Tab eventKey="trace" title="Trace"/> + <Tab eventKey="build" title="Build"/> + <Tab eventKey="container" title="Container"/> + </Tabs>} + </FlexItem> + </Flex> + </PageSection> {showFilePanel && <FileEditor projectId={project.projectId}/>} {!showFilePanel && <ProjectPanel/>} <ProjectLogPanel/> diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx index 9b07d27a..5769a286 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx @@ -1,7 +1,7 @@ import React, {useEffect} from 'react'; import { Flex, - FlexItem, Tabs, Tab + FlexItem, Tabs, Tab, PageSection, PageSectionVariants, Gallery } from '@patternfly/react-core'; import '../designer/karavan.css'; import {FilesTab} from "./files/FilesTab"; @@ -14,6 +14,8 @@ import {shallow} from "zustand/shallow"; import {ImagesPanel} from "./build/ImagesPanel"; import {ContainerButtons} from "./container/ContainerButtons"; import {ProjectContainerTab} from "./container/ProjectContainerTab"; +import {KameletModal} from "../knowledgebase/kamelets/KameletModal"; +import {KameletCard} from "../knowledgebase/kamelets/KameletCard"; export function ProjectPanel() { @@ -27,6 +29,7 @@ export function ProjectPanel() { function onRefresh() { if (project.projectId) { ProjectService.refreshProjectData(project.projectId); + setTab('files') } } @@ -36,25 +39,19 @@ export function ProjectPanel() { const buildIn = isBuildIn(); return ( - <Flex direction={{default: "column"}} spaceItems={{default: "spaceItemsNone"}}> - <FlexItem className="project-tabs"> - {!buildIn && <Tabs activeKey={tab} onSelect={(event, tabIndex) => setTab(tabIndex)}> - <Tab eventKey="files" title="Files"/> - <Tab eventKey="dashboard" title="Dashboard"/> - <Tab eventKey="trace" title="Trace"/> - <Tab eventKey="build" title="Build"/> - <Tab eventKey="container" title="Container"/> - </Tabs>} - </FlexItem> - {buildIn && tab === 'files' && <FlexItem><FilesTab/></FlexItem>} - <FlexItem> - {!buildIn && tab === 'files' && <FlexItem><FilesTab/></FlexItem>} - {!buildIn && tab === 'dashboard' && project && <FlexItem><DashboardTab/></FlexItem>} - {!buildIn && tab === 'trace' && project && <FlexItem><TraceTab/></FlexItem>} - {!buildIn && tab === 'build' && <FlexItem><ProjectBuildTab/></FlexItem>} - {!buildIn && tab === 'build' && config.infrastructure !== 'kubernetes' && <FlexItem><ImagesPanel/></FlexItem>} - {!buildIn && tab === 'container' && <FlexItem><ProjectContainerTab/></FlexItem>} - </FlexItem> - </Flex> + <PageSection padding={{default: 'noPadding'}} className="scrollable-out"> + <PageSection isFilled padding={{default: 'noPadding'}} className="scrollable-in"> + <Flex direction={{default: "column"}} spaceItems={{default: "spaceItemsNone"}}> + {tab === 'files' && <FlexItem><FilesTab/></FlexItem>} + {!buildIn && tab === 'dashboard' && project && <FlexItem><DashboardTab/></FlexItem>} + {!buildIn && tab === 'trace' && project && <FlexItem><TraceTab/></FlexItem>} + {!buildIn && tab === 'build' && <FlexItem><ProjectBuildTab/></FlexItem>} + {!buildIn && tab === 'build' && config.infrastructure !== 'kubernetes' && <FlexItem><ImagesPanel/></FlexItem>} + {!buildIn && tab === 'container' && <FlexItem><ProjectContainerTab/></FlexItem>} + </Flex> + </PageSection> + </PageSection> + + ) } diff --git a/karavan-web/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx b/karavan-web/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx index 795385f3..c58aca91 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx @@ -45,10 +45,16 @@ export function DashboardTab() { const camelContainers = containers .filter(c => c.projectId === project.projectId && ['devmode', 'project'].includes(c.type)); + camelContainers.push(...camelContainers) + camelContainers.push(...camelContainers) + camelContainers.push(...camelContainers) + camelContainers.push(...camelContainers) + camelContainers.push(...camelContainers) + return ( <PageSection className="project-tab-panel" padding={{default: "padding"}}> - <Panel isScrollable> - {camelContainers.map((containerStatus, index) => <Card className="project-development"> + {camelContainers.map((containerStatus, index) => + <Card className="dashboard-card"> <CardBody> <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentSpaceBetween"}}> @@ -65,8 +71,8 @@ export function DashboardTab() { </FlexItem> </Flex> </CardBody> - </Card>)} - </Panel> + </Card> + )} {camelContainers.length === 0 && <Card className="project-development"> <CardBody> diff --git a/karavan-web/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx b/karavan-web/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx index 24e6d428..1e0fe7fb 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx @@ -100,7 +100,7 @@ export function PropertiesTable () { } return ( - <PageSection isFilled className="kamelets-page" padding={{default: file !== undefined ? 'noPadding' : 'padding'}}> + <PageSection isFilled className="scrollable-in" padding={{default: file !== undefined ? 'noPadding' : 'padding'}}> <PageSection padding={{default: "noPadding"}}> {properties.length > 0 && <Table aria-label="Property table" variant='compact' borders={false}