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 ce68f204caea6ead6e71703f08ace2ae13552a85 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Sun Aug 25 12:34:34 2024 -0400 Fix #1376 --- .../main/webui/src/project/files/DiffFileModal.tsx | 57 ++++++++++++++-------- .../src/main/webui/src/project/files/FilesTab.tsx | 5 +- .../main/webui/src/project/files/FilesToolbar.tsx | 20 ++++++-- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/karavan-app/src/main/webui/src/project/files/DiffFileModal.tsx b/karavan-app/src/main/webui/src/project/files/DiffFileModal.tsx index d05856e6..94f05099 100644 --- a/karavan-app/src/main/webui/src/project/files/DiffFileModal.tsx +++ b/karavan-app/src/main/webui/src/project/files/DiffFileModal.tsx @@ -18,8 +18,7 @@ import React, {useEffect, useState} from 'react'; import { Button, - Modal, - ModalVariant, Spinner + Modal, Spinner } from '@patternfly/react-core'; import './DiffFileModal.css'; import {useFileStore, useProjectStore} from "../../api/ProjectStore"; @@ -27,6 +26,8 @@ import {DiffEditor} from "@monaco-editor/react"; import {KaravanApi} from "../../api/KaravanApi"; import {ProjectFile} from "../../api/ProjectModels"; import {shallow} from "zustand/shallow"; +import {EventBus} from "../../designer/utils/EventBus"; +import {ProjectService} from "../../api/ProjectService"; const languages = new Map<string, string>([ ['sh', 'shell'], @@ -42,40 +43,56 @@ interface Props { id: string } -export function DiffFileModal (prop: Props) { +export function DiffFileModal(prop: Props) { const [project] = useProjectStore((s) => [s.project], shallow); - const {file, operation} = useFileStore(); - const [fileCommited, setFileCommited] = useState<string>(); + const {file, operation, setFile} = useFileStore(); + const [fileCommited, setFileCommited] = useState<ProjectFile>(); useEffect(() => { if (file && operation === 'diff') { KaravanApi.getFileCommited(project.projectId, file?.name, (fileCommited: ProjectFile) => { - setFileCommited(fileCommited.code); + setFileCommited(fileCommited); }); } }, [project, file, operation]); - function closeModal () { + function closeModal() { useFileStore.setState({operation: "none"}) setFileCommited(undefined) } - const isOpen= operation === "diff"; + function undoChanges() { + if (fileCommited) { + KaravanApi.putProjectFile(fileCommited, result => { + if (result.status === 200) { + EventBus.sendAlert( "Success", "File reverted", "success"); + ProjectService.refreshProjectData(project.projectId); + useFileStore.setState({operation: "none"}) + setFileCommited(undefined) + } + }) + } + } + + const isOpen = operation === "diff"; const extension = file?.name.split('.').pop(); const language = extension && languages.has(extension) ? languages.get(extension) : extension; return ( - <Modal - className='karavan-diff-modal' - title="Diff" - isOpen={isOpen} - onClose={() => closeModal()} - actions={[ - <Button key="confirm" variant="primary" onClick={e => closeModal()}>Close</Button>, - ]} - onEscapePress={e => closeModal()}> - {fileCommited === undefined && <Spinner size="lg" aria-label="spinner"/>} - {fileCommited !== undefined && <DiffEditor language={language} original={fileCommited} modified={file?.code}/>} - </Modal> + <Modal + className='karavan-diff-modal' + title="Diff" + isOpen={isOpen} + onClose={() => closeModal()} + actions={[ + <div style={{display: "flex", flexDirection: 'row', justifyContent: 'space-between', width: "100%"}}> + <Button key="confirm" variant="warning" onClick={e => undoChanges()}>Undo</Button> + <Button key="confirm" variant="primary" onClick={e => closeModal()}>Close</Button> + </div> + ]} + onEscapePress={e => closeModal()}> + {fileCommited === undefined && <Spinner size="lg" aria-label="spinner"/>} + {fileCommited !== undefined && <DiffEditor language={language} original={fileCommited.code} modified={file?.code}/>} + </Modal> ) } \ No newline at end of file diff --git a/karavan-app/src/main/webui/src/project/files/FilesTab.tsx b/karavan-app/src/main/webui/src/project/files/FilesTab.tsx index 86814d6a..05eced7f 100644 --- a/karavan-app/src/main/webui/src/project/files/FilesTab.tsx +++ b/karavan-app/src/main/webui/src/project/files/FilesTab.tsx @@ -162,7 +162,7 @@ export function FilesTab () { </Button> </Td> <Td> - {needCommit(file.name) && diffType === 'CHANGED' && + {needCommit(file.name) && <Tooltip content="Show diff" position={"right"}> <Label color="grey"> <Button size="sm" variant="link" className='labeled-button' @@ -176,9 +176,6 @@ export function FilesTab () { </Label> </Tooltip> } - {needCommit(file.name) && diffType !== 'CHANGED' && - <Label color="grey">{diffType}</Label> - } {!needCommit(file.name) && <Label color="green" icon={<CheckIcon/>}/> } 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 2ac4c01c..eecb38df 100644 --- a/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx +++ b/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx @@ -33,7 +33,7 @@ import { import '../../designer/karavan.css'; import UploadIcon from "@patternfly/react-icons/dist/esm/icons/upload-icon"; import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon"; -import {useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectStore"; +import {useAppConfigStore, useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectStore"; import {shallow} from "zustand/shallow"; import {ProjectService} from "../../api/ProjectService"; import PushIcon from "@patternfly/react-icons/dist/esm/icons/code-branch-icon"; @@ -48,6 +48,8 @@ export function FileToolbar () { const [project, isPushing, isPulling] = useProjectStore((s) => [s.project, s.isPushing, s.isPulling], shallow ) const [diff] = useFilesStore((s) => [s.diff], shallow); const [file, setFile] = useFileStore((s) => [s.file, s.setFile], shallow ) + const [config] = useAppConfigStore((s) => [s.config], shallow); + const isDev = config.environment === 'dev'; useEffect(() => { }, [project, file]); @@ -189,6 +191,7 @@ export function FileToolbar () { <FlexItem> <Tooltip content="Commit and push to git" position={"bottom-end"}> <Button isLoading={isPushing ? true : undefined} + isDisabled={!isDev} size="sm" variant={"secondary"} className="project-button dev-action-button" @@ -202,15 +205,24 @@ export function FileToolbar () { </Tooltip> </FlexItem> {canAddFiles() && !isKameletsProject() && <FlexItem> - <Button className="dev-action-button" size="sm" variant={"primary"} icon={<PlusIcon/>} + <Button className="dev-action-button" + isDisabled={!isDev} + size="sm" variant={"primary"} + icon={<PlusIcon/>} onClick={e => setFile("create")}>Create</Button> </FlexItem>} {canAddFiles() && isKameletsProject() && <FlexItem> - <Button className="dev-action-button" size="sm" variant={"primary"} icon={<PlusIcon/>} + <Button className="dev-action-button" + isDisabled={!isDev} + size="sm" variant={"primary"} + icon={<PlusIcon/>} onClick={e => setFile("create", undefined, 'kamelet')}>Create</Button> </FlexItem>} {canAddFiles() && <FlexItem> - <Button className="dev-action-button" size="sm" variant="secondary" icon={<UploadIcon/>} + <Button className="dev-action-button" + isDisabled={!isDev} + size="sm" variant="secondary" + icon={<UploadIcon/>} onClick={e => setFile("upload")}>Upload</Button> </FlexItem>} {getCommitModal()}