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[]

Reply via email to