You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/02/28 19:56:46 UTC
[camel-karavan] 01/02: fix #644
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 17cdea97e7ba4f38e6b3acdaf4a56a982fdaa709
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Tue Feb 28 14:56:21 2023 -0500
fix #644
---
.../org/apache/camel/karavan/api/GitResource.java | 7 +-
.../apache/camel/karavan/service/GitService.java | 14 +-
karavan-app/src/main/webui/src/api/KaravanApi.tsx | 5 +-
.../main/webui/src/projects/ProjectPageToolbar.tsx | 150 +++++++++++++--------
4 files changed, 108 insertions(+), 68 deletions(-)
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java
index 2f85a37b..9bd7d21a 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java
@@ -26,6 +26,7 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
+import java.util.HashMap;
@Path("/api/git")
public class GitResource {
@@ -35,10 +36,12 @@ public class GitResource {
private static final Logger LOGGER = Logger.getLogger(GitResource.class.getName());
+
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
- public Project push(Project project) throws Exception {
- return gitService.commitAndPushProject(project);
+ public Project push(HashMap<String, String> params) throws Exception {
+ System.out.println(params);
+ return gitService.commitAndPushProject(params.get("projectId"), params.get("message"));
}
}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
index be83abf2..26f2c821 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
@@ -95,10 +95,10 @@ public class GitService {
}
}
- public Project commitAndPushProject(Project project) throws Exception {
- Project p = infinispanService.getProject(project.getProjectId());
- List<ProjectFile> files = infinispanService.getProjectFiles(project.getProjectId());
- RevCommit commit = commitAndPushProject(p, files);
+ public Project commitAndPushProject(String projectId, String message) throws Exception {
+ Project p = infinispanService.getProject(projectId);
+ List<ProjectFile> files = infinispanService.getProjectFiles(projectId);
+ RevCommit commit = commitAndPushProject(p, files, message);
String commitId = commit.getId().getName();
Long lastUpdate = commit.getCommitTime() * 1000L;
p.setLastCommit(commitId);
@@ -107,7 +107,7 @@ public class GitService {
return p;
}
- public RevCommit commitAndPushProject(Project project, List<ProjectFile> files) throws GitAPIException, IOException, URISyntaxException {
+ public RevCommit commitAndPushProject(Project project, List<ProjectFile> files, String message) throws GitAPIException, IOException, URISyntaxException {
LOGGER.info("Commit and push project " + project.getProjectId());
GitConfig gitConfig = getGitConfig();
CredentialsProvider cred = new UsernamePasswordCredentialsProvider(gitConfig.getUsername(), gitConfig.getPassword());
@@ -126,7 +126,7 @@ public class GitService {
}
writeProjectToFolder(folder, project, files);
addDeletedFilesToIndex(git, folder, project, files);
- return commitAddedAndPush(git, gitConfig.getBranch(), cred, project.getProjectId());
+ return commitAddedAndPush(git, gitConfig.getBranch(), cred, message);
}
public List<GitRepo> readProjectsFromRepository() {
@@ -248,7 +248,7 @@ public class GitService {
public RevCommit commitAddedAndPush(Git git, String branch, CredentialsProvider cred, String message) throws GitAPIException, IOException, URISyntaxException {
LOGGER.info("Commit and push changes");
LOGGER.info("Git add: " + git.add().addFilepattern(".").call());
- RevCommit commit = git.commit().setMessage(LocalDateTime.now() + ": " + message).call();
+ RevCommit commit = git.commit().setMessage(message).call();
LOGGER.info("Git commit: " + commit);
Iterable<PushResult> result = git.push().add(branch).setRemote("origin").setCredentialsProvider(cred).call();
LOGGER.info("Git push: " + result);
diff --git a/karavan-app/src/main/webui/src/api/KaravanApi.tsx b/karavan-app/src/main/webui/src/api/KaravanApi.tsx
index 5d9e84d0..53af69f5 100644
--- a/karavan-app/src/main/webui/src/api/KaravanApi.tsx
+++ b/karavan-app/src/main/webui/src/api/KaravanApi.tsx
@@ -273,8 +273,9 @@ export class KaravanApi {
});
}
- static async push(project: Project, after: (res: AxiosResponse<any>) => void) {
- instance.post('/api/git', project)
+ static async push(params: {}, after: (res: AxiosResponse<any>) => void) {
+ console.log(params)
+ instance.post('/api/git', params)
.then(res => {
after(res);
}).catch(err => {
diff --git a/karavan-app/src/main/webui/src/projects/ProjectPageToolbar.tsx b/karavan-app/src/main/webui/src/projects/ProjectPageToolbar.tsx
index e4acc565..35facb46 100644
--- a/karavan-app/src/main/webui/src/projects/ProjectPageToolbar.tsx
+++ b/karavan-app/src/main/webui/src/projects/ProjectPageToolbar.tsx
@@ -7,10 +7,10 @@ import {
FlexItem,
ToggleGroup,
ToggleGroupItem,
- Checkbox, Tooltip, ToolbarItem
+ Checkbox, Tooltip, ToolbarItem, Modal, ModalVariant, Form, FormGroup, TextInput, FormHelperText, HelperText, HelperTextItem
} from '@patternfly/react-core';
import '../designer/karavan.css';
-import {Project, ProjectFile} from "./ProjectModels";
+import {Project, ProjectFile, ProjectFileTypes} from "./ProjectModels";
import UploadIcon from "@patternfly/react-icons/dist/esm/icons/upload-icon";
import DownloadIcon from "@patternfly/react-icons/dist/esm/icons/download-icon";
import DownloadImageIcon from "@patternfly/react-icons/dist/esm/icons/image-icon";
@@ -18,6 +18,7 @@ import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml";
import PushIcon from "@patternfly/react-icons/dist/esm/icons/code-branch-icon";
import {KaravanApi} from "../api/KaravanApi";
+import {CamelUi} from "../designer/utils/CamelUi";
interface Props {
project: Project,
@@ -40,17 +41,25 @@ interface Props {
interface State {
isPushing: boolean,
+ commitMessageIsOpen: boolean,
+ commitMessage: string
}
export class ProjectPageToolbar extends React.Component<Props> {
public state: State = {
isPushing: false,
+ commitMessageIsOpen: false,
+ commitMessage: ''
};
push = (after?: () => void) => {
- this.setState({isPushing: true});
- KaravanApi.push(this.props.project, res => {
+ this.setState({isPushing: true, commitMessageIsOpen: false});
+ const params = {
+ "projectId": this.props.project.projectId,
+ "message": this.state.commitMessage
+ };
+ KaravanApi.push(params, res => {
if (res.status === 200 || res.status === 201) {
this.setState({isPushing: false});
after?.call(this);
@@ -84,7 +93,7 @@ export class ProjectPageToolbar extends React.Component<Props> {
variant={needCommit ? "primary" : "secondary"}
className="project-button"
icon={!isPushing ? <PushIcon/> : <div></div>}
- onClick={e => this.push()}>
+ onClick={() => this.setState({commitMessageIsOpen: true})}>
{isPushing ? "..." : "Commit"}
</Button>
</Tooltip>
@@ -96,7 +105,7 @@ export class ProjectPageToolbar extends React.Component<Props> {
}
getProjectToolbar() {
- const {isPushing} = this.state;
+ const {isPushing, commitMessage} = this.state;
const {file, needCommit, mode, editAdvancedProperties, addProperty, setEditAdvancedProperties, download, downloadImage, setCreateModalOpen, setUploadModalOpen} = this.props;
const isFile = file !== undefined;
const isYaml = file !== undefined && file.name.endsWith("yaml");
@@ -104,68 +113,95 @@ export class ProjectPageToolbar extends React.Component<Props> {
const isProperties = file !== undefined && file.name.endsWith("properties");
return <Toolbar id="toolbar-group-types">
<ToolbarContent>
- <Flex className="toolbar" direction={{default: "row"}} alignItems={{default:"alignItemsCenter"}}>
- {isYaml && <FlexItem>
- <ToggleGroup>
- <ToggleGroupItem text="Design" buttonId="design" isSelected={mode === "design"}
- onChange={s => this.props.setMode.call(this, "design")} />
- <ToggleGroupItem text="Code" buttonId="code" isSelected={mode === "code"}
- onChange={s => this.props.setMode.call(this, "code")} />
- </ToggleGroup>
- </FlexItem>}
+ <Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}>
+ {isYaml && <FlexItem>
+ <ToggleGroup>
+ <ToggleGroupItem text="Design" buttonId="design" isSelected={mode === "design"}
+ onChange={s => this.props.setMode.call(this, "design")}/>
+ <ToggleGroupItem text="Code" buttonId="code" isSelected={mode === "code"}
+ onChange={s => this.props.setMode.call(this, "code")}/>
+ </ToggleGroup>
+ </FlexItem>}
- {isProperties && <FlexItem>
- <Checkbox
- id="advanced"
- label="Edit advanced"
- isChecked={editAdvancedProperties}
- onChange={checked => setEditAdvancedProperties.call(this, checked)}
- />
- </FlexItem>}
- {isProperties && <FlexItem>
- <Button isSmall variant="primary" icon={<PlusIcon/>} onClick={e => addProperty.call(this)}>Add property</Button>
- </FlexItem>}
+ {isProperties && <FlexItem>
+ <Checkbox
+ id="advanced"
+ label="Edit advanced"
+ isChecked={editAdvancedProperties}
+ onChange={checked => setEditAdvancedProperties.call(this, checked)}
+ />
+ </FlexItem>}
+ {isProperties && <FlexItem>
+ <Button isSmall variant="primary" icon={<PlusIcon/>} onClick={e => addProperty.call(this)}>Add property</Button>
+ </FlexItem>}
- {isFile && <FlexItem>
- <Tooltip content="Download source" position={"bottom-end"}>
- <Button isSmall variant="control" icon={<DownloadIcon/>} onClick={e => download.call(this)}/>
- </Tooltip>
- </FlexItem>}
- {isIntegration && <FlexItem>
- <Tooltip content="Download image" position={"bottom-end"}>
- <Button isSmall variant="control" icon={<DownloadImageIcon/>} onClick={e => downloadImage.call(this)}/>
- </Tooltip>
- </FlexItem>}
- {!isFile && <FlexItem>
- <Button isSmall variant={"secondary"} icon={<PlusIcon/>}
- onClick={e => setCreateModalOpen.call(this)}>Create</Button>
- </FlexItem>}
- {!isFile && <FlexItem>
- <Button isSmall variant="secondary" icon={<UploadIcon/>}
- onClick={e => setUploadModalOpen.call(this)}>Upload</Button>
- </FlexItem>}
- {!isFile && <FlexItem>
- <Tooltip content="Commit and push to git" position={"bottom-end"}>
- <Button isLoading={isPushing ? true : undefined}
- isSmall
- variant={needCommit ? "primary" : "secondary"}
- className="project-button"
- icon={!isPushing ? <PushIcon/> : <div></div>}
- onClick={e => this.push()}>
- {isPushing ? "..." : "Commit"}
- </Button>
- </Tooltip>
- </FlexItem>}
- </Flex>
+ {isFile && <FlexItem>
+ <Tooltip content="Download source" position={"bottom-end"}>
+ <Button isSmall variant="control" icon={<DownloadIcon/>} onClick={e => download.call(this)}/>
+ </Tooltip>
+ </FlexItem>}
+ {isIntegration && <FlexItem>
+ <Tooltip content="Download image" position={"bottom-end"}>
+ <Button isSmall variant="control" icon={<DownloadImageIcon/>} onClick={e => downloadImage.call(this)}/>
+ </Tooltip>
+ </FlexItem>}
+ {!isFile && <FlexItem>
+ <Button isSmall variant={"secondary"} icon={<PlusIcon/>}
+ onClick={e => setCreateModalOpen.call(this)}>Create</Button>
+ </FlexItem>}
+ {!isFile && <FlexItem>
+ <Button isSmall variant="secondary" icon={<UploadIcon/>}
+ onClick={e => setUploadModalOpen.call(this)}>Upload</Button>
+ </FlexItem>}
+ {!isFile && <FlexItem>
+ <Tooltip content="Commit and push to git" position={"bottom-end"}>
+ <Button isLoading={isPushing ? true : undefined}
+ isSmall
+ variant={needCommit ? "primary" : "secondary"}
+ className="project-button"
+ icon={!isPushing ? <PushIcon/> : <div></div>}
+ onClick={() => this.setState({
+ commitMessageIsOpen: true,
+ commitMessage : commitMessage === '' ? new Date().toLocaleString() : commitMessage
+ })}>
+ {isPushing ? "..." : "Commit"}
+ </Button>
+ </Tooltip>
+ </FlexItem>}
+ </Flex>
</ToolbarContent>
</Toolbar>
}
+ getCommitModal() {
+ let {commitMessage, commitMessageIsOpen} = this.state;
+ return (
+ <Modal
+ title="Commit"
+ variant={ModalVariant.small}
+ isOpen={commitMessageIsOpen}
+ onClose={() => this.setState({commitMessageIsOpen: false})}
+ actions={[
+ <Button key="confirm" variant="primary" onClick={() => this.push()}>Save</Button>,
+ <Button key="cancel" variant="secondary" onClick={() => this.setState({commitMessageIsOpen: false})}>Cancel</Button>
+ ]}
+ >
+ <Form autoComplete="off" isHorizontal className="create-file-form">
+ <FormGroup label="Message" fieldId="name" isRequired>
+ <TextInput value={commitMessage} onChange={value => this.setState({commitMessage: value})}/>
+ <FormHelperText isHidden={false} component="div"/>
+ </FormGroup>
+ </Form>
+ </Modal>
+ )
+ }
+
render() {
const {isTemplates} = this.props;
return <div>
{isTemplates && this.getTemplatesToolbar()}
{!isTemplates && this.getProjectToolbar()}
+ {this.getCommitModal()}
</div>
}
}