/*- * ============LICENSE_START======================================================= * ONAP CLAMP * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed 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. * ============LICENSE_END============================================ * =================================================================== * */ import React from 'react' import styled from 'styled-components'; import { withRouter } from "react-router-dom"; import LoopCache from '../../../api/LoopCache'; import OnapConstant from '../../../utils/OnapConstants'; const DivStyled = styled.div` overflow-x: scroll; display: flex; width: 100%; height: 100%; ` const emptySvg = ( No LOOP (SVG) ); class SvgGenerator extends React.Component { boxWidth = 200; boxHeight = 100; boxSpace = 50; static GENERATED_FROM_INSTANCE = "INSTANCE"; static GENERATED_FROM_TEMPLATE = "TEMPLATE"; state = { loopCache: new LoopCache({}), clickable: false, generatedFrom: SvgGenerator.GENERATED_FROM_INSTANCE, // INSTANCE / TEMPLATE } constructor(props) { super(props); this.state.loopCache = props.loopCache; this.state.clickable = props.clickable; this.state.generatedFrom = props.generatedFrom; this.handleSvgClick = this.handleSvgClick.bind(this); this.renderSvg = this.renderSvg.bind(this); } shouldComponentUpdate(nextProps, nextState) { return this.state.loopCache !== nextProps.loopCache; } componentDidUpdate(prevProps) { if (prevProps.loopCache !== this.props.loopCache) { this.setState({ loopCache: this.props.loopCache, }); } } handleSvgClick(event) { console.debug("svg click event received"); if (this.state.clickable) { var elementName = event.target.parentNode.getAttribute('policyId'); console.info("SVG element clicked", elementName); // Only allow movement to policy editing IF there busyLoadingCOunt is 0, // meaning we are not waiting for refreshStatus to complete, for example if (elementName !== null && !this.props.isBusyLoading()) { this.props.history.push("/policyModal/" + event.target.parentNode.getAttribute('policyType') + "/" + elementName); } } } createVesBox(xPos) { return this.createOneBox(xPos, null, null, 'VES Collector', 'VES', null); } createOneArrow(xPos) { return ( ); } createBeginCircle(xPos, text) { return ( { text } ); } createEndCircle(xPos, text) { return ( { text } ); } createOneBox(xPos, policyId, loopElementModelId, name, title, policyType) { return ( { title } { name } { policyId } ); } createSvgFromTemplate() { const allElements = []; var xPos = 0; allElements.push(this.createBeginCircle(xPos, "Start")) xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); allElements.push(this.createVesBox(xPos)); xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); //createOneBox(xPos, policyId, loopElementModelId , name, title, policyType) for (var loopElement of this.state.loopCache.getAllLoopElementModels()) { allElements.push(this.createOneBox(xPos, loopElement['name'], loopElement['name'], loopElement['shortName'], loopElement['loopElementType'], loopElement['loopElementType'])) xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); } allElements.push(this.createEndCircle(xPos, "End")) xPos += (this.boxWidth + this.boxSpace); return allElements; } createSvgFromInstance() { const allElements = []; var xPos = 0; allElements.push(this.createBeginCircle(xPos, "Start")) xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); allElements.push(this.createVesBox(xPos)); xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); for (var msPolicy in this.state.loopCache.getMicroServicePolicies()) { var loopElementModelName = this.state.loopCache.getMicroServicePolicies()[msPolicy]['loopElementModel']; if (loopElementModelName !== undefined) { loopElementModelName = loopElementModelName['name']; } allElements.push(this.createOneBox(xPos, this.state.loopCache.getMicroServicePolicies()[msPolicy]['name'], loopElementModelName, this.state.loopCache.getMicroServicePolicies()[msPolicy]['policyModel']['policyAcronym'], 'microservice', OnapConstant.microServiceType)) xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); } for (var opPolicy in this.state.loopCache.getOperationalPolicies()) { loopElementModelName = this.state.loopCache.getOperationalPolicies()[opPolicy]['loopElementModel']; if (loopElementModelName !== undefined) { loopElementModelName = loopElementModelName['name']; } allElements.push(this.createOneBox(xPos, this.state.loopCache.getOperationalPolicies()[opPolicy]['name'], loopElementModelName, this.state.loopCache.getOperationalPolicies()[opPolicy]['policyModel']['policyAcronym'], 'operational', OnapConstant.operationalPolicyType)) xPos += (this.boxWidth + this.boxSpace); allElements.push(this.createOneArrow(xPos - this.boxSpace)); } allElements.push(this.createEndCircle(xPos, "End")) xPos += (this.boxWidth + this.boxSpace); return allElements; } renderSvg() { if (this.state.loopCache.getLoopName() === undefined) { return [emptySvg]; } if (this.state.generatedFrom === SvgGenerator.GENERATED_FROM_INSTANCE) { return this.createSvgFromInstance(); } else if (this.state.generatedFrom === SvgGenerator.GENERATED_FROM_TEMPLATE) { return this.createSvgFromTemplate(); } } render() { var allTheElements = this.renderSvg(); var svgWidth = this.boxWidth * allTheElements.length; var svgHeight = this.boxHeight + 50; return ( { allTheElements } ); } } export default withRouter(SvgGenerator);