This is an automated email from the ASF dual-hosted git repository.

mgubaidullin 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 677a293a Cleanup before release
677a293a is described below

commit 677a293a6ebdfd53f53bfdb54124ce9b14887d8c
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Sun Sep 6 13:37:01 2026 -0400

    Cleanup before release
---
 ...eateProjectModal.tsx => CreateKameletModal.tsx} |   4 +-
 .../src/ui/page-project/files/FilesSubTab.tsx      |   4 +-
 .../src/ui/page-projects/CreateProjectModal.tsx    | 150 ---------------------
 .../src/ui/page-projects/table/ProjectsTab.tsx     |   2 -
 .../ui/page-projects/table/ProjectsTableRow.tsx    |  16 +--
 5 files changed, 5 insertions(+), 171 deletions(-)

diff --git 
a/karavan-app/src/main/webui/src/ui/page-project/files/CreateProjectModal.tsx 
b/karavan-app/src/main/webui/src/ui/page-project/files/CreateKameletModal.tsx
similarity index 98%
rename from 
karavan-app/src/main/webui/src/ui/page-project/files/CreateProjectModal.tsx
rename to 
karavan-app/src/main/webui/src/ui/page-project/files/CreateKameletModal.tsx
index 64dae7cf..3ed1f764 100644
--- 
a/karavan-app/src/main/webui/src/ui/page-project/files/CreateProjectModal.tsx
+++ 
b/karavan-app/src/main/webui/src/ui/page-project/files/CreateKameletModal.tsx
@@ -48,7 +48,7 @@ import {CodeUtils} from "@utils/CodeUtils";
 import {FieldSelectScrollable} from "@shared/ui/FieldSelectScrollable";
 
 
