Skip to content

Commit dc65aa3

Browse files
committed
Sortable working
1 parent 9e9cf7f commit dc65aa3

File tree

4 files changed

+79
-25
lines changed

4 files changed

+79
-25
lines changed

css/styles.scss

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@
4040
margin: 1rem;
4141
}
4242

43+
.query-builder.qb-dragging {
44+
button {
45+
pointer-events: none;
46+
}
47+
}
48+
4349
.query-preview {
4450
font-size: 14px;
4551
background: rgba(250, 240, 210, 0.5);
@@ -60,7 +66,7 @@
6066
padding: 10px;
6167
}
6268

63-
.group, .rule {
69+
.group-or-rule {
6470
border-radius: 5px;
6571
position: relative;
6672
}

examples/demo/config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ export default {
668668
}
669669
},
670670
valueSourcesPopupTitle: "Select value source",
671-
canReorder: false,
671+
canReorder: true,
672672
canCompareFieldWithField: (leftField, leftFieldConfig, rightField, rightFieldConfig) => {
673673
//for type == 'select'/'multiselect' you can check listValues
674674
return true;

modules/components/containers/SortableContainer.js

Lines changed: 70 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import size from 'lodash/size';
44
import {getFieldConfig} from "../../utils/configUtils";
55
import {getFlatTree} from "../../utils/treeUtils";
66
import * as constants from '../../constants';
7+
import clone from 'clone';
78

89

910
export 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);

modules/utils/treeUtils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const getFlatTree = (tree) => {
3434

3535
items[id] = {
3636
type: type,
37-
parent: path.length ? path[0] : null,
37+
parent: path.length ? path[path.length-1] : null,
3838
path: path.concat(id),
3939
lev: lev,
4040
leaf: !children,

0 commit comments

Comments
 (0)