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
The following commit(s) were added to refs/heads/main by this push: new 44ee0615 Fix #669 44ee0615 is described below commit 44ee061565e8d4fc6150f4ebea4c314f1547bae1 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Thu Mar 2 12:19:52 2023 -0500 Fix #669 --- karavan-space/package-lock.json | 43 +++++++--- karavan-space/package.json | 2 +- karavan-space/src/components/ComponentCard.tsx | 12 ++- karavan-space/src/designer/karavan.css | 102 ++++++++++++++++------- karavan-space/src/designer/route/DslSelector.tsx | 23 ++--- karavan-space/src/designer/utils/CamelUi.tsx | 2 + karavan-space/src/designer/utils/DslMetaModel.ts | 1 + karavan-space/src/eip/EipCard.tsx | 7 +- karavan-space/src/kamelets/KameletCard.tsx | 12 +-- karavan-space/src/space/GithubModal.tsx | 4 +- karavan-space/src/space/SpacePage.tsx | 16 +++- karavan-space/src/space/UploadModal.tsx | 3 +- 12 files changed, 160 insertions(+), 67 deletions(-) diff --git a/karavan-space/package-lock.json b/karavan-space/package-lock.json index 884566c9..e750e3ab 100644 --- a/karavan-space/package-lock.json +++ b/karavan-space/package-lock.json @@ -42,6 +42,27 @@ "typescript": "^4.9.5" } }, + "../karavan-core": { + "version": "3.20.1-SNAPSHOT", + "license": "Apache-2.0", + "dependencies": { + "@types/js-yaml": "^4.0.5", + "@types/uuid": "^8.3.4", + "typescript": "^4.9.4", + "uuid": "8.3.2" + }, + "devDependencies": { + "@types/chai": "^4.3.0", + "@types/dagre": "^0.7.47", + "@types/mocha": "^9.1.0", + "@types/node": "^18.11.18", + "chai": "^4.3.4", + "cross-env": "^7.0.3", + "fs": "^0.0.1-security", + "mocha": "^9.2.0", + "ts-node": "^10.4.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -12147,15 +12168,8 @@ } }, "node_modules/karavan-core": { - "version": "3.20.1-SNAPSHOT", - "resolved": "file:../karavan-core", - "license": "Apache-2.0", - "dependencies": { - "@types/js-yaml": "^4.0.5", - "@types/uuid": "^8.3.4", - "typescript": "^4.9.4", - "uuid": "8.3.2" - } + "resolved": "../karavan-core", + "link": true }, "node_modules/kind-of": { "version": "6.0.3", @@ -26453,10 +26467,19 @@ } }, "karavan-core": { - "version": "3.20.1-SNAPSHOT", + "version": "file:../karavan-core", "requires": { + "@types/chai": "^4.3.0", + "@types/dagre": "^0.7.47", "@types/js-yaml": "^4.0.5", + "@types/mocha": "^9.1.0", + "@types/node": "^18.11.18", "@types/uuid": "^8.3.4", + "chai": "^4.3.4", + "cross-env": "^7.0.3", + "fs": "^0.0.1-security", + "mocha": "^9.2.0", + "ts-node": "^10.4.0", "typescript": "^4.9.4", "uuid": "8.3.2" } diff --git a/karavan-space/package.json b/karavan-space/package.json index 3701d7ed..44098ffd 100644 --- a/karavan-space/package.json +++ b/karavan-space/package.json @@ -1,6 +1,6 @@ { "name": "karavan-space", - "version": "3.18.6", + "version": "3.20.1", "license": "Apache-2.0", "scripts": { "cp-designer": "cp -r ../karavan-designer/src/designer src", diff --git a/karavan-space/src/components/ComponentCard.tsx b/karavan-space/src/components/ComponentCard.tsx index ba18bd4f..83521a66 100644 --- a/karavan-space/src/components/ComponentCard.tsx +++ b/karavan-space/src/components/ComponentCard.tsx @@ -16,7 +16,7 @@ */ import React from 'react'; import { - CardHeader, Card, CardTitle, CardBody, CardFooter,Badge + CardHeader, Card, CardTitle, CardBody, CardFooter, Badge, Text } from '@patternfly/react-core'; import '../designer/karavan.css'; import {camelIcon, CamelUi} from "../designer/utils/CamelUi"; @@ -48,14 +48,18 @@ export class ComponentCard extends React.Component<Props, State> { <Card isHoverable isCompact key={component.component.name} className="kamelet-card" onClick={event => this.click(event)} > + <CardHeader className="header-labels"> + {component.component.supportType === 'Supported' && <Badge isRead className="support-type labels">{component.component.supportType}</Badge>} + <Badge isRead className="support-level labels">{component.component.supportLevel}</Badge> + </CardHeader> <CardHeader> {CamelUi.getIconFromSource(camelIcon)} + <CardTitle>{component.component.title}</CardTitle> </CardHeader> - <CardTitle>{component.component.title}</CardTitle> <CardBody>{component.component.description}</CardBody> - <CardFooter> + <CardFooter className="footer-labels"> <Badge isRead className="labels">{component.component.label}</Badge> - <Badge isRead className="version">{component.component.version}</Badge> + <Badge isRead className="version labels">{component.component.version}</Badge> </CardFooter> </Card> ); diff --git a/karavan-space/src/designer/karavan.css b/karavan-space/src/designer/karavan.css index 3598b1ab..4e714245 100644 --- a/karavan-space/src/designer/karavan.css +++ b/karavan-space/src/designer/karavan.css @@ -43,9 +43,10 @@ justify-content: space-between; } -.karavan .page-header .top-toolbar .pf-c-page__header-tools{ +.karavan .page-header .top-toolbar .pf-c-page__header-tools { margin-right: 0; } + .karavan .page-header .top-toolbar { width: 100%; } @@ -124,10 +125,6 @@ height: 160px; } -.kamelets-page .kamelet-card .pf-c-card__header { - /*padding-right: 6px;*/ -} - .kamelets-page .kamelet-card .pf-c-card__header .custom { margin-left: auto; } @@ -140,12 +137,14 @@ .kamelets-page .kamelet-card .pf-c-card__body { overflow: hidden; position: relative; + line-height: 1.6em; } .kamelets-page .kamelet-card .icon { height: 24px; margin-top: auto; margin-bottom: auto; + margin-right: 3px; border: none; -webkit-user-select: none; -khtml-user-select: none; @@ -154,12 +153,33 @@ user-select: none; } -.karavan .kamelets-page .kamelet-card .pf-c-card__footer { +.kamelets-page .kamelet-card .header-labels { + padding: 5px; + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.kamelets-page .kamelet-card .footer-labels { + padding: 5px; display: flex; flex-direction: row; justify-content: space-between; } +.kamelets-page .kamelet-card .version, +.kamelets-page .kamelet-card .support-type, +.kamelets-page .kamelet-card .support-level { + white-space: nowrap; +} + +.kamelets-page .kamelet-card .labels { + opacity: 0.5; +} + +.kamelets-page .kamelet-card:hover .labels { + opacity: 1; +} /*kamelet modal*/ .kamelet-modal-card .pf-c-card__header { @@ -277,7 +297,7 @@ flex-direction: row; } -.karavan .properties .headers .top h1{ +.karavan .properties .headers .top h1 { width: 100%; margin-top: auto; margin-bottom: auto; @@ -321,16 +341,17 @@ .karavan .properties .input-group .pf-c-chip-group .pf-c-chip-group__list, .karavan .properties .input-group .pf-c-chip-group .pf-c-chip-group__list .pf-c-chip-group__list-item, .karavan .properties .input-group .pf-c-chip-group .pf-c-chip-group__main { - display:block; + display: block; } .karavan .properties .input-group .pf-c-chip-group { margin-left: 0; } -.karavan .properties .input-group .pf-c-chip-group .pf-c-chip .pf-c-chip__text{ +.karavan .properties .input-group .pf-c-chip-group .pf-c-chip .pf-c-chip__text { max-width: inherit; } + .karavan .properties .input-group .pf-c-chip-group .pf-c-chip { width: 100%; } @@ -340,8 +361,8 @@ margin-top: auto; } -.karavan .properties .chip .pf-c-button{ - position:absolute; +.karavan .properties .chip .pf-c-button { + position: absolute; right: 0; } @@ -464,7 +485,7 @@ .karavan .properties .expression .pf-c-select__menu-wrapper, .karavan .properties .object .pf-c-select__menu-wrapper, .karavan .properties .dataformat .pf-c-select__menu-wrapper, -.karavan .properties .parameters .pf-c-select__menu-wrapper{ +.karavan .properties .parameters .pf-c-select__menu-wrapper { width: 350px; } @@ -487,7 +508,7 @@ } .karavan .properties .delete-button { - color: #909090; + color: #909090; } .karavan .properties .pf-c-expandable-section__toggle { @@ -592,7 +613,11 @@ fill: transparent; } -@keyframes dashdraw{0%{stroke-dashoffset:10}} +@keyframes dashdraw { + 0% { + stroke-dashoffset: 10 + } +} .karavan .dsl-page .flows .step-element { align-items: center; @@ -617,14 +642,14 @@ .karavan .dsl-page .flows .children { display: flex; flex-wrap: wrap; - flex-wrap:nowrap; + flex-wrap: nowrap; gap: 6px; } .karavan .dsl-page .flows .has-child { display: flex; flex-direction: column; - flex-wrap:nowrap; + flex-wrap: nowrap; gap: 6px; } @@ -700,16 +725,19 @@ display: flex; flex-direction: row; } + .karavan .step-element .header .spacer { width: 50% } + .karavan .step-element .header .text-bottom { background-color: rgba(255, 255, 255, 0.5); } + .karavan .step-element .header .text-right { padding-left: 17px; width: 50%; - text-align:start; + text-align: start; } .karavan .step-element .header .header-text-required { @@ -867,7 +895,7 @@ } -.dsl-modal .search .pf-c-form__group-label{ +.dsl-modal .search .pf-c-form__group-label { padding: 0; margin: auto; } @@ -896,16 +924,23 @@ flex-wrap: wrap; } -.dsl-modal .version { - opacity: 0.5; - white-space: nowrap; - margin-left: auto; +.dsl-modal .pf-c-card.pf-m-compact .header-labels { + padding: 5px; + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.dsl-modal .pf-c-card.pf-m-compact .footer-labels { + padding: 5px; + display: flex; + flex-direction: row; + justify-content: space-between; } +.dsl-modal .version, +.dsl-modal .support-type, .dsl-modal .support-level { - position: absolute; - right: 6px; - top: 6px; white-space: nowrap; } @@ -913,6 +948,10 @@ opacity: 0.5; } +.dsl-modal .dsl-card:hover .labels { + opacity: 1; +} + .move-modal { width: 270px !important; } @@ -920,6 +959,7 @@ .move-modal .pf-c-modal-box__body { margin-right: 0 !important; } + .move-modal .pf-m-plain { display: none; } @@ -1128,13 +1168,14 @@ .karavan .yaml-page { height: 100px; } + /*Exception*/ /*Template*/ /*Error*/ .karavan .templates-page, .karavan .exception-page, -.karavan .error-page{ +.karavan .error-page { flex: 1; overflow: auto; } @@ -1163,6 +1204,7 @@ display: flex; flex-direction: row; } + .karavan .tools-section .tools .header .labels { height: fit-content; margin-left: 3px; @@ -1185,8 +1227,7 @@ .karavan .project-builder .pf-c-tabs__link, .karavan .project-builder .pf-c-card__title, -.karavan .project-builder .profile-caption -{ +.karavan .project-builder .profile-caption { font-size: 14px; } @@ -1238,6 +1279,7 @@ gap: 10px; padding: 10px; } + .karavan .project-builder .center-column { width: 100%; display: flex; @@ -1262,18 +1304,22 @@ flex-direction: column; justify-content: space-around; } + .karavan .project-builder .project-properties td { padding: 0; margin: 0; } + .karavan .project-builder .project-properties td, .karavan .project-builder .project-properties tr { border: none; } + .karavan .project-builder .project-properties .delete-button { padding: 0 0 0 6px; margin: 0; } + .karavan .project-builder .add-button { width: fit-content; margin-top: 6px; diff --git a/karavan-space/src/designer/route/DslSelector.tsx b/karavan-space/src/designer/route/DslSelector.tsx index dd68403b..f394a92e 100644 --- a/karavan-space/src/designer/route/DslSelector.tsx +++ b/karavan-space/src/designer/route/DslSelector.tsx @@ -88,28 +88,31 @@ export class DslSelector extends React.Component<Props, State> { return ( <Card key={dsl.dsl + index} isHoverable isCompact className="dsl-card" onClick={event => this.selectDsl(event, dsl)}> + <CardHeader className="header-labels"> + {dsl.supportType === 'Supported' && <Badge isRead className="support-type labels">{dsl.supportType}</Badge>} + <Badge isRead className="support-level labels">{dsl.supportLevel}</Badge> + </CardHeader> <CardHeader> {CamelUi.getIconForDsl(dsl)} <Text>{dsl.title}</Text> - {dsl.supportLevel && dsl.supportLevel === 'Preview' && <Badge isRead className="support-level">{dsl.supportLevel}</Badge>} </CardHeader> <CardBody> <Text>{dsl.description}</Text> </CardBody> - <CardFooter> {dsl.navigation.toLowerCase() === "kamelet" - && <div className="footer" style={{justifyContent: "space-between"}}> + && <CardFooter className="footer-labels"> <Badge isRead className="labels">{dsl.labels}</Badge> - <Badge isRead className="version">{dsl.version}</Badge> - </div>} + <Badge isRead className="version labels">{dsl.version}</Badge> + </CardFooter>} {dsl.navigation.toLowerCase() === "component" - && <div className="footer" style={{justifyContent: "flex-start"}}> - {dsl.labels.split(',').map((s: string, i: number) => <Badge key={s + i} isRead + && <CardFooter className="footer-labels"> + <div> + {dsl.labels.split(',').map((s: string, i: number) => <Badge key={s + i} isRead className="labels">{s}</Badge>)} - <Badge isRead className="version">{dsl.version}</Badge> - </div> + </div> + <Badge isRead className="version labels">{dsl.version}</Badge> + </CardFooter> } - </CardFooter> </Card> ) } diff --git a/karavan-space/src/designer/utils/CamelUi.tsx b/karavan-space/src/designer/utils/CamelUi.tsx index 334607ef..a8985521 100644 --- a/karavan-space/src/designer/utils/CamelUi.tsx +++ b/karavan-space/src/designer/utils/CamelUi.tsx @@ -177,6 +177,8 @@ export class CamelUi { title: c.component.title, description: c.component.description, version: c.component.version, + supportLevel: c.component.supportLevel, + supportType: c.component.supportType, })); } diff --git a/karavan-space/src/designer/utils/DslMetaModel.ts b/karavan-space/src/designer/utils/DslMetaModel.ts index 53318bd0..d267a56d 100644 --- a/karavan-space/src/designer/utils/DslMetaModel.ts +++ b/karavan-space/src/designer/utils/DslMetaModel.ts @@ -25,6 +25,7 @@ export class DslMetaModel { navigation: string = '' version: string = '' supportLevel: string = '' + supportType: string = '' properties: any; public constructor(init?: Partial<DslMetaModel>) { diff --git a/karavan-space/src/eip/EipCard.tsx b/karavan-space/src/eip/EipCard.tsx index bfb2f8de..d288ac6f 100644 --- a/karavan-space/src/eip/EipCard.tsx +++ b/karavan-space/src/eip/EipCard.tsx @@ -53,8 +53,11 @@ export class EipCard extends React.Component<Props, State> { </CardHeader> <CardTitle>{component.title}</CardTitle> <CardBody>{component.description}</CardBody> - <CardFooter> - <Badge isRead className="labels">{component.labels}</Badge> + <CardFooter className="footer-labels"> + <div> + {component.labels.split(',').map((s: string, i: number) => <Badge key={s + i} isRead + className="labels">{s}</Badge>)} + </div> </CardFooter> </Card> ) diff --git a/karavan-space/src/kamelets/KameletCard.tsx b/karavan-space/src/kamelets/KameletCard.tsx index 5d4faafa..cfe3d48d 100644 --- a/karavan-space/src/kamelets/KameletCard.tsx +++ b/karavan-space/src/kamelets/KameletCard.tsx @@ -50,16 +50,18 @@ export class KameletCard extends React.Component<Props, State> { <Card isHoverable isCompact key={kamelet.metadata.name} className="kamelet-card" onClick={event => this.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> + </CardHeader> <CardHeader> {CamelUi.getIconFromSource(kamelet.icon())} - {isCustom && <Badge className="custom">custom</Badge>} + <CardTitle>{kamelet.spec.definition.title}</CardTitle> </CardHeader> - <CardTitle>{kamelet.spec.definition.title}</CardTitle> <CardBody>{kamelet.spec.definition.description}</CardBody> - <CardFooter> - {/*<div style={{justifyContent: "space-between"}}>*/} + <CardFooter className="footer-labels"> <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="version labels">{kamelet.metadata.annotations["camel.apache.org/catalog.version"].toLowerCase()}</Badge> {/*</div>*/} </CardFooter> </Card> diff --git a/karavan-space/src/space/GithubModal.tsx b/karavan-space/src/space/GithubModal.tsx index 23c80da1..70b5a158 100644 --- a/karavan-space/src/space/GithubModal.tsx +++ b/karavan-space/src/space/GithubModal.tsx @@ -11,8 +11,6 @@ import '../designer/karavan.css'; import {GithubApi, GithubParams} from "../api/GithubApi"; import GithubImageIcon from "@patternfly/react-icons/dist/esm/icons/github-icon"; import {StorageApi} from "../api/StorageApi"; -import {KameletApi} from "../../../karavan-core/lib/api/KameletApi"; -import {ComponentApi} from "../../../karavan-core/lib/api/ComponentApi"; import {SpaceBus} from "./SpaceBus"; interface Props { @@ -70,7 +68,7 @@ export class GithubModal extends React.Component<Props, State> { githubAuth = () => { GithubApi.auth( (result: any) => { - const onlyToken = StorageApi.getGithubParameters() != undefined; + const onlyToken = StorageApi.getGithubParameters() !== undefined; if (onlyToken){ this.setState({token: result.token}) } else { diff --git a/karavan-space/src/space/SpacePage.tsx b/karavan-space/src/space/SpacePage.tsx index 4c0346f0..f4489121 100644 --- a/karavan-space/src/space/SpacePage.tsx +++ b/karavan-space/src/space/SpacePage.tsx @@ -19,9 +19,10 @@ import { Toolbar, ToolbarContent, ToolbarItem, - PageSection, TextContent, Text, PageSectionVariants, Flex, FlexItem, Button, Tooltip, ToggleGroup, ToggleGroupItem + PageSection, TextContent, Text, Flex, FlexItem, Button, Tooltip, ToggleGroup, ToggleGroupItem } from '@patternfly/react-core'; import '../designer/karavan.css'; +import CopyIcon from "@patternfly/react-icons/dist/esm/icons/copy-icon"; import DownloadIcon from "@patternfly/react-icons/dist/esm/icons/download-icon"; import DownloadImageIcon from "@patternfly/react-icons/dist/esm/icons/image-icon"; import GithubImageIcon from "@patternfly/react-icons/dist/esm/icons/github-icon"; @@ -58,6 +59,10 @@ export class SpacePage extends React.Component<Props, State> { this.props.onSave?.call(this, filename, yaml, propertyOnly); } + copyToClipboard = () => { + navigator.clipboard.writeText(this.props.yaml); + } + download = () => { const {name, yaml} = this.props; if (name && yaml) { @@ -153,9 +158,16 @@ export class SpacePage extends React.Component<Props, State> { <FlexItem> <Toolbar id="toolbar-group-types"> <ToolbarContent> + <ToolbarItem> + <Tooltip content="Copy to Clipboard" position={"bottom"}> + <Button variant="primary" icon={<CopyIcon/>} onClick={e => this.copyToClipboard()}> + Copy + </Button> + </Tooltip> + </ToolbarItem> <ToolbarItem> <Tooltip content="Download YAML" position={"bottom"}> - <Button variant="primary" icon={<DownloadIcon/>} onClick={e => this.download()}> + <Button variant="secondary" icon={<DownloadIcon/>} onClick={e => this.download()}> YAML </Button> </Tooltip> diff --git a/karavan-space/src/space/UploadModal.tsx b/karavan-space/src/space/UploadModal.tsx index 1177d06d..1ea8f463 100644 --- a/karavan-space/src/space/UploadModal.tsx +++ b/karavan-space/src/space/UploadModal.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { - TextInput, - Button, Modal, FormGroup, ModalVariant, Switch, Form, FileUpload, Radio + Button, Modal, FormGroup, ModalVariant, Form, FileUpload } from '@patternfly/react-core'; import '../designer/karavan.css'; import {GeneratorApi} from "../api/GeneratorApi";