22 * @date 2018.11
33*/
44import { Component } from 'react' ;
5+ import PropTypes from 'prop-types' ;
56import { getOffset } from './util.js' ;
67import Line from './line.jsx' ;
78import _ from 'lodash' ;
@@ -32,11 +33,19 @@ class DrawLines extends Component {
3233 const box = document . querySelector ( '.react-field-mapping-box' ) ;
3334 let scrollTop = 0 ;
3435 let scrollLeft = 0 ;
36+ let sourceDom = null ;
3537 document . documentElement . onmousedown = ( event ) => {
3638 const eventDom = event . target ;
39+ sourceDom = eventDom ;
3740 const className = eventDom && eventDom . className ;
3841 if ( className && typeof className === "string" && className . indexOf ( "source-column-icon" ) > - 1 ) {
3942 event . preventDefault ( ) ;
43+ const relation = _ . assign ( [ ] , me . props . relation ) ;
44+ if ( ! me . props . sourceMutiple && _ . find ( relation , ( o ) => {
45+ return o . source . key === me . domOperate ( eventDom ) . key ;
46+ } ) ) {
47+ return ;
48+ }
4049 if ( this . baseXY !== getOffset ( this . drawEle ) ) {
4150 this . baseXY = getOffset ( this . drawEle ) ;
4251 }
@@ -45,7 +54,7 @@ class DrawLines extends Component {
4554 const sourceData = _ . find ( me . props . sourceData , ( o ) => {
4655 return o . key === this . domOperate ( eventDom ) . key ;
4756 } ) ;
48- me . props . onDrawStart && me . props . onDrawStart ( sourceData , me . props . relation ) ;
57+ me . props . onDrawStart ( sourceData , me . props . relation ) ;
4958 me . props . changeIconStatus ( sourceData ) ;
5059 me . setState ( {
5160 startX : this . domOperate ( eventDom ) . left ,
@@ -64,7 +73,7 @@ class DrawLines extends Component {
6473 } ;
6574 document . documentElement . onmousemove = ( event ) => {
6675 if ( this . state . drawing ) {
67- me . props . onDrawing && me . props . onDrawing ( me . state . sourceData , me . props . relation ) ;
76+ me . props . onDrawing ( me . state . sourceData , me . props . relation ) ;
6877 me . setState ( {
6978 endX : event . pageX - this . baseXY . left + scrollLeft ,
7079 endY : event . pageY - this . baseXY . top + scrollTop
@@ -78,11 +87,14 @@ class DrawLines extends Component {
7887 const className = eventDom && eventDom . className ;
7988 if ( className && typeof className === "string" && className . indexOf ( "target-column-icon" ) > - 1 ) {
8089 const relation = _ . assign ( [ ] , me . props . relation ) ;
81- if ( _ . find ( relation , ( o ) => {
90+ if ( ! me . props . targetMutiple && _ . find ( relation , ( o ) => { // target不允许映射多次
8291 return o . target . key === me . domOperate ( eventDom ) . key ;
92+ } ) || _ . find ( relation , ( o ) => { // 过滤连线已存在的情况
93+ return o . target . key === me . domOperate ( eventDom ) . key && o . source . key === me . domOperate ( sourceDom ) . key ;
8394 } ) ) {
8495 me . props . changeIconStatus ( ) ;
8596 me . setState ( { ...defaultState } ) ;
97+ sourceDom = null ;
8698 return ;
8799 }
88100 const targetData = _ . find ( me . props . targetData , ( o ) => {
@@ -100,8 +112,9 @@ class DrawLines extends Component {
100112 ...targetData
101113 }
102114 } ) ;
103- me . props . onDrawEnd && me . props . onDrawEnd ( sourceData , targetData , relation ) ;
115+ me . props . onDrawEnd ( sourceData , targetData , relation ) ;
104116 me . props . onChange ( relation ) ;
117+ sourceDom = null ;
105118 }
106119 me . props . changeIconStatus ( ) ;
107120 me . setState ( { ...defaultState } ) ;
@@ -133,7 +146,7 @@ class DrawLines extends Component {
133146 }
134147 render ( ) {
135148 const { startX, startY, drawing, endX, endY } = this . state ;
136- const { relation, currentRelation, edit } = this . props ;
149+ const { relation, currentRelation, edit, closeIcon } = this . props ;
137150 return < div className = "lines-area" ref = { me => { this . drawEle = me ; } } >
138151 < svg width = "100%" height = "100%" version = "1.1"
139152 xmlns = "http://www.w3.org/2000/svg" >
@@ -160,6 +173,7 @@ class DrawLines extends Component {
160173 endY = { item . target . y }
161174 data = { item }
162175 edit = { edit }
176+ closeIcon = { closeIcon }
163177 toTop = { this . topLine . bind ( this ) }
164178 currentRelation = { currentRelation }
165179 removeRelation = { this . removeRelation . bind ( this ) }
@@ -179,4 +193,24 @@ class DrawLines extends Component {
179193 }
180194}
181195
196+ DrawLines . propTypes = {
197+ sourceData : PropTypes . array . isRequired ,
198+ targetData : PropTypes . array . isRequired ,
199+ sourceMutiple : PropTypes . bool . isRequired ,
200+ targetMutiple : PropTypes . bool . isRequired ,
201+ onDrawStart : PropTypes . func ,
202+ onDrawing : PropTypes . func ,
203+ onDrawEnd : PropTypes . func ,
204+ relation : PropTypes . array . isRequired ,
205+ edit : PropTypes . bool . isRequired ,
206+ currentRelation : PropTypes . object . isRequired ,
207+ onChange : PropTypes . func . isRequired ,
208+ changeIconStatus : PropTypes . func . isRequired ,
209+ closeIcon : PropTypes . string
210+ } ;
211+ DrawLines . defaultProps = {
212+ onDrawStart : ( ) => { } ,
213+ onDrawing : ( ) => { } ,
214+ onDrawEnd : ( ) => { }
215+ } ;
182216export default DrawLines ;
0 commit comments