@@ -4,6 +4,7 @@ import size from 'lodash/size';
44import { getFieldConfig } from "../../utils/configUtils" ;
55import { getFlatTree } from "../../utils/treeUtils" ;
66import * as constants from '../../constants' ;
7+ import clone from 'clone' ;
78
89
910export default ( Builder , CanMoveFn = null ) => {
@@ -33,6 +34,30 @@ export default (Builder, CanMoveFn = null) => {
3334 this . tree = getFlatTree ( nextProps . tree ) ;
3435 }
3536
37+ componentDidUpdate ( prevProps , prevState ) {
38+ var dragging = this . draggingInfo ;
39+ var startDragging = this . dragStartInfo ;
40+ if ( startDragging && startDragging . id ) {
41+ dragging . itemInfo = this . tree . items [ dragging . id ] ;
42+
43+ if ( dragging . itemInfo . index != startDragging . itemInfo . index ) {
44+ var treeEl = startDragging . treeEl ;
45+ var plhEl = this . _getPlaceholderNodeEl ( treeEl , true ) ;
46+ if ( plhEl ) {
47+ var plX = plhEl . getBoundingClientRect ( ) . left + window . scrollX ;
48+ var plY = plhEl . getBoundingClientRect ( ) . top + window . scrollY ;
49+ var oldPlX = startDragging . plX ;
50+ var oldPlY = startDragging . plY ;
51+ startDragging . plX = plX ;
52+ startDragging . plY = plY ;
53+ startDragging . itemInfo = clone ( dragging . itemInfo ) ;
54+ startDragging . y = plhEl . offsetTop ;
55+ startDragging . clientY += ( plY - oldPlY ) ;
56+ }
57+ }
58+ }
59+ }
60+
3661 _getNodeElById ( treeEl , indexId , ignoreCache = false ) {
3762 if ( indexId == null )
3863 return null ;
@@ -72,26 +97,33 @@ export default (Builder, CanMoveFn = null) => {
7297
7398 onDragStart ( id , dom , e ) {
7499 var treeEl = dom . closest ( '.query-builder' ) ;
100+ treeEl . classList . add ( "qb-dragging" ) ;
75101 var treeElContainer = treeEl . closest ( '.query-builder-container' ) ;
76102 if ( ! treeElContainer )
77103 treeElContainer = dom . closest ( 'body' ) ;
78104 var scrollTop = treeElContainer . scrollTop ;
79105
106+ var dragEl = this . _getDraggableNodeEl ( treeEl ) ;
107+ var plhEl = this . _getPlaceholderNodeEl ( treeEl ) ;
108+
80109 this . draggingInfo = {
81110 id : id ,
82- w : dom . offsetWidth ,
83- h : dom . offsetHeight ,
84111 x : dom . offsetLeft ,
85112 y : dom . offsetTop ,
86- treeEl : treeEl ,
87- treeElContainer : treeElContainer ,
113+ w : dom . offsetWidth ,
114+ h : dom . offsetHeight ,
115+ itemInfo : this . tree . items [ id ] ,
88116 } ;
89117 this . dragStartInfo = {
118+ id : id ,
90119 x : dom . offsetLeft ,
91120 y : dom . offsetTop ,
92121 scrollTop : scrollTop ,
93- offsetX : e . clientX ,
94- offsetY : e . clientY ,
122+ clientX : e . clientX ,
123+ clientY : e . clientY ,
124+ itemInfo : clone ( this . tree . items [ id ] ) ,
125+ treeEl : treeEl ,
126+ treeElContainer : treeElContainer ,
95127 } ;
96128 this . didAnySortOnDrag = false ;
97129
@@ -106,29 +138,39 @@ export default (Builder, CanMoveFn = null) => {
106138
107139 _onDrag ( e ) {
108140 var dragging = this . draggingInfo ;
141+ var startDragging = this . dragStartInfo ;
109142 var paddingLeft = this . props . paddingLeft ;
110- var treeElContainer = dragging . treeElContainer ;
143+ var treeElContainer = startDragging . treeElContainer ;
111144 var scrollTop = treeElContainer . scrollTop ;
112- var itemInfo = this . tree . items [ dragging . id ] ;
113- if ( ! itemInfo ) {
145+ dragging . itemInfo = this . tree . items [ dragging . id ] ;
146+ if ( ! dragging . itemInfo ) {
114147 return ;
115148 }
116149
117- var startX = this . dragStartInfo . x ;
118- var startY = this . dragStartInfo . y ;
119- var startOffsetX = this . dragStartInfo . offsetX ;
120- var startOffsetY = this . dragStartInfo . offsetY ;
121- var startScrollTop = this . dragStartInfo . scrollTop ;
122-
150+ //first init plX/plY
151+ if ( ! startDragging . plX ) {
152+ var treeEl = startDragging . treeEl ;
153+ var plhEl = this . _getPlaceholderNodeEl ( treeEl ) ;
154+ if ( plhEl ) {
155+ startDragging . plX = plhEl . getBoundingClientRect ( ) . left + window . scrollX ;
156+ startDragging . plY = plhEl . getBoundingClientRect ( ) . top + window . scrollY ;
157+ }
158+ }
159+
160+ var startX = startDragging . x ;
161+ var startY = startDragging . y ;
162+ var startClientX = startDragging . clientX ;
163+ var startClientY = startDragging . clientY ;
164+ var startScrollTop = startDragging . scrollTop ;
123165 var pos = {
124- x : startX + ( e . clientX - startOffsetX ) ,
125- y : startY + ( e . clientY - startOffsetY ) + ( scrollTop - startScrollTop )
166+ x : startX + ( e . clientX - startClientX ) ,
167+ y : startY + ( e . clientY - startClientY ) + ( scrollTop - startScrollTop )
126168 } ;
127169 dragging . x = pos . x ;
128170 dragging . y = pos . y ;
129171 dragging . paddingLeft = paddingLeft ;
130172
131- var moved = this . handleDrag ( itemInfo , dragging , e , CanMoveFn ) ;
173+ var moved = this . handleDrag ( dragging , e , CanMoveFn ) ;
132174
133175 if ( moved ) {
134176 this . didAnySortOnDrag = true ;
@@ -142,17 +184,22 @@ export default (Builder, CanMoveFn = null) => {
142184 }
143185
144186 _onDragEnd ( ) {
187+ var treeEl = this . dragStartInfo . treeEl ;
145188 this . draggingInfo = {
146189 id : null ,
147190 x : null ,
148191 y : null ,
149192 w : null ,
150- h : null
193+ h : null ,
194+ } ;
195+ this . dragStartInfo = {
196+ id : null ,
151197 } ;
152198 this . setState ( {
153199 dragging : this . draggingInfo
154200 } ) ;
155201
202+ treeEl . classList . remove ( "qb-dragging" ) ;
156203 this . _cacheEls = { } ;
157204
158205 if ( this . didAnySortOnDrag ) {
@@ -164,13 +211,14 @@ export default (Builder, CanMoveFn = null) => {
164211 }
165212
166213
167- handleDrag ( itemInfo , dragInfo , e , canMoveFn ) {
214+ handleDrag ( dragInfo , e , canMoveFn ) {
215+ var itemInfo = dragInfo . itemInfo ;
168216 var newItemInfo = null ;
169217 var paddingLeft = dragInfo . paddingLeft ;
170218
171219 var moveInfo = null ;
172- var treeEl = dragInfo . treeEl ;
173- //var treeElContainer = dragInfo .treeElContainer;
220+ var treeEl = this . dragStartInfo . treeEl ;
221+ //var treeElContainer = this.dragStartInfo .treeElContainer;
174222 //var scrollTop = treeElContainer.scrollTop;
175223 var dragId = dragInfo . id ;
176224 var dragEl = this . _getDraggableNodeEl ( treeEl ) ;
0 commit comments