karavan-designer/src/designer/beans/BeansDesigner.tsx (102 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, {useEffect} from 'react'; import { Button, Flex, FlexItem, Gallery, GalleryItem, Modal, PageSection, } from '@patternfly/react-core'; import '../karavan.css'; import './bean.css'; import {BeanFactoryDefinition} from "karavan-core/lib/model/CamelDefinition"; 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 {CamelUtil} from "karavan-core/lib/api/CamelUtil"; import {BeanCard} from "./BeanCard"; import {useDesignerStore, useIntegrationStore} from "../DesignerStore"; import {shallow} from "zustand/shallow"; export function BeansDesigner() { const [integration, setIntegration] = useIntegrationStore((s) => [s.integration, s.setIntegration], shallow) const [selectedStep, showDeleteConfirmation, setShowDeleteConfirmation, setSelectedStep, setNotification] = useDesignerStore((s) => [s.selectedStep, s.showDeleteConfirmation, s.setShowDeleteConfirmation, s.setSelectedStep, s.setNotification], shallow) useEffect(() => { return () => { setNotification(false, ['', '']); } }, []); function onShowDeleteConfirmation(bean: BeanFactoryDefinition) { setSelectedStep(bean); setShowDeleteConfirmation(true); } function deleteBean() { const i = CamelDefinitionApiExt.deleteBeanFromIntegration(integration, selectedStep as BeanFactoryDefinition); setIntegration(i, false); setShowDeleteConfirmation(false); setSelectedStep(undefined); } function getDeleteConfirmation() { return (<Modal className="modal-delete" title="Confirmation" isOpen={showDeleteConfirmation} onClose={() => setShowDeleteConfirmation(false)} actions={[ <Button key="confirm" variant="primary" onClick={e => deleteBean()}>Delete</Button>, <Button key="cancel" variant="link" onClick={e => setShowDeleteConfirmation(false)}>Cancel</Button> ]} onEscapePress={e => setShowDeleteConfirmation(false)}> <div> Delete bean from integration? </div> </Modal>) } function selectBean(bean?: BeanFactoryDefinition) { setSelectedStep(bean); } function unselectBean(evt: React.MouseEvent<HTMLDivElement, MouseEvent>) { if ((evt.target as any).dataset.click === 'BEANS') { evt.stopPropagation() setSelectedStep(undefined); } }; function createBean() { const bean = new BeanFactoryDefinition(); const clone = CamelUtil.cloneIntegration(integration); const i = CamelDefinitionApiExt.addBeanToIntegration(clone, bean); setIntegration(i, false); setSelectedStep(bean); } const beans = CamelUi.getBeans(integration); return ( <PageSection className="bean-designer" isFilled padding={{default: 'noPadding'}}> <Gallery className="gallery" hasGutter maxWidths={{ default: '100%', }} > {beans?.map((bean, index) => ( <GalleryItem key={bean.uuid + index}> <BeanCard bean={bean} selectedStep={selectedStep} selectElement={selectBean} deleteElement={onShowDeleteConfirmation} /> </GalleryItem> ))} <GalleryItem> <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentCenter"}}> <FlexItem> <Button variant={beans?.length === 0 ? "primary" : "secondary"} data-click="ADD_REST" icon={<PlusIcon/>} onClick={e => createBean()}>Create bean </Button> </FlexItem> </Flex> </GalleryItem> </Gallery> {getDeleteConfirmation()} </PageSection> ) }