blob: 6cc6450c81bef793aec8ba92c7ded7c7e3480956 [file] [log] [blame]
/*
* 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 from 'react';
import {
Button,
Form,
FormGroup, Popover,
TextInput, Title, Tooltip,
} from '@patternfly/react-core';
import '../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import {Integration, Dependency} from "karavan-core/lib/model/IntegrationDefinition";
import {CamelUtil} from "karavan-core/lib/api/CamelUtil";
import {IntegrationHeader} from "../utils/KaravanComponents";
import {v4 as uuidv4} from "uuid";
import CloneIcon from "@patternfly/react-icons/dist/esm/icons/clone-icon";
import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
interface Props {
integration: Integration
dependency?: Dependency
dark: boolean
onChange: (dependency: Dependency) => void
onClone: (dependency: Dependency) => void
}
interface State {
dependency?: Dependency
}
export class DependencyProperties extends React.Component<Props, State> {
public state: State = {
dependency: this.props.dependency,
};
componentDidUpdate = (prevProps: Readonly<Props>, prevState: Readonly<State>, snapshot?: any) => {
if (prevProps.dependency?.uuid !== this.props.dependency?.uuid) {
this.setState({dependency:this.props.dependency});
}
}
dependencyChanged = (fieldId: string, value: string) => {
if (this.state.dependency) {
const dependency = CamelUtil.cloneDependency(this.state.dependency);
(dependency as any)[fieldId] = value;
this.setState({dependency: dependency});
this.props.onChange?.call(this, dependency);
}
}
cloneDependency = () => {
if (this.state.dependency) {
const dependency = CamelUtil.cloneDependency(this.state.dependency);
dependency.uuid = uuidv4();
this.props.onClone?.call(this, dependency);
}
}
getLabelIcon = (displayName: string, description: string) => {
return (
<Popover
position={"left"}
headerContent={displayName}
bodyContent={description}
footerContent={
<div>
<b>Required</b>
</div>
}>
<button type="button" aria-label="More info" onClick={e => {
e.preventDefault();
e.stopPropagation();
}} className="pf-c-form__group-label-help">
<HelpIcon noVerticalAlign/>
</button>
</Popover>
)
}
getDependencyForm() {
const dependency = this.state.dependency;
return (
<>
<div className="headers">
<div className="top">
<Title headingLevel="h1" size="md">Dependency</Title>
<Tooltip content="Clone dependency" position="bottom">
<Button variant="link" onClick={() => this.cloneDependency()} icon={<CloneIcon/>}/>
</Tooltip>
</div>
</div>
<FormGroup label="Group" fieldId="group" isRequired labelIcon={this.getLabelIcon("Group ID", "Maven artifact groupId uniquely identifies project ex: org.demo.project ")}>
<TextInput className="text-field" isRequired type="text" id="group" name="group" value={dependency?.group}
onChange={e => this.dependencyChanged("group", e)}/>
</FormGroup>
<FormGroup label="Artifact" fieldId="artifact" isRequired labelIcon={this.getLabelIcon("Artifact ID", "Maven artifact artifactId is the name of the jar without version ex: core")}>
<TextInput className="text-field" isRequired type="text" id="artifact" name="artifact" value={dependency?.artifact}
onChange={e => this.dependencyChanged("artifact", e)}/>
</FormGroup>
<FormGroup label="Version" fieldId="version" isRequired labelIcon={this.getLabelIcon("Version", "Maven artifact version ex: 1.0.0")}>
<TextInput className="text-field" isRequired type="text" id="version" name="version" value={dependency?.version}
onChange={e => this.dependencyChanged("version", e)}/>
</FormGroup>
</>
)
}
render() {
return (
<div className='properties' key={this.state.dependency ? this.state.dependency.uuid : 'integration'}>
<Form autoComplete="off" onSubmit={event => event.preventDefault()}>
{this.state.dependency === undefined && <IntegrationHeader integration={this.props.integration}/>}
{this.state.dependency !== undefined && this.getDependencyForm()}
</Form>
</div>
)
}
}