-export function CreateProjectModal() {
+export function CreateKameletModal() {
 
     const [project] = useProjectStore((s) => [s.project], shallow);
     const [operation, setFile, designerTab] = useFileStore((s) => 
[s.operation, s.setFile, s.designerTab], shallow);
@@ -155,7 +155,7 @@ export function CreateProjectModal() {
                     </FormGroup>}
                     {getTextFieldSuffix('name', 'Name', getFileSuffix(), {
                         regex: v => isValidFileName(v) || 'Only characters, 
numbers and dashes allowed',
-                        length: v => v.length > 3 || 'File name should be 
longer that 3 characters',
+                        length: v => (v?.length > 3) || 'File name should be 
longer that 3 characters',
                         name: v => !RESERVED_WORDS.includes(v) || "Reserved 
word",
                     })}
                     {isKamelet &&
diff --git 
a/karavan-app/src/main/webui/src/ui/page-project/files/FilesSubTab.tsx 
b/karavan-app/src/main/webui/src/ui/page-project/files/FilesSubTab.tsx
index aacdd177..700bfebd 100644
--- a/karavan-app/src/main/webui/src/ui/page-project/files/FilesSubTab.tsx
+++ b/karavan-app/src/main/webui/src/ui/page-project/files/FilesSubTab.tsx
@@ -18,7 +18,6 @@ import {shallow} from "zustand/shallow";
 import {UploadFileModal} from "../files/UploadFileModal";
 import {DeleteFileModal} from "../files/DeleteFileModal";
 import {CreateFileModal} from "../files/CreateFileModal";
-import {CreateProjectModal} from "../files/CreateProjectModal";
 import {KaravanApi} from "@api/KaravanApi";
 import {ModalConfirmation} from "@shared/ui/ModalConfirmation";
 import {EventBus} from "@designer/utils/EventBus";
@@ -30,6 +29,7 @@ import {download, getIcon, sortFiles} from 
"../files/FilesTabUtils";
 import {ProjectService} from "@services/ProjectService";
 import {LANDSCAPE_TEMPLATE_FILENAME_PREFIX} from "@core/contants";
 import timeAgo from "@shared/timeAgo";
+import {CreateKameletModal} from "@page-project/files/CreateKameletModal";
 
 interface FilesSubTabProps {
     sortFiles?: (files: ProjectFile[]) => ProjectFile[]
@@ -339,7 +339,7 @@ export function FilesSubTab(props: FilesSubTabProps) {
             <DeleteFileModal/>
             {showCopy && <FileCopyForEnvModal show={showCopy} 
environments={missingEnvs} close={() => setShowCopy(false)}/>}
             {!isKameletsProject() && <CreateFileModal/>}
-            {isKameletsProject() && <CreateProjectModal/>}
+            {isKameletsProject() && <CreateKameletModal/>}
             {showRename &&
                 <RenameFileModal
                     show={showRename}
diff --git 
a/karavan-app/src/main/webui/src/ui/page-projects/CreateProjectModal.tsx 
b/karavan-app/src/main/webui/src/ui/page-projects/CreateProjectModal.tsx
deleted file mode 100644
index f4300b55..00000000
--- a/karavan-app/src/main/webui/src/ui/page-projects/CreateProjectModal.tsx
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import React, {useEffect} from 'react';
-import {Alert, Button, Form, FormAlert, Modal, ModalBody, ModalFooter, 
ModalHeader, ModalVariant} from '@patternfly/react-core';
-import {useProjectsStore, useProjectStore} from "@stores/ProjectStore";
-import {Project, RESERVED_WORDS} from "@models/ProjectModels";
-import {isValidProjectId, nameToProjectId} from "@utils/StringUtils";
-import {EventBus} from "@designer/utils/EventBus";
-import {SubmitHandler, useForm} from "react-hook-form";
-import {useFormUtil} from "@utils/useFormUtil";
-import {KaravanApi} from "@api/KaravanApi";
-import {AxiosResponse} from "axios";
-import {shallow} from "zustand/shallow";
-import {useNavigate} from "react-router-dom";
-import {ROUTES} from "@compass/navigation/Routes";
-
-export function CreateProjectModal() {
-
-    const [project, operation, setOperation] = useProjectStore((s) => 
[s.project, s.operation, s.setOperation], shallow);
-    const [projects, setProjects] = useProjectsStore((s) => [s.projects, 
s.setProjects], shallow);
-    const [isReset, setReset] = React.useState(false);
-    const [isProjectIdChanged, setIsProjectIdChanged] = React.useState(false);
-    const [backendError, setBackendError] = React.useState<string>();
-    const formContext = useForm<Project>({mode: "all"});
-    const {getTextField} = useFormUtil(formContext);
-    const {
-        formState: {errors},
-        handleSubmit,
-        reset,
-        trigger,
-        setValue,
-        getValues
-    } = formContext;
-    const navigate = useNavigate();
-
-    useEffect(() => {
-        const p = new Project();
-        if (operation === 'copy') {
-            p.projectId = project.projectId;
-            p.name = project.name;
-            p.type = project.type;
-        }
-        reset(p);
-        setBackendError(undefined);
-        setReset(true);
-    }, [reset]);
-
-    React.useEffect(() => {
-        isReset && trigger();
-    }, [trigger, isReset]);
-
-    function closeModal() {
-        setOperation("none");
-    }
-
-    const onSubmit: SubmitHandler<Project> = (data) => {
-        if (operation === 'copy') {
-            KaravanApi.copyProject(project.projectId, data, after)
-        } else {
-            KaravanApi.postProject(data, after)
-        }
-    }
-
-    function after (result: boolean, res: AxiosResponse<Project> | any) {
-        if (result) {
-            onSuccess(res.data.projectId);
-        } else {
-            setBackendError(res?.response?.data);
-        }
-    }
-
-    function onSuccess (projectId: string) {
-        const message = operation !== "copy" ? "Project successfully created." 
: "Project successfully copied.";
-        EventBus.sendAlert( "Success", message, "success");
-        KaravanApi.getProjects((projects: Project[]) => {
-            setProjects(projects);
-            setOperation("none");
-            navigate(`${ROUTES.PROJECTS}/${projectId}`);
-        });
-    }
-
-    function onKeyDown(event: React.KeyboardEvent<HTMLDivElement>): void {
-        if (event.key === 'Enter') {
-            handleSubmit(onSubmit)()
-        }
-    }
-
-    function onNameChange (value: string) {
-        if (!isProjectIdChanged) {
-            setValue('projectId', nameToProjectId(value), {shouldValidate: 
true})
-        }
-    }
-    function onIdChange (value: string) {
-        setIsProjectIdChanged(true)
-    }
-
-    return (
-        <Modal
-            variant={ModalVariant.small}
-            isOpen={["create", "copy"].includes(operation)}
-            onClose={closeModal}
-            onKeyDown={onKeyDown}
-        >
-
-            <ModalHeader title={operation !== 'copy' ? "Create Project" : 
"Copy Project from " + project?.projectId}/>
-            <ModalBody>
-                <Form isHorizontal={true} autoComplete="off">
-                    {getTextField('name', 'Name', {
-                        length: v => v.length > 5 || 'Project name should be 
longer that 5 characters',
-                    }, 'text', onNameChange)}
-                    {getTextField('projectId', 'Project ID', {
-                        regex: v => isValidProjectId(v) || 'Only lowercase 
characters, numbers and dashes allowed',
-                        length: v => v.length > 5 || 'Project ID should be 
longer that 5 characters',
-                        name: v => !RESERVED_WORDS.includes(v) || "Reserved 
word",
-                        uniques: v => !projects.map(p=> p.name).includes(v) || 
"Project already exists!",
-                    }, 'text', onIdChange)}
-                    {backendError &&
-                        <FormAlert>
-                            <Alert variant="danger" title={backendError} 
aria-live="polite" isInline />
-                        </FormAlert>
-                    }
-                </Form>
-            </ModalBody>
-            <ModalFooter>
-                <Button key="confirm" variant="primary"
-                        onClick={handleSubmit(onSubmit)}
-                        isDisabled={Object.getOwnPropertyNames(errors).length 
> 0}
-                >
-                    Save
-                </Button>
-                <Button key="cancel" variant="secondary" 
onClick={closeModal}>Cancel</Button>
-            </ModalFooter>
-        </Modal>
-    )
-}
\ No newline at end of file
diff --git 
a/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTab.tsx 
b/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTab.tsx
index 74779265..4dc6f5fe 100644
--- a/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTab.tsx
+++ b/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTab.tsx
@@ -12,7 +12,6 @@ import {ComplexityApi} from "@api/ComplexityApi";
 import {ProjectType} from "@models/ProjectModels";
 import {ProjectsToolbar} from "../ProjectsToolbar";
 import ProjectsTableRow from "../table/ProjectsTableRow";
-import {CreateProjectModal} from "@page-project/files/CreateProjectModal";
 import {DeleteProjectModal} from "../DeleteProjectModal";
 
 export function ProjectsTab() {
@@ -114,7 +113,6 @@ export function ProjectsTab() {
     return (
         <div className="right-panel-card">
             {getProjectsTable()}
-            {["create", "copy"].includes(operation) && <CreateProjectModal/>}
             {["delete"].includes(operation) && <DeleteProjectModal/>}
         </div>
     )
diff --git 
a/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTableRow.tsx 
b/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTableRow.tsx
index ad738c75..ca2e4813 100644
--- a/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTableRow.tsx
+++ b/karavan-app/src/main/webui/src/ui/page-projects/table/ProjectsTableRow.tsx
@@ -10,7 +10,7 @@ import {ROUTES} from "@compass/navigation/Routes";
 import {ProjectZipApi} from "../ProjectZipApi";
 import {ProjectStatusLabel} from "./ProjectStatusLabel";
 import {CamelIcon, OpenApiIcon} from "@designer/icons/KaravanIcons";
-import {CogIcon, CopyIcon, DownloadIcon, TimesCircleIcon} from 
"@patternfly/react-icons";
+import {CogIcon, DownloadIcon, TimesCircleIcon} from "@patternfly/react-icons";
 import {BUILD_IN_PROJECTS, Project, ProjectCommited} from 
"@models/ProjectModels";
 import {ComplexityProject} from "@models/ComplexityModels";
 import {PROJECT_WITH_NO_LABELS, useProjectStore} from "@stores/ProjectStore";
@@ -117,20 +117,6 @@ function ProjectsTableRow(props: Props) {
                             </Tooltip>
                         </FlexItem>
                     }
-                    {!isBuildIn &&
-                        <FlexItem>
-                            <Tooltip content={"Copy"} position={"bottom"}>
-                                <Button className="dev-action-button"
-                                        isDisabled={!isDev}
-                                        isInline={!isDev}
-                                        variant={"link"}
-                                        icon={<CopyIcon/>}
-                                        onClick={e => {
-                                            setProject(project, "copy");
-                                        }}></Button>
-                            </Tooltip>
-                        </FlexItem>
-                    }
                     <FlexItem>
                         <Tooltip content={"Export"} position={"bottom-end"}>
                             <Button className="dev-action-button"

Reply via email to