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


The following commit(s) were added to refs/heads/main by this push:
     new 30d6dca  Edit advanced properties (#409)
30d6dca is described below

commit 30d6dcadc4eeb732418f7d46e435cb00de417fab
Author: Marat Gubaidullin <marat.gubaidul...@gmail.com>
AuthorDate: Mon Jul 11 11:03:54 2022 -0400

    Edit advanced properties (#409)
---
 karavan-app/pom.xml                                |  2 +-
 karavan-app/src/main/webapp/src/index.css          | 10 ++++++
 .../src/main/webapp/src/projects/ProjectPage.tsx   | 42 +++++++++++++++++++---
 .../main/webapp/src/projects/PropertiesEditor.tsx  |  4 ++-
 .../main/webapp/src/projects/PropertiesTable.tsx   | 39 +++++---------------
 5 files changed, 59 insertions(+), 38 deletions(-)

diff --git a/karavan-app/pom.xml b/karavan-app/pom.xml
index 64b0c30..a405d30 100644
--- a/karavan-app/pom.xml
+++ b/karavan-app/pom.xml
@@ -73,7 +73,7 @@
         <dependency>
             <groupId>io.quarkiverse.jgit</groupId>
             <artifactId>quarkus-jgit</artifactId>
-            <version>2.0.0</version>
+            <version>2.1.0</version>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
diff --git a/karavan-app/src/main/webapp/src/index.css 
b/karavan-app/src/main/webapp/src/index.css
index 1378930..c8c1f77 100644
--- a/karavan-app/src/main/webapp/src/index.css
+++ b/karavan-app/src/main/webapp/src/index.css
@@ -179,6 +179,16 @@
   display: none;
 }
 
+.karavan .project-page .project-properties .delete-cell {
+  padding: 0;
+  margin: 0;
+  min-width: 0;
+}
+.karavan .project-page .project-properties .delete-button {
+  padding: 0 0 0 6px;
+  margin: 0;
+}
+
 .karavan .action-cell {
   padding: 0;
 }
diff --git a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx 
b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
index 3c9e0c2..faf732c 100644
--- a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
+++ b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
@@ -21,7 +21,7 @@ import {
     ToggleGroup,
     ToggleGroupItem,
     CodeBlockCode,
-    CodeBlock, Skeleton
+    CodeBlock, Skeleton, Switch, Checkbox
 } from '@patternfly/react-core';
 import '../designer/karavan.css';
 import {MainToolbar} from "../MainToolbar";
@@ -40,6 +40,8 @@ import PlusIcon from 
"@patternfly/react-icons/dist/esm/icons/plus-icon";
 import {CreateFileModal} from "./CreateFileModal";
 import {PropertiesEditor} from "./PropertiesEditor";
 import {ProjectHeader} from "./ProjectHeader";
+import {ProjectModel, ProjectProperty} from 
"karavan-core/lib/model/ProjectModel";
+import {ProjectModelApi} from "karavan-core/lib/api/ProjectModelApi";
 
 interface Props {
     project: Project,
@@ -55,7 +57,9 @@ interface State {
     isDeleteModalOpen: boolean,
     isCreateModalOpen: boolean,
     fileToDelete?: ProjectFile,
-    mode: "design" | "code";
+    mode: "design" | "code",
+    editAdvancedProperties: boolean
+    key: string
 }
 
 export class ProjectPage extends React.Component<Props, State> {
@@ -66,7 +70,9 @@ export class ProjectPage extends React.Component<Props, 
State> {
         isCreateModalOpen: false,
         isDeleteModalOpen: false,
         files: [],
-        mode: "design"
+        mode: "design",
+        editAdvancedProperties: false,
+        key: ''
     };
 
     componentDidMount() {
@@ -120,19 +126,44 @@ export class ProjectPage extends React.Component<Props, 
State> {
         }
     }
 
+    addProperty() {
+        const file = this.state.file;
+        if (file){
+            const project = file ? 
ProjectModelApi.propertiesToProject(file?.code) : ProjectModel.createNew();
+            const props = project.properties;
+            props.push(ProjectProperty.createNew("", ""))
+            this.save(file.name, ProjectModelApi.propertiesToString(props));
+            this.setState({key: Math.random().toString()});
+        }
+    }
+
     tools = () => {
         const {file, mode} = this.state;
         const isFile = file !== undefined;
         const isYaml = file !== undefined && file.name.endsWith("yaml");
+        const isProperties = file !== undefined && 
file.name.endsWith("properties");
         return <Toolbar id="toolbar-group-types">
             <ToolbarContent>
-                <Flex className="toolbar" direction={{default: "row"}}>
+                <Flex className="toolbar" direction={{default: "row"}} 
alignItems={{default:"alignItemsCenter"}}>
                     {isYaml && <FlexItem>
                         <ToggleGroup>
                             <ToggleGroupItem text="Design" buttonId="design" 
isSelected={mode === "design"} onChange={s => this.setState({mode:"design"})} />
                             <ToggleGroupItem text="Code" buttonId="code" 
isSelected={mode === "code"} onChange={s => this.setState({mode:"code"})} />
                         </ToggleGroup>
                     </FlexItem>}
+
+                    {isProperties && <FlexItem>
+                        <Checkbox
+                            id="advanced"
+                            label="Edit advanced"
+                            isChecked={this.state.editAdvancedProperties}
+                            onChange={checked => 
this.setState({editAdvancedProperties: checked})}
+                        />
+                    </FlexItem>}
+                    {isProperties && <FlexItem>
+                        <Button variant="primary" icon={<PlusIcon/>} 
onClick={e => this.addProperty()}>Add property</Button>
+                    </FlexItem>}
+
                     {isFile && <FlexItem>
                         <Button variant="secondary" icon={<DownloadIcon/>} 
onClick={e => this.download()}>Download</Button>
                     </FlexItem>}
@@ -363,7 +394,8 @@ export class ProjectPage extends React.Component<Props, 
State> {
         const file = this.state.file;
         return (
             file !== undefined &&
-            <PropertiesEditor
+            <PropertiesEditor key={this.state.key}
+                editAdvanced={this.state.editAdvancedProperties}
                 file={file}
                 onSave={(name, code) => this.save(name, code)}
             />
diff --git a/karavan-app/src/main/webapp/src/projects/PropertiesEditor.tsx 
b/karavan-app/src/main/webapp/src/projects/PropertiesEditor.tsx
index 592350c..4b6ceec 100644
--- a/karavan-app/src/main/webapp/src/projects/PropertiesEditor.tsx
+++ b/karavan-app/src/main/webapp/src/projects/PropertiesEditor.tsx
@@ -3,13 +3,14 @@ import {
     PageSection,
 } from '@patternfly/react-core';
 import '../designer/karavan.css';
-import {Project, ProjectFile, ProjectFileTypes} from "../models/ProjectModels";
+import {ProjectFile} from "../models/ProjectModels";
 import {PropertiesTable} from "./PropertiesTable";
 import {ProjectModel} from "karavan-core/lib/model/ProjectModel";
 import {ProjectModelApi} from "karavan-core/lib/api/ProjectModelApi";
 
 interface Props {
     file: ProjectFile,
+    editAdvanced: boolean,
     onSave?: (filename: string, code: string) => void
 }
 
@@ -31,6 +32,7 @@ export class PropertiesEditor extends React.Component<Props, 
State> {
         return (
             <PageSection isFilled className="kamelets-page" padding={{default: 
file !== undefined ? 'noPadding' : 'padding'}}>
                 <PropertiesTable
+                    editAdvanced={this.props.editAdvanced}
                     properties={project.properties}
                     onChange={properties => this.props.onSave?.call(this, 
file.name, ProjectModelApi.propertiesToString(properties))}
                 />
diff --git a/karavan-app/src/main/webapp/src/projects/PropertiesTable.tsx 
b/karavan-app/src/main/webapp/src/projects/PropertiesTable.tsx
index eaa5b23..6f83381 100644
--- a/karavan-app/src/main/webapp/src/projects/PropertiesTable.tsx
+++ b/karavan-app/src/main/webapp/src/projects/PropertiesTable.tsx
@@ -16,23 +16,20 @@
  */
 import React from 'react';
 import {
-    Button, Flex, FlexItem,
+    Button,
     Modal,
     PageSection,
-    Panel,
-    PanelMain,
-    PanelMainBody,
     TextInput
 } from '@patternfly/react-core';
 import '../designer/karavan.css';
 import {TableComposable, Tbody, Td, Th, Thead, Tr} from 
"@patternfly/react-table";
 import DeleteIcon from "@patternfly/react-icons/dist/js/icons/times-icon";
-import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
 import {ProjectProperty} from "karavan-core/lib/model/ProjectModel";
 
 interface Props {
     properties: ProjectProperty[]
     onChange?: (properties: ProjectProperty[]) => void
+    editAdvanced: boolean
 }
 
 interface State {
@@ -46,7 +43,7 @@ export class PropertiesTable extends React.Component<Props, 
State> {
     public state: State = {
         properties: this.props.properties,
         showDeleteConfirmation: false,
-    };
+    }
 
     sendUpdate = (props: ProjectProperty[]) => {
         this.props.onChange?.call(this, props);
@@ -71,13 +68,6 @@ export class PropertiesTable extends React.Component<Props, 
State> {
         this.sendUpdate(props);
     }
 
-    addProperty() {
-        const props = [...this.state.properties];
-        props.push(ProjectProperty.createNew("", ""))
-        this.setState({properties: props, showDeleteConfirmation: false, 
deleteId: undefined});
-        this.sendUpdate(props);
-    }
-
     getDeleteConfirmation() {
         return (<Modal
             className="modal-delete"
@@ -111,17 +101,17 @@ export class PropertiesTable extends 
React.Component<Props, State> {
                             <Tr>
                                 <Th key='name'>Name</Th>
                                 <Th key='value'>Value</Th>
-                                <Td></Td>
+                                <Th></Th>
                             </Tr>
                         </Thead>
                         <Tbody>
                             {properties.map((property, idx: number) => {
-                                const readOnly = false;// 
property.key.startsWith("camel.jbang");
+                                const readOnly = 
property.key.startsWith("camel.jbang") && !this.props.editAdvanced;
                                 return (
                                     <Tr key={property.id}>
-                                        <Td noPadding width={20} 
dataLabel="key">{this.getTextInputField(property, "key", readOnly)}</Td>
-                                        <Td noPadding width={10} 
dataLabel="value">{this.getTextInputField(property, "value", readOnly)}</Td>
-                                        <Td noPadding isActionCell 
dataLabel="delete">
+                                        <Td noPadding width={10} 
dataLabel="key">{this.getTextInputField(property, "key", readOnly)}</Td>
+                                        <Td noPadding width={20} 
dataLabel="value">{this.getTextInputField(property, "value", readOnly)}</Td>
+                                        <Td noPadding isActionCell 
dataLabel="delete" className="delete-cell">
                                             {!readOnly && <Button 
variant={"plain"} icon={<DeleteIcon/>} className={"delete-button"}
                                                                   
onClick={event => this.startDelete(property.id)}/>}
                                         </Td>
@@ -130,19 +120,6 @@ export class PropertiesTable extends 
React.Component<Props, State> {
                         </Tbody>
                     </TableComposable>}
                 {this.state.showDeleteConfirmation && 
this.getDeleteConfirmation()}
-                <Panel>
-                    <PanelMain>
-                        <PanelMainBody>
-                            <Flex direction={{default:"row"}} >
-                                <FlexItem align={{ default: 'alignRight' }}>
-                                    <Button isInline variant={"primary"} 
icon={<PlusIcon/>}
-                                            className={"add-button"}
-                                            onClick={event => 
this.addProperty()}>Add property</Button>
-                                </FlexItem>
-                            </Flex>
-                        </PanelMainBody>
-                    </PanelMain>
-                </Panel>
             </PageSection>
         )
     }

Reply via email to