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 1f163f777ef2eb440a9c1ffb7b2c600db3058421 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Fri Nov 11 13:19:28 2022 -0500 ProjectPageToolbar class externalized --- karavan-app/src/main/webapp/src/Main.tsx | 4 +- karavan-app/src/main/webapp/src/index.css | 4 +- .../src/main/webapp/src/projects/ProjectPage.tsx | 90 +++------------- .../webapp/src/projects/ProjectPageToolbar.tsx | 115 +++++++++++++++++++++ .../src/main/webapp/src/projects/ProjectsPage.tsx | 7 +- 5 files changed, 138 insertions(+), 82 deletions(-) diff --git a/karavan-app/src/main/webapp/src/Main.tsx b/karavan-app/src/main/webapp/src/Main.tsx index f3dcdc3..b37908d 100644 --- a/karavan-app/src/main/webapp/src/Main.tsx +++ b/karavan-app/src/main/webapp/src/Main.tsx @@ -28,7 +28,7 @@ import KameletsIcon from "@patternfly/react-icons/dist/js/icons/registry-icon"; import DashboardIcon from "@patternfly/react-icons/dist/js/icons/tachometer-alt-icon"; import EipIcon from "@patternfly/react-icons/dist/js/icons/topology-icon"; import ComponentsIcon from "@patternfly/react-icons/dist/js/icons/module-icon"; -import TemplatesIcon from "@patternfly/react-icons/dist/js/icons/cogs-icon"; +import { PficonTemplateIcon } from '@patternfly/react-icons'; import {MainLogin} from "./MainLogin"; import {DashboardPage} from "./dashboard/DashboardPage"; @@ -165,7 +165,7 @@ export class Main extends React.Component<Props, State> { new MenuItem("eip", "Enterprise Integration Patterns", <EipIcon/>), new MenuItem("kamelets", "Kamelets", <KameletsIcon/>), new MenuItem("components", "Components", <ComponentsIcon/>), - new MenuItem("templates", "Templates", <TemplatesIcon/>) + new MenuItem("templates", "Templates", <PficonTemplateIcon/>) ] return (<Flex className="nav-buttons" direction={{default: "column"}} style={{height: "100%"}} spaceItems={{default: "spaceItemsNone"}}> diff --git a/karavan-app/src/main/webapp/src/index.css b/karavan-app/src/main/webapp/src/index.css index 43ae76f..b19e0f5 100644 --- a/karavan-app/src/main/webapp/src/index.css +++ b/karavan-app/src/main/webapp/src/index.css @@ -118,10 +118,10 @@ } .karavan .projects-page .runtime-badge { - min-width: 18px; + min-width: 27px; font-size: 14px; font-weight: 400; - padding: 2px 7px 2px 7px; + padding: 2px 8px 2px 8px; } .karavan .projects-page .pf-m-link { diff --git a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx index 9150d7b..0b12716 100644 --- a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx +++ b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx @@ -47,8 +47,8 @@ import {UploadModal} from "./UploadModal"; import {ProjectInfo} from "./ProjectInfo"; import {ProjectOperations} from "./ProjectOperations"; import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml"; -import RefreshIcon from "@patternfly/react-icons/dist/esm/icons/sync-alt-icon"; import PushIcon from "@patternfly/react-icons/dist/esm/icons/code-branch-icon"; +import {ProjectPageToolbar} from "./ProjectPageToolbar"; interface Props { project: Project, @@ -168,79 +168,21 @@ export class ProjectPage extends React.Component<Props, State> { } tools = () => { - const {isTemplates, project} = this.props; - const {file, mode} = this.state; - const isFile = file !== undefined; - const isYaml = file !== undefined && file.name.endsWith("yaml"); - const isIntegration = isYaml && file?.code && CamelDefinitionYaml.yamlIsIntegration(file.code); - const isProperties = file !== undefined && file.name.endsWith("properties"); - return <Toolbar id="toolbar-group-types"> - <ToolbarContent> - {isTemplates && - <ToolbarItem> - <Flex justifyContent={{default: "justifyContentSpaceBetween"}} alignItems={{default: "alignItemsCenter"}}> - <FlexItem> - <Tooltip content={project?.lastCommit} position={"right"}> - <Badge>{project?.lastCommit ? project?.lastCommit?.substr(0, 7) : "-"}</Badge> - </Tooltip> - </FlexItem> - <FlexItem> - <Button variant="primary" icon={<PushIcon/>} onClick={e => { - KaravanApi.push(this.props.project, res => { - console.log(res) - if (res.status === 200 || res.status === 201) { - this.onRefresh(); - } else { - // Todo notification - } - }); - }}>Commit</Button> - </FlexItem> - </Flex> - </ToolbarItem> - } - {!isTemplates && - <Flex className="toolbar" direction={{default: "row"}} alignItems={{default:"alignItemsCenter"}}> - {isYaml && <FlexItem> - <ToggleGroup> - <ToggleGroupItem text="Design" buttonId="design" isSelected={mode === "design"} onChange={s => this.setState({mode:"design"})} /> - <ToggleGroupItem text="Code" buttonId="code" isSelected={mode === "code"} onChange={s => this.setState({mode:"code"})} /> - </ToggleGroup> - </FlexItem>} - - {isProperties && <FlexItem> - <Checkbox - id="advanced" - label="Edit advanced" - isChecked={this.state.editAdvancedProperties} - onChange={checked => this.setState({editAdvancedProperties: checked})} - /> - </FlexItem>} - {isProperties && <FlexItem> - <Button variant="primary" icon={<PlusIcon/>} onClick={e => this.addProperty()}>Add property</Button> - </FlexItem>} - - {isFile && <FlexItem> - <Tooltip content="Download source" position={"bottom-end"}> - <Button variant="control" icon={<DownloadIcon/>} onClick={e => this.download()}/> - </Tooltip> - </FlexItem>} - {isIntegration && <FlexItem> - <Tooltip content="Download image" position={"bottom-end"}> - <Button variant="control" icon={<DownloadImageIcon/>} onClick={e => this.downloadImage()}/> - </Tooltip> - </FlexItem>} - {!isFile && <FlexItem> - <Button variant={"primary"} icon={<PlusIcon/>} - onClick={e => this.setState({isCreateModalOpen: true})}>Create</Button> - </FlexItem>} - {!isFile && <FlexItem> - <Button variant="secondary" icon={<UploadIcon/>} - onClick={e => this.setState({isUploadModalOpen: true})}>Upload</Button> - </FlexItem>} - </Flex>} - </ToolbarContent> - </Toolbar> + return <ProjectPageToolbar + project={this.props.project} + file={this.state.file} + mode={this.state.mode} + isTemplates={this.props.isTemplates} + config={this.props.config} + addProperty={() => this.addProperty()} + download={() => this.download()} + downloadImage={() => this.downloadImage()} + editAdvancedProperties={this.state.editAdvancedProperties} + setEditAdvancedProperties={checked => this.setState({editAdvancedProperties: checked})} + setMode={mode => this.setState({mode: mode})} + setCreateModalOpen={() => this.setState({isCreateModalOpen: true})} + setUploadModalOpen={() => this.setState({isUploadModalOpen: true})} + /> } getType = (file: ProjectFile) => { diff --git a/karavan-app/src/main/webapp/src/projects/ProjectPageToolbar.tsx b/karavan-app/src/main/webapp/src/projects/ProjectPageToolbar.tsx new file mode 100644 index 0000000..325127a --- /dev/null +++ b/karavan-app/src/main/webapp/src/projects/ProjectPageToolbar.tsx @@ -0,0 +1,115 @@ +import React from 'react'; +import { + Badge, + Button, + Toolbar, + ToolbarContent, + Flex, + FlexItem, + ToggleGroup, + ToggleGroupItem, + Checkbox, Tooltip, ToolbarItem +} from '@patternfly/react-core'; +import '../designer/karavan.css'; +import {Project, ProjectFile} from "./ProjectModels"; +import UploadIcon from "@patternfly/react-icons/dist/esm/icons/upload-icon"; +import DownloadIcon from "@patternfly/react-icons/dist/esm/icons/download-icon"; +import DownloadImageIcon from "@patternfly/react-icons/dist/esm/icons/image-icon"; +import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon"; +import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml"; +import PushIcon from "@patternfly/react-icons/dist/esm/icons/code-branch-icon"; + +interface Props { + project: Project, + isTemplates?: boolean, + config: any, + file?: ProjectFile, + mode: "design" | "code", + editAdvancedProperties: boolean, + addProperty: () => void, + download: () => void, + downloadImage: () => void, + setCreateModalOpen: () => void, + setUploadModalOpen: () => void, + setEditAdvancedProperties: (checked: boolean) => void, + setMode: (mode: "design" | "code") => void, +} + +export class ProjectPageToolbar extends React.Component<Props> { + + render() { + const {isTemplates, project, file, mode, editAdvancedProperties} = this.props; + const isFile = file !== undefined; + const isYaml = file !== undefined && file.name.endsWith("yaml"); + const isIntegration = isYaml && file?.code && CamelDefinitionYaml.yamlIsIntegration(file.code); + const isProperties = file !== undefined && file.name.endsWith("properties"); + return <Toolbar id="toolbar-group-types"> + <ToolbarContent> + {isTemplates && + <ToolbarItem> + <Flex justifyContent={{default: "justifyContentSpaceBetween"}} alignItems={{default: "alignItemsCenter"}}> + {isProperties && <FlexItem> + <Checkbox + id="advanced" + label="Edit advanced" + isChecked={editAdvancedProperties} + onChange={checked => this.props.setEditAdvancedProperties.call(this, checked)} + /> + </FlexItem>} + <FlexItem> + <Tooltip content={project?.lastCommit} position={"right"}> + <Badge>{project?.lastCommit ? project?.lastCommit?.substr(0, 7) : "-"}</Badge> + </Tooltip> + </FlexItem> + <FlexItem> + <Button variant="primary" icon={<PushIcon/>} onClick={e => {}}>Commit</Button> + </FlexItem> + </Flex> + </ToolbarItem> + } + {!isTemplates && + <Flex className="toolbar" direction={{default: "row"}} alignItems={{default:"alignItemsCenter"}}> + {isYaml && <FlexItem> + <ToggleGroup> + <ToggleGroupItem text="Design" buttonId="design" isSelected={mode === "design"} + onChange={s => this.props.setMode.call(this, "design")} /> + <ToggleGroupItem text="Code" buttonId="code" isSelected={mode === "code"} + onChange={s => this.props.setMode.call(this, "code")} /> + </ToggleGroup> + </FlexItem>} + + {isProperties && <FlexItem> + <Checkbox + id="advanced" + label="Edit advanced" + isChecked={editAdvancedProperties} + onChange={checked => this.props.setEditAdvancedProperties.call(this, checked)} + /> + </FlexItem>} + {isProperties && <FlexItem> + <Button variant="primary" icon={<PlusIcon/>} onClick={e => this.props.addProperty.call(this)}>Add property</Button> + </FlexItem>} + + {isFile && <FlexItem> + <Tooltip content="Download source" position={"bottom-end"}> + <Button variant="control" icon={<DownloadIcon/>} onClick={e => this.props.download.call(this)}/> + </Tooltip> + </FlexItem>} + {isIntegration && <FlexItem> + <Tooltip content="Download image" position={"bottom-end"}> + <Button variant="control" icon={<DownloadImageIcon/>} onClick={e => this.props.downloadImage.call(this)}/> + </Tooltip> + </FlexItem>} + {!isFile && <FlexItem> + <Button variant={"primary"} icon={<PlusIcon/>} + onClick={e => this.props.setCreateModalOpen.call(this)}>Create</Button> + </FlexItem>} + {!isFile && <FlexItem> + <Button variant="secondary" icon={<UploadIcon/>} + onClick={e => this.props.setUploadModalOpen.call(this)}>Upload</Button> + </FlexItem>} + </Flex>} + </ToolbarContent> + </Toolbar> + } +} diff --git a/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx b/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx index 08bb7c7..32a7a4d 100644 --- a/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx +++ b/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx @@ -144,7 +144,7 @@ export class ProjectsPage extends React.Component<Props, State> { </TextContent>); closeModal = () => { - this.setState({isCreateModalOpen: false, isCopy: false, name: this.props.config.groupId, description: '', projectId: ''}); + this.setState({isCreateModalOpen: false, isCopy: false, name: this.props.config.groupId, description: '', projectId: '', runtime: this.props.config.runtime }); this.onGetProjects(); } @@ -246,7 +246,6 @@ export class ProjectsPage extends React.Component<Props, State> { } render() { - const runtime = this.props.config?.runtime ? this.props.config.runtime : "QUARKUS"; const projects = this.state.projects.filter(p => p.name.toLowerCase().includes(this.state.filter) || p.description.toLowerCase().includes(this.state.filter)); return ( <PageSection className="kamelet-section projects-page" padding={{default: 'noPadding'}}> @@ -270,8 +269,8 @@ export class ProjectsPage extends React.Component<Props, State> { {projects.map(project => ( <Tr key={project.projectId}> <Td modifier={"fitContent"}> - <Tooltip content={runtime} position={"left"}> - <Badge className="runtime-badge">{runtime.substring(0, 1)}</Badge> + <Tooltip content={project.runtime} position={"left"}> + <Badge className="runtime-badge">{project.runtime.substring(0, 1).toUpperCase()}</Badge> </Tooltip> </Td> <Td>