11import * as PropTypes from "prop-types" ;
22import * as React from "react" ;
3+ import OutsideClickHandler from "react-outside-click-handler" ;
34import { DndProvider } from "react-dnd" ;
45import Backend from "react-dnd-html5-backend" ;
56
@@ -96,6 +97,12 @@ export class FlowModeler extends React.Component<FlowModelerProps, FlowModelerSt
9697 event . stopPropagation ( ) ;
9798 } ;
9899
100+ handleOnOutsideClick = ( ) : void => {
101+ if ( this . state . selection !== null ) {
102+ this . onSelect ( null ) ;
103+ }
104+ } ;
105+
99106 handleOnChange = ( change : ( originalFlow : FlowModelerProps [ "flow" ] ) => EditActionResult ) : void => {
100107 const { flow, onChange } = this . props ;
101108 const { changedFlow } = change ( flow ) ;
@@ -216,22 +223,32 @@ export class FlowModeler extends React.Component<FlowModelerProps, FlowModelerSt
216223 } ;
217224 } ;
218225
219- render ( ) : React . ReactElement {
226+ renderMain ( ) : React . ReactElement {
220227 const { flow, options, onChange } = this . props ;
221228 const { gridCellData, columnCount } = buildRenderData ( flow , options && options . verticalAlign === "bottom" ? "bottom" : "top" ) ;
222229 return (
223- < DndProvider backend = { Backend } >
224- < div
225- className = { `flow-modeler${ onChange ? " editable" : "" } ` }
226- onClick = { onChange ? this . clearSelection : undefined }
227- style = { { gridTemplateColumns : `repeat(${ columnCount } , max-content)` } }
228- >
229- { gridCellData . map ( this . renderGridCell ( ! ! onChange ) ) }
230- </ div >
231- </ DndProvider >
230+ < div
231+ className = { `flow-modeler${ onChange ? " editable" : "" } ` }
232+ onClick = { onChange ? this . clearSelection : undefined }
233+ style = { { gridTemplateColumns : `repeat(${ columnCount } , max-content)` } }
234+ >
235+ { gridCellData . map ( this . renderGridCell ( ! ! onChange ) ) }
236+ </ div >
232237 ) ;
233238 }
234239
240+ render ( ) : React . ReactElement {
241+ const { onChange, options } = this . props ;
242+ if ( onChange ) {
243+ return (
244+ < OutsideClickHandler onOutsideClick = { this . handleOnOutsideClick } >
245+ { options && options . omitDndProvider ? this . renderMain ( ) : < DndProvider backend = { Backend } > { this . renderMain ( ) } </ DndProvider > }
246+ </ OutsideClickHandler >
247+ ) ;
248+ }
249+ return this . renderMain ( ) ;
250+ }
251+
235252 static propTypes = {
236253 flow : PropTypes . shape ( {
237254 firstElementId : PropTypes . string ,
@@ -254,7 +271,8 @@ export class FlowModeler extends React.Component<FlowModelerProps, FlowModelerSt
254271 ) . isRequired
255272 } ) . isRequired ,
256273 options : PropTypes . shape ( {
257- verticalAlign : PropTypes . oneOf ( [ "top" , "middle" , "bottom" ] )
274+ verticalAlign : PropTypes . oneOf ( [ "top" , "middle" , "bottom" ] ) ,
275+ omitDndProvider : PropTypes . bool
258276 } ) ,
259277 renderStep : PropTypes . func . isRequired ,
260278 renderGatewayConditionType : PropTypes . func ,
0 commit comments