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 4aeba2183deba98067d85f7bc05268b775cbb6c5 Author: Marat Gubaidullin <[email protected]> AuthorDate: Fri Apr 19 15:07:00 2024 -0400 Kamelet for project --- .../src/main/resources/application.properties | 2 -- karavan-app/src/main/webui/src/api/ProjectStore.ts | 7 +++-- .../main/webui/src/designer/KaravanDesigner.tsx | 2 +- .../src/main/webui/src/project/ProjectPanel.tsx | 3 ++- .../src/project/files/CreateIntegrationModal.tsx | 31 ++++++++++------------ .../main/webui/src/project/files/FilesToolbar.tsx | 1 - .../src/main/webui/src/topology/TopologyTab.tsx | 2 ++ .../main/webui/src/topology/TopologyToolbar.tsx | 16 +++++++++-- karavan-designer/src/designer/KaravanDesigner.tsx | 2 +- 9 files changed, 37 insertions(+), 29 deletions(-) diff --git a/karavan-app/src/main/resources/application.properties b/karavan-app/src/main/resources/application.properties index 5c3905b2..fad623c2 100644 --- a/karavan-app/src/main/resources/application.properties +++ b/karavan-app/src/main/resources/application.properties @@ -106,8 +106,6 @@ quarkus.kubernetes-client.devservices.enabled=false %public.quarkus.swagger-ui.always-include=true quarkus.quinoa.ci=false -quarkus.quinoa.package-manager-install=false -quarkus.quinoa.package-manager-install.node-version=18.12.1 quarkus.quinoa.dev-server.port=3003 quarkus.quinoa.dev-server.check-timeout=60000 quarkus.quinoa.ignored-path-prefixes=/ui,/public diff --git a/karavan-app/src/main/webui/src/api/ProjectStore.ts b/karavan-app/src/main/webui/src/api/ProjectStore.ts index 154c2ee9..135f7753 100644 --- a/karavan-app/src/main/webui/src/api/ProjectStore.ts +++ b/karavan-app/src/main/webui/src/api/ProjectStore.ts @@ -75,7 +75,6 @@ export const useAppConfigStore = createWithEqualityFn<AppConfigState>((set) => ( }); }, selectEnvironment(name: string, selected: boolean) { - console.log(name, selected) set((state: AppConfigState) => { if (selected && !state.selectedEnv.includes(name)) { state.selectedEnv.push(name); @@ -216,8 +215,8 @@ export const useFilesStore = createWithEqualityFn<FilesState>((set) => ({ interface FileState { file?: ProjectFile; operation: "create" | "select" | "delete" | "none" | "copy" | "upload"; - designerTab?: "routes" | "rest" | "beans"; - setFile: (operation: "create" | "select" | "delete"| "none" | "copy" | "upload", file?: ProjectFile, designerTab?: "routes" | "rest" | "beans") => void; + designerTab?: "routes" | "rest" | "beans" | "kamelet"; + setFile: (operation: "create" | "select" | "delete"| "none" | "copy" | "upload", file?: ProjectFile, designerTab?: "routes" | "rest" | "beans" | "kamelet") => void; } export const useFileStore = createWithEqualityFn<FileState>((set) => ({ @@ -225,7 +224,7 @@ export const useFileStore = createWithEqualityFn<FileState>((set) => ({ operation: "none", designerTab: undefined, addProperty: '', - setFile: (operation: "create" | "select" | "delete"| "none" | "copy" | "upload", file?: ProjectFile, designerTab?: "routes" | "rest" | "beans") => { + setFile: (operation: "create" | "select" | "delete"| "none" | "copy" | "upload", file?: ProjectFile, designerTab?: "routes" | "rest" | "beans" | "kamelet") => { set((state: FileState) => ({ file: file, operation: operation, diff --git a/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx b/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx index ff76fa19..cee6fbc4 100644 --- a/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx +++ b/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx @@ -54,7 +54,7 @@ interface Props { yaml: string dark: boolean showCodeTab: boolean - tab?: "routes" | "rest" | "beans" + tab?: "routes" | "rest" | "beans" | "kamelet" propertyPlaceholders: string[] beans: RegistryBeanDefinition[] files: IntegrationFile[] diff --git a/karavan-app/src/main/webui/src/project/ProjectPanel.tsx b/karavan-app/src/main/webui/src/project/ProjectPanel.tsx index b19297f6..e468c494 100644 --- a/karavan-app/src/main/webui/src/project/ProjectPanel.tsx +++ b/karavan-app/src/main/webui/src/project/ProjectPanel.tsx @@ -83,13 +83,14 @@ export function ProjectPanel() { files={files.map(f => new IntegrationFile(f.name, f.code))} onClickAddRoute={() => setFile('create', undefined, 'routes')} onClickAddREST={() => setFile('create', undefined, 'rest')} + onClickAddKamelet={() => setFile('create', undefined, 'kamelet')} onClickAddBean={() => { // setFile('create', undefined, 'beans'); setShowWizard(true) }} onSetFile={(fileName) => selectFile(fileName)} /> - <CreateIntegrationModal type={'INTEGRATION'} isKameletsProject={false}/> + <CreateIntegrationModal/> <BeanWizard/> </> ) diff --git a/karavan-app/src/main/webui/src/project/files/CreateIntegrationModal.tsx b/karavan-app/src/main/webui/src/project/files/CreateIntegrationModal.tsx index 109b81c4..34647d0c 100644 --- a/karavan-app/src/main/webui/src/project/files/CreateIntegrationModal.tsx +++ b/karavan-app/src/main/webui/src/project/files/CreateIntegrationModal.tsx @@ -27,7 +27,7 @@ import { import '../../designer/karavan.css'; import {KameletTypes} from "karavan-core/lib/model/IntegrationDefinition"; import {useFileStore, useProjectStore} from "../../api/ProjectStore"; -import {ProjectFile, ProjectFileTypes} from "../../api/ProjectModels"; +import {getProjectFileTypeName, ProjectFile, ProjectFileTypes} from "../../api/ProjectModels"; import {ProjectService} from "../../api/ProjectService"; import {shallow} from "zustand/shallow"; import {CamelUtil} from "karavan-core/lib/api/CamelUtil"; @@ -40,16 +40,11 @@ import {useFormUtil} from "../../util/useFormUtil"; import {KaravanApi} from "../../api/KaravanApi"; import {CodeUtils} from "../../util/CodeUtils"; -interface Props { - type: string, - isKameletsProject: boolean -} -export function CreateIntegrationModal(props: Props) { +export function CreateIntegrationModal() { const [project] = useProjectStore((s) => [s.project], shallow); const [operation, setFile, designerTab] = useFileStore((s) => [s.operation, s.setFile, s.designerTab], shallow); - const [fileType, setFileType] = useState<string>('INTEGRATION'); const [kameletType, setKameletType] = useState<KameletTypes>('source'); const [selectedKamelet, setSelectedKamelet] = useState<string>(); const [isReset, setReset] = React.useState(false); @@ -79,8 +74,8 @@ export function CreateIntegrationModal(props: Props) { const onSubmit: SubmitHandler<ProjectFile> = (data) => { data.projectId = project.projectId; - data.name = getFullFileName(data.name, props.type); - data.code = CodeUtils.getCodeForNewFile(data.name, fileType, selectedKamelet); + data.name = getFullFileName(data.name); + data.code = CodeUtils.getCodeForNewFile(data.name, getProjectFileTypeName(data), selectedKamelet); KaravanApi.saveProjectFile(data, (result, file) => { if (result) { onSuccess(file); @@ -106,7 +101,7 @@ export function CreateIntegrationModal(props: Props) { } } - const isKamelet = props.isKameletsProject; + const isKamelet = designerTab === 'kamelet'; const listOfValues: Value[] = KameletApi.getKamelets() .filter(k => k.metadata.labels["camel.apache.org/kamelet.type"] === kameletType) @@ -115,14 +110,16 @@ export function CreateIntegrationModal(props: Props) { return v; }) - function getFileExtension(type?: string) { - let extension = ProjectFileTypes.filter(value => value.name === type)[0]?.extension; - extension = extension === '*' ? '' : '.' + extension; - return extension; + function getFileExtension() { + return designerTab === 'kamelet' ? '.kamelet.yaml' : '.camel.yaml'; } - function getFullFileName(name: string, type?: string) { - return name + (isKamelet ? '-' + kameletType : '') + getFileExtension(type); + function getFileSuffix() { + return (isKamelet ? '-' + kameletType : '') + getFileExtension(); + } + + function getFullFileName(name: string) { + return name + getFileSuffix(); } return ( @@ -155,7 +152,7 @@ export function CreateIntegrationModal(props: Props) { })} </ToggleGroup> </FormGroup>} - {getTextFieldSuffix('name', 'Name', getFileExtension(props.type), true, { + {getTextFieldSuffix('name', 'Name', getFileSuffix(), true, { regex: v => isValidFileName(v) || 'Only characters, numbers and dashes allowed', length: v => v.length > 3 || 'File name should be longer that 3 characters', name: v => !['templates', 'kamelets', 'karavan'].includes(v) || "'templates', 'kamelets', 'karavan' can't be used as project", diff --git a/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx b/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx index 30048bcf..bfcfa645 100644 --- a/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx +++ b/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx @@ -37,7 +37,6 @@ import {useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectSto import {shallow} from "zustand/shallow"; import {ProjectService} from "../../api/ProjectService"; import PushIcon from "@patternfly/react-icons/dist/esm/icons/code-branch-icon"; -import {ProjectType} from "../../api/ProjectModels"; import {isEmpty} from "../../util/StringUtils"; export function FileToolbar () { diff --git a/karavan-app/src/main/webui/src/topology/TopologyTab.tsx b/karavan-app/src/main/webui/src/topology/TopologyTab.tsx index 694eeb64..e9587444 100644 --- a/karavan-app/src/main/webui/src/topology/TopologyTab.tsx +++ b/karavan-app/src/main/webui/src/topology/TopologyTab.tsx @@ -43,6 +43,7 @@ interface Props { hideToolbar: boolean onClickAddRoute: () => void onClickAddREST: () => void + onClickAddKamelet: () => void onClickAddBean: () => void } @@ -144,6 +145,7 @@ export function TopologyTab(props: Props) { contextToolbar={!props.hideToolbar ? <TopologyToolbar onClickAddRoute={props.onClickAddRoute} onClickAddBean={props.onClickAddBean} + onClickAddKamelet={props.onClickAddKamelet} onClickAddREST={props.onClickAddREST}/> : undefined} sideBar={<TopologyPropertiesPanel onSetFile={props.onSetFile}/>} diff --git a/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx b/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx index 667cf8f5..5dbe4949 100644 --- a/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx +++ b/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx @@ -25,6 +25,7 @@ import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon"; interface Props { onClickAddRoute: () => void onClickAddREST: () => void + onClickAddKamelet: () => void onClickAddBean: () => void } @@ -46,7 +47,7 @@ export function TopologyToolbar (props: Props) { <ToolbarItem align={{default:"alignRight"}}> <Tooltip content={"Add REST API"} position={"bottom"}> <Button className="dev-action-button" size="sm" - variant={"primary"} + variant={"secondary"} icon={<PlusIcon/>} onClick={e => props.onClickAddREST()} > @@ -54,10 +55,21 @@ export function TopologyToolbar (props: Props) { </Button> </Tooltip> </ToolbarItem> + <ToolbarItem align={{default:"alignRight"}}> + <Tooltip content={"Add Kamelet"} position={"bottom"}> + <Button className="dev-action-button" size="sm" + variant={"secondary"} + icon={<PlusIcon/>} + onClick={e => props.onClickAddKamelet()} + > + Kamelet + </Button> + </Tooltip> + </ToolbarItem> <ToolbarItem align={{default:"alignRight"}}> <Tooltip content={"Add Bean"} position={"bottom"}> <Button className="dev-action-button" size="sm" - variant={"primary"} + variant={"secondary"} icon={<PlusIcon/>} onClick={e => props.onClickAddBean()} > diff --git a/karavan-designer/src/designer/KaravanDesigner.tsx b/karavan-designer/src/designer/KaravanDesigner.tsx index ff76fa19..cee6fbc4 100644 --- a/karavan-designer/src/designer/KaravanDesigner.tsx +++ b/karavan-designer/src/designer/KaravanDesigner.tsx @@ -54,7 +54,7 @@ interface Props { yaml: string dark: boolean showCodeTab: boolean - tab?: "routes" | "rest" | "beans" + tab?: "routes" | "rest" | "beans" | "kamelet" propertyPlaceholders: string[] beans: RegistryBeanDefinition[] files: IntegrationFile[]
