UNPKG

js2flowchart

Version:

> Why? While I've been working on [Under-the-hood-ReactJS](https://github.com/Bogdan-Lyashenko/Under-the-hood-ReactJS) I spent enormous amount of time on creating schemes. Each change in code or flowchart affects all entire scheme instantly, forcing you t

105 lines (85 loc) 2.99 kB
import { getRoundedRectangle, getLine, getClosedPath } from 'shared/utils/svgPrimitives'; import { assignState } from 'shared/utils/composition'; import { addOffsetToPoints } from 'shared/utils/geometry'; import { setupBasicBehaviour, setupInitialProperties, setupInitialSelectors, calculateHeight, calculateNameBasedWidth, calculatePosition, delegateInit } from './BaseShape'; const ENTITY_FIELD_NAME = 'ReturnStatement'; const setupReturnStatementBehaviour = state => ({ print(config) { const theme = state.theme, arrowTheme = theme.arrow; const { x, y } = state.position, h = state.dimensions.h, w = state.dimensions.w - arrowTheme.handlerLength - arrowTheme.sizeX, namePosition = { x: x, y }; //TODO: refactor const arrowSize = { x: arrowTheme.sizeX, y: arrowTheme.sizeY }; const arrow = getClosedPath( addOffsetToPoints( [{ x: 0, y: 0 }, { x: arrowSize.x, y: arrowSize.y / 2 }, { x: 0, y: arrowSize.y }], { x: x + w + arrowTheme.handlerLength, y: y + h / 2 - arrowSize.y / 2 } ), arrowTheme ); return ` <g> ${getRoundedRectangle(x, y, w, h, theme)} ${getLine( x + w, y + h / 2 - arrowTheme.handlerLength, x + w + arrowTheme.handlerLength, y + h / 2 - arrowTheme.handlerLength, arrowTheme )} ${getLine( x + w, y + h / 2 + arrowTheme.handlerLength, x + w + arrowTheme.handlerLength, y + h / 2 + arrowTheme.handlerLength, arrowTheme )} ${arrow} ${this.printName(namePosition)} ${this.printDebugInfo(config)} </g>`; } }); const calculateWidth = state => { const theme = state.theme, arrowTheme = theme.arrow; return ( 2 * theme.horizontalPadding + arrowTheme.handlerLength + arrowTheme.sizeX + calculateNameBasedWidth(state) ); }; const calculateDimensions = state => ({ w: calculateWidth(state), h: calculateHeight(state) }); const extractBasicState = state => ({ ...state, position: calculatePosition(state), dimensions: calculateDimensions(state) }); export const ReturnStatement = initialState => { let state = extractBasicState(initialState); state = { ...state, ...setupInitialProperties(state) }; return assignState(state, [ setupInitialSelectors, setupBasicBehaviour, setupReturnStatementBehaviour ]); }; export default delegateInit(ReturnStatement, ENTITY_FIELD_NAME);