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"