karavan-space/src/designer/beans/BeansDesigner.tsx (130 lines of code) (raw):
/*
* 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, Drawer, DrawerContent, DrawerContentBody, DrawerPanelContent, Modal, PageSection
} from '@patternfly/react-core';
import '../karavan.css';
import {RegistryBeanDefinition} from "karavan-core/lib/model/CamelDefinition";
import {Integration} from "karavan-core/lib/model/IntegrationDefinition";
import {CamelUi} from "../utils/CamelUi";
import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
import {CamelDefinitionApiExt} from "karavan-core/lib/api/CamelDefinitionApiExt";
import {BeanProperties} from "./BeanProperties";
import {CamelUtil} from "karavan-core/lib/api/CamelUtil";
import {BeanCard} from "./BeanCard";
interface Props {
onSave?: (integration: Integration, propertyOnly: boolean) => void
integration: Integration
dark: boolean
}
interface State {
integration: Integration
showDeleteConfirmation: boolean
selectedBean?: RegistryBeanDefinition
key: string
propertyOnly: boolean
}
export class BeansDesigner extends React.Component<Props, State> {
public state: State = {
integration: this.props.integration,
showDeleteConfirmation: false,
key: "",
propertyOnly: false
};
componentDidUpdate = (prevProps: Readonly<Props>, prevState: Readonly<State>, snapshot?: any) => {
if (prevState.key !== this.state.key) {
this.props.onSave?.call(this, this.state.integration, this.state.propertyOnly);
}
}
showDeleteConfirmation = (bean: RegistryBeanDefinition) => {
this.setState({selectedBean: bean, showDeleteConfirmation: true});
}
onIntegrationUpdate = (i: Integration) => {
this.setState({integration: i, propertyOnly: false, showDeleteConfirmation: false, key: Math.random().toString()});
}
deleteBean = () => {
const i = CamelDefinitionApiExt.deleteBeanFromIntegration(this.state.integration, this.state.selectedBean);
this.setState({
integration: i,
showDeleteConfirmation: false,
key: Math.random().toString(),
selectedBean: new RegistryBeanDefinition(),
propertyOnly: false
});
}
changeBean = (bean: RegistryBeanDefinition) => {
const clone = CamelUtil.cloneIntegration(this.state.integration);
const i = CamelDefinitionApiExt.addBeanToIntegration(clone, bean);
this.setState({integration: i, propertyOnly: false, key: Math.random().toString(), selectedBean: bean});
}
getDeleteConfirmation() {
return (<Modal
className="modal-delete"
title="Confirmation"
isOpen={this.state.showDeleteConfirmation}
onClose={() => this.setState({showDeleteConfirmation: false})}
actions={[
<Button key="confirm" variant="primary" onClick={e => this.deleteBean()}>Delete</Button>,
<Button key="cancel" variant="link"
onClick={e => this.setState({showDeleteConfirmation: false})}>Cancel</Button>
]}
onEscapePress={e => this.setState({showDeleteConfirmation: false})}>
<div>
Delete bean from integration?
</div>
</Modal>)
}
selectBean = (bean?: RegistryBeanDefinition) => {
this.setState({selectedBean: bean})
}
unselectBean = (evt: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
if ((evt.target as any).dataset.click === 'BEANS') {
evt.stopPropagation()
this.setState({selectedBean: undefined})
}
};
createBean = () => {
this.changeBean(new RegistryBeanDefinition());
}
getPropertiesPanel() {
return (
<DrawerPanelContent isResizable hasNoBorder defaultSize={'400px'} maxSize={'800px'} minSize={'300px'}>
<BeanProperties integration={this.props.integration}
bean={this.state.selectedBean}
dark={this.props.dark}
onChange={this.changeBean}
onClone={this.changeBean}/>
</DrawerPanelContent>
)
}
render() {
const beans = CamelUi.getBeans(this.state.integration);
return (
<PageSection className="rest-page" isFilled padding={{default: 'noPadding'}}>
<div className="rest-page-columns">
<Drawer isExpanded isInline>
<DrawerContent panelContent={this.getPropertiesPanel()}>
<DrawerContentBody>
<div className="graph" data-click="REST" onClick={event => this.unselectBean(event)}>
<div className="flows">
{beans?.map(bean => <BeanCard key={bean.uuid + this.state.key}
selectedStep={this.state.selectedBean}
bean={bean}
integration={this.props.integration}
selectElement={this.selectBean}
deleteElement={this.showDeleteConfirmation}/>)}
<div className="add-rest">
<Button
variant={beans?.length === 0 ? "primary" : "secondary"}
data-click="ADD_REST"
icon={<PlusIcon/>}
onClick={e => this.createBean()}>Create bean
</Button>
</div>
</div>
</div>
</DrawerContentBody>
</DrawerContent>
</Drawer>
</div>
{this.getDeleteConfirmation()}
</PageSection>
)
}
